[med-svn] [sleepyhead] 01/02: Imported Upstream version 0.9.8

Sergio Durigan Junior sergiodj-guest at moszumanska.debian.org
Sun Oct 11 07:01:55 UTC 2015


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

sergiodj-guest pushed a commit to branch master
in repository sleepyhead.

commit 4d3f6c7a8a709260b2cd2418ee3b733405be0ef7
Author: Sergio Durigan Junior <sergiodj at sergiodj.net>
Date:   Sun Oct 11 02:25:28 2015 -0400

    Imported Upstream version 0.9.8
---
 .gitignore                                         |     0
 COPYING                                            |   674 ++
 Doxyfile                                           |  1721 +++
 README                                             |    36 +
 SleepyHeadQT.pro                                   |    16 +
 Translations/Bulgarian.bg.ts                       |  7934 ++++++++++++++
 Translations/Chinese.zh.ts                         |  7917 ++++++++++++++
 Translations/Deutsch.de.ts                         |  7439 +++++++++++++
 Translations/English.en_UK.ts                      |  7938 ++++++++++++++
 Translations/Espaniol.es.ts                        |  8398 +++++++++++++++
 Translations/Francais.fr.ts                        |  9758 +++++++++++++++++
 Translations/Nederlands.nl.ts                      | 10797 +++++++++++++++++++
 Translations/Svenska.se.ts                         |  8654 +++++++++++++++
 configure                                          |    26 +
 history/README                                     |     9 +
 history/cpap.py                                    |  1783 +++
 innosetup/installer-angle.iss                      |    52 +
 innosetup/installer-opengl.iss                     |    52 +
 sleepyhead/COPYING                                 |   674 ++
 sleepyhead/Graphs/MinutesAtPressure.cpp            |   674 ++
 sleepyhead/Graphs/MinutesAtPressure.h              |   107 +
 sleepyhead/Graphs/gFlagsLine.cpp                   |   435 +
 sleepyhead/Graphs/gFlagsLine.h                     |   164 +
 sleepyhead/Graphs/gFooBar.cpp                      |   135 +
 sleepyhead/Graphs/gFooBar.h                        |    52 +
 sleepyhead/Graphs/gGraph.cpp                       |  1474 +++
 sleepyhead/Graphs/gGraph.h                         |   410 +
 sleepyhead/Graphs/gGraphView.cpp                   |  3385 ++++++
 sleepyhead/Graphs/gGraphView.h                     |   693 ++
 sleepyhead/Graphs/gLineChart.cpp                   |  1167 ++
 sleepyhead/Graphs/gLineChart.h                     |   182 +
 sleepyhead/Graphs/gLineOverlay.cpp                 |   423 +
 sleepyhead/Graphs/gLineOverlay.h                   |    85 +
 sleepyhead/Graphs/gSegmentChart.cpp                |   315 +
 sleepyhead/Graphs/gSegmentChart.h                  |    75 +
 sleepyhead/Graphs/gSessionTimesChart.cpp           |  1473 +++
 sleepyhead/Graphs/gSessionTimesChart.h             |   465 +
 sleepyhead/Graphs/gStatsLine.cpp                   |    69 +
 sleepyhead/Graphs/gStatsLine.h                     |    33 +
 sleepyhead/Graphs/gSummaryChart.cpp                |  1306 +++
 sleepyhead/Graphs/gSummaryChart.h                  |   153 +
 sleepyhead/Graphs/gXAxis.cpp                       |   447 +
 sleepyhead/Graphs/gXAxis.h                         |   150 +
 sleepyhead/Graphs/gYAxis.cpp                       |   344 +
 sleepyhead/Graphs/gYAxis.h                         |   196 +
 sleepyhead/Graphs/gdailysummary.cpp                |   446 +
 sleepyhead/Graphs/gdailysummary.h                  |    64 +
 sleepyhead/Graphs/glcommon.cpp                     |    55 +
 sleepyhead/Graphs/glcommon.h                       |    72 +
 sleepyhead/Graphs/graphdata.h                      |   122 +
 sleepyhead/Graphs/graphdata_custom.h               |   138 +
 sleepyhead/Graphs/gspacer.cpp                      |    15 +
 sleepyhead/Graphs/gspacer.h                        |    33 +
 sleepyhead/Graphs/layer.cpp                        |   293 +
 sleepyhead/Graphs/layer.h                          |   297 +
 sleepyhead/Resources.qrc                           |    51 +
 sleepyhead/STYLE                                   |    23 +
 sleepyhead/SleepLib/calcs.cpp                      |  2073 ++++
 sleepyhead/SleepLib/calcs.h                        |   164 +
 sleepyhead/SleepLib/common.cpp                     |   621 ++
 sleepyhead/SleepLib/common.h                       |   345 +
 sleepyhead/SleepLib/day.cpp                        |  1590 +++
 sleepyhead/SleepLib/day.h                          |   326 +
 sleepyhead/SleepLib/event.cpp                      |   332 +
 sleepyhead/SleepLib/event.h                        |   188 +
 sleepyhead/SleepLib/journal.cpp                    |   299 +
 sleepyhead/SleepLib/journal.h                      |    80 +
 .../SleepLib/loader_plugins/cms50_loader.cpp       |   679 ++
 sleepyhead/SleepLib/loader_plugins/cms50_loader.h  |    95 +
 .../SleepLib/loader_plugins/cms50f37_loader.cpp    |   965 ++
 .../SleepLib/loader_plugins/cms50f37_loader.h      |   154 +
 sleepyhead/SleepLib/loader_plugins/icon_loader.cpp |   938 ++
 sleepyhead/SleepLib/loader_plugins/icon_loader.h   |   110 +
 .../SleepLib/loader_plugins/intellipap_loader.cpp  |   619 ++
 .../SleepLib/loader_plugins/intellipap_loader.h    |    94 +
 .../SleepLib/loader_plugins/md300w1_loader.cpp     |   236 +
 .../SleepLib/loader_plugins/md300w1_loader.h       |    91 +
 .../SleepLib/loader_plugins/mseries_loader.cpp     |   491 +
 .../SleepLib/loader_plugins/mseries_loader.h       |    76 +
 sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp |  2725 +++++
 sleepyhead/SleepLib/loader_plugins/prs1_loader.h   |   225 +
 .../SleepLib/loader_plugins/resmed_loader.cpp      |  3229 ++++++
 sleepyhead/SleepLib/loader_plugins/resmed_loader.h |   480 +
 .../SleepLib/loader_plugins/somnopose_loader.cpp   |   185 +
 .../SleepLib/loader_plugins/somnopose_loader.h     |    47 +
 .../SleepLib/loader_plugins/weinmann_loader.cpp    |   587 +
 .../SleepLib/loader_plugins/weinmann_loader.h      |   141 +
 sleepyhead/SleepLib/loader_plugins/zeo_loader.cpp  |   331 +
 sleepyhead/SleepLib/loader_plugins/zeo_loader.h    |    45 +
 sleepyhead/SleepLib/machine.cpp                    |  1185 ++
 sleepyhead/SleepLib/machine.h                      |   314 +
 sleepyhead/SleepLib/machine_common.cpp             |    50 +
 sleepyhead/SleepLib/machine_common.h               |   179 +
 sleepyhead/SleepLib/machine_loader.cpp             |   388 +
 sleepyhead/SleepLib/machine_loader.h               |   188 +
 sleepyhead/SleepLib/preferences.cpp                |   346 +
 sleepyhead/SleepLib/preferences.h                  |   144 +
 sleepyhead/SleepLib/profiles.cpp                   |  1809 ++++
 sleepyhead/SleepLib/profiles.h                     |   860 ++
 sleepyhead/SleepLib/progressdialog.cpp             |    38 +
 sleepyhead/SleepLib/progressdialog.h               |    37 +
 sleepyhead/SleepLib/schema.cpp                     |   965 ++
 sleepyhead/SleepLib/schema.h                       |   325 +
 sleepyhead/SleepLib/serialoximeter.cpp             |   150 +
 sleepyhead/SleepLib/serialoximeter.h               |   145 +
 sleepyhead/SleepLib/session.cpp                    |  2262 ++++
 sleepyhead/SleepLib/session.h                      |   443 +
 sleepyhead/UpdaterWindow.cpp                       |   688 ++
 sleepyhead/UpdaterWindow.h                         |   105 +
 sleepyhead/UpdaterWindow.ui                        |   363 +
 sleepyhead/build_number.h                          |     1 +
 sleepyhead/common_gui.cpp                          |   139 +
 sleepyhead/common_gui.h                            |    88 +
 sleepyhead/daily.cpp                               |  2563 +++++
 sleepyhead/daily.h                                 |   374 +
 sleepyhead/daily.ui                                |  1584 +++
 sleepyhead/docs/0.0.gif                            |   Bin 0 -> 11764 bytes
 sleepyhead/docs/PRS1 Data Format.odt               |   Bin 0 -> 14574 bytes
 sleepyhead/docs/changelog.txt                      |     1 +
 sleepyhead/docs/channels.xml                       |    98 +
 sleepyhead/docs/countries.txt                      |   195 +
 sleepyhead/docs/graphs.xml                         |    48 +
 sleepyhead/docs/release_notes.html                 |   150 +
 sleepyhead/docs/schema.xml                         |    68 +
 sleepyhead/docs/script.js                          |    77 +
 sleepyhead/docs/sheep.png                          |   Bin 0 -> 30302 bytes
 sleepyhead/docs/sheep.svg                          |   347 +
 sleepyhead/docs/sheep2.svg                         |    81 +
 sleepyhead/docs/startup_tips.txt                   |     2 +
 sleepyhead/docs/tooltips.css                       |    53 +
 sleepyhead/docs/tz.txt                             |    92 +
 sleepyhead/docs/usage.html                         |    21 +
 sleepyhead/exportcsv.cpp                           |   399 +
 sleepyhead/exportcsv.h                             |    61 +
 sleepyhead/exportcsv.ui                            |   297 +
 sleepyhead/fonts/FreeSans.ttf                      |   Bin 0 -> 460384 bytes
 sleepyhead/icons/Jedimark.png                      |   Bin 0 -> 166828 bytes
 sleepyhead/icons/README.txt                        |     6 +
 sleepyhead/icons/arrow-end.png                     |   Bin 0 -> 9026 bytes
 sleepyhead/icons/arrow-left.png                    |   Bin 0 -> 8017 bytes
 sleepyhead/icons/arrow-right.png                   |   Bin 0 -> 8008 bytes
 sleepyhead/icons/back.png                          |   Bin 0 -> 2952 bytes
 sleepyhead/icons/bob-v3.0.ico                      |   Bin 0 -> 99678 bytes
 sleepyhead/icons/bob-v3.0.png                      |   Bin 0 -> 30302 bytes
 sleepyhead/icons/bookmark.png                      |   Bin 0 -> 1226 bytes
 sleepyhead/icons/cms50f.png                        |   Bin 0 -> 85294 bytes
 sleepyhead/icons/cubeoximeter.png                  |   Bin 0 -> 42705 bytes
 sleepyhead/icons/edit-find.png                     |   Bin 0 -> 68710 bytes
 sleepyhead/icons/eye.png                           |   Bin 0 -> 38699 bytes
 sleepyhead/icons/forward.png                       |   Bin 0 -> 2983 bytes
 sleepyhead/icons/go-home.png                       |   Bin 0 -> 2458 bytes
 sleepyhead/icons/help.png                          |   Bin 0 -> 82459 bytes
 sleepyhead/icons/iconfile.icns                     |   Bin 0 -> 134015 bytes
 sleepyhead/icons/intellipap.png                    |   Bin 0 -> 96431 bytes
 sleepyhead/icons/last.png                          |   Bin 0 -> 390 bytes
 sleepyhead/icons/mask.png                          |   Bin 0 -> 64178 bytes
 sleepyhead/icons/moon.png                          |   Bin 0 -> 4948 bytes
 sleepyhead/icons/overview.png                      |   Bin 0 -> 50971 bytes
 sleepyhead/icons/oximeter.png                      |   Bin 0 -> 42402 bytes
 sleepyhead/icons/preferences.png                   |   Bin 0 -> 3704 bytes
 sleepyhead/icons/prs1.png                          |   Bin 0 -> 75569 bytes
 sleepyhead/icons/prs1_60s.png                      |   Bin 0 -> 81511 bytes
 sleepyhead/icons/pushpin.png                       |   Bin 0 -> 2050 bytes
 sleepyhead/icons/refresh.png                       |   Bin 0 -> 815 bytes
 sleepyhead/icons/rms9.png                          |   Bin 0 -> 76421 bytes
 sleepyhead/icons/sadface.png                       |   Bin 0 -> 70604 bytes
 sleepyhead/icons/save.png                          |   Bin 0 -> 3612 bytes
 sleepyhead/icons/sdcard-lock.png                   |   Bin 0 -> 80327 bytes
 sleepyhead/icons/sdcard.png                        |   Bin 0 -> 68397 bytes
 sleepyhead/icons/session-off.png                   |   Bin 0 -> 1350 bytes
 sleepyhead/icons/session-on.png                    |   Bin 0 -> 1352 bytes
 sleepyhead/icons/smileyface.png                    |   Bin 0 -> 77133 bytes
 sleepyhead/icons/statistics.png                    |   Bin 0 -> 49803 bytes
 sleepyhead/icons/svg/applications-viewers.svg      |    79 +
 sleepyhead/icons/svg/back.svg                      |   854 ++
 sleepyhead/icons/svg/calendar.svg                  |   316 +
 sleepyhead/icons/svg/close-window.svg              |   152 +
 sleepyhead/icons/svg/edit-find.svg                 |    52 +
 sleepyhead/icons/svg/emblem-marketing.svg          |   271 +
 sleepyhead/icons/svg/forward.svg                   |   192 +
 sleepyhead/icons/svg/gnome-dev-media-sdmmc.svg     |   176 +
 sleepyhead/icons/svg/media.svg                     |   477 +
 sleepyhead/icons/svg/moon.svg                      |    76 +
 sleepyhead/icons/svg/preferences.svg               |   642 ++
 sleepyhead/icons/trophy.png                        |   Bin 0 -> 15460 bytes
 sleepyhead/logger.cpp                              |   146 +
 sleepyhead/logger.h                                |    46 +
 sleepyhead/main.cpp                                |   408 +
 sleepyhead/mainwindow.cpp                          |  2714 +++++
 sleepyhead/mainwindow.h                            |   365 +
 sleepyhead/mainwindow.ui                           |  3614 +++++++
 sleepyhead/newprofile.cpp                          |   461 +
 sleepyhead/newprofile.h                            |    65 +
 sleepyhead/newprofile.ui                           |  1010 ++
 sleepyhead/overview.cpp                            |   803 ++
 sleepyhead/overview.h                              |   142 +
 sleepyhead/overview.ui                             |   278 +
 sleepyhead/oximeterimport.cpp                      |  1147 ++
 sleepyhead/oximeterimport.h                        |   121 +
 sleepyhead/oximeterimport.ui                       |  2243 ++++
 sleepyhead/oximetry.ui                             |   478 +
 sleepyhead/preferencesdialog.cpp                   |  1137 ++
 sleepyhead/preferencesdialog.h                     |   115 +
 sleepyhead/preferencesdialog.ui                    |  2781 +++++
 sleepyhead/profileselect.cpp                       |   402 +
 sleepyhead/profileselect.h                         |    62 +
 sleepyhead/profileselect.ui                        |   419 +
 sleepyhead/report.ui                               |    43 +
 sleepyhead/reports.cpp                             |   669 ++
 sleepyhead/reports.h                               |    27 +
 sleepyhead/scripts/build_number                    |     1 +
 sleepyhead/scripts/inc_build.sh                    |    31 +
 sleepyhead/sessionbar.cpp                          |   287 +
 sleepyhead/sessionbar.h                            |    71 +
 sleepyhead/sleepyhead.pro                          |   324 +
 sleepyhead/statistics.cpp                          |  2092 ++++
 sleepyhead/statistics.h                            |   183 +
 sleepyhead/translation.cpp                         |   161 +
 sleepyhead/translation.h                           |    16 +
 sleepyhead/updateparser.cpp                        |   217 +
 sleepyhead/updateparser.h                          |    95 +
 sleepyhead/version.h                               |    39 +
 sleepyhead/welcome.cpp                             |   250 +
 sleepyhead/win_icon.rc                             |     1 +
 version.sh                                         |     9 +
 225 files changed, 152949 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    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/Doxyfile b/Doxyfile
new file mode 100644
index 0000000..333ef8f
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,1721 @@
+# Doxyfile 1.7.4
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a hash (#) is considered a comment and will be ignored.
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = SleepyHead
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         = 0.8.x
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer
+# a quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = OpenSource CPAP Review Software
+
+# With the PROJECT_LOGO tag one can specify an logo or icon that is
+# included in the documentation. The maximum height of the logo should not
+# exceed 55 pixels and the maximum width should not exceed 200 pixels.
+# Doxygen will copy the logo to the output directory.
+
+PROJECT_LOGO           = ./docs/sheep.png
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./docs/doxygen
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful if your file system
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also makes the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and
+# unions are shown inside the group in which they are included (e.g. using
+# @ingroup) instead of on a separate page (for HTML and Man pages) or
+# section (for LaTeX and RTF).
+
+INLINE_GROUPED_CLASSES = NO
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penalty.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will roughly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespaces are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to
+# do proper type resolution of all parameters of a function it will reject a
+# match between the prototype and the implementation of a member function even
+# if there is only one candidate or it is obvious which candidate to choose
+# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen
+# will still accept a match between prototype and implementation in such cases.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or macro consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and macros in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. The create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# The WARN_NO_PARAMDOC option can be enabled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = ./ ./Graphs ./SleepLib  ./SleepLib/loader_plugins
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
+# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
+# *.f90 *.f *.for *.vhd *.vhdl
+
+FILE_PATTERNS          =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = */quazip/* */qextserialport/* */fonts/* */docs/* */icons/* *git*
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty or if
+# non of the patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any)
+# and it is also possible to disable source filtering for a specific pattern
+# using *.ext= (so without naming a filter). This option only has effect when
+# FILTER_SOURCE_FILES is enabled.
+
+FILTER_SOURCE_PATTERNS =
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header. Note that when using a custom header you are responsible
+# for the proper inclusion of any scripts and style sheets that doxygen
+# needs, which is dependent on the configuration options used.
+# It is adviced to generate a default header using "doxygen -w html
+# header.html footer.html stylesheet.css YourConfigFile" and then modify
+# that header. Note that the header is subject to change so you typically
+# have to redo this when upgrading to a newer version of doxygen or when changing the value of configuration settings such as GENERATE_TREEVIEW!
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# If the HTML_TIMESTAMP tag is set to YES then the generated HTML
+# documentation will contain the timesstamp.
+
+HTML_TIMESTAMP         = NO
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that
+# the files will be copied as-is; there are no commands or markers available.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the stylesheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+#  will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values
+# (range [0,1..20]) that doxygen will group on one line in the generated HTML
+# documentation. Note that a value of 0 will completely suppress the enum
+# values from appearing in the overview section.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax
+# (see http://www.mathjax.org) which uses client side Javascript for the
+# rendering instead of using prerendered bitmaps. Use this if you do not
+# have LaTeX installed or if you want to formulas look prettier in the HTML
+# output. When enabled you also need to install MathJax separately and
+# configure the path to it using the MATHJAX_RELPATH option.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you need to specify the location relative to the
+# HTML output directory using the MATHJAX_RELPATH option. The destination
+# directory should contain the MathJax.js script. For instance, if the mathjax
+# directory is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the
+# mathjax.org site, so you can quickly see the result without installing
+# MathJax, but it is strongly recommended to install a local copy of MathJax
+# before deployment.
+
+MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvantages are that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for
+# the generated latex document. The footer should contain everything after
+# the last chapter. If it is left blank doxygen will generate a
+# standard footer. Notice: only use this tag if you know what you are doing!
+
+LATEX_FOOTER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# pointed to by INCLUDE_PATH will be searched when a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition that
+# overrules the definition found in the source code.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all references to function-like macros
+# that are alone on a line, have an all uppercase name, and do not end with a
+# semicolon, because these will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option also works with HAVE_DOT disabled, but it is recommended to
+# install and use dot, since it yields more powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called Helvetica to the output
+# directory and reference it in all dot files that doxygen generates.
+# When you want a differently looking font you can specify the font name
+# using DOT_FONTNAME. You need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will generate a graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are svg, png, jpg, or gif.
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the
+# \mscfile command).
+
+MSCFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES
diff --git a/README b/README
new file mode 100644
index 0000000..bf06bf0
--- /dev/null
+++ b/README
@@ -0,0 +1,36 @@
+SleepyHead QT port v0.9 branch
+
+SleepyHead is cross platform, opensource sleep tracking program for reviewing CPAP and Oximetry data, 
+which are devices used in the treatment of Sleep Disorders like Obstructive Sleep Apnea.
+
+Requirements:
+-------------
+Qt5 SDK with webkit (opengl stuff recommended)
+Linux needs libudev-dev for qserialport to compile
+
+
+Building:
+--------
+
+Recommend shadow building to not cruft up the source code folder:
+
+cd ..
+mkdir build_sleepyhead
+cd build_sleepyhead
+qmake ../sleepyhead-code/SleepyHeadQT.pro 
+make
+
+You may need to add a -spec option to qmake to suit your platform. 
+Adding -j3 speeds up the make command on a dual core or greater system.
+
+
+Author: Mark Watkins <jedimark at users.sourceforge.net>
+Copyright (C)2011-2014 Mark Watkins
+
+Licence Stuff
+-------------
+This software is released under the GNU Public License version 3.0
+
+Exceptions and 3rd Party Libraries:
+It uses QuaZip, by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package..
+http://sourceforge.net/projects/quazip/
diff --git a/SleepyHeadQT.pro b/SleepyHeadQT.pro
new file mode 100644
index 0000000..ee6b705
--- /dev/null
+++ b/SleepyHeadQT.pro
@@ -0,0 +1,16 @@
+TEMPLATE = subdirs
+
+SUBDIRS += sleepyhead
+
+CONFIG += ordered
+
+TRANSLATIONS += \
+    Translations/Nederlands.nl.ts \
+    Translations/Deutsch.de.ts \
+    Translations/Chinese.zh.ts \
+    Translations/Francais.fr.ts \
+    Translations/Svenska.se.ts \
+    Translations/Espaniol.es.ts \
+    Translations/Bulgarian.bg.ts \
+    Translations/English.en_UK.ts \
+    Translations/Portugues.pt.ts
diff --git a/Translations/Bulgarian.bg.ts b/Translations/Bulgarian.bg.ts
new file mode 100755
index 0000000..86b3c6b
--- /dev/null
+++ b/Translations/Bulgarian.bg.ts
@@ -0,0 +1,7934 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="bg_BG">
+<context>
+    <name>CMS50Loader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Could not get data transmission from oximeter.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Please ensure you select 'upload' from the oximeter devices menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Daily</name>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="435"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="506"/>
+        <source>Go to the previous day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="525"/>
+        <source>Prev</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="551"/>
+        <source>Show or hide the calender</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="574"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="614"/>
+        <source>Go to the next day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="636"/>
+        <source>Next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="674"/>
+        <source>Go to the most recent day with data records</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="852"/>
+        <source>Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="914"/>
+        <source>View Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="959"/>
+        <location filename="../sleepyhead/daily.ui" line="1374"/>
+        <source>Notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1013"/>
+        <source>Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1099"/>
+        <source>Small</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1104"/>
+        <source>Medium</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1109"/>
+        <source>Big</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1475"/>
+        <source>Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1527"/>
+        <source>Graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1079"/>
+        <source>Color</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1038"/>
+        <source> i </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1041"/>
+        <source>Ctrl+I</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1069"/>
+        <source>u</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1054"/>
+        <source>B</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1057"/>
+        <source>Ctrl+B</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1168"/>
+        <source>Zombie</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1181"/>
+        <source>I'm feeling...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1197"/>
+        <source>Weight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1271"/>
+        <source>Awesome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1309"/>
+        <source>B.M.I.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1325"/>
+        <source>Bookmarks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1346"/>
+        <source>Add Bookmark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1369"/>
+        <source>Starts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1382"/>
+        <source>Remove Bookmark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1552"/>
+        <source>Drop down this list to show/hide available graphs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>Breakdown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="517"/>
+        <source>No %1 events are recorded this day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="615"/>
+        <source>%1 event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="616"/>
+        <source>%1 events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1093"/>
+        <source>PAP Mode: %1<br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="212"/>
+        <source>UF1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="213"/>
+        <source>UF2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="651"/>
+        <source>Session Start Times</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="652"/>
+        <source>Session End Times</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="892"/>
+        <source>Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="872"/>
+        <source>Oximetery Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="878"/>
+        <source>Position Sensor Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="883"/>
+        <source>Unknown Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="949"/>
+        <source>Machine Settings Unavailable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1098"/>
+        <source>This day has missing pressure, mode and settings data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1140"/>
+        <source>%1%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1206"/>
+        <source>This day just contains summary data, only limited information is available .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1216"/>
+        <source>Total time in apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1226"/>
+        <source>Time over leak redline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Sleep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Wake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1523"/>
+        <source>Event Breakdown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1558"/>
+        <source>Sessions all off!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1560"/>
+        <source>Sessions exist for this day but are switched off.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1563"/>
+        <source>Impossibly short session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1564"/>
+        <source>Zero hours??</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1567"/>
+        <source>BRICK :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1569"/>
+        <source>Complain to your Equipment Provider!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1135"/>
+        <source>Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1057"/>
+        <source>Oximeter Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1061"/>
+        <source>SpO2 Desaturations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1062"/>
+        <source>Pulse Change events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1063"/>
+        <source>SpO2 Baseline Used</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="945"/>
+        <source>Machine Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="837"/>
+        <source>Session Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="869"/>
+        <source>CPAP Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="875"/>
+        <source>Sleep Stage Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="933"/>
+        <source>One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1232"/>
+        <source>Total ramp time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1236"/>
+        <source>Time outside of ramp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1246"/>
+        <source>AHI excluding ramp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1568"/>
+        <source>Sorry, your machine only provides compliance data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1587"/>
+        <source>"Nothing's here!"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1590"/>
+        <source>Bob is bored with this days lack of data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1869"/>
+        <source>Pick a Colour</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2131"/>
+        <source>This bookmarked is in a currently disabled area..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2174"/>
+        <source>Bookmark at %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2365"/>
+        <source>Show all graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Hide all events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Show all events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2385"/>
+        <source>Hide all graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ExportCSV</name>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="14"/>
+        <source>Export as CSV</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="24"/>
+        <source>Dates:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="37"/>
+        <source>Resolution:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="46"/>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="53"/>
+        <source>Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="60"/>
+        <source>Daily</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="85"/>
+        <source>Filename:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="107"/>
+        <source>Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="114"/>
+        <source>Export</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="131"/>
+        <source>Start:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="154"/>
+        <source>End:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="192"/>
+        <source>Quick Range:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="60"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="122"/>
+        <source>Most Recent Day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="205"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="125"/>
+        <source>Last Week</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="210"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="128"/>
+        <source>Last Fortnight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="215"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="131"/>
+        <source>Last Month</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="220"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="134"/>
+        <source>Last 6 Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="225"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="137"/>
+        <source>Last Year</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="230"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="119"/>
+        <source>Everything</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="235"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="108"/>
+        <source>Custom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="248"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="73"/>
+        <source>SleepyHead_</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="76"/>
+        <source>Details_</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="78"/>
+        <source>Sessions_</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="80"/>
+        <source>Summary_</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="87"/>
+        <source>Select file to export to</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="88"/>
+        <source>CSV Files (*.csv)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>DateTime</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Data/Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <source>Session Count</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>End</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>Total Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="207"/>
+        <source> Count</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="211"/>
+        <source> Avg</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="215"/>
+        <source> %1%</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>FPIconLoader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="128"/>
+        <source>Import Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>This Machine Record cannot be imported in this profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>The Day records overlap with already existing content.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="441"/>
+        <source>SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1007"/>
+        <source>&Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="981"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="998"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1035"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3050"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3107"/>
+        <source>about:blank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1073"/>
+        <source>Report Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1080"/>
+        <source>Standard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1090"/>
+        <source>Monthly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1097"/>
+        <source>Date Range</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1141"/>
+        <source>&Help Browser</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1204"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1224"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1244"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="2932"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1317"/>
+        <source>qrc:/docs/index.html</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1633"/>
+        <source>Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1683"/>
+        <source>Daily</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1727"/>
+        <source>Overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1771"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1096"/>
+        <source>Oximetry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1821"/>
+        <source>Import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1871"/>
+        <source>Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3136"/>
+        <source>&File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3154"/>
+        <source>&View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3172"/>
+        <source>&Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3188"/>
+        <source>&Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3192"/>
+        <source>&Advanced</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3196"/>
+        <source>Purge Oximetery Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3212"/>
+        <source>Rebuild CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3250"/>
+        <source>&Import Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3253"/>
+        <source>Shift+F2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3258"/>
+        <source>&Preferences</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3263"/>
+        <source>&Profiles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="276"/>
+        <source>E&xit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3268"/>
+        <source>Exit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3273"/>
+        <source>View &Daily</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3276"/>
+        <source>F5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3281"/>
+        <source>View &Overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3284"/>
+        <source>F6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3289"/>
+        <source>View &Welcome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3292"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3439"/>
+        <source>F4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3297"/>
+        <source>-</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3300"/>
+        <source>Ctrl+Tab</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3308"/>
+        <source>Use &AntiAliasing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3313"/>
+        <source>&About SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3321"/>
+        <source>&Fullscreen Toggle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3324"/>
+        <source>F11</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3332"/>
+        <source>Show Debug Pane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3337"/>
+        <source>&Reset Graph Layout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3342"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="273"/>
+        <source>Check for &Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3347"/>
+        <source>Take &Screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3350"/>
+        <source>F12</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3355"/>
+        <source>O&ximetry Wizard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3358"/>
+        <source>F7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3363"/>
+        <source>Print &Report</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3368"/>
+        <source>&Edit Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3376"/>
+        <source>&Link Graph Groups</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3520"/>
+        <source>Daily Calendar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3523"/>
+        <source>F9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3528"/>
+        <source>Backup &Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3386"/>
+        <source>Online Users &Guide</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3391"/>
+        <source>&Frequently Asked Questions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3396"/>
+        <source>&Automatic Oximetry Cleanup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3487"/>
+        <source>Toggle &Line Cursor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3401"/>
+        <source>Change &User</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3406"/>
+        <source>Purge &Current Selected Day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3411"/>
+        <source>All data for current CPAP machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3422"/>
+        <source>Right &Sidebar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3490"/>
+        <source>Ctrl+L</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3506"/>
+        <source>Daily Sidebar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3509"/>
+        <source>F8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3430"/>
+        <source>View S&tatistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1606"/>
+        <source>Navigation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1993"/>
+        <source>Bookmarks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3077"/>
+        <source>Records</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3202"/>
+        <source>Purge ALL CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3381"/>
+        <source>Exp&ort Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3425"/>
+        <source>F10</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3433"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3436"/>
+        <source>View Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3444"/>
+        <source>Import &ZEO Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3449"/>
+        <source>Import RemStar &MSeries Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3454"/>
+        <source>&Support SleepyHead Development</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3459"/>
+        <source>Sleep Disorder Terms &Glossary</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3464"/>
+        <source>Change &Language</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3469"/>
+        <source>Change &Data Folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3474"/>
+        <source>Import &Somnopose Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3479"/>
+        <source>Current Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="151"/>
+        <source>Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="942"/>
+        <source>Welcome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="272"/>
+        <source>&About</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="300"/>
+        <source>Loading...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="609"/>
+        <source>Loading Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="866"/>
+        <source>Access to Import has been blocked while recalculations are in progress.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1017"/>
+        <source>Importing Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="720"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2062"/>
+        <source>Please wait, importing from backup folder(s)...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="878"/>
+        <source>Please wait, scanning for CPAP data cards...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="318"/>
+        <source>When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Import Problem</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Couldn't find any valid Machine Data at
+
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="814"/>
+        <source>Please insert your CPAP data card...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="899"/>
+        <source>CPAP Data Located</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="916"/>
+        <source>Please wait, launching file dialog...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="922"/>
+        <source>No CPAP data card detected, launching file dialog...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="928"/>
+        <source>Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="929"/>
+        <source>Import Reminder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1079"/>
+        <source>Welcome to SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1082"/>
+        <source>About SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1083"/>
+        <source>This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1085"/>
+        <source>SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1087"/>
+        <source>This is a beta release, some features may not yet behave as expected.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1088"/>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1090"/>
+        <source>Currenly supported machines:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1091"/>
+        <source>CPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1093"/>
+        <source>ResMed S9 models (CPAP, Auto, VPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1094"/>
+        <source>DeVilbiss Intellipap (Auto)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1095"/>
+        <source>Fisher & Paykel ICON (CPAP, Auto)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1097"/>
+        <source>Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1098"/>
+        <source>ResMed S9 Oximeter Attachment</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1099"/>
+        <source>Online Help Resources</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1100"/>
+        <source>Note:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1101"/>
+        <source>I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1103"/>
+        <source>(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1114"/>
+        <source>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1116"/>
+        <source>Further Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1118"/>
+        <source>Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1120"/>
+        <source>Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1122"/>
+        <source>About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1125"/>
+        <source>Friendly forums to talk and learn about Sleep Apnea:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1126"/>
+        <source><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>Copyright:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>&copy;2011-2014</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1137"/>
+        <source>License:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1138"/>
+        <source>This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1141"/>
+        <source>DISCLAIMER:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1143"/>
+        <source>This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1145"/>
+        <source>The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1147"/>
+        <source>Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1149"/>
+        <source>*** <u>Use at your own risk</u> ***</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1293"/>
+        <source>Loading</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>Revision:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>branch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1331"/>
+        <source>Data Folder Location: <a href="file://%1">%2</a></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1355"/>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1366"/>
+        <source>Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2037"/>
+        <source>Are you sure you want to rebuild all CPAP data for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2040"/>
+        <source>Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2048"/>
+        <source>For some reason, SleepyHead does not have internal backups for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2051"/>
+        <source>Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2052"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2097"/>
+        <source>You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2100"/>
+        <source>Note as a precaution, the backup folder will be left in place.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2101"/>
+        <source>Are you <b>absolutely sure</b> you want to proceed?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2124"/>
+        <source>A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2649"/>
+        <source>%1's Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>Choose where to save journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>XML Files (*.xml)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2065"/>
+        <source>Because there are no internal backups to rebuild from, you will have to restore from your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2066"/>
+        <source>Would you like to import from your own backups now? (you will have no data visible for this machine until you do)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2587"/>
+        <source>Are you sure you want to delete oximetry data for %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2589"/>
+        <source><b>Please be aware you can not undo this operation!</b></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2609"/>
+        <source>Select the day with valid oximetry data in daily view first.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1332"/>
+        <source>Copyright</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="314"/>
+        <source><b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="315"/>
+        <source>If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="316"/>
+        <source>Make sure your keep your SleepyHead data folder backed up when trying testing versions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="317"/>
+        <source>Please ensure you are running the latest version before reporting any bugs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="319"/>
+        <source>Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="320"/>
+        <source>Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="321"/>
+        <source>This red message line is intentional, and will not be a feature in the final version...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Imported %1 CPAP session(s) from
+
+%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Import Success</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Already up to date with CPAP data at
+
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Up to date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="821"/>
+        <source>Choose a folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="892"/>
+        <source>A %1 file structure for a %2 was located at:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="894"/>
+        <source>A %1 file structure was located at:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="901"/>
+        <source>Would you like to import from this location?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="905"/>
+        <source>Specify</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1106"/>
+        <source>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1108"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1110"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1112"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1127"/>
+        <source><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1333"/>
+        <source>This software is released under the GNU Public License v3.0<br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1337"/>
+        <source>SleepyHead Project Page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1340"/>
+        <source>SleepyHead Wiki</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1344"/>
+        <source>Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1349"/>
+        <source>SleepyHead, brought to you by Jedimark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1353"/>
+        <source>Kudos & Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1354"/>
+        <source>Bugfixes, Patches and Platform Help:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Translators:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1361"/>
+        <source>3rd Party Libaries:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1362"/>
+        <source>SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1364"/>
+        <source>In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1371"/>
+        <source>Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1376"/>
+        <source>This software comes with absolutely no warranty, either express of implied.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1377"/>
+        <source>It comes with no guarantee of fitness for any particular purpose.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1378"/>
+        <source>No guarantees are made regarding the accuracy of any data this program displays.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1380"/>
+        <source>This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1382"/>
+        <source>This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1385"/>
+        <source>The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1387"/>
+        <source>Use this software entirely at your own risk.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1456"/>
+        <source>Access to Preferences has been blocked until recalculation completes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1092"/>
+        <source>Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1327"/>
+        <source>Build Date: %1 %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1329"/>
+        <source>Graphics Engine: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1545"/>
+        <source>There was an error saving screenshot to file "%1"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1547"/>
+        <source>Screenshot saved to file "%1"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1567"/>
+        <source>Printing Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1568"/>
+        <source>Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>Gah!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>If you can read this, the restart command didn't work. Your going to have to do it yourself manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2287"/>
+        <source>Performance will be degraded during these recalculations.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2288"/>
+        <source>Recalculating Indices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2300"/>
+        <source>Loading Event Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2302"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2362"/>
+        <source>Recalculating Summaries</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2374"/>
+        <source>Restart Required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2375"/>
+        <source>Recalculations are complete, the application now needs to restart to display the changes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Recalculations are now complete.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Task Completed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2404"/>
+        <source>There was a problem opening ZEO File: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2408"/>
+        <source>Zeo CSV Import complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2430"/>
+        <source>There was a problem opening MSeries block File: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2434"/>
+        <source>MSeries Import complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2492"/>
+        <source>There was a problem opening Somnopose Data File: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2496"/>
+        <source>Somnopause Data Import complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MinMaxWidget</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1773"/>
+        <source>Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1774"/>
+        <source>Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1775"/>
+        <source>Override</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1776"/>
+        <source>The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1782"/>
+        <source>The Minimum Y-Axis value.. Note this can be a negative number if you wish.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1783"/>
+        <source>The Maximum Y-Axis value.. Must be greater than Minimum to work.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1818"/>
+        <source>Scaling Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1840"/>
+        <source>This button resets the Min and Max to match the Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>NewProfile</name>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="14"/>
+        <source>Edit User Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="70"/>
+        <source>I agree to all the conditions above.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="111"/>
+        <source>User Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="137"/>
+        <source>User Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="152"/>
+        <source>Keep the kids out.. Nothing more.. This isn't meant to be uber security.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="155"/>
+        <source>Password Protect Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="182"/>
+        <source>Password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="196"/>
+        <source>...twice...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="213"/>
+        <source>Locale Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="285"/>
+        <source>Country</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="253"/>
+        <source>TimeZone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="54"/>
+        <source>about:blank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="240"/>
+        <source>DST Zone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="320"/>
+        <source>Personal Information (for reports)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="344"/>
+        <source>First Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="354"/>
+        <source>Last Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="364"/>
+        <source>D.O.B.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="380"/>
+        <source>Gender</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="393"/>
+        <source>Male</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="398"/>
+        <source>Female</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="414"/>
+        <source>Height</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="453"/>
+        <source>metric</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="458"/>
+        <source>archiac</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="471"/>
+        <source>Contact Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="498"/>
+        <location filename="../sleepyhead/newprofile.ui" line="773"/>
+        <source>Address</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="515"/>
+        <location filename="../sleepyhead/newprofile.ui" line="804"/>
+        <source>Email</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="525"/>
+        <location filename="../sleepyhead/newprofile.ui" line="794"/>
+        <source>Phone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="570"/>
+        <source>CPAP Treatment Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="597"/>
+        <source>Date Diagnosed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="611"/>
+        <source>Untreated AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="625"/>
+        <source>CPAP Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="633"/>
+        <source>CPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="638"/>
+        <source>APAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="643"/>
+        <source>Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="648"/>
+        <source>ASV</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="656"/>
+        <source>RX Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="702"/>
+        <source>Doctors / Clinic Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="729"/>
+        <source>Doctors Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="746"/>
+        <source>Practice Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="756"/>
+        <source>Patient ID</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="852"/>
+        <source>SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="867"/>
+        <source>TextLabel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="943"/>
+        <source>&Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="959"/>
+        <source>&Back</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="975"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="275"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="284"/>
+        <source>&Next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="59"/>
+        <source>Select Country</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="109"/>
+        <source>Welcome to SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="111"/>
+        <source>This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="114"/>
+        <source>SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="116"/>
+        <source>PLEASE READ CAREFULLY</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="117"/>
+        <source>SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="120"/>
+        <source>Accuracy of any data displayed is not and can not be guaranteed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="122"/>
+        <source>Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="125"/>
+        <source>The author will not be held liable for <u>anything</u> related to the use or misuse of this software.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="129"/>
+        <source>Use of this software is entirely at your own risk.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="132"/>
+        <source>SleepyHead is copyright &copy;2011-2014 Mark Watkins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="157"/>
+        <source>Please provide a username for this profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="167"/>
+        <source>Passwords don't match</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Profile Changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Accept and save this information?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="273"/>
+        <source>&Finish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="449"/>
+        <source>&Close this window</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Overview</name>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="68"/>
+        <source>Range:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="82"/>
+        <source>Last Week</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="87"/>
+        <source>Last Two Weeks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="92"/>
+        <source>Last Month</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="97"/>
+        <source>Last Two Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="102"/>
+        <source>Last Three Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="107"/>
+        <source>Last 6 Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="112"/>
+        <source>Last Year</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="117"/>
+        <source>Everything</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="122"/>
+        <source>Custom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="130"/>
+        <source>Start:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="153"/>
+        <source>End:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="176"/>
+        <source>Reset view to selected date range</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="195"/>
+        <location filename="../sleepyhead/overview.ui" line="244"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="225"/>
+        <source>Toggle Graph Visibility</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="260"/>
+        <source>Drop down to see list of graphs to switch on/off.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="264"/>
+        <source>Graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="121"/>
+        <source>Respiratory
+Disturbance
+Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="123"/>
+        <source>Apnea
+Hypopnea
+Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage
+(hours)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times
+(hours)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>% in %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <source>%1
+(% of night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>Large Leaks
+(% of night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI
+Shows RDI Clusters
+(RDI/hr)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI
+Shows AHI Clusters
+(AHI/hr)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="157"/>
+        <source>Tidal
+Volume
+(ml)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="158"/>
+        <source>Minute
+Ventilation
+(L/min)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="159"/>
+        <source>Target
+Ventilation
+(L/min)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="160"/>
+        <source>Patient
+Triggered
+Breaths
+(%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="161"/>
+        <source>
+(count)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="163"/>
+        <source>Oxygen Saturation
+(%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="164"/>
+        <source>SensAwake
+(count)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="167"/>
+        <source>Body
+Mass
+Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="168"/>
+        <source>How you felt
+(0-10)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="185"/>
+        <source>Zombie Meter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="254"/>
+        <source>breaths/min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="262"/>
+        <source>L/b</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="284"/>
+        <source>%PTB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="311"/>
+        <source>% PB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="314"/>
+        <source>% %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="670"/>
+        <source>Show all graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="683"/>
+        <source>Hide all graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>OximeterImport</name>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="14"/>
+        <source>Dialog</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="39"/>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="35"/>
+        <source>Oximeter Import Wizard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="749"/>
+        <source>Skip this page next time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="789"/>
+        <source><html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="823"/>
+        <source>Where would you like to import from?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="846"/>
+        <source><html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="852"/>
+        <source>Directly from a recording on a device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="872"/>
+        <source><html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="878"/>
+        <source>Record attached to computer overnight (provides plethysomogram)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="895"/>
+        <source><html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="901"/>
+        <source>Import from a datafile saved by another program, like SpO2Review</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="942"/>
+        <source><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p>& [...]
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="964"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1000"/>
+        <source>Please connect your oximeter device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1026"/>
+        <source>Press Start to commence recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1072"/>
+        <source>Show Live Graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1103"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1357"/>
+        <source>Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1139"/>
+        <source>SpO2 %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1221"/>
+        <source>Pulse Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1313"/>
+        <source>Multiple Sessions Detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1329"/>
+        <source>Please choose which one you want to import into SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1352"/>
+        <source>Start Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1362"/>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1379"/>
+        <source>Import Completed. When did the recording start?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1403"/>
+        <source>Day recording (normally would of) started</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1449"/>
+        <source>Oximeter Starting time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1461"/>
+        <source>I want to use the time reported by my oximeter's built in clock.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1477"/>
+        <source>I started this oximeter recording at (or near) the same time as a session on my CPAP machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1506"/>
+        <source><html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1538"/>
+        <source><html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1559"/>
+        <source>Choose CPAP session to sync to:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1598"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1637"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1679"/>
+        <source>You can manually adjust the time here if required:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1700"/>
+        <source>HH:mm:ssap</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1753"/>
+        <source>&Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1760"/>
+        <source>&Information Page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1780"/>
+        <source>&Retry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1787"/>
+        <source>&Choose Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1794"/>
+        <source>&End Recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1801"/>
+        <source>&Sync and Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1808"/>
+        <source>&Save and Finish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1815"/>
+        <source>&Start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="170"/>
+        <source>Scanning for compatible oximeters</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="202"/>
+        <source>Could not detect any connected oximeter devices.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="209"/>
+        <source>Connecting to %1 Oximeter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="269"/>
+        <source>"%1", session %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="288"/>
+        <source>Waiting for %1 to start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="289"/>
+        <source>Waiting for the device to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="291"/>
+        <source>Select upload option on %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="292"/>
+        <source>Waiting for you to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="323"/>
+        <source>%1 device is uploading data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="324"/>
+        <source>Please wait until oximeter upload process completes. Do not unplug your oximeter.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="341"/>
+        <source>Oximeter import completed..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Select a valid oximetry data file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Oximetry Files (*.spo *.spor *.spo2 *.dat)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="391"/>
+        <source>No Oximetery module could parse the given file:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="413"/>
+        <source>Oximeter not detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="420"/>
+        <source>Couldn't access oximeter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="431"/>
+        <source>Live Oximetery Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="434"/>
+        <source>Starting up...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="435"/>
+        <source>If you can still read this after a few seconds, cancel and try again</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="478"/>
+        <source>Live Import Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="479"/>
+        <source>Live Oximetery Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="480"/>
+        <source>Live Oximetery import has been stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="527"/>
+        <source>%1 session(s) on %2, starting at %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="531"/>
+        <source>No CPAP data available on %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="537"/>
+        <source>%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="650"/>
+        <source>Recording...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="657"/>
+        <source>Finger not detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="750"/>
+        <source>I want to use the time my computer recorded for this live oximetry session.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="753"/>
+        <source>I need to set the time manually, because my oximeter doesn't have an internal clock.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="764"/>
+        <source>Something went wrong getting session data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="993"/>
+        <source>CMS50 Session %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Oximetry</name>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="89"/>
+        <source>Date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="102"/>
+        <source>d/MM/yy h:mm:ss AP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="131"/>
+        <source>R&eset</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="160"/>
+        <source>SpO2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="245"/>
+        <source>Pulse</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="346"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="366"/>
+        <source>&Open .spo/R File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="385"/>
+        <source>Serial &Import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="398"/>
+        <source>&Start Live</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="421"/>
+        <source>Serial Port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="450"/>
+        <source>&Rescan Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PreferencesDialog</name>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="23"/>
+        <source>Preferences</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="58"/>
+        <source>&Import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="79"/>
+        <source>Session Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="102"/>
+        <source>Combine Close Sessions </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="112"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="197"/>
+        <source>Minutes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="132"/>
+        <source>Multiple sessions closer together than this value will be kept on the same day.
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="187"/>
+        <source>Ignore Short Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="211"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="252"/>
+        <source>Day Split Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="262"/>
+        <source>Sessions starting before this time will go to the previous calendar day.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="282"/>
+        <source>Keep session data in memory to speed up revisiting days.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="285"/>
+        <source>Cache Session Data (uses more system memory)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="361"/>
+        <source>Summary only data is more accurate for ResMed users if this is left on.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="364"/>
+        <source>Don't Split Summary Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="395"/>
+        <source>Session Storage Options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="419"/>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+SleepyHead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="428"/>
+        <source>Create SD Card Backups during Import (Turn this off at your own peril!)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="435"/>
+        <source>This makes SleepyHead's data take around half as much space.
+But it makes import and day changing take longer.. 
+If you've got a new computer with a small solid state disk, this is a good option.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="440"/>
+        <source>Compress Session Data (makes SleepyHead data smaller, but day changing slower.)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="447"/>
+        <source>Compress ResMed (EDF) backups to save disk space.
+Backed up EDF files are stored in the .gz format, 
+which is common on Mac & Linux platforms.. 
+
+SleepyHead can import from this compressed backup directory natively.. 
+To use with ResScan will require the .gz files to be uncompressed first..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="455"/>
+        <source>Compress SD Card Backups (slower first import, but makes backups smaller)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="467"/>
+        <source>The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="477"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data.  </span></p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="508"/>
+        <source>&CPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="535"/>
+        <source>CPAP Mask Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="562"/>
+        <source>Mask Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="569"/>
+        <source>Generic mask type. Select the one that's closest to your mask.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="587"/>
+        <source>Description</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="594"/>
+        <source>The name of your mask, or at least the name you call it.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="607"/>
+        <source>Method of unintentional leaks calculation if not provided by your machine.
+Note: Statistical Model is experimental.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="612"/>
+        <source>Mask Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="617"/>
+        <source>Statistical Model</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="631"/>
+        <source>Leak calcs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="644"/>
+        <source>Started Using</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="657"/>
+        <source>The date you started using this mask</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="673"/>
+        <source>Leak Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="687"/>
+        <source>Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="692"/>
+        <source>Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1153"/>
+        <source>Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1156"/>
+        <source>Use RDI instead of AHI (PRS1 only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1069"/>
+        <source>Don't show any compliance information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1072"/>
+        <source>Show Compliance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1105"/>
+        <source>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1108"/>
+        <source> hours</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1130"/>
+        <source>as over</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1137"/>
+        <source>of usage per night</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="728"/>
+        <source>Enable/disable experimental event flagging enhancements. 
+It allows detecting borderline events, and some the machine missed.
+This option must be enabled before import, otherwise a purge is required.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="733"/>
+        <source>Custom User Event Flagging</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="797"/>
+        <source>Flow Restriction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="843"/>
+        <source>Percentage of restriction in airflow from the median value. 
+A value of 20% works well for detecting apneas. </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="760"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="847"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1432"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1487"/>
+        <source>%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="875"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="821"/>
+        <source>Duration of airflow restriction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="804"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="824"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1377"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1406"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1477"/>
+        <source>s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="814"/>
+        <source>Event Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="857"/>
+        <source>Allow duplicates near machine events.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="947"/>
+        <source>AHI/Hour Graph Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="983"/>
+        <source>Window</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="990"/>
+        <source>Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="994"/>
+        <source> minutes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1010"/>
+        <source>Reset the counter to zero at beginning of each (time) window.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1013"/>
+        <source>Zero Reset</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1029"/>
+        <source>CPAP Clock Drift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="318"/>
+        <source>Do not import sessions older than:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="325"/>
+        <source>Sessions older than this date will not be imported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="351"/>
+        <source>dd MMMM yyyy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1036"/>
+        <source>Don't touch this unless you know your CPAP clock is out.
+Try to sync it to your PC's clock (which should be synced to a timeserver)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1040"/>
+        <source> seconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="770"/>
+        <source>Show in Event Breakdown Piechart</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="777"/>
+        <source>#1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="784"/>
+        <source>#2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="905"/>
+        <source>This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="908"/>
+        <source>Resync Machine Detected Events (Experimental)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="934"/>
+        <source>User definable threshold considered large leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="937"/>
+        <source> L/min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="924"/>
+        <source>Whether to show the leak redline in the leak graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="927"/>
+        <source>Show Leak Redline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1189"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1261"/>
+        <source>Search</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1310"/>
+        <source>&Oximetry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1537"/>
+        <source>Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1550"/>
+        <source>Tries to forces the oximetry data to link with CPAP when possible.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1553"/>
+        <source>Link Oximetry and CPAP graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1367"/>
+        <source>SPO2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1429"/>
+        <source>Percentage drop in oxygen saturation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1422"/>
+        <source>Pulse</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1387"/>
+        <source>Sudden change in Pulse Rate of at least this amount</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1390"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1514"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1521"/>
+        <source> bpm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1374"/>
+        <source>Minimum duration of drop in oxygen saturation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1403"/>
+        <source>Minimum duration of pulse change event.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1474"/>
+        <source>Small chunks of oximetry data under this amount will be discarded.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1649"/>
+        <source>&General</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1798"/>
+        <source>General Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1850"/>
+        <source>Daily view navigation buttons will skip over days without data records</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1853"/>
+        <source>Skip over Empty Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1839"/>
+        <source>Allow use of multiple CPU cores where available to improve performance. 
+Mainly affects the importer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1843"/>
+        <source>Enable Multithreading</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1829"/>
+        <source>Bypass the login screen and load the most recent User Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1832"/>
+        <source>Skip Login Screen</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2476"/>
+        <source><html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1679"/>
+        <source>Changes to the following settings needs a restart, but not a recalc.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1331"/>
+        <source>Oximetery Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1682"/>
+        <source>Preferred Calculation Methods</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1709"/>
+        <source>Middle Calculations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1716"/>
+        <source>Upper Percentile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1723"/>
+        <source>For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1737"/>
+        <source>Median is recommended for ResMed users.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1741"/>
+        <source>Median</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1746"/>
+        <source>Weighted Average</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1751"/>
+        <source>Normal Average</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1771"/>
+        <source>ResMed users probably should use 99th Percentile for visual consistency.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1775"/>
+        <source>True Maximum</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1780"/>
+        <source>99% Percentile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1788"/>
+        <source>Maximum Calcs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1892"/>
+        <source>Automatically Check For Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1909"/>
+        <source>Check for new version every</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1916"/>
+        <source>Sourceforge hosts this project for free.. Please be considerate of their resources..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1932"/>
+        <source>days.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1997"/>
+        <source>&Check for Updates now</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2020"/>
+        <source>Last Checked For Updates: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2033"/>
+        <source>TextLabel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2055"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2064"/>
+        <source>I want to try experimental and test builds (Advanced users only please.)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2088"/>
+        <source>&Appearance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2120"/>
+        <source>Graph Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2127"/>
+        <source>Bar Tops</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2132"/>
+        <source>Line Chart</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2140"/>
+        <source>Overview Linecharts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2165"/>
+        <source><html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2193"/>
+        <source>milliseconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2259"/>
+        <source>Scroll Dampening</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2351"/>
+        <source>Overlay Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2361"/>
+        <source>Line Thickness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2373"/>
+        <source>The pixel thickness of line plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2466"/>
+        <source>Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2317"/>
+        <source>The visual method of displaying waveform overlay flags.
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2322"/>
+        <source>Standard Bars</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2335"/>
+        <source>Graph Height</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2285"/>
+        <source>Default display height of graphs in pixels</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2213"/>
+        <source>How long you want the tooltips to stay visible.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1629"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style= [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">t [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1166"/>
+        <source>Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1212"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1284"/>
+        <source>Reset &Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1225"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1297"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1238"/>
+        <source>Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1355"/>
+        <source>Flag rapid changes in oximetry stats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1448"/>
+        <source>Other oximetry options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1454"/>
+        <source>Flag SPO2 Desaturations Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1464"/>
+        <source>Discard segments under</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1494"/>
+        <source>Flag Pulse Rate Above</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1504"/>
+        <source>Flag Pulse Rate Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1574"/>
+        <source>Contec CMS50D+/E/F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1579"/>
+        <source>Contec CMS50F v3.7+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1584"/>
+        <source>ChoiceMMed MD300W1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1589"/>
+        <source>ResMed S9 Oximeter Module</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1610"/>
+        <source>If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1613"/>
+        <source>Update Oximeter Clock during import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1819"/>
+        <source>Show flags for machine detected events that haven't been identified yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1822"/>
+        <source>Show Unknown Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1860"/>
+        <source>Import without nagging</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2269"/>
+        <source>Tooltip Timeout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2304"/>
+        <source>Graph Tooltips</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2327"/>
+        <source>Top Markers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2422"/>
+        <source>Other Visual Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2428"/>
+        <source>Anti-Aliasing applies smoothing to graph plots.. 
+Certain plots look more attractive with this on. 
+This also affects printed reports.
+
+Try it and see if you like it.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2435"/>
+        <source>Use Anti-Aliasing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2442"/>
+        <source>Makes certain plots look more "square waved".</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2445"/>
+        <source>Square Wave Plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2452"/>
+        <source>Allows graphs to be "screenshotted" for display purposes.
+The Event Breakdown PIE chart uses this method, as does
+the printing code.
+Unfortunately some older computers/versions of Qt can cause
+this application to be unstable with this feature enabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2459"/>
+        <source>Show event breakdown pie chart</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2469"/>
+        <source>Use Pixmap Caching</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2479"/>
+        <source>Animations && Fancy Stuff</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2486"/>
+        <source>Whether to allow changing yAxis scales by double clicking on yAxis labels</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2489"/>
+        <source>Allow YAxis Scaling</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2508"/>
+        <source>Application Fonts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2543"/>
+        <source>Font</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2562"/>
+        <source>Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2581"/>
+        <source>Bold  </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2603"/>
+        <source>Italic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2616"/>
+        <source>Application</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2680"/>
+        <source>Graph Text</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2741"/>
+        <source>Graph Titles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2802"/>
+        <source>Big  Text</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2863"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="410"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="530"/>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2920"/>
+        <source>&Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2927"/>
+        <source>&Ok</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="68"/>
+        <source>Nasal Pillows</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="406"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="525"/>
+        <source>Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="407"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="526"/>
+        <source>Color</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="408"/>
+        <source>Flag Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="409"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="529"/>
+        <source>Label</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="425"/>
+        <source>CPAP Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="426"/>
+        <source>Oximeter Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="427"/>
+        <source>Positional Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="428"/>
+        <source>Sleep Stage Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="429"/>
+        <source>Unknown Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="468"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="589"/>
+        <source>Double click to change the descriptive name this channel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="476"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="596"/>
+        <source>Double click to change the default color for this channel plot/flag/data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="484"/>
+        <source>Here you can change the type of flag shown for this event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="489"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="612"/>
+        <source>This is the short-form label to indicate this channel on screen.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="495"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="618"/>
+        <source>This is a description of what this channel does.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="527"/>
+        <source>Lower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="528"/>
+        <source>Upper</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="546"/>
+        <source>CPAP Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="547"/>
+        <source>Oximeter Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="548"/>
+        <source>Positional Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="549"/>
+        <source>Sleep Stage Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="602"/>
+        <source>Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="607"/>
+        <source>Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="709"/>
+        <source>Data Reindex Required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="710"/>
+        <source>A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.
+
+Are you sure you want to make these changes?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="716"/>
+        <source>Restart Required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="717"/>
+        <source>One or more of the changes you have made will require this application to be restarted,
+in order for these changes to come into effect.
+
+Would you like do this now?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1141"/>
+        <source>Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1142"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="61"/>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="62"/>
+        <source>Minor Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="63"/>
+        <source>Span</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="64"/>
+        <source>Always Minor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1095"/>
+        <source>This may not be a good idea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1096"/>
+        <source>ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1097"/>
+        <source>If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1098"/>
+        <source>If you need to conserve disk space, please remember to carry out manual backups.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1099"/>
+        <source>Are you sure you want to disable these backups?</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ProfileSelect</name>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="14"/>
+        <source>Select Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="115"/>
+        <source>Search:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="188"/>
+        <source>Start with the selected user profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="212"/>
+        <source>Create a new user profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="232"/>
+        <source>Choose a different SleepyHead data folder.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="238"/>
+        <source>&Different Folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="271"/>
+        <source>SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="284"/>
+        <source>[version]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="307"/>
+        <source>Click here if you didn't want to start SleepyHead.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="310"/>
+        <source>&Quit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="367"/>
+        <source>Folder:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="380"/>
+        <source>The current location of SleepyHead data store.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="386"/>
+        <source>[data directory]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="215"/>
+        <source>New Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="191"/>
+        <source>&Select User</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="94"/>
+        <source>Open Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="95"/>
+        <source>Edit Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="97"/>
+        <source>Delete Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="144"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="224"/>
+        <source>Enter Password for %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="163"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="373"/>
+        <source>Incorrect Password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="165"/>
+        <source>You entered the password wrong too many times.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>Enter the word DELETE below to confirm.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>You are about to destroy profile '%1'.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>Sorry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>You need to enter DELETE in capital letters.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="214"/>
+        <source>Could not open profile.. You will need to delete this profile directory manually</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="215"/>
+        <source>You will find it under the following location:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="243"/>
+        <source>You entered an incorrect password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="246"/>
+        <source>If you're trying to delete because you forgot the password, you need to delete it manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="259"/>
+        <source>There was an error deleting the profile directory, you need to manually remove it.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="263"/>
+        <source>Profile '%1' was succesfully deleted</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="292"/>
+        <source>Create new profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="357"/>
+        <source>Enter Password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="376"/>
+        <source>You entered an Incorrect Password too many times. Exiting!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1276"/>
+        <source>No Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="496"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="86"/>
+        <source>On</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="497"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="87"/>
+        <source>Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="321"/>
+        <source>cm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="322"/>
+        <source>"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="323"/>
+        <source>ft</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="324"/>
+        <source>lb</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="325"/>
+        <source>oz</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="326"/>
+        <source>Kg</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="327"/>
+        <source>cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="328"/>
+        <source>Hours</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="334"/>
+        <source>bpm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="339"/>
+        <source>?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="341"/>
+        <source>Severity (0-1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="345"/>
+        <source>Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="346"/>
+        <source>Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="349"/>
+        <source>Please Note</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="352"/>
+        <source>Compliance Only :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="353"/>
+        <source>Graphs Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="354"/>
+        <source>Summary Only :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="355"/>
+        <source>Sessions Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="359"/>
+        <source>&Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="360"/>
+        <source>&No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="361"/>
+        <source>&Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="362"/>
+        <source>&Destroy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="363"/>
+        <source>&Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="365"/>
+        <source>BMI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="366"/>
+        <source>Weight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="367"/>
+        <source>Zombie</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="368"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="259"/>
+        <source>Pulse Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="369"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="266"/>
+        <source>SpO2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="370"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="273"/>
+        <source>Plethy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="371"/>
+        <source>Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="373"/>
+        <source>Daily</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="374"/>
+        <source>Overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="375"/>
+        <source>Oximetry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="377"/>
+        <source>Oximeter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="378"/>
+        <source>Event Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="381"/>
+        <source>CPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="382"/>
+        <source>BiPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="383"/>
+        <source>Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="384"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1065"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1072"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1076"/>
+        <source>EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="385"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1068"/>
+        <source>Min EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="386"/>
+        <source>Max EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="387"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1066"/>
+        <source>IPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="390"/>
+        <source>APAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="391"/>
+        <source>ASV</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="392"/>
+        <source>ST/ASV</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="394"/>
+        <source>Humidifier</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="396"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="187"/>
+        <source>H</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="397"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="181"/>
+        <source>OA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="398"/>
+        <source>A</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="399"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="175"/>
+        <source>CA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="400"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="197"/>
+        <source>FL</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="402"/>
+        <source>LE</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="403"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="233"/>
+        <source>EP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="404"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="206"/>
+        <source>VS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="406"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="211"/>
+        <source>VS2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="407"/>
+        <source>RERA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="408"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2078"/>
+        <source>PP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="409"/>
+        <source>P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="410"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="202"/>
+        <source>RE</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="411"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="228"/>
+        <source>NR</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="412"/>
+        <source>NRI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="413"/>
+        <source>O2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="414"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="283"/>
+        <source>PC</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="243"/>
+        <source>UF1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="416"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="248"/>
+        <source>UF2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="417"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="253"/>
+        <source>UF3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="419"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1070"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1073"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1077"/>
+        <source>PS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="421"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>RDI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="422"/>
+        <source>AI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="423"/>
+        <source>HI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="424"/>
+        <source>UAI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="425"/>
+        <source>CAI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="426"/>
+        <source>FLI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="428"/>
+        <source>REI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="429"/>
+        <source>EPI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="388"/>
+        <source>Min IPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="329"/>
+        <source>Minutes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="330"/>
+        <source>Seconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="331"/>
+        <source>Events/hr</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="333"/>
+        <source>Hz</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="336"/>
+        <source>Litres</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="337"/>
+        <source>ml</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="338"/>
+        <source>Breaths/min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="342"/>
+        <source>Degrees</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="347"/>
+        <source>Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="348"/>
+        <source>Busy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="389"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1069"/>
+        <source>Max IPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="401"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="238"/>
+        <source>SA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="430"/>
+        <source>ÇSR</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="431"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="169"/>
+        <source>PB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="435"/>
+        <source>IE</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="371"/>
+        <source>Insp. Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="437"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="367"/>
+        <source>Exp. Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="438"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>Resp. Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="439"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="195"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="379"/>
+        <source>Flow Limitation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="440"/>
+        <source>Flow Limit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="441"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="236"/>
+        <source>SensAwake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="442"/>
+        <source>Pat. Trig. Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="443"/>
+        <source>Tgt. Min. Vent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="444"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Vent.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="445"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Minute Vent.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="446"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="329"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Tidal Volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="447"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Resp. Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="448"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="334"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Snore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="449"/>
+        <source>Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="450"/>
+        <source>Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="453"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Total Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="454"/>
+        <source>Unintentional Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="455"/>
+        <source>MaskPressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="456"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="314"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Flow Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="457"/>
+        <source>Sleep Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="458"/>
+        <source>Usage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="459"/>
+        <source>Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="460"/>
+        <source>Pr. Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="351"/>
+        <source>No Data Available</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="462"/>
+        <source>Bookmarks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="463"/>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="465"/>
+        <source>Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="466"/>
+        <source>Model</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="467"/>
+        <source>Brand</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="468"/>
+        <source>Serial</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="469"/>
+        <source>Series</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="470"/>
+        <source>Machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="471"/>
+        <source>Channel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="472"/>
+        <source>Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="477"/>
+        <source>Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="478"/>
+        <source>DOB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="479"/>
+        <source>Phone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="480"/>
+        <source>Address</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="481"/>
+        <source>Email</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="482"/>
+        <source>Patient ID</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="483"/>
+        <source>Date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="485"/>
+        <source>Bedtime</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="486"/>
+        <source>Wake-up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="487"/>
+        <source>Mask Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="488"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="124"/>
+        <source>Unknown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="489"/>
+        <source>None</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="490"/>
+        <source>Ready</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="492"/>
+        <source>First</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="493"/>
+        <source>Last</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="494"/>
+        <source>Start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="495"/>
+        <source>End</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="498"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2124"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="499"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2125"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="501"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1062"/>
+        <source>Min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="502"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1063"/>
+        <source>Max</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="503"/>
+        <source>Med</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="505"/>
+        <source>Average</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="506"/>
+        <source>Median</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="507"/>
+        <source>Avg</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="508"/>
+        <source>W-Avg</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="262"/>
+        <source>Import Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="263"/>
+        <source>This Machine Record cannot be imported in this profile.
+The Day records overlap with already existing content.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="384"/>
+        <source>Non Data Capable Machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="385"/>
+        <source>Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="386"/>
+        <source>I'm sorry to report that SleepyHead can only track hours of use for this machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2169"/>
+        <source>15mm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2168"/>
+        <source>22mm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2082"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2084"/>
+        <source>Flex Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2083"/>
+        <source>PRS1 pressure relief mode.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2089"/>
+        <source>C-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2090"/>
+        <source>C-Flex+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2091"/>
+        <source>A-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2092"/>
+        <source>Rise Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2093"/>
+        <source>Bi-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2097"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2099"/>
+        <source>Flex Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2098"/>
+        <source>PRS1 pressure relief setting.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2103"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2134"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2156"/>
+        <source>x1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2104"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2135"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2157"/>
+        <source>x2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2105"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2136"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2158"/>
+        <source>x3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2106"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2137"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2159"/>
+        <source>x4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2107"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2138"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2160"/>
+        <source>x5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2111"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2113"/>
+        <source>Humidifier Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2112"/>
+        <source>PRS1 humidifier connected?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2115"/>
+        <source>Disconnected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2116"/>
+        <source>Connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2120"/>
+        <source>Heated Tubing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2121"/>
+        <source>Heated Tubing Connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2122"/>
+        <source>Headed Tubing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2129"/>
+        <source>Humidification Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2130"/>
+        <source>PRS1 Humidification level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2131"/>
+        <source>Humid. Lvl.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2142"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2143"/>
+        <source>System One Resistance Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2144"/>
+        <source>Sys1 Resist. Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2151"/>
+        <source>System One Resistance Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2152"/>
+        <source>System One Mask Resistance Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2153"/>
+        <source>Sys1 Resist. Set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2164"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2166"/>
+        <source>Hose Diameter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2165"/>
+        <source>Diameter of primary CPAP hose</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2173"/>
+        <source>System One Resistance Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2174"/>
+        <source>Whether System One resistance settings are available to you.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2175"/>
+        <source>Sys1 Resist. Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2182"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2184"/>
+        <source>Auto On</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2183"/>
+        <source>A few breaths automatically starts machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2191"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2193"/>
+        <source>Auto Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2192"/>
+        <source>Machine automatically switches off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2200"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2202"/>
+        <source>Mask Alert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2201"/>
+        <source>Whether or not machine allows Mask checking.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2209"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2211"/>
+        <source>Show AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2210"/>
+        <source>Whether or not machine shows AHI via LCD panel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2223"/>
+        <source>Unknown PRS1 Code %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2224"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2225"/>
+        <source>PRS1_%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2290"/>
+        <source>Timed Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2291"/>
+        <source>Machine Initiated Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2292"/>
+        <source>TB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/preferences.cpp" line="33"/>
+        <source>Windows User</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="308"/>
+        <source>SleepyHead (%1) needs to upgrade its database for %2 %3 %4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="321"/>
+        <source><b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="322"/>
+        <source><i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="256"/>
+        <source>Launching Windows Explorer failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="257"/>
+        <source>Could not find explorer.exe in path to launch Windows Explorer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="325"/>
+        <source>SleepyHead does not yet have any automatic card backups stored for this device.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="326"/>
+        <source>This means you will need to import this machine data again afterwards from your own backups or data card.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Important:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="330"/>
+        <source>If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="331"/>
+        <source>Are you ready to upgrade, so you can run the new version of SleepyHead?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="334"/>
+        <source>Machine Database Changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="345"/>
+        <source>Sorry, the purge operation failed, which means this version of SleepyHead can't start.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="346"/>
+        <source>The machine data folder needs to be removed manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="347"/>
+        <source>This folder currently resides at the following location:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="353"/>
+        <source>Rebuilding from %1 Backup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="358"/>
+        <source>Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="365"/>
+        <source>SleepyHead will now start the import wizard so you can reinstall your %1 data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="375"/>
+        <source>SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="377"/>
+        <source>Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="81"/>
+        <source>Release Notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="92"/>
+        <source>&Ok, get on with it..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="164"/>
+        <source>Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="171"/>
+        <source>A faster build of SleepyHead may be available</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="172"/>
+        <source>You will not be bothered with this message again.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="173"/>
+        <source>This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="178"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="189"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="191"/>
+        <source>If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="201"/>
+        <source>Incompatible Graphics Hardware</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="202"/>
+        <source>This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="203"/>
+        <source>You may need to update your computers graphics drivers from the GPU makers website. %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="204"/>
+        <source>(<a href='http://intel.com/support'>Intel's support site</a>)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="205"/>
+        <source>Because graphs will not render correctly, and it may cause crashes, this build will now exit.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="206"/>
+        <source>Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>No SleepyHead data folder was found.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>Would you like SleepyHead to use the default location for storing its data?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>As you did not select a data folder, SleepyHead will exit.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>Next time you run, you will be asked again.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>You did not select a directory.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>SleepyHead will now start with your old one.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="344"/>
+        <source>Question</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="245"/>
+        <source>Choose or create new folder for SleepyHead data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="250"/>
+        <source>Exiting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="266"/>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="267"/>
+        <source>Are you sure you want to use this folder?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1393"/>
+        <source>About SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1409"/>
+        <source>&Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1413"/>
+        <source>&Donate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="40"/>
+        <source>Unspecified</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="41"/>
+        <source>Nasal Pillows</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="42"/>
+        <source>Hybrid F/F Mask</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="43"/>
+        <source>Nasal Interface</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="44"/>
+        <source>Full-Face Mask</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1132"/>
+        <source>Are you sure you want to reset all your channel colors and settings to defaults?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="39"/>
+        <source>There are no graphs visible to print</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="56"/>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="96"/>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="97"/>
+        <source>Printing %1 Report</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="130"/>
+        <source>%1 Report</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="180"/>
+        <source>: %1 hours, %2 minutes, %3 seconds
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Range</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Fixed %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="270"/>
+        <source>RDI	%1
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="272"/>
+        <source>AHI	%1
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="306"/>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="310"/>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="314"/>
+        <source>UAI=%1 </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="316"/>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="384"/>
+        <source>Reporting from %1 to %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="451"/>
+        <source>Entire Day's Flow Waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="457"/>
+        <source>Current Selection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="467"/>
+        <source>Entire Day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="586"/>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="592"/>
+        <source>Page %1 of %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="659"/>
+        <source>SleepyHead has finished sending the job to the printer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Feb</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Mar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Apr</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>May</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jun</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Jul</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Aug</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Sep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Oct</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Nov</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Dec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="404"/>
+        <source>Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="402"/>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="405"/>
+        <source>Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="419"/>
+        <source>(% %1 in events)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="92"/>
+        <source>Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="104"/>
+        <source>Therapy Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="108"/>
+        <source>Inspiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="112"/>
+        <source>Lower Inspiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="116"/>
+        <source>Higher Inspiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="120"/>
+        <source>Expiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="124"/>
+        <source>Lower Expiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="128"/>
+        <source>Higher Expiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="132"/>
+        <source>Pressure Support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="137"/>
+        <source>PS Min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <source>Pressure Support Minimum</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="141"/>
+        <source>PS Max</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <source>Pressure Support Maximum</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Min Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Minimum Therapy Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Max Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Maximum Therapy Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="153"/>
+        <source>Ramp Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <source>Ramp Delay Period</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="157"/>
+        <source>Ramp Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <source>Starting Ramp Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="161"/>
+        <source>Ramp Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="162"/>
+        <source>Ramp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="167"/>
+        <source>Periodic Breathing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="168"/>
+        <source>A period of periodic breathing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="209"/>
+        <source>Vibratory Snore (VS2) </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="425"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Mask On Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Time started according to str.edf</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="430"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>Summary Only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="332"/>
+        <source>%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="173"/>
+        <source>Clear Airway Apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="174"/>
+        <source>An apnea where the airway is open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="179"/>
+        <source>Obstructive Apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="180"/>
+        <source>An apnea caused by airway obstruction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="185"/>
+        <source>Hypopnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="186"/>
+        <source>A partially obstructed airway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="190"/>
+        <source>Unclassified Apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="191"/>
+        <source>An apnea that could not fit into a category</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="192"/>
+        <source>UA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="196"/>
+        <source>An restriction in breathing from normal, causing a flattening of the flow waveform.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="200"/>
+        <source>Respiratory Effort Related Arousal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="201"/>
+        <source>An restriction in breathing that causes an either an awakening or sleep disturbance.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>Vibratory Snore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>A vibratory snore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="210"/>
+        <source>A vibratory snore as detcted by a System One machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2076"/>
+        <source>Pressure Pulse</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2077"/>
+        <source>A pulse of pressure 'pinged' to detect a closed airway.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="451"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="221"/>
+        <source>Large Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="216"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="222"/>
+        <source>A large mask leak affecting machine performance.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="452"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="223"/>
+        <source>LL</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="226"/>
+        <source>Non Responding Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="227"/>
+        <source>A type of respiratory event that won't respond to a pressure increase.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="231"/>
+        <source>Expiratory Puff</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="232"/>
+        <source>Intellipap event where you breathe out your mouth.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="237"/>
+        <source>SensAwake feature will reduce pressure when waking is detected.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="241"/>
+        <source>User Flag #1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="242"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="252"/>
+        <source>A user definable event detected by SleepyHead's flow waveform processor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="246"/>
+        <source>User Flag #2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="251"/>
+        <source>User Flag #3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <source>Heart rate in beats per minute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>Blood-oxygen saturation percentage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>SpO2 %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="271"/>
+        <source>Plethysomogram</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="272"/>
+        <source>An optical Photo-plethysomogram showing heart rhythm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="281"/>
+        <source>Pulse Change</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="282"/>
+        <source>A sudden (user definable) change in heart rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="286"/>
+        <source>SpO2 Drop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="287"/>
+        <source>A sudden (user definable) drop in blood oxygen saturation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="288"/>
+        <source>SD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Breathing flow rate waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="335"/>
+        <source>L/min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="319"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="320"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="324"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure (High resolution)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Amount of air displaced per breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Graph displaying snore volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="339"/>
+        <source>Minute Ventilation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Amount of air displaced per minute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="344"/>
+        <source>Respiratory Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Rate of breaths per minute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="349"/>
+        <source>Patient Triggered Breaths</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Percentage of breaths triggered by patient</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Pat. Trig. Breaths</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="354"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Leak Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Rate of detected mask leakage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="361"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>I:E Ratio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>Ratio between Inspiratory and Expiratory time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="340"/>
+        <source>ratio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="145"/>
+        <source>Pressure Min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="149"/>
+        <source>Pressure Max</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="215"/>
+        <source>Leak Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="217"/>
+        <source>LF</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="276"/>
+        <source>Perfusion Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="277"/>
+        <source>A relative assessment of the pulse strength at the monitoring site</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="278"/>
+        <source>Perf. Index %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Expiratory Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Time taken to breathe out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Inspiratory Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Time taken to breathe in</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="374"/>
+        <source>Respiratory Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>A ResMed data source showing Respiratory Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Graph showing severity of flow limitations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Flow Limit.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="384"/>
+        <source>Target Minute Ventilation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Minute Ventilation?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="389"/>
+        <source>Maximum Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>The maximum rate of mask leakage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>Max Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="394"/>
+        <source>Apnea Hypopnea Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>Graph showing running AHI for the past hour</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="399"/>
+        <source>Total Leak Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Detected mask leakage including natural Mask leakages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="404"/>
+        <source>Median Leak Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median rate of detected mask leakage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="409"/>
+        <source>Respiratory Disturbance Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>Graph showing running RDI for the past hour</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>CPAP Session contains summary data only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="438"/>
+        <source>PAP Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="437"/>
+        <source>PAP Device Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="443"/>
+        <source>APAP (Variable)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="447"/>
+        <source>ASV (Fixed EPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="448"/>
+        <source>ASV (Variable EPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="922"/>
+        <source>Zero</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="925"/>
+        <source>Upper Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="928"/>
+        <source>Lower Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="475"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Orientation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Sleep position in degrees</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="474"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Inclination</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Upright angle in degrees</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="112"/>
+        <source>Name: %1, %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="114"/>
+        <source>DOB: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="117"/>
+        <source>Phone: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="120"/>
+        <source>Email: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="123"/>
+        <source>Address:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="165"/>
+        <source>Usage Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="179"/>
+        <source>This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="181"/>
+        <source>SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1039"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1041"/>
+        <source>Auto Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1045"/>
+        <source>ASV Auto EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1029"/>
+        <source>Days: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1033"/>
+        <source>Low Usage Days: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1034"/>
+        <source>(%1% compliant, defined as > %2 hours)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1148"/>
+        <source>(Sess: %1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1156"/>
+        <source>Bedtime: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1158"/>
+        <source>Waketime: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1198"/>
+        <source>90%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1270"/>
+        <source>(Summary Only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="315"/>
+        <source>There is a lockfile already present for profile '%1'.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="316"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="326"/>
+        <source>You can only work with one instance of an individual SleepyHead profile at a time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="317"/>
+        <source>Please close any other instances of SleepyHead running with this profile before proceeding.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="318"/>
+        <source>If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="325"/>
+        <source>There is a lockfile already present for this profile '%1', claimed on '%2'.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="327"/>
+        <source>If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>Peak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="142"/>
+        <source>%1% %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1241"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1060"/>
+        <source>Fixed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1243"/>
+        <source>Auto</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1245"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="444"/>
+        <source>Fixed Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="445"/>
+        <source>Auto Bi-Level (Fixed PS)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1249"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="446"/>
+        <source>Auto Bi-Level (Variable PS)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1251"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1043"/>
+        <source>ASV Fixed EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1253"/>
+        <source>ASV Variable EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1274"/>
+        <source>%1%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1294"/>
+        <source>Fixed %1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1296"/>
+        <source>Min %1 Max %2 (%3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1298"/>
+        <source>EPAP %1 IPAP %2 (%3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1300"/>
+        <source>PS %1 over %2-%3 (%4)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1302"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1306"/>
+        <source>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1304"/>
+        <source>EPAP %1 PS %2-%3 (%6)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="129"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="131"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="133"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>%1 %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="90"/>
+        <source>Welcome to SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>What would you like to do?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>Please Import Some Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="104"/>
+        <source>CPAP<br/>Importer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="109"/>
+        <source>Oximetery<br/>Wizard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="113"/>
+        <source>or</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="116"/>
+        <source>View<br/>Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="122"/>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="123"/>
+        <source>First import can take a few minutes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="139"/>
+        <source>Click this box to see this in daily view.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="141"/>
+        <source>The last time you used your %1...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="145"/>
+        <source>last night</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="146"/>
+        <source>yesterday</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="147"/>
+        <source>%2 days ago</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="149"/>
+        <source>was %1 (on %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="157"/>
+        <source>perfect :)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="158"/>
+        <source>pretty darn good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="159"/>
+        <source>reasonably good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="160"/>
+        <source>technically "treated"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="161"/>
+        <source>not very good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="162"/>
+        <source>horrible, please consult your doctor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="164"/>
+        <source>You had an AHI of %1, which is considered %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="169"/>
+        <source>%1 hours, %2 minutes and %3 seconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="171"/>
+        <source>You machine was on for %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="241"/>
+        <source><p><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="242"/>
+        <source><p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="172"/>
+        <source><font color = red>You only had the mask on for %1.</font></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="179"/>
+        <source>You had no <i>major</i> mask leaks (maximum was %1 %2).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="180"/>
+        <source>You had a small but acceptable amount of <i>major</i> mask leakage.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="181"/>
+        <source>You had significant periods of <i>major</i> mask leakage.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="182"/>
+        <source>Your mask is leaking way too much.. Talk to your CPAP advisor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="190"/>
+        <source>Your CPAP machine blasted you with a constant %1%2 of air</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="193"/>
+        <source>Your pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="197"/>
+        <source>Your machine blasted you with a constant %1-%2 %3 of air.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="201"/>
+        <source>Your machine was under %1-%2 %3 for %4% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="206"/>
+        <source>Your EPAP pressure fixed at %1%2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="212"/>
+        <source>Your EPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="207"/>
+        <location filename="../sleepyhead/welcome.cpp" line="213"/>
+        <source>Your IPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="220"/>
+        <source>No CPAP data has been imported yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="226"/>
+        <source>Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="227"/>
+        <source>(last night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="228"/>
+        <source>(yesterday)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="229"/>
+        <source>(%2 day ago)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="232"/>
+        <source>No oximetery data has been imported yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="238"/>
+        <source>Very Important Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="240"/>
+        <source><p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>Contec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <source>CMS50</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>Fisher & Paykel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>ICON</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>DeVilbiss</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>Intellipap</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="81"/>
+        <source>SmartFlex Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>ChoiceMMed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>MD300</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>Respironics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>M-Series</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>Philips Respironics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>System One</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>ResMed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>S9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="395"/>
+        <source>EPR: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose Software</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Zeo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Personal Sleep Coach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1034"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1586"/>
+        <source>VPAP Adapt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2632"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2634"/>
+        <source>EPR</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2633"/>
+        <source>ResMed Exhale Pressure Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2641"/>
+        <source>Patient???</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2644"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2646"/>
+        <source>EPR Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2645"/>
+        <source>Exhale Pressure Relief Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2649"/>
+        <source>0cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2650"/>
+        <source>1cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2651"/>
+        <source>2cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2652"/>
+        <source>3cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/MinutesAtPressure.cpp" line="234"/>
+        <source>(% of time)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gFlagsLine.cpp" line="195"/>
+        <source>Database Outdated
+Please Rebuild CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1271"/>
+        <source>SleepyHead is proudly brought to you by JediMark.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1394"/>
+        <source>d MMM [ %1 - %2 ]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1930"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1983"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2058"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2075"/>
+        <source>%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2038"/>
+        <source>Hide All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2039"/>
+        <source>Show All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2363"/>
+        <source>Unpin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2438"/>
+        <source>Pin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1066"/>
+        <source>Plots Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1148"/>
+        <source>Duration %1:%2:%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1149"/>
+        <source>AHI %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="107"/>
+        <source>%1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="150"/>
+        <source>Relief: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="156"/>
+        <source>Hours: %1h, %2m, %3s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="259"/>
+        <source>Machine Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>Journal Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="43"/>
+        <source>SleepyHead found an old Journal folder, but it looks like it's been renamed:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="45"/>
+        <source>SleepyHead will not touch this folder, and will create a new one instead.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="46"/>
+        <source>Please be careful when playing in SleepyHead's profile folders :-P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="53"/>
+        <source>For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="54"/>
+        <source>SleepyHead picked only the first one of these, and will use it in future:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="56"/>
+        <source>If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F3.7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="587"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="589"/>
+        <source>SmartFlex Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="588"/>
+        <source>Intellipap pressure relief mode.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="594"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2639"/>
+        <source>Ramp Only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="595"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2640"/>
+        <source>Full Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="598"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="600"/>
+        <source>SmartFlex Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="599"/>
+        <source>Intellipap pressure relief level.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>Weinmann</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>SOMNOsoft2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/machine.cpp" line="404"/>
+        <source>Loading %1 data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/progressdialog.cpp" line="14"/>
+        <source>PLease Wait...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>By Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>Statistics at Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="923"/>
+        <source>%1 Session #%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="334"/>
+        <source>Snapshot %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QuaZipFilePrivate</name>
+    <message>
+        <location filename="../3rdparty/quazip/quazip/quazipfile.cpp" line="217"/>
+        <source>ZIP/UNZIP API error %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Report</name>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="27"/>
+        <source>about:blank</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SessionBar</name>
+    <message>
+        <location filename="../sleepyhead/sessionbar.cpp" line="282"/>
+        <source>No Sessions Present</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Statistics</name>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="667"/>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="607"/>
+        <source>Most Recent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="35"/>
+        <source>Compliance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="609"/>
+        <source>Last 30 Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="611"/>
+        <source>Last Year</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="83"/>
+        <location filename="../sleepyhead/statistics.cpp" line="84"/>
+        <source>Average %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="30"/>
+        <source>CPAP Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="33"/>
+        <source>CPAP Usage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="34"/>
+        <source>Average Hours per Night</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="37"/>
+        <source>Therapy Efficiacy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="47"/>
+        <source>Leak Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="52"/>
+        <source>Pressure Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="65"/>
+        <source>Oximeter Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="69"/>
+        <source>Blood Oxygen Saturation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="74"/>
+        <source>Pulse Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="82"/>
+        <source>%1 Median</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="85"/>
+        <source>90% %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="86"/>
+        <source>Min %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="87"/>
+        <source>Max %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="88"/>
+        <source>%1 Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="89"/>
+        <source>% of time in %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="90"/>
+        <source>% of time above %1 threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="91"/>
+        <source>% of time below %1 threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="550"/>
+        <source>I can haz data?!?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="551"/>
+        <source>This lonely sleepy sheep has no data :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="608"/>
+        <source>Last Week</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="610"/>
+        <source>Last 6 Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="615"/>
+        <source>Last Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="681"/>
+        <source>No %1 data available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="684"/>
+        <source>%1 day of %2 Data on %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="690"/>
+        <source>%1 days of %2 Data, between %3 and %4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="963"/>
+        <source>Usage Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="964"/>
+        <source>Total Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="968"/>
+        <source>Compliant Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="980"/>
+        <source>Days AHI &gt;5.0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="985"/>
+        <source>Best&nbsp;%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="998"/>
+        <source>Worst&nbsp;%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1024"/>
+        <source>Best RX Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1025"/>
+        <source>Worst RX Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1095"/>
+        <source>Changes to Prescription Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1103"/>
+        <source>Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1110"/>
+        <source>Pressure Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1112"/>
+        <source>Pressure Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1123"/>
+        <source>Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1243"/>
+        <source>Machine Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1250"/>
+        <source>First Use</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1251"/>
+        <source>Last Use</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>UpdaterWindow</name>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="14"/>
+        <source>SleepyHead Updater</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="51"/>
+        <source>A new version of $APP is available</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="97"/>
+        <source>Version Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="108"/>
+        <source>Release Notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="121"/>
+        <source>about:blank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="130"/>
+        <source>Build Notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="174"/>
+        <source>Maybe &Later</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="194"/>
+        <source>&Upgrade Now</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="220"/>
+        <source>Please wait while updates are downloaded and installed...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="234"/>
+        <source>Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="265"/>
+        <source>Component</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="270"/>
+        <source>Version</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="275"/>
+        <source>Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="280"/>
+        <source>Progress</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="289"/>
+        <source>Log</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="317"/>
+        <source>Downloading & Installing Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="337"/>
+        <source>&Finished</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="94"/>
+        <source>Checking for SleepyHead Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="109"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="171"/>
+        <source>Requesting </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="178"/>
+        <source>Saving as </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="256"/>
+        <source>XML update structure parsed cleanly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <source>No updates were found for your platform.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="322"/>
+        <source>SleepyHead Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="321"/>
+        <source>No new updates were found for your platform.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="339"/>
+        <source>SleepyHead v%1, codename "%2"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="342"/>
+        <source>platform notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="347"/>
+        <source>A new version of SleepyHead is available!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="348"/>
+        <source>Shiny new <b>v%1</b> is available. You're running old and busted v%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="352"/>
+        <source>An update for SleepyHead is available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="353"/>
+        <source>Version <b>%1</b> is available. You're currently running v%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="366"/>
+        <source>SleepyHead v%1 build notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="369"/>
+        <source>Update to QtLibs (v%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="379"/>
+        <source>There was an error parsing the XML Update file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="400"/>
+        <source>%1 bytes received</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="430"/>
+        <source>Redirected to </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="444"/>
+        <source>File size mismatch for %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="455"/>
+        <source>File integrity check failed for %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="485"/>
+        <source>Extracting </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="546"/>
+        <source>You might need to reinstall manually. Sorry :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="547"/>
+        <source>Ugh.. Something went wrong with unzipping.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="560"/>
+        <source>Failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="580"/>
+        <source>Download Complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="584"/>
+        <source>There was an error completing a network request:
+
+(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="629"/>
+        <source>Update Complete!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="632"/>
+        <source>Updates Complete. SleepyHead needs to restart now, click Finished to do so.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="635"/>
+        <source>Update Failed :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="637"/>
+        <source>Download Error. Sorry, try again later.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="654"/>
+        <source>Downloading & Installing Updates...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="655"/>
+        <source>Please wait while downloading and installing updates.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraph</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="694"/>
+        <source>Snapshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraphView</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="361"/>
+        <source>100% zoom level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="362"/>
+        <source>Restore X-axis zoom too 100% to view entire days data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="364"/>
+        <source>Reset Graph Layout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="365"/>
+        <source>Resets all graphs to a uniform height and default order.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="368"/>
+        <source>Y-Axis</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="369"/>
+        <source>Plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="374"/>
+        <source>CPAP Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="377"/>
+        <source>Oximeter Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="380"/>
+        <source>Dotted Lines</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1854"/>
+        <source>Remove Clone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1858"/>
+        <source>Clone %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/Translations/Chinese.zh.ts b/Translations/Chinese.zh.ts
new file mode 100644
index 0000000..b609a8c
--- /dev/null
+++ b/Translations/Chinese.zh.ts
@@ -0,0 +1,7917 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="zh_CN">
+<context>
+    <name>CMS50Loader</name>
+    <message>
+        <source>Could not get data transmission from oximeter.</source>
+        <translation>无法传输血氧仪数据.</translation>
+    </message>
+    <message>
+        <source>Please ensure you select 'upload' from the oximeter devices menu.</source>
+        <translation>请确认已在血氧仪菜单中选择'上传'操作.</translation>
+    </message>
+</context>
+<context>
+    <name>CMS50Serial</name>
+    <message>
+        <source>No valid start time was provided for this oximeter session. You will likely have to adjust your oximeter sessions start time before saving.</source>
+        <translation type="vanished">血氧仪开启时间设置无效。在保存之前,请设定有效的血氧仪开启时间。</translation>
+    </message>
+    <message>
+        <source>Did you remember to start your oximeter recording at exactly the same time you started your CPAP machine?</source>
+        <translation type="vanished">F您是否已经在打开呼吸机的同时开启您的血氧记录仪?</translation>
+    </message>
+    <message>
+        <source>Import Failed</source>
+        <translation type="vanished">导入失败</translation>
+    </message>
+    <message>
+        <source>Import Failed. Wait for oximeter and try again.</source>
+        <translation type="vanished">导入失败,请重试。</translation>
+    </message>
+    <message>
+        <source>Information</source>
+        <translation type="vanished">消息</translation>
+    </message>
+    <message>
+        <source>The most recent CPAP Session time has been selected as the start of your oximetry session.
+If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter.</source>
+        <translation type="vanished">一般情况下,呼吸机与血氧仪是同时开启工作的。如果您忘记导入呼吸机的数据,现在就做吧!然后请再次导入血氧仪数据。</translation>
+    </message>
+    <message>
+        <source>Set Oximeter to Upload</source>
+        <translation type="vanished">血氧仪上传数据</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">问题</translation>
+    </message>
+    <message>
+        <source>Please Wait, Importing...</source>
+        <translation type="vanished">请稍后,数据导入中...</translation>
+    </message>
+    <message>
+        <source>Processing...</source>
+        <translation type="vanished">进行中...</translation>
+    </message>
+</context>
+<context>
+    <name>Daily</name>
+    <message>
+        <source>B</source>
+        <translation>粗</translation>
+    </message>
+    <message>
+        <source>u</source>
+        <translation>线</translation>
+    </message>
+    <message>
+        <source>U1</source>
+        <translation type="vanished">U1</translation>
+    </message>
+    <message>
+        <source>U2</source>
+        <translation type="vanished">U2</translation>
+    </message>
+    <message>
+        <source>U3</source>
+        <translation type="vanished">U3</translation>
+    </message>
+    <message>
+        <source> i </source>
+        <translation>斜</translation>
+    </message>
+    <message>
+        <source>%1%</source>
+        <translation type="vanished">%1%</translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>ASV</source>
+        <translation type="vanished">ASV适应性支持通气模式</translation>
+    </message>
+    <message>
+        <source>Avg</source>
+        <translation type="vanished">平均</translation>
+    </message>
+    <message>
+        <source>Big</source>
+        <translation>大</translation>
+    </message>
+    <message>
+        <source>Med</source>
+        <translation type="vanished">中间值</translation>
+    </message>
+    <message>
+        <source>100%</source>
+        <translation type="vanished">100%</translation>
+    </message>
+    <message>
+        <source>Form</source>
+        <translation>表格</translation>
+    </message>
+    <message>
+        <source>Next</source>
+        <translation>前进</translation>
+    </message>
+    <message>
+        <source>Prev</source>
+        <translation>后退</translation>
+    </message>
+    <message>
+        <source>Wake</source>
+        <translation>醒</translation>
+    </message>
+    <message>
+        <source>Apnea</source>
+        <translation type="vanished">暂停</translation>
+    </message>
+    <message>
+        <source>Color</source>
+        <translation>颜色</translation>
+    </message>
+    <message>
+        <source>Int. Pulse</source>
+        <translation type="vanished">初始脉搏</translation>
+    </message>
+    <message>
+        <source>Notes</source>
+        <translation>备注</translation>
+    </message>
+    <message>
+        <source>Reset</source>
+        <translation type="vanished">重置</translation>
+    </message>
+    <message>
+        <source>Sleep</source>
+        <translation>睡</translation>
+    </message>
+    <message>
+        <source>Small</source>
+        <translation>小</translation>
+    </message>
+    <message>
+        <source>Hypopnea</source>
+        <translation type="vanished">低通气</translation>
+    </message>
+    <message>
+        <source>Show all graphs</source>
+        <translation>显示所有图表</translation>
+    </message>
+    <message>
+        <source>Clear Airway</source>
+        <translation type="vanished">开放气道</translation>
+    </message>
+    <message>
+        <source>Journal</source>
+        <translation>日记</translation>
+    </message>
+    <message>
+        <source>Reset the graph heights to uniform sizes</source>
+        <translation type="vanished">统一图表高度</translation>
+    </message>
+    <message>
+        <source>Position Sensor Sessions</source>
+        <translation>位置传感器会话</translation>
+    </message>
+    <message>
+        <source>Add Bookmark</source>
+        <translation>添加标记</translation>
+    </message>
+    <message>
+        <source>Remove Bookmark</source>
+        <translation>删除标记</translation>
+    </message>
+    <message>
+        <source>Pick a Colour</source>
+        <translation>选择一种颜色</translation>
+    </message>
+    <message>
+        <source>Complain to your Equipment Provider!</source>
+        <translation>谴责你的呼吸机供应商吧!</translation>
+    </message>
+    <message>
+        <source>Session Information</source>
+        <translation>会话信息</translation>
+    </message>
+    <message>
+        <source>Sessions all off!</source>
+        <translation>关闭所有会话!</translation>
+    </message>
+    <message>
+        <source>Oximetery Sessions</source>
+        <translation>血氧计会话</translation>
+    </message>
+    <message>
+        <source>%1 event</source>
+        <translation>%1 事件</translation>
+    </message>
+    <message>
+        <source>Go to the most recent day with data records</source>
+        <translation>跳转到最近的数据</translation>
+    </message>
+    <message>
+        <source>Machine Settings</source>
+        <translation>设置</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">无图表显示!</translation>
+    </message>
+    <message>
+        <source><b>Please Note:</b> This day just contains summary data, only limited information is available .</source>
+        <translation type="vanished"><b> 请注意:</b> 这一天只含有简易数据,信息很有限。</translation>
+    </message>
+    <message>
+        <source>User Flags</source>
+        <translation type="vanished">用户标记</translation>
+    </message>
+    <message>
+        <source>B.M.I.</source>
+        <translation>体重指数.</translation>
+    </message>
+    <message>
+        <source>Sleep Stage Sessions</source>
+        <translation>睡眠阶段会话</translation>
+    </message>
+    <message>
+        <source>Oximeter Information</source>
+        <translation>血氧仪信息</translation>
+    </message>
+    <message>
+        <source>Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked.</source>
+        <translation type="vanished">血氧仪存在这一日期的数据,但是时间戳存在差异,所以图形显示不会被关联.</translation>
+    </message>
+    <message>
+        <source>Ctrl+B</source>
+        <translation>Ctrl+B</translation>
+    </message>
+    <message>
+        <source>Ctrl+I</source>
+        <translation>Ctrl+I</translation>
+    </message>
+    <message>
+        <source>Events</source>
+        <translation>事件</translation>
+    </message>
+    <message>
+        <source>CPAP Sessions</source>
+        <translation>正压呼吸机阶段会话</translation>
+    </message>
+    <message>
+        <source>Medium</source>
+        <translation>中</translation>
+    </message>
+    <message>
+        <source>PB/CSR</source>
+        <translation type="vanished">周期性呼吸</translation>
+    </message>
+    <message>
+        <source>Zoom fully out</source>
+        <translation type="vanished">缩到最小</translation>
+    </message>
+    <message>
+        <source>Starts</source>
+        <translation>开始</translation>
+    </message>
+    <message>
+        <source>VSnore</source>
+        <translation type="vanished">鼾声指数</translation>
+    </message>
+    <message>
+        <source>Sorry, your machine only provides compliance data.</source>
+        <translation>对不起,你的设备只提供相容数据。</translation>
+    </message>
+    <message>
+        <source>Weight</source>
+        <translation>体重</translation>
+    </message>
+    <message>
+        <source>This bookmarked is in a currently disabled area..</source>
+        <translation>此标记现位于不可用区域。</translation>
+    </message>
+    <message>
+        <source>Zombie</source>
+        <translation>极差</translation>
+    </message>
+    <message>
+        <source>Bookmarks</source>
+        <translation>标记簇</translation>
+    </message>
+    <message>
+        <source>%1 events</source>
+        <translation>%1 事件</translation>
+    </message>
+    <message>
+        <source>events</source>
+        <translation>事件</translation>
+    </message>
+    <message>
+        <source>BRICK :(</source>
+        <translation>崩溃  :(</translation>
+    </message>
+    <message>
+        <source>Exh&nbsp;Puff</source>
+        <translation type="vanished">排&nbsp;气</translation>
+    </message>
+    <message>
+        <source>Int. SpO2</source>
+        <translation type="vanished">初始血样饱和度</translation>
+    </message>
+    <message>
+        <source>Event Breakdown</source>
+        <translation>时间分类</translation>
+    </message>
+    <message>
+        <source>Selection AHI</source>
+        <translation type="vanished">所选AHI</translation>
+    </message>
+    <message>
+        <source>SpO2 Desaturations</source>
+        <translation>血氧低饱和</translation>
+    </message>
+    <message>
+        <source>Awesome</source>
+        <translation>极好</translation>
+    </message>
+    <message>
+        <source>Pulse Change events</source>
+        <translation>脉搏变化事件</translation>
+    </message>
+    <message>
+        <source>Flow Limit</source>
+        <translation type="vanished">气流限制</translation>
+    </message>
+    <message>
+        <source>SpO2 Baseline Used</source>
+        <translation>血样饱和度基准</translation>
+    </message>
+    <message>
+        <source>Zero hours??</source>
+        <translation>零小时??</translation>
+    </message>
+    <message>
+        <source>PAP Setting</source>
+        <translation type="vanished">呼吸机设置</translation>
+    </message>
+    <message>
+        <source>Obstructive</source>
+        <translation type="vanished">阻塞性</translation>
+    </message>
+    <message>
+        <source>Go to the previous day</source>
+        <translation>前一天</translation>
+    </message>
+    <message>
+        <source>Drop down this list to show/hide available graphs.</source>
+        <translation>滚动菜单以显示更多图表。</translation>
+    </message>
+    <message>
+        <source>Bookmark at %1</source>
+        <translation>在%1添加标记</translation>
+    </message>
+    <message>
+        <source>Statistics</source>
+        <translation>统计</translation>
+    </message>
+    <message>
+        <source>Events/hour</source>
+        <translation type="vanished">事件/小时</translation>
+    </message>
+    <message>
+        <source>Breakdown</source>
+        <translation>分类</translation>
+    </message>
+    <message>
+        <source>Unknown Session</source>
+        <translation>未知会话</translation>
+    </message>
+    <message>
+        <source>VSnore2</source>
+        <translation type="vanished">鼾声指数II</translation>
+    </message>
+    <message>
+        <source>Sessions exist for this day but are switched off.</source>
+        <translation>会话存在,但是已被关闭。</translation>
+    </message>
+    <message>
+        <source>PAP Mode: %1<br/></source>
+        <translation>正压通气模式: %1<br/></translation>
+    </message>
+    <message>
+        <source>Duration</source>
+        <translation>时长</translation>
+    </message>
+    <message>
+        <source>View Size</source>
+        <translation>显示尺寸</translation>
+    </message>
+    <message>
+        <source>Hide all graphs</source>
+        <translation>隐藏所有图表</translation>
+    </message>
+    <message>
+        <source>Impossibly short session</source>
+        <translation>不可用的会话</translation>
+    </message>
+    <message>
+        <source>No Graphs :(</source>
+        <translation type="vanished">没有图表  :(</translation>
+    </message>
+    <message>
+        <source>No %1 events are recorded this day</source>
+        <translation>无 %1 事件</translation>
+    </message>
+    <message>
+        <source>Oximetry data exists for this day, however it's timestamps are too different, so the Graphs will not be linked.</source>
+        <translation type="vanished">血氧仪有数据记录,但是时钟不匹配,故图表不关联。</translation>
+    </message>
+    <message>
+        <source>Show or hide the calender</source>
+        <translation>显示或者隐藏日历</translation>
+    </message>
+    <message>
+        <source>One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.</source>
+        <translation>这一会话有多个波形,其中很多波形不能正确叠加,造成源数据出错。</translation>
+    </message>
+    <message>
+        <source>I'm feeling...</source>
+        <translation>我感觉...</translation>
+    </message>
+    <message>
+        <source>No data available</source>
+        <translation type="vanished">数据不可用</translation>
+    </message>
+    <message>
+        <source>Go to the next day</source>
+        <translation>下一天</translation>
+    </message>
+    <message>
+        <source>Session Start Times</source>
+        <translation>会话开始次数</translation>
+    </message>
+    <message>
+        <source>Session End Times</source>
+        <translation>会话结束次数</translation>
+    </message>
+    <message>
+        <source>Machine Settings Unavailable</source>
+        <translation>设置不可用</translation>
+    </message>
+    <message>
+        <source>EPR:%1 EPR_LEVEL:%2</source>
+        <translation type="vanished">EPR:%1 EPR_LEVEL:%2</translation>
+    </message>
+    <message>
+        <source>This day has missing pressure, mode and settings data.</source>
+        <translation>所选日期的压力,模式以及设置数据丢失.</translation>
+    </message>
+    <message>
+        <source>%1%2</source>
+        <translation>%1%2</translation>
+    </message>
+    <message>
+        <source>This day just contains summary data, only limited information is available .</source>
+        <translation>仅有此日的概要数据.仅含有少量可用信息.</translation>
+    </message>
+    <message>
+        <source>Time over leak redline</source>
+        <translation>漏气时长超限</translation>
+    </message>
+    <message>
+        <source>Summary Only :(</source>
+        <translation type="vanished">仅有概要信息:(</translation>
+    </message>
+    <message>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <source>Flags:</source>
+        <translation type="vanished">标记:</translation>
+    </message>
+    <message>
+        <source>Total time in apnea</source>
+        <translation>暂停总时间</translation>
+    </message>
+    <message>
+        <source>Total ramp time</source>
+        <translation>斜坡升压总时间</translation>
+    </message>
+    <message>
+        <source>Time outside of ramp</source>
+        <translation>斜坡升压以为的时间</translation>
+    </message>
+    <message>
+        <source>AHI excluding ramp</source>
+        <translation>包含谐波升压时的AHI</translation>
+    </message>
+    <message>
+        <source>Hide all events</source>
+        <translation>隐藏所有事件</translation>
+    </message>
+    <message>
+        <source>Show all events</source>
+        <translation>显示所有事件</translation>
+    </message>
+    <message>
+        <source>Flags</source>
+        <translation type="unfinished">标记</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation type="unfinished">图表</translation>
+    </message>
+    <message>
+        <source>"Nothing's here!"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bob is bored with this days lack of data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ExportCSV</name>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation>AHI</translation>
+    </message>
+    <message>
+        <source>End</source>
+        <translation>结束</translation>
+    </message>
+    <message>
+        <source> %1%</source>
+        <translation> %1%</translation>
+    </message>
+    <message>
+        <source> Avg</source>
+        <translation>平均</translation>
+    </message>
+    <message>
+        <source>Date</source>
+        <translation>日期</translation>
+    </message>
+    <message>
+        <source>End:</source>
+        <translation>结束:</translation>
+    </message>
+    <message>
+        <source>Quick Range:</source>
+        <translation>快速范围:</translation>
+    </message>
+    <message>
+        <source>Daily</source>
+        <translation>日常</translation>
+    </message>
+    <message>
+        <source>Event</source>
+        <translation>事件</translation>
+    </message>
+    <message>
+        <source>Start</source>
+        <translation>开始</translation>
+    </message>
+    <message>
+        <source>Last Fortnight</source>
+        <translation>前两周</translation>
+    </message>
+    <message>
+        <source>Most Recent Day</source>
+        <translation>最近的</translation>
+    </message>
+    <message>
+        <source> Count</source>
+        <translation>计数</translation>
+    </message>
+    <message>
+        <source>Filename:</source>
+        <translation>文档名称:</translation>
+    </message>
+    <message>
+        <source>Select file to export to</source>
+        <translation>选择文件导出到</translation>
+    </message>
+    <message>
+        <source>Resolution:</source>
+        <translation>分辨率:</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation>取消</translation>
+    </message>
+    <message>
+        <source>Dates:</source>
+        <translation>日期:</translation>
+    </message>
+    <message>
+        <source>Custom</source>
+        <translation>自定义</translation>
+    </message>
+    <message>
+        <source>Export</source>
+        <translation>导出</translation>
+    </message>
+    <message>
+        <source>Start:</source>
+        <translation>开始:</translation>
+    </message>
+    <message>
+        <source>Data/Duration</source>
+        <translation>数据/时长</translation>
+    </message>
+    <message>
+        <source>CSV Files (*.csv)</source>
+        <translation>CSV文件(*.ccsv)</translation>
+    </message>
+    <message>
+        <source>Last Month</source>
+        <translation>上个月</translation>
+    </message>
+    <message>
+        <source>SleepyHead_</source>
+        <translation>SleepyHead_</translation>
+    </message>
+    <message>
+        <source>Last 6 Months</source>
+        <translation>过去六个月</translation>
+    </message>
+    <message>
+        <source>Total Time</source>
+        <translation>总时长</translation>
+    </message>
+    <message>
+        <source>DateTime</source>
+        <translation>日期 时间</translation>
+    </message>
+    <message>
+        <source>Session Count</source>
+        <translation>会话计数</translation>
+    </message>
+    <message>
+        <source>Session</source>
+        <translation>会话</translation>
+    </message>
+    <message>
+        <source>Everything</source>
+        <translation>所有</translation>
+    </message>
+    <message>
+        <source>Last Week</source>
+        <translation>上周</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation>去年</translation>
+    </message>
+    <message>
+        <source>Export as CSV</source>
+        <translation>导出为CSV格式数据</translation>
+    </message>
+    <message>
+        <source>Sessions_</source>
+        <translation>会话_</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation>详情</translation>
+    </message>
+    <message>
+        <source>Summary_</source>
+        <translation>概要_</translation>
+    </message>
+    <message>
+        <source>Details_</source>
+        <translation>详情_</translation>
+    </message>
+    <message>
+        <source>Sessions</source>
+        <translation>会话</translation>
+    </message>
+</context>
+<context>
+    <name>FPIconLoader</name>
+    <message>
+        <source>Import Error</source>
+        <translation>导入出错</translation>
+    </message>
+    <message>
+        <source>This Machine Record cannot be imported in this profile.</source>
+        <translation>本机器所存数据不能导入此用户.</translation>
+    </message>
+    <message>
+        <source>The Day records overlap with already existing content.</source>
+        <translation>本日的数据已覆盖已存储的内容.</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <source>-</source>
+        <translation>-</translation>
+    </message>
+    <message>
+        <source>F4</source>
+        <translation>F4</translation>
+    </message>
+    <message>
+        <source>F5</source>
+        <translation>F5</translation>
+    </message>
+    <message>
+        <source>F6</source>
+        <translation>F6</translation>
+    </message>
+    <message>
+        <source>F7</source>
+        <translation>F7</translation>
+    </message>
+    <message>
+        <source>F8</source>
+        <translation>F8</translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>F11</source>
+        <translation>F11</translation>
+    </message>
+    <message>
+        <source>F12</source>
+        <translation>F12</translation>
+    </message>
+    <message>
+        <source>Yes</source>
+        <translation type="vanished">是的</translation>
+    </message>
+    <message>
+        <source>CPAP</source>
+        <translation>持续气道正压通气</translation>
+    </message>
+    <message>
+        <source>Gah!</source>
+        <translation>哦!</translation>
+    </message>
+    <message>
+        <source>Help</source>
+        <translation>帮助</translation>
+    </message>
+    <message>
+        <source>CPAP data was recently purged and needs to be re-imported.</source>
+        <translation type="vanished">呼吸机的数据已被清除,请重新导入.</translation>
+    </message>
+    <message>
+        <source>DISCLAIMER:</source>
+        <translation>免责声明:</translation>
+    </message>
+    <message>
+        <source>About SleepyHead</source>
+        <translation>关于SleepyHead</translation>
+    </message>
+    <message>
+        <source>&Data</source>
+        <translation>&数据</translation>
+    </message>
+    <message>
+        <source>&File</source>
+        <translation>&文档</translation>
+    </message>
+    <message>
+        <source>&Help</source>
+        <translation>&帮助</translation>
+    </message>
+    <message>
+        <source>&View</source>
+        <translation>&查看</translation>
+    </message>
+    <message>
+        <source>There was a problem opening Somnopose Data File: </source>
+        <translation>打开睡姿数据文件出错:</translation>
+    </message>
+    <message>
+        <source>&About SleepyHead</source>
+        <translation>&关于 SleepyHead</translation>
+    </message>
+    <message>
+        <source>E&xit</source>
+        <translation>&退出</translation>
+    </message>
+    <message>
+        <source>Daily</source>
+        <translation>日常</translation>
+    </message>
+    <message>
+        <source>Note:</source>
+        <translation>注意:</translation>
+    </message>
+    <message>
+        <source>Would you like to import from the path(s) shown above?</source>
+        <translation type="vanished">您希望从如上显示的路径导入数据吗?</translation>
+    </message>
+    <message>
+        <source><a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Main_Page">SleepyHead Wiki</a><br/></source>
+        <translation type="vanished"><a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Main_Page">SleepyHead 维基百科</a><br/></translation>
+    </message>
+    <message>
+        <source>Import &ZEO Data</source>
+        <translation>导入&ZEO数据</translation>
+    </message>
+    <message>
+        <source>Copyright:</source>
+        <translation>版权:</translation>
+    </message>
+    <message>
+        <source>MSeries Import complete</source>
+        <translation>M系列呼吸机数据导入完成</translation>
+    </message>
+    <message>
+        <source>There was an error saving screenshot to file "%1"</source>
+        <translation>错误信息截屏存储在 "%1"文档中</translation>
+    </message>
+    <message>
+        <source>New Location</source>
+        <translation type="vanished">新位置</translation>
+    </message>
+    <message>
+        <source>This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.</source>
+        <translation>这款软件用于协助读取用于治疗睡眠障碍的各种CPAP的数据.</translation>
+    </message>
+    <message>
+        <source>Importing Data</source>
+        <translation>正在导入数据</translation>
+    </message>
+    <message>
+        <source>No CPAP data card detected, launching file dialog...</source>
+        <translation>没有检测到呼吸机数据卡,正在启动对话...</translation>
+    </message>
+    <message>
+        <source>Select another folder</source>
+        <translation type="vanished">选择其他文件夹</translation>
+    </message>
+    <message>
+        <source>Online Users &Guide</source>
+        <translation>在线&指南</translation>
+    </message>
+    <message>
+        <source>The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.</source>
+        <translation>作者不为使用者由于任何形式的使用此软件对其所造成的任何伤害负责.</translation>
+    </message>
+    <message>
+        <source>Please wait, launching file dialog...</source>
+        <translation>请稍等,正在启动对话...</translation>
+    </message>
+    <message>
+        <source>View O&ximetry</source>
+        <translation type="vanished">查看&血氧数据</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:
+</source>
+        <translation type="vanished">你确定需要删除所有呼吸机数据吗:</translation>
+    </message>
+    <message>
+        <source>Online Help Resources</source>
+        <translation>在线帮助</translation>
+    </message>
+    <message>
+        <source>View &Welcome</source>
+        <translation>查看&欢迎信息</translation>
+    </message>
+    <message>
+        <source>Currenly supported machines:</source>
+        <translation>所支持的机型:</translation>
+    </message>
+    <message>
+        <source>View S&ummary</source>
+        <translation type="vanished">查看&概要</translation>
+    </message>
+    <message>
+        <source>This software is NOT suitable for medical diagnosis, CPAP complaince reporting and other similar purposes.</source>
+        <translation type="vanished">这款软件不适用于医疗诊断,呼吸机兼容性报告出具以及其它类似的目的。</translation>
+    </message>
+    <message>
+        <source>Loading Data</source>
+        <translation>载入数据</translation>
+    </message>
+    <message>
+        <source>This software comes with absolutely no warranty, either express of implied.</source>
+        <translation>该软件不提供质保。</translation>
+    </message>
+    <message>
+        <source>There was a problem opening MSeries block File: </source>
+        <translation>打开M系列呼吸机文件出错:</translation>
+    </message>
+    <message>
+        <source><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</source>
+        <translation><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</translation>
+    </message>
+    <message>
+        <source>SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>.</source>
+        <translation>SleepyHead的编写时基于 <a href="http://qt-project.org">Qt Application 架构</a>.</translation>
+    </message>
+    <message>
+        <source>Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters</source>
+        <translation>康泰  CMS50D+, CMS50E and CMS50F 血氧仪</translation>
+    </message>
+    <message>
+        <source>Kudos & Credits</source>
+        <translation>致&谢</translation>
+    </message>
+    <message>
+        <source>Recalculations are complete, the application now needs to restart to display the changes.</source>
+        <translation>再计算完毕。软件需要重启以显示新数据。</translation>
+    </message>
+    <message>
+        <source>Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)</source>
+        <translation>飞利浦伟康System One(CPAP Pro, Auto, BIPIP & ASV模式)</translation>
+    </message>
+    <message>
+        <source>&copy;2011-2014</source>
+        <translation>&copy;2011-2014</translation>
+    </message>
+    <message>
+        <source>Build Date</source>
+        <translation type="vanished">建档日期</translation>
+    </message>
+    <message>
+        <source>The author and any associates of his accept NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation type="vanished">本软件的作者以及协作者对由于软件正常或滥用期间遇到的重要或者非重要问题所产生的损坏以及不利影响不予负责。</translation>
+    </message>
+    <message>
+        <source>Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt</source>
+        <translation>请使用 QT 4.8.5 或其更高版本,来修复SleepyHead由于打印错误导致的崩溃</translation>
+    </message>
+    <message>
+        <source>&About</source>
+        <translation>&关于</translation>
+    </message>
+    <message>
+        <source>Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</source>
+        <translation>不要忘记为 SleepyHead 在 <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> 或者 <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+ 上点赞</translation>
+    </message>
+    <message>
+        <source>&Link Graph Groups</source>
+        <translation>&关联图表组</translation>
+    </message>
+    <message>
+        <source>Further Information</source>
+        <translation>更进一步的信息</translation>
+    </message>
+    <message>
+        <source>View &Daily</source>
+        <translation>查看&日常</translation>
+    </message>
+    <message>
+        <source>View &Overview</source>
+        <translation>查看&总览</translation>
+    </message>
+    <message>
+        <source>Import Problem
+
+Couldn't find any new Machine Data at the locations given</source>
+        <translation type="vanished">导入出错
+
+没有发现新的数据</translation>
+    </message>
+    <message>
+        <source>Access to Preferences has been blocked until recalculation completes.</source>
+        <translation>重新计算完成之前,参数设置功能将不能实现。</translation>
+    </message>
+    <message>
+        <source>Import RemStar &MSeries Data</source>
+        <translation>导入瑞斯迈&M系列呼吸机数据</translation>
+    </message>
+    <message>
+        <source>Loading</source>
+        <translation>载入中</translation>
+    </message>
+    <message>
+        <source>&Help Browser</source>
+        <translation>&帮助</translation>
+    </message>
+    <message>
+        <source>Got a neat idea on how to improve SleepyHead? Check out SleepyHeads <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">Idea Torrent</a></source>
+        <translation type="vanished">有帮助 SleepyHead 改进的好办法? 去 SleepyHeads <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">金点子看看</a></translation>
+    </message>
+    <message>
+        <source>Do you have a CMS50[x] Oximeter?
+One is required to use this section.</source>
+        <translation type="vanished">你的血氧仪是CM550[x]吗?
+本软件适用这款产品。</translation>
+    </message>
+    <message>
+        <source>&Current Selected Day</source>
+        <translation type="vanished">&所选日期</translation>
+    </message>
+    <message>
+        <source>Change &User</source>
+        <translation>更改&用户</translation>
+    </message>
+    <message>
+        <source>Would you like to remember this import location for next time?</source>
+        <translation type="vanished">希望为了方便下次使用而记住这个导入位置吗?</translation>
+    </message>
+    <message>
+        <source>All data for current CPAP machine</source>
+        <translation>所有当前呼吸机的数据</translation>
+    </message>
+    <message>
+        <source>In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.</source>
+        <translation> SleepyHead使用<a href="http://sourceforge.net/projects/quazip">Sergey A. Tachenov 的</a> QuaZip,所更新的代码位于一个封装C++外壳内的Gilles Vollant 的 ZIP/UNZIP压缩包.</translation>
+    </message>
+    <message>
+        <source>Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users.</source>
+        <translation>为 Mac用户 加入一些 <a href='qrc:/docs/usage.html'>使用注意</a>, 和其他重要信息.</translation>
+    </message>
+    <message>
+        <source>Friendly forums to talk and learn about Sleep Apnea:</source>
+        <translation>可以用来学习和讨论睡眠暂停的论坛:</translation>
+    </message>
+    <message>
+        <source>Please wait, scanning for CPAP data cards...</source>
+        <translation>请稍等,正在扫描由存储卡扫描数据..</translation>
+    </message>
+    <message>
+        <source>View S&tatistics</source>
+        <translation>查看统&计</translation>
+    </message>
+    <message>
+        <source>Monthly</source>
+        <translation>每月</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="vanished">取消</translation>
+    </message>
+    <message>
+        <source>Change &Language</source>
+        <translation>更改&语言</translation>
+    </message>
+    <message>
+        <source>This software is released under the GNU Public License v3.0<br/></source>
+        <translation>这个软件是基于GNU V3.0版本发布的<br/></translation>
+    </message>
+    <message>
+        <source>Import from where?</source>
+        <translation type="vanished">导入来源?</translation>
+    </message>
+    <message>
+        <source><a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></source>
+        <translation type="vanished"><a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Frequently_Asked_Questions">常见问题</a><br/></translation>
+    </message>
+    <message>
+        <source>Loading Event Data</source>
+        <translation>载入事件数据</translation>
+    </message>
+    <message>
+        <source>SleepyHead's Online <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation type="vanished">SleepyHead 在线 <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=SleepyHead_Users_Guide">使用指南</a><br/></translation>
+    </message>
+    <message>
+        <source>No guarantees are made regarding the accuracy of any data this program displays.</source>
+        <translation>不保证本软件显示的所有数据的准确性。</translation>
+    </message>
+    <message>
+        <source>It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module.</source>
+        <translation type="vanished">血氧仪模块通信串口使用支持多平台的 <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> 数据库.</translation>
+    </message>
+    <message>
+        <source>Import</source>
+        <translation>导入</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:
+
+</source>
+        <translation type="vanished">你确定需要删除所有呼吸机数据吗:
+
+</translation>
+    </message>
+    <message>
+        <source>The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation>本软件的作者以及协作者对由于软件正常或滥用期间遇到的重要或者非重要问题所产生的损坏以及不利影响不予负责。</translation>
+    </message>
+    <message>
+        <source>It comes with no guarantee of fitness for any particular purpose.</source>
+        <translation>不做适合任何特定任务的保证。</translation>
+    </message>
+    <message>
+        <source>Authors Twitter Feed</source>
+        <translation type="vanished">作者TWITTER反馈</translation>
+    </message>
+    <message>
+        <source>Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="vanished">特别感谢来自CAPAPTalk的 <a href='http://cpaptalk.com'>Pugsy</a> 对文档以及教程的制作的帮助, 也向其他协助测试软件并分享数据的各位致谢.</translation>
+    </message>
+    <message>
+        <source>Would you like this done automatically from the Backup Folder?</source>
+        <translation type="vanished">您希望自动导入备份文件夹的内容吗?</translation>
+    </message>
+    <message>
+        <source>Please wait, importing from backup folder(s)...</source>
+        <translation>请稍等,正在由备份文件夹导入...</translation>
+    </message>
+    <message>
+        <source>Welcome to SleepyHead</source>
+        <translation>欢迎使用SleepyHead</translation>
+    </message>
+    <message>
+        <source>SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.</source>
+        <translation>SleepyHead是一款基于开发者个人睡眠障碍方面的经验,以及众多饱受类似困扰的众多测试者的反馈,编写而成.</translation>
+    </message>
+    <message>
+        <source>Restart Required</source>
+        <translation>需要重启</translation>
+    </message>
+    <message>
+        <source>ResMed S9 Oximeter Attachment</source>
+        <translation>瑞思迈S9血氧仪附件</translation>
+    </message>
+    <message>
+        <source>&Bookmarks</source>
+        <translation type="vanished">&标记</translation>
+    </message>
+    <message>
+        <source>Right &Sidebar</source>
+        <translation>右&侧边栏</translation>
+    </message>
+    <message>
+        <source>This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.</source>
+        <translation>这不是一款医疗软件,它仅仅是一款将数据图形化显示的研究工具。</translation>
+    </message>
+    <message>
+        <source>Click here to choose a folder</source>
+        <translation type="vanished">请选择一个文件夹</translation>
+    </message>
+    <message>
+        <source>&Rebuild Oximetry Indices</source>
+        <translation type="vanished">&重建血氧索引</translation>
+    </message>
+    <message>
+        <source>branch</source>
+        <translation>分支</translation>
+    </message>
+    <message>
+        <source>Translators:</source>
+        <translation>翻译:</translation>
+    </message>
+    <message>
+        <source>Remember this Location?</source>
+        <translation type="vanished">记住这个位置吗?</translation>
+    </message>
+    <message>
+        <source>The Usual</source>
+        <translation type="vanished">常用</translation>
+    </message>
+    <message>
+        <source>Profile</source>
+        <translation>配置文件</translation>
+    </message>
+    <message>
+        <source>View Statistics</source>
+        <translation>查看统计信息</translation>
+    </message>
+    <message>
+        <source>CPAP Data Located</source>
+        <translation>数据已定位</translation>
+    </message>
+    <message>
+        <source>Access to Import has been blocked while recalculations are in progress.</source>
+        <translation>导入数据遇阻,重新计算进行中。</translation>
+    </message>
+    <message>
+        <source><p>The author wishes to express thanks to James Marshall and Rich Freeman for their assistance with this project.</p></source>
+        <translation type="vanished"><p>感谢 James Marshall和 Rich Freeman 的帮助</p></translation>
+    </message>
+    <message>
+        <source>Sleep Disorder Terms &Glossary</source>
+        <translation>呼吸失调症术语&定义</translation>
+    </message>
+    <message>
+        <source>This is a beta release, some features may not yet behave as expected.</source>
+        <translation>这是测试版,有些功能并不完善.</translation>
+    </message>
+    <message>
+        <source>Copyright</source>
+        <translation>版权</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation>about:空白</translation>
+    </message>
+    <message>
+        <source>SleepyHead Project Page</source>
+        <translation>SleepHead 项目页</translation>
+    </message>
+    <message>
+        <source>*** <u>Use at your own risk</u> ***</source>
+        <translation>*** <u>后果自负</u> ***</translation>
+    </message>
+    <message>
+        <source>&Records</source>
+        <translation type="vanished">&保存</translation>
+    </message>
+    <message>
+        <source>Use &AntiAliasing</source>
+        <translation>使用&抗锯齿设置</translation>
+    </message>
+    <message>
+        <source>I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.</source>
+        <translation>不建议使用这个内建浏览器网上冲浪,尽管它可以,但是在某种程度上,它其实只是个帮助文档.</translation>
+    </message>
+    <message>
+        <source>About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia</source>
+        <translation>睡眠呼吸暂停<a href='http://en.wikipedia.org/wiki/Sleep_apnea'>在</a>维基百科</translation>
+    </message>
+    <message>
+        <source>This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.</source>
+        <translation>这 <font color='red'><u>并不是</u></font> 一款医疗软件.它仅仅是一款数据读显软件 ,且不保证任何计算以及显示信息的精确性以及正确性.</translation>
+    </message>
+    <message>
+        <source>Somnopause Data Import complete</source>
+        <translation>睡姿数据导入完成</translation>
+    </message>
+    <message>
+        <source>Report Mode</source>
+        <translation>报告模式</translation>
+    </message>
+    <message>
+        <source>Bugfixes, Patches and Platform Help:</source>
+        <translation>纠错,补丁以及系统平台帮助方面:</translation>
+    </message>
+    <message>
+        <source><a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation type="vanished"><a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Glossary">睡眠障碍专业术语</a><br/></translation>
+    </message>
+    <message>
+        <source>&Profiles</source>
+        <translation>&配置文件</translation>
+    </message>
+    <message>
+        <source>DeVilbiss Intellipap (Auto)</source>
+        <translation>德百世Intellipap(Auto)</translation>
+    </message>
+    <message>
+        <source>SleepyHead, brought to you by Jedimark</source>
+        <translation>SleepyHead作者: Jedimark</translation>
+    </message>
+    <message>
+        <source>Use this software entirely at your own risk.</source>
+        <translation>使用此款软件的风险由用户自行承担。</translation>
+    </message>
+    <message>
+        <source>Printing Disabled</source>
+        <translation>打印禁用</translation>
+    </message>
+    <message>
+        <source>Standard</source>
+        <translation>标准的</translation>
+    </message>
+    <message>
+        <source>There was a problem opening ZEO File: </source>
+        <translation>ZEO文档出错:</translation>
+    </message>
+    <message>
+        <source>Loading...</source>
+        <translation>载入中...</translation>
+    </message>
+    <message>
+        <source>CPAP Datacard structures were detected at the following locations:</source>
+        <translation type="vanished">在如下位置检测到呼吸机数据:</translation>
+    </message>
+    <message>
+        <source>Statistics</source>
+        <translation>统计</translation>
+    </message>
+    <message>
+        <source>&Statistics</source>
+        <translation>&统计</translation>
+    </message>
+    <message>
+        <source>Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder.</source>
+        <translation>请牢记需指向您的数据卡的根目录或者盘符,而不是子目录.</translation>
+    </message>
+    <message>
+        <source>Do you just want to Import from the usual (remembered) locations?
+</source>
+        <translation type="vanished">希望从已记住的位置进行导入吗?</translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here.</source>
+        <translatorcomment>Chen, you may put your own name here!!</translatorcomment>
+        <translation type="vanished">Arie Klerk (Dutch), Steffen Reitz (German), 后续将会加入更多.</translation>
+    </message>
+    <message>
+        <source>Ctrl+Tab</source>
+        <translation>Ctrl+Tab</translation>
+    </message>
+    <message>
+        <source>&Support SleepyHead Development</source>
+        <translation>&支持SleepyHead的开发</translation>
+    </message>
+    <message>
+        <source>&Support Sleepyhead Development</source>
+        <translation type="vanished">&帮助 SleepyHead 改进</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html></source>
+        <translation><html><head/><body><p><span style=" font-weight:600;">警告: </span>这是一个预发布版本的软件,其部分功能可能并不尽如人意.</p></body></html></translation>
+    </message>
+    <message>
+        <source>3rd Party Libaries:</source>
+        <translation>第三方数据库:</translation>
+    </message>
+    <message>
+        <source>ResMed S9 models (CPAP, Auto, VPAP)</source>
+        <translation>瑞思迈 S9 (CPAP, Auto, VPAP)</translation>
+    </message>
+    <message>
+        <source>Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.</source>
+        <translation>对于您的健康,您的医生是您最好的选择.</translation>
+    </message>
+    <message>
+        <source>&Advanced</source>
+        <translation>&高级</translation>
+    </message>
+    <message>
+        <source>Zeo CSV Import complete</source>
+        <translation>Zeo CSV导入完成</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">问题</translation>
+    </message>
+    <message>
+        <source>&Import Data</source>
+        <translation>&导入数据</translation>
+    </message>
+    <message>
+        <source>Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version.</source>
+        <translation>此<a href='qrc:/docs/release_notes.html'>版本的</a> 介绍.</translation>
+    </message>
+    <message>
+        <source>This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.</source>
+        <translation>这款软件不适用于医疗诊断,呼吸机兼容性报告出具以及其它类似的目的.</translation>
+    </message>
+    <message>
+        <source>Print &Report</source>
+        <translation>打印&报告</translation>
+    </message>
+    <message>
+        <source>&Reset Graph Layout</source>
+        <translation>&重置图表布局</translation>
+    </message>
+    <message>
+        <source>Performance will be degraded during these recalculations.</source>
+        <translation>在再计算的过程中,软件性能会降低。</translation>
+    </message>
+    <message>
+        <source>This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>.</source>
+        <translation>免费发布基于<a href="qrc:/COPYING">GNU Public 许可</a>.</translation>
+    </message>
+    <message>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <source>If you can read this, the restart command didn't work. Your going to have to do it yourself manually.</source>
+        <translation>如果你看到此条信息,说明重启命令未起作用,需要手动重启。</translation>
+    </message>
+    <message>
+        <source>SleepyHead Wiki</source>
+        <translation>SleepHead 维基百科</translation>
+    </message>
+    <message>
+        <source>Take &Screenshot</source>
+        <translation>&截屏</translation>
+    </message>
+    <message>
+        <source>Overview</source>
+        <translation>总览</translation>
+    </message>
+    <message>
+        <source>Exp&ort</source>
+        <translation type="vanished">&导出</translation>
+    </message>
+    <message>
+        <source>Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.</source>
+        <translation>感谢使用SleepyHead,如果觉得它好用,请不吝通过Paypal捐赠,对其的完善进行支持.</translation>
+    </message>
+    <message>
+        <source>Show Debug Pane</source>
+        <translation>显示调试面板</translation>
+    </message>
+    <message>
+        <source>Revision:</source>
+        <translation>版本:</translation>
+    </message>
+    <message>
+        <source>Task Completed</source>
+        <translation>任务结束</translation>
+    </message>
+    <message>
+        <source>&Edit Profile</source>
+        <translation>&编辑配置文件</translation>
+    </message>
+    <message>
+        <source>Import Reminder</source>
+        <translation>导入提示</translation>
+    </message>
+    <message>
+        <source>Recalculations are now complete.</source>
+        <translation>计算完成。</translation>
+    </message>
+    <message>
+        <source>Welcome</source>
+        <translation>欢迎信息</translation>
+    </message>
+    <message>
+        <source>Import &Somnopose Data</source>
+        <translation>导入&睡姿数据</translation>
+    </message>
+    <message>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone.</source>
+        <translation type="vanished">James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone.</translation>
+    </message>
+    <message>
+        <source>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/></source>
+        <translation>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/></translation>
+    </message>
+    <message>
+        <source>Check for &Updates</source>
+        <translation>检查&更新</translation>
+    </message>
+    <message>
+        <source>Screenshot saved to file "%1"</source>
+        <translation>截屏存储于 "%1"</translation>
+    </message>
+    <message>
+        <source>&Preferences</source>
+        <translation>&参数设置</translation>
+    </message>
+    <message>
+        <source>Fisher & Paykel ICON (CPAP, Auto)</source>
+        <translation>费&雪(CPAP, Auto)</translation>
+    </message>
+    <message>
+        <source>If you find this free software to be of use, please consider supporting the development efforts by making a paypal donation to the Author</source>
+        <translation type="vanished">这是一款免费软件,可以通过到PayPal捐款以支持此款软件的开发改进</translation>
+    </message>
+    <message>
+        <source>Recalculating Summaries</source>
+        <translation>汇总统计中</translation>
+    </message>
+    <message>
+        <source>&Fullscreen Toggle</source>
+        <translation>&全屏切换</translation>
+    </message>
+    <message>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation>请将运行软件中遇到的错误发送到SourceForge的SleepyHead页面.</translation>
+    </message>
+    <message>
+        <source>&Frequently Asked Questions</source>
+        <translation>&常见问题</translation>
+    </message>
+    <message>
+        <source>&Purge CPAP Data</source>
+        <translation type="vanished">&清除数据</translation>
+    </message>
+    <message>
+        <source>qrc:/docs/index.html</source>
+        <translation>qrc:/docs/index.html</translation>
+    </message>
+    <message>
+        <source>Shift+F2</source>
+        <translation>Shift+F2</translation>
+    </message>
+    <message>
+        <source>Oximetry</source>
+        <translation>血氧测定</translation>
+    </message>
+    <message>
+        <source>Please wait, SleepyHead is importing data...</source>
+        <translation type="vanished">请稍等,SleepyHead正在导入数据...</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations
+
+</source>
+        <translation type="vanished">数据已有如下位置成功导入
+
+</translation>
+    </message>
+    <message>
+        <source>Recalculating Indices</source>
+        <translation>重新计算指数</translation>
+    </message>
+    <message>
+        <source>(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)</source>
+        <translation>(未使用SSL加密技术,所以请不要把密码或其他个人信息键入其中)</translation>
+    </message>
+    <message>
+        <source>Data Folder Location</source>
+        <translation type="vanished">文件位置</translation>
+    </message>
+    <message>
+        <source>Change &Data Folder</source>
+        <translation>更改&文件夹</translation>
+    </message>
+    <message>
+        <source>License:</source>
+        <translation>许可:</translation>
+    </message>
+    <message>
+        <source>&Navigation</source>
+        <translation type="vanished">&导航</translation>
+    </message>
+    <message>
+        <source>Are you sure?</source>
+        <translation type="vanished">确定?</translation>
+    </message>
+    <message>
+        <source>Date Range</source>
+        <translation>日期范围</translation>
+    </message>
+    <message>
+        <source>Purge Oximetery Data</source>
+        <translation>清除血氧仪数据</translation>
+    </message>
+    <message>
+        <source>O&ximetry Wizard</source>
+        <translation>血&氧仪安装向导</translation>
+    </message>
+    <message>
+        <source>Purge &Current Selected Day</source>
+        <translation>清除&所选天的数据</translation>
+    </message>
+    <message>
+        <source>Current Days</source>
+        <translation>当前天数</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum.</source>
+        <translation type="vanished"><b>警告:</b> 这是一款以测试为目的的预发售软件,请勿 <b>NOT</b>分享到SleepyHead Testing Forum以外.</translation>
+    </message>
+    <message>
+        <source>Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version.</source>
+        <translation type="vanished">Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version.</translation>
+    </message>
+    <message>
+        <source>When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.</source>
+        <translation>When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes.</source>
+        <translation type="vanished"><b>警告:</b> 本软件所生成的报告不可用于医疗诊断.</translation>
+    </message>
+    <message>
+        <source>These messages are only a temporary feature. Some people thought they were an error.</source>
+        <translation type="vanished">These messages are only a temporary feature. Some people thought they were an error。</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations:</source>
+        <translation type="vanished">数据已从以下位置成功导入:</translation>
+    </message>
+    <message>
+        <source>Couldn't find any new Machine Data at the locations given.</source>
+        <translation type="vanished">指定位置未发现可用数据.</translation>
+    </message>
+    <message>
+        <source>Import Problem</source>
+        <translation>导入错误</translation>
+    </message>
+    <message>
+        <source>Choose a folder</source>
+        <translation>选择一个文件夹</translation>
+    </message>
+    <message>
+        <source>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation>SleepyHead 的在线 <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">用户手册</a><br/></translation>
+    </message>
+    <message>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">常见问题</a><br/></translation>
+    </message>
+    <message>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">术语</a><br/></translation>
+    </message>
+    <message>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></translation>
+    </message>
+    <message>
+        <source><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Build Date: %1 %2</source>
+        <translation>创建日期: %1 %2</translation>
+    </message>
+    <message>
+        <source>Graphics Engine: %1</source>
+        <translation>图形引擎:%1</translation>
+    </message>
+    <message>
+        <source>Data Folder Location: %1</source>
+        <translation type="vanished">数据文件夹位置:%1</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:</source>
+        <translation type="vanished">你确定清除如下机器的所有数据:</translation>
+    </message>
+    <message>
+        <source>Not all session data could be removed, you have to delete the following folder manually.</source>
+        <translation type="vanished">未能清除所有会话数据,请手动清除如下文件夹.</translation>
+    </message>
+    <message>
+        <source>Machine data has been successfully purged.</source>
+        <translation type="vanished">数据已经成功清除.</translation>
+    </message>
+    <message>
+        <source>Would you like to reimport from the backup folder?</source>
+        <translation type="vanished">您希望由备份文件夹重新导入数据吗?</translation>
+    </message>
+    <message>
+        <source>Please wait, importing...</source>
+        <translation type="vanished">请稍后.正在导入...</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete oximetry data for %1</source>
+        <translation>确定清除%1内的血氧仪数据吗</translation>
+    </message>
+    <message>
+        <source><b>Please be aware you can not undo this operation!</b></source>
+        <translation><b>请注意您不能撤销该操作!</b></translation>
+    </message>
+    <message>
+        <source>Select the day with valid oximetry data in daily view first.</source>
+        <translation>请先在每日视图中选择有效血氧仪数据.</translation>
+    </message>
+    <message>
+        <source>Rebuild CPAP Data</source>
+        <translation>重建数据</translation>
+    </message>
+    <message>
+        <source>Exit</source>
+        <translation>推出</translation>
+    </message>
+    <message>
+        <source>&Automatic Oximetry Cleanup</source>
+        <translation>&血氧仪数据自动清理</translation>
+    </message>
+    <message>
+        <source>Toggle &Line Cursor</source>
+        <translation>切换&线游标</translation>
+    </message>
+    <message>
+        <source>Foo</source>
+        <translation type="vanished">FOO</translation>
+    </message>
+    <message>
+        <source>Please insert your CPAP data card...</source>
+        <translation>请插入呼吸机数据卡...</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to rebuild all CPAP data for the following machine:</source>
+        <translation>确定在如下机器中重建呼吸机数据吗:</translation>
+    </message>
+    <message>
+        <source>Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way.</source>
+        <translation>请注意,这将在SleepHead内部存储被关闭或者其他原因使得未能正确存储的情况下,导致图表数据丢失.</translation>
+    </message>
+    <message>
+        <source>For some reason, SleepyHead does not have internal backups for the following machine:</source>
+        <translation>由于某种原因,Sleephead并没有此机器的内部备份文件:</translation>
+    </message>
+    <message>
+        <source>Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.</source>
+        <translation>Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.</translation>
+    </message>
+    <message>
+        <source>Are you really sure you want to do this?</source>
+        <translation>确定?</translation>
+    </message>
+    <message>
+        <source>A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:</source>
+        <translation>清除未能正确进行,请手动删除:</translation>
+    </message>
+    <message>
+        <source>Because there are no internal backups to rebuild from, you will have to restore from your own.</source>
+        <translation>由于没有可用的内部备份可供重建使用,请自行重新导入。</translation>
+    </message>
+    <message>
+        <source>Would you like to import from your own backups now? (you will have no data visible for this machine until you do)</source>
+        <translation>您希望从立即由备份导入吗?(完成导入,才能有数据显示)</translation>
+    </message>
+    <message>
+        <source>A %1 file structure for a %2 was located at:</source>
+        <translation> %1文件结构的%2位置在:</translation>
+    </message>
+    <message>
+        <source>A %1 file structure was located at:</source>
+        <translation>%1 文件结构的位置在:</translation>
+    </message>
+    <message>
+        <source>Would you like to import from this location?</source>
+        <translation>从这里导入吗?</translation>
+    </message>
+    <message>
+        <source>Specify</source>
+        <translation>指定</translation>
+    </message>
+    <message>
+        <source>Navigation</source>
+        <translation>导航</translation>
+    </message>
+    <message>
+        <source>Bookmarks</source>
+        <translation>标记簇</translation>
+    </message>
+    <message>
+        <source>Records</source>
+        <translation>存档</translation>
+    </message>
+    <message>
+        <source>Purge ALL CPAP Data</source>
+        <translation>删除所有呼吸机数据</translation>
+    </message>
+    <message>
+        <source>F10</source>
+        <translation>F10</translation>
+    </message>
+    <message>
+        <source>Ctrl+L</source>
+        <translation>Ctrl+L</translation>
+    </message>
+    <message>
+        <source>Daily Sidebar</source>
+        <translation>每日侧边栏</translation>
+    </message>
+    <message>
+        <source>Daily Calendar</source>
+        <translation>日历</translation>
+    </message>
+    <message>
+        <source>F9</source>
+        <translation>F9</translation>
+    </message>
+    <message>
+        <source>Imported %1 CPAP session(s) from
+
+%2</source>
+        <translation>导入 %1呼吸机会话由
+
+%2</translation>
+    </message>
+    <message>
+        <source>Import Success</source>
+        <translation>导入成功</translation>
+    </message>
+    <message>
+        <source>Already up to date with CPAP data at
+
+%1</source>
+        <translation>已全部更新的呼吸机数据在
+
+%1</translation>
+    </message>
+    <message>
+        <source>Up to date</source>
+        <translation>最新</translation>
+    </message>
+    <message>
+        <source>Couldn't find any valid Machine Data at
+
+%1</source>
+        <translation>没有有效的呼吸机数据在
+
+%1</translation>
+    </message>
+    <message>
+        <source>You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine:</source>
+        <translation>你将要 <font size=+2>消除</font> SleepyHead为如下机器建立的数据库:</translation>
+    </message>
+    <message>
+        <source>Note as a precaution, the backup folder will be left in place.</source>
+        <translation>以防万一,备份文件夹将被保留.</translation>
+    </message>
+    <message>
+        <source>Are you <b>absolutely sure</b> you want to proceed?</source>
+        <translation>您 <b>完全肯定</b> 需要继续吗?</translation>
+    </message>
+    <message>
+        <source>Exp&ort Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Backup &Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Make sure your keep your SleepyHead data folder backed up when trying testing versions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please ensure you are running the latest version before reporting any bugs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This red message line is intentional, and will not be a feature in the final version...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Data Folder Location: <a href="file://%1">%2</a></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1's Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Choose where to save journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>XML Files (*.xml)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MinMaxWidget</name>
+    <message>
+        <source>Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Override</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The Minimum Y-Axis value.. Note this can be a negative number if you wish.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The Maximum Y-Axis value.. Must be greater than Minimum to work.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scaling Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This button resets the Min and Max to match the Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>NewProfile</name>
+    <message>
+        <source>...</source>
+        <translation type="vanished">...</translation>
+    </message>
+    <message>
+        <source>ASV</source>
+        <translation>适应性支持同期模式</translation>
+    </message>
+    <message>
+        <source>APAP</source>
+        <translation>全自动正压通气</translation>
+    </message>
+    <message>
+        <source>CPAP</source>
+        <translation>持续气道正压通气</translation>
+    </message>
+    <message>
+        <source>Male</source>
+        <translation>男</translation>
+    </message>
+    <message>
+        <source>&Back</source>
+        <translation>&上一步</translation>
+    </message>
+    <message>
+        <source>&Next</source>
+        <translation>&下一步</translation>
+    </message>
+    <message>
+        <source>TimeZone</source>
+        <translation>时区</translation>
+    </message>
+    <message>
+        <source>Email</source>
+        <translation>电子邮件</translation>
+    </message>
+    <message>
+        <source>Phone</source>
+        <translation>电话</translation>
+    </message>
+    <message>
+        <source>Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.</source>
+        <translation>所有生成的报告仅限个人使用,且不能够作为医疗诊断.</translation>
+    </message>
+    <message>
+        <source>SleepyHead is copyright &copy;2011-2014 Mark Watkins</source>
+        <translation>SleepyHead 版权归于 &copy;2011-2014 Mark Watkins</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; font-style:italic;">Welcome to SleepyHead</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">This software is being designed to help you review data related to your CPAP treatment.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">It's intended as merely a data viewer, and not a substitute for competent medical guidance from your Doctor.  </span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">This software has been released freely under the </span><a href="qrc:/LICENSE.txt"><span style=" font-family:'Sans'; font-size:10pt; text-decoration: underline; color:#0000ff;">GNU Public License</span></a><span style [...]
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Accuracy of any data displayed is not and can not be guaranteed. </span></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;"><br />Any reports generated are for PERSONAL USE ONLY, and not fit for compliance purposes.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The author will not be held liable for </span><span style=" font-family:'Sans'; font-size:10pt; text-decoration: underline;">anything</span><span style=" font-family:'Sans'; font-size:10pt;"> related to the use or mi [...]
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Use at your own risk. </span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">This software is copyright ©2011 Mark Watkins </span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p></body></html></source>
+        <translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; font-style:italic;">欢迎使用SleepyHead</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">本软件用于呼吸机数据读取并图形化显示.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">本软件的作用为数据读取与显示,并不能作为诊断依据.  </span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">本软件基于GNU </span><a href="qrc:/LICENSE.txt"><span style=" font-family:'Sans'; font-size:10pt; text-decoration: underline; color:#0000ff;">免费发布</span></a><span style=" font-family:'Sans'; font-size:10pt;& [...]
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">数据准确性的保证. </span></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;"><br />任何经由此软件生成的报告作为自用参考,不适用于任何以遵从性(医嘱等)为目的的用途.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">作者不承担 </span><span style=" font-family:'Sans'; font-size:10pt; text-decoration: underline;">任何</span><span style=" font-family:'Sans'; font-size:10pt;"> 由于软件使用引起的问题所带来的损失. </span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Use at your own risk. </span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">版权所有 ©2011 Mark Watkins </span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p></body></html></translation>
+    </message>
+    <message>
+        <source>The author will not be held liable for <u>anything</u> related to the use or misuse of this software.</source>
+        <translation>作者不为 <u>任何</u> 使用本软件造成的后果负责.</translation>
+    </message>
+    <message>
+        <source>&Close this window</source>
+        <translation>&关闭窗口</translation>
+    </message>
+    <message>
+        <source>Edit User Profile</source>
+        <translation>编辑用户信息</translation>
+    </message>
+    <message>
+        <source>qrc:/docs/update_notes.html</source>
+        <translation type="vanished">qrc:/docs/update_notes.html</translation>
+    </message>
+    <message>
+        <source>CPAP Treatment Information</source>
+        <translation>呼吸机治疗信息</translation>
+    </message>
+    <message>
+        <source>Password Protect Profile</source>
+        <translation>密码保护</translation>
+    </message>
+    <message>
+        <source>Accuracy of any data displayed is not and can not be guaranteed.</source>
+        <translation>不保证任何显示数据的正确性.</translation>
+    </message>
+    <message>
+        <source>D.O.B.</source>
+        <translation>生日.</translation>
+    </message>
+    <message>
+        <source>Click here to choose where to store SleepyHead data.</source>
+        <translation type="vanished">点击选择存储SleepyHead数据的位置。</translation>
+    </message>
+    <message>
+        <source>Data Folder</source>
+        <translation type="vanished">数据文件夹</translation>
+    </message>
+    <message>
+        <source>Female</source>
+        <translation>女</translation>
+    </message>
+    <message>
+        <source>Gender</source>
+        <translation>性别</translation>
+    </message>
+    <message>
+        <source>Height</source>
+        <translation>身高</translation>
+    </message>
+    <message>
+        <source>Contact Information</source>
+        <translation>联系方式</translation>
+    </message>
+    <message>
+        <source>Locale Settings</source>
+        <translation>地点</translation>
+    </message>
+    <message>
+        <source>SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.</source>
+        <translation>SleepyHead仅是一款数据读显软件,并不适用于取代您的医生所给的建议.</translation>
+    </message>
+    <message>
+        <source>Welcome to SleepyHead</source>
+        <translation>欢迎使用SleepyHead</translation>
+    </message>
+    <message>
+        <source>CPAP Mode</source>
+        <translation>CPAP模式</translation>
+    </message>
+    <message>
+        <source>Select Country</source>
+        <translation>国家</translation>
+    </message>
+    <message>
+        <source>PLEASE READ CAREFULLY</source>
+        <translation>请认真阅读</translation>
+    </message>
+    <message>
+        <source>Untreated AHI</source>
+        <translation>未治疗时的AHI</translation>
+    </message>
+    <message>
+        <source>Keep the kids out.. Nothing more.. This isn't meant to be uber security.</source>
+        <translation>远离孩子...仅此而已....这不绝对安全。</translation>
+    </message>
+    <message>
+        <source>metric</source>
+        <translation>公制</translation>
+    </message>
+    <message>
+        <source>Address</source>
+        <translation>地址</translation>
+    </message>
+    <message>
+        <source>I agree to all the conditions above.</source>
+        <translation>同意以上条款。</translation>
+    </message>
+    <message>
+        <source>DST Zone</source>
+        <translation>夏令时</translation>
+    </message>
+    <message>
+        <source>archiac</source>
+        <translatorcomment>This means very old-fashioned, outdated</translatorcomment>
+        <translation>archiac</translation>
+    </message>
+    <message>
+        <source>RX Pressure</source>
+        <translation>释放压力</translation>
+    </message>
+    <message>
+        <source>Password</source>
+        <translation>密码</translation>
+    </message>
+    <message>
+        <source>Use of this software is entirely at your own risk.</source>
+        <translation>后果自负.</translation>
+    </message>
+    <message>
+        <source>Passwords don't match</source>
+        <translation>密码不匹配</translation>
+    </message>
+    <message>
+        <source>First Name</source>
+        <translation>名</translation>
+    </message>
+    <message>
+        <source>Last Name</source>
+        <translation>姓</translation>
+    </message>
+    <message>
+        <source>Country</source>
+        <translation>国家</translation>
+    </message>
+    <message>
+        <source>&Cancel</source>
+        <translation>&取消</translation>
+    </message>
+    <message>
+        <source>&Finish</source>
+        <translation>&完成</translation>
+    </message>
+    <message>
+        <source>Bi-Level</source>
+        <translation>双水平</translation>
+    </message>
+    <message>
+        <source>Profile Changes</source>
+        <translation>用户信息更改</translation>
+    </message>
+    <message>
+        <source>Personal Information (for reports)</source>
+        <translation>个人信息</translation>
+    </message>
+    <message>
+        <source>User Name</source>
+        <translation>姓名</translation>
+    </message>
+    <message>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <source>SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</source>
+        <translation>SleepyHead 基于 <a href='qrc:/COPYING'>GNU Public 许可发布</a>, 并不含质保以及不保证适用于用户以任何目的的使用.</translation>
+    </message>
+    <message>
+        <source>This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</source>
+        <translation>这款软件用于协助读取用于治疗睡眠障碍的各种CPAP的数据.</translation>
+    </message>
+    <message>
+        <source>User Information</source>
+        <translation>用户信息</translation>
+    </message>
+    <message>
+        <source>Empty Username</source>
+        <translation type="vanished">空白用户名</translation>
+    </message>
+    <message>
+        <source>...twice...</source>
+        <translation>...两次...</translation>
+    </message>
+    <message>
+        <source>Doctors Name</source>
+        <translation>医生姓名</translation>
+    </message>
+    <message>
+        <source>Shows the directory where SleepyHead data will be stored. </source>
+        <translation type="vanished">显示SleepyHead所需存储数据的目录。</translation>
+    </message>
+    <message>
+        <source>Doctors / Clinic Information</source>
+        <translation>医生/诊所信息</translation>
+    </message>
+    <message>
+        <source>Practice Name</source>
+        <translation>患者姓名</translation>
+    </message>
+    <message>
+        <source>Date Diagnosed</source>
+        <translation>诊断日期</translation>
+    </message>
+    <message>
+        <source>TextLabel</source>
+        <translation>文本标签</translation>
+    </message>
+    <message>
+        <source>Accept and save this information?</source>
+        <translation>保存信息?</translation>
+    </message>
+    <message>
+        <source>Patient ID</source>
+        <translation>患者编号</translation>
+    </message>
+    <message>
+        <source>Please provide a username for this profile</source>
+        <translation>请输入用户名</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation>空白</translation>
+    </message>
+</context>
+<context>
+    <name>Overview</name>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>L/b</source>
+        <translation>升/呼吸</translation>
+    </message>
+    <message>
+        <source>% PB</source>
+        <translation>% 周期性呼吸</translation>
+    </message>
+    <message>
+        <source>%PTB</source>
+        <translation>% 患者触发呼吸</translation>
+    </message>
+    <message>
+        <source>End:</source>
+        <translation>结束:</translation>
+    </message>
+    <message>
+        <source>Form</source>
+        <translation>表格</translation>
+    </message>
+    <message>
+        <source>Target
+Ventilation
+(L/min)</source>
+        <translation>目标
+通气率
+(升/分钟)</translation>
+    </message>
+    <message>
+        <source>Usage</source>
+        <translation>使用</translation>
+    </message>
+    <message>
+        <source>Respiratory
+Disturbance
+Index</source>
+        <translation>呼吸
+紊乱
+指数</translation>
+    </message>
+    <message>
+        <source>Show all graphs</source>
+        <translation>显示所有图表</translation>
+    </message>
+    <message>
+        <source>Reset view to selected date range</source>
+        <translation>重置是视窗范围</translation>
+    </message>
+    <message>
+        <source>Zombie Meter</source>
+        <translation>麻木程度</translation>
+    </message>
+    <message>
+        <source>Drop down to see list of graphs to switch on/off.</source>
+        <translation>滚动菜单以显示视图切换开关。</translation>
+    </message>
+    <message>
+        <source>Peak RDI
+Shows RDI Clusters
+(RDI/hr)</source>
+        <translation>RDI峰值
+显示RDI组
+(RDI/小时)</translation>
+    </message>
+    <message>
+        <source>Peak AHI
+Shows AHI Clusters
+(AHI/hr)</source>
+        <translation>AHI峰值
+显示AHI组
+(AHI/小时)</translation>
+    </message>
+    <message>
+        <source>Usage
+(hours)</source>
+        <translation>使用
+(小时)</translation>
+    </message>
+    <message>
+        <source>Last Three Months</source>
+        <translation>前三个月</translation>
+    </message>
+    <message>
+        <source>Respiratory
+Rate
+(breaths/min)</source>
+        <translation type="vanished">呼吸
+频率
+(呼吸次数/分钟)</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">无图表显示!</translation>
+    </message>
+    <message>
+        <source>Custom</source>
+        <translation>自定义</translation>
+    </message>
+    <message>
+        <source>How you felt
+(0-10)</source>
+        <translation>感觉如何
+(0-10)</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation>图表</translation>
+    </message>
+    <message>
+        <source>Range:</source>
+        <translation>范围:</translation>
+    </message>
+    <message>
+        <source>Start:</source>
+        <translation>开始:</translation>
+    </message>
+    <message>
+        <source>SensAwake
+(count)</source>
+        <translation>觉醒
+(计数)</translation>
+    </message>
+    <message>
+        <source>Last Month</source>
+        <translation>上个月</translation>
+    </message>
+    <message>
+        <source>Apnea
+Hypopnea
+Index</source>
+        <translation>暂停
+低通气
+指数</translation>
+    </message>
+    <message>
+        <source>% in PB</source>
+        <translation type="vanished">% 周期性呼吸</translation>
+    </message>
+    <message>
+        <source>Last 6 Months</source>
+        <translation>前六个月</translation>
+    </message>
+    <message>
+        <source>Body
+Mass
+Index</source>
+        <translation>身体
+重量
+指数</translation>
+    </message>
+    <message>
+        <source>Minute
+Ventilation
+(L/min)</source>
+        <translation>分钟
+通气率
+(升/分钟)</translation>
+    </message>
+    <message>
+        <source>Oxygen Saturation
+(%)</source>
+        <translation>氧饱和度
+(%)</translation>
+    </message>
+    <message>
+        <source>Session Times</source>
+        <translation>会话</translation>
+    </message>
+    <message>
+        <source>Last Two Weeks</source>
+        <translation>前两周</translation>
+    </message>
+    <message>
+        <source>Everything</source>
+        <translation>所有</translation>
+    </message>
+    <message>
+        <source>Last Week</source>
+        <translation>上周</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation>去年</translation>
+    </message>
+    <message>
+        <source>breaths/min</source>
+        <translation>呼吸次数/分钟</translation>
+    </message>
+    <message>
+        <source>Toggle Graph Visibility</source>
+        <translation>切换视图</translation>
+    </message>
+    <message>
+        <source>Peak AHI</source>
+        <translation>AHI峰值</translation>
+    </message>
+    <message>
+        <source>Peak RDI</source>
+        <translation>RDI峰值</translation>
+    </message>
+    <message>
+        <source>Events/Hr</source>
+        <translation type="vanished">事件/小时</translation>
+    </message>
+    <message>
+        <source>Hide all graphs</source>
+        <translation>隐藏所有图表</translation>
+    </message>
+    <message>
+        <source>Periodic
+Breathing
+(% of night)</source>
+        <translation type="vanished">周期性
+呼吸
+(% 夜)</translation>
+    </message>
+    <message>
+        <source>Patient
+Triggered
+Breaths
+(%)</source>
+        <translation>患者
+触发
+呼吸
+(%)</translation>
+    </message>
+    <message>
+        <source>Session Times
+(hours)</source>
+        <translation>会话时长
+(小时)</translation>
+    </message>
+    <message>
+        <source>
+(count)</source>
+        <translation>
+(计数)</translation>
+    </message>
+    <message>
+        <source>Last Two Months</source>
+        <translation>前两个月</translation>
+    </message>
+    <message>
+        <source>Tidal
+Volume
+(ml)</source>
+        <translation>呼吸
+容量
+(毫升)</translation>
+    </message>
+    <message>
+        <source>% in %1</source>
+        <translation>% in %1</translation>
+    </message>
+    <message>
+        <source>%1
+(% of night)</source>
+        <translation>%1
+(% 晚)</translation>
+    </message>
+    <message>
+        <source>Large Leaks
+(% of night)</source>
+        <translation>大量漏气
+(% 晚)</translation>
+    </message>
+    <message>
+        <source>% %1</source>
+        <translation>% %1</translation>
+    </message>
+</context>
+<context>
+    <name>OximeterImport</name>
+    <message>
+        <source>Dialog</source>
+        <translation>对话</translation>
+    </message>
+    <message>
+        <source>Oximeter Import Wizard</source>
+        <translation>血氧仪导入向导</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></source>
+        <translation type="unfinished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Skip this page next time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Where would you like to import from?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Directly from a recording on a device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Record attached to computer overnight (provides plethysomogram)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Import from a datafile saved by another program, like SpO2Review</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p>& [...]
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please connect your oximeter device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Press Start to commence recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Show Live Graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Duration</source>
+        <translation type="unfinished">时长</translation>
+    </message>
+    <message>
+        <source>SpO2 %</source>
+        <translation type="unfinished">血氧饱和度 %</translation>
+    </message>
+    <message>
+        <source>Pulse Rate</source>
+        <translation type="unfinished">脉搏</translation>
+    </message>
+    <message>
+        <source>Multiple Sessions Detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please choose which one you want to import into SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation type="unfinished">详情</translation>
+    </message>
+    <message>
+        <source>Import Completed. When did the recording start?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Day recording (normally would of) started</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximeter Starting time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>I want to use the time reported by my oximeter's built in clock.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>I started this oximeter recording at (or near) the same time as a session on my CPAP machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Choose CPAP session to sync to:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <source>You can manually adjust the time here if required:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>HH:mm:ssap</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&Cancel</source>
+        <translation type="unfinished">&取消</translation>
+    </message>
+    <message>
+        <source>&Information Page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&Retry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&Choose Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&End Recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&Sync and Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&Save and Finish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&Start</source>
+        <translation type="unfinished">&开始</translation>
+    </message>
+    <message>
+        <source>Scanning for compatible oximeters</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Could not detect any connected oximeter devices.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Connecting to %1 Oximeter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Select upload option on %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Waiting for you to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 device is uploading data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please wait until oximeter upload process completes. Do not unplug your oximeter.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximeter import completed..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Select a valid oximetry data file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximetry Files (*.spo *.spor *.spo2 *.dat)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>No Oximetery module could parse the given file:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximeter not detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Couldn't access oximeter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Live Oximetery Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Starting up...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>If you can still read this after a few seconds, cancel and try again</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Live Import Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Live Oximetery Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Live Oximetery import has been stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 session(s) on %2, starting at %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>No CPAP data available on %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1</source>
+        <translation type="unfinished">%1% {1?}</translation>
+    </message>
+    <message>
+        <source>Recording...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Finger not detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>I want to use the time my computer recorded for this live oximetry session.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>I need to set the time manually, because my oximeter doesn't have an internal clock.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Something went wrong getting session data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CMS50 Session %1</source>
+        <translation>CMS50 会话 %1</translation>
+    </message>
+    <message>
+        <source>Start Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>"%1", session %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Waiting for %1 to start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Waiting for the device to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Oximetry</name>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>Date</source>
+        <translation>日期</translation>
+    </message>
+    <message>
+        <source>Form</source>
+        <translation>表格</translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation type="vanished">保存</translation>
+    </message>
+    <message>
+        <source>SpO2</source>
+        <translation>血氧饱和度</translation>
+    </message>
+    <message>
+        <source>Please make sure your oximeter is switched on, and in the right mode to transmit data.</source>
+        <translation type="vanished">请确保血氧仪已经打开并且置于正确的模式以便数据传输。</translation>
+    </message>
+    <message>
+        <source>&Stop</source>
+        <translation type="vanished">&停止</translation>
+    </message>
+    <message>
+        <source>Pulse</source>
+        <translation>脉搏</translation>
+    </message>
+    <message>
+        <source>Please connect oximeter device</source>
+        <translation type="vanished">请连接血氧仪</translation>
+    </message>
+    <message>
+        <source>&Start</source>
+        <translation type="vanished">&开始</translation>
+    </message>
+    <message>
+        <source>Creating a new oximetry session will destroy the old one.
+Would you like to save it first?</source>
+        <translation type="vanished">创建一个新的会话会覆盖旧的。
+是否将旧的会话进行保存?</translation>
+    </message>
+    <message>
+        <source>Would you like to save this oximetery session?</source>
+        <translation type="vanished">保存这个血氧仪会话?</translation>
+    </message>
+    <message>
+        <source>&Open .spo/R File</source>
+        <translation>&打开 SPO/R 文档</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="vanished">取消</translation>
+    </message>
+    <message>
+        <source>Check Oximeter is Ready</source>
+        <translation type="vanished">血氧仪已就绪</translation>
+    </message>
+    <message>
+        <source>Oximeter Error!</source>
+        <translation type="vanished">血氧计故障!</translation>
+    </message>
+    <message>
+        <source>Couldn't open oximetry file "</source>
+        <translation type="vanished">无法打开血氧仪文件"</translation>
+    </message>
+    <message>
+        <source>Save Session?</source>
+        <translation type="vanished">保存?</translation>
+    </message>
+    <message>
+        <source>R&eset</source>
+        <translation>重&置</translation>
+    </message>
+    <message>
+        <source>Select an oximetry file</source>
+        <translation type="vanished">选择一个血氧仪数据文件</translation>
+    </message>
+    <message>
+        <source>Oximetry Error!
+
+Something is wrong with the device connection.</source>
+        <translation type="vanished">血氧仪故障!
+
+是否连接。</translation>
+    </message>
+    <message>
+        <source>Serial &Import</source>
+        <translation>序列号 & 导入</translation>
+    </message>
+    <message>
+        <source>Oximetry Files (*.spo *.spoR)</source>
+        <translation type="vanished">血氧仪文档((*.spo *.spoR)</translation>
+    </message>
+    <message>
+        <source>Serial Port</source>
+        <translation>产口</translation>
+    </message>
+    <message>
+        <source>d/MM/yy h:mm:ss AP</source>
+        <translation>日/月/年 小时:分钟:秒</translation>
+    </message>
+    <message>
+        <source>Please Wait</source>
+        <translation type="vanished">请稍等</translation>
+    </message>
+    <message>
+        <source>&Start Live</source>
+        <translation>&开始</translation>
+    </message>
+    <message>
+        <source>Connect Oximeter</source>
+        <translation type="vanished">连接血氧仪</translation>
+    </message>
+    <message>
+        <source>Please make sure Oximeter device is in upload mode.</source>
+        <translation type="vanished">请确保血氧仪处于上传模式。</translation>
+    </message>
+    <message>
+        <source>Control</source>
+        <translation type="vanished">控制</translation>
+    </message>
+    <message>
+        <source>Oximetry live recording has been terminated due to timeout.</source>
+        <translation type="vanished">血氧仪实时记录已经由于超时而停止。</translation>
+    </message>
+    <message>
+        <source>Destroy It</source>
+        <translation type="vanished">删除</translation>
+    </message>
+    <message>
+        <source>&Rescan Ports</source>
+        <translation>&扫描端口</translation>
+    </message>
+    <message>
+        <source>Opening this oximetry file will destroy the current session.
+Would you like to keep it?</source>
+        <translation type="vanished">打开血氧仪文档会损坏现有的会话。
+您希望保存这个会话吗?</translation>
+    </message>
+    <message>
+        <source>Device Connected</source>
+        <translation type="vanished">设备已连接</translation>
+    </message>
+    <message>
+        <source>Keep This Recording?</source>
+        <translation type="vanished">仍然记录?</translation>
+    </message>
+    <message>
+        <source>Oximeter Error
+
+The device has not responded.. Make sure it's switched on.</source>
+        <translation type="vanished">血氧仪故障
+
+设备未响应。请确保已打开。</translation>
+    </message>
+    <message>
+        <source>Oximeter Error
+
+The device did not respond.. Make sure it's switched on.</source>
+        <translation type="vanished">血氧仪故障
+
+设备未响应。请确保已打开。</translation>
+    </message>
+    <message>
+        <source>Opening this oximetry session will destroy the unsavedsession in the oximetry tab.
+Would you like to store it first?</source>
+        <translation type="vanished">打开这个血氧仪文化会损坏在血氧仪栏内的未存储会话。
+是否先保存会话?</translation>
+    </message>
+    <message>
+        <source>No Oximetry Data</source>
+        <translation type="vanished">无血氧数据</translation>
+    </message>
+</context>
+<context>
+    <name>PreferencesDialog</name>
+    <message>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <source>s</source>
+        <translation>s</translation>
+    </message>
+    <message>
+        <source>ID</source>
+        <translation type="vanished">编号</translation>
+    </message>
+    <message>
+        <source>&Ok</source>
+        <translation>&好的</translation>
+    </message>
+    <message>
+        <source>Add</source>
+        <translation type="vanished">添加</translation>
+    </message>
+    <message>
+        <source>N/A</source>
+        <translation type="vanished">不适用</translation>
+    </message>
+    <message>
+        <source> bpm</source>
+        <translation>每分钟脉搏</translation>
+    </message>
+    <message>
+        <source>Graph Height</source>
+        <translation>图表高度</translation>
+    </message>
+    <message>
+        <source>Font</source>
+        <translation>字体</translation>
+    </message>
+    <message>
+        <source>Leak</source>
+        <translation>漏气</translation>
+    </message>
+    <message>
+        <source>SPO2</source>
+        <translation>血氧饱和度</translation>
+    </message>
+    <message>
+        <source>Show</source>
+        <translation type="vanished">显示</translation>
+    </message>
+    <message>
+        <source>Size</source>
+        <translation>大小</translation>
+    </message>
+    <message>
+        <source>Type</source>
+        <translation>类型</translation>
+    </message>
+    <message>
+        <source>Skip Login Screen</source>
+        <translation>跳过登录界面</translation>
+    </message>
+    <message>
+        <source>Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA)</source>
+        <translation>显示RDI,而不是AHI (RDI=AHI+RERA)</translation>
+    </message>
+    <message>
+        <source>&CPAP</source>
+        <translation>&持续气道正压通气</translation>
+    </message>
+    <message>
+        <source>General Settings</source>
+        <translation>通用设置</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html></source>
+        <translation><html><head/><body><p>在使用双向触摸板放大时,滚动显示更容易</p><p>50ms是推荐值.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Daily Graphs</source>
+        <translation type="vanished">日常图表</translation>
+    </message>
+    <message>
+        <source>Compress ResMed (EDF) backups to save disk space.
+Backed up EDF files are stored in the .gz format, 
+which is common on Mac & Linux platforms.. 
+
+SleepyHead can import from this compressed backup directory natively.. 
+To use with ResScan will require the .gz files to be uncompressed first..</source>
+        <translation>压缩的瑞斯迈数据文件(EDF)的备份可以节省硬盘空间。
+压缩过的文件将保存为.gz格式,
+这是MAC和linux平台的常见文件格式..
+
+SleepyHead可以从本地硬盘导入备份文件..
+如果使用ResScan读取,需要先行解压..</translation>
+    </message>
+    <message>
+        <source>Event</source>
+        <translation type="vanished">事件</translation>
+    </message>
+    <message>
+        <source>Event Duration</source>
+        <translation>事件区间</translation>
+    </message>
+    <message>
+        <source>Graph</source>
+        <translation type="vanished">图表</translation>
+    </message>
+    <message>
+        <source>Pulse</source>
+        <translation>脉搏</translation>
+    </message>
+    <message>
+        <source>days.</source>
+        <translation>天.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">会话将会比这个稍短并且不会显示<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></translation>
+    </message>
+    <message>
+        <source>The name of your mask, or at least the name you call it.</source>
+        <translation>面罩名称。</translation>
+    </message>
+    <message>
+        <source>Ignore Short Sessions</source>
+        <translation>忽略短时会话</translation>
+    </message>
+    <message>
+        <source>Percentage of restriction in airflow from the median value. 
+A value of 20% works well for detecting apneas. </source>
+        <translation>气流限值的中值百分比
+20%的气流限值有利于检测呼吸暂停。</translation>
+    </message>
+    <message>
+        <source>Sessions starting before this time will go to the previous calendar day.</source>
+        <translation>在此之前开始一段会话将会计入上一天.</translation>
+    </message>
+    <message>
+        <source>The date you started using this mask</source>
+        <translation>开始使用此面罩的日期</translation>
+    </message>
+    <message>
+        <source>Session Storage Options</source>
+        <translation>会话存储选项</translation>
+    </message>
+    <message>
+        <source>Graph Titles</source>
+        <translation>图表标题</translation>
+    </message>
+    <message>
+        <source>Zero Reset</source>
+        <translation>归零</translation>
+    </message>
+    <message>
+        <source>The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes.</source>
+        <translation>随后的选择将会影响到SleepyHead所占用的空间以及数据导入的时间。</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">自定义标记是一个检测被机器忽略的事件实验方法。它们<span style=" text-decoration: underline;">不</span>包含于 AHI.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Show event breakdown pie chart</source>
+        <translation>显示饼图</translation>
+    </message>
+    <message>
+        <source>Enable/disable experimental event flagging enhancements. 
+It allows detecting borderline events, and some the machine missed.
+This option must be enabled before import, otherwise a purge is required.</source>
+        <translation>激活/禁用(实验性)突出事件标记。
+允许检测边缘事件以及设备遗漏事件
+这个选项必须在导入前激活,否则需要清除缓存。</translation>
+    </message>
+    <message>
+        <source>Flow Restriction</source>
+        <translation>气流限制</translation>
+    </message>
+    <message>
+        <source>Show Compliance</source>
+        <translation>显示兼容信息</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to reset your graph preferences to the defaults?</source>
+        <translation type="vanished">重置图表设置为默认值?</translation>
+    </message>
+    <message>
+        <source>Minimum duration of drop in oxygen saturation</source>
+        <translation>血氧饱和下降的最小区间</translation>
+    </message>
+    <message>
+        <source>Overview Linecharts</source>
+        <translation>线形图概览</translation>
+    </message>
+    <message>
+        <source>Whether to allow changing yAxis scales by double clicking on yAxis labels</source>
+        <translation>是否允许以双击Y轴来进行Y轴的缩放</translation>
+    </message>
+    <message>
+        <source>Contec CMS50</source>
+        <translation type="vanished">康泰 CMS50</translation>
+    </message>
+    <message>
+        <source>Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</source>
+        <translation>像素映射缓存是图形加速技术,或许会导致在您的操作系统上的字体显示异常.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data.  </span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">正在更换SD卡备份压缩选项不会自动再次压缩数据  </span></p></body></html></translation>
+    </message>
+    <message>
+        <source>Bypass the login screen and load the most recent User Profile</source>
+        <translation>跳过用户登录界面,登录常用用户</translation>
+    </message>
+    <message>
+        <source>Data Reindex Required</source>
+        <translation>重建数据索引</translation>
+    </message>
+    <message>
+        <source>Scroll Dampening</source>
+        <translation>滚动抑制</translation>
+    </message>
+    <message>
+        <source> hours</source>
+        <translation>小时</translation>
+    </message>
+    <message>
+        <source>Nasal Pillows</source>
+        <translation>鼻枕</translation>
+    </message>
+    <message>
+        <source>If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.</source>
+        <translation>如果您需要重新导入数据,这个数据将会丢失。</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">如果你愿意尝试新功能或者修正程序,请点击这里.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">但是请注意这将有可能破坏代码..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></translation>
+    </message>
+    <message>
+        <source>Leak Profile</source>
+        <translation>漏气参数</translation>
+    </message>
+    <message>
+        <source>Standard Bars</source>
+        <translation>标准导航条</translation>
+    </message>
+    <message>
+        <source>Mask Profile</source>
+        <translation>面罩参数</translation>
+    </message>
+    <message>
+        <source>99% Percentile</source>
+        <translation>99%</translation>
+    </message>
+    <message>
+        <source>Small chunks of oximetry data under this amount will be discarded.</source>
+        <translation>在此数值下的血氧饱和数据块将会被舍弃。</translation>
+    </message>
+    <message>
+        <source>Top & Bottom Markers</source>
+        <translation type="vanished">顶端 & 底部 标志带</translation>
+    </message>
+    <message>
+        <source>Reset the counter to zero at beginning of each (time) window.</source>
+        <translation>在每个窗口打开时将计数器归零。</translation>
+    </message>
+    <message>
+        <source>One or more of the changes you have made will require this application to be restarted,
+in order for these changes to come into effect.
+
+Would you like do this now?</source>
+        <translation>软件需要重启
+来实现这些更改
+
+希望进行更改吗?</translation>
+    </message>
+    <message>
+        <source>Not entirely sure if this will get to live or not..</source>
+        <translation type="vanished">不完全确定是否已经成功..</translation>
+    </message>
+    <message>
+        <source>Discard chunks under</source>
+        <translation type="vanished">舍弃如下数据块</translation>
+    </message>
+    <message>
+        <source> minutes</source>
+        <translation>分钟</translation>
+    </message>
+    <message>
+        <source>Minutes</source>
+        <translation>分钟</translation>
+    </message>
+    <message>
+        <source>Graph Settings</source>
+        <translation>图形设置</translation>
+    </message>
+    <message>
+        <source>CPAP Mask Information</source>
+        <translation>CPAP面罩信息</translation>
+    </message>
+    <message>
+        <source>Method of unintentional leaks calculation if not provided by your machine.
+Note: Statistical Model is experimental.</source>
+        <translation>意外漏气计算方法(如果您的机器没有提供这个模型)
+备注:经验统计模型。</translation>
+    </message>
+    <message>
+        <source>Bold  </source>
+        <translation>突出显示  </translation>
+    </message>
+    <message>
+        <source>Colour</source>
+        <translation type="vanished">颜色</translation>
+    </message>
+    <message>
+        <source>Minimum duration of pulse change event.</source>
+        <translation>脉搏改变事件的最小区间。</translation>
+    </message>
+    <message>
+        <source>Anti-Aliasing applies smoothing to graph plots.. 
+Certain plots look more attractive with this on. 
+This also affects printed reports.
+
+Try it and see if you like it.</source>
+        <translation>反锯齿技术可以使得图表显示更加圆润
+当这一功能启用时,特定的图块会突出显示
+在打印报告中也会体现出来
+
+试试看。</translation>
+    </message>
+    <message>
+        <source>Oximetry Graphs</source>
+        <translation type="vanished">血氧仪图表</translation>
+    </message>
+    <message>
+        <source>Median is recommended for ResMed users.</source>
+        <translation>建议瑞斯迈用户选择中值。</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation type="vanished">图表</translation>
+    </message>
+    <message>
+        <source>of usage per night</source>
+        <translation>每晚使用时间</translation>
+    </message>
+    <message>
+        <source>&Check for Updates now</source>
+        <translation>&即刻检查更新</translation>
+    </message>
+    <message>
+        <source>Italic</source>
+        <translation>意大利</translation>
+    </message>
+    <message>
+        <source>Enable Multithreading</source>
+        <translation>启用多线程</translation>
+    </message>
+    <message>
+        <source>This may not be a good idea</source>
+        <translation>不正确的应用</translation>
+    </message>
+    <message>
+        <source>Weighted Average</source>
+        <translation>平均体重</translation>
+    </message>
+    <message>
+        <source>Median</source>
+        <translation>中间的</translation>
+    </message>
+    <message>
+        <source>Turn on/off the spinning "context" cube.
+It really doesn't use that much resources.. :)</source>
+        <translation type="vanished">打开/关闭 文档滑块
+文档滑块非常节省资源,建议打开.. :)</translation>
+    </message>
+    <message>
+        <source>Sudden change in Pulse Rate of at least this amount</source>
+        <translation>脉搏突然改变的最小值</translation>
+    </message>
+    <message>
+        <source>Remove</source>
+        <translation type="vanished">删除</translation>
+    </message>
+    <message>
+        <source>Search</source>
+        <translation>查询</translation>
+    </message>
+    <message>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+SleepyHead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translation>这将为瑞斯迈的SD卡保留一备份数据。
+瑞斯迈的机器仅会将高分辨率的数据保存7天,图表保存30天。
+SleepyHead可以保存这些数据的副本以备再次使用。
+(强烈建议,除非你的磁盘空间不足或者不在意图表数据)</translation>
+    </message>
+    <message>
+        <source>Window</source>
+        <translation>窗口</translation>
+    </message>
+    <message>
+        <source>Middle Calculations</source>
+        <translation>中值计算</translation>
+    </message>
+    <message>
+        <source>Skip over Empty Days</source>
+        <translation>跳过无数据日期</translation>
+    </message>
+    <message>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+Sleepyhead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translation type="vanished">这将为瑞斯迈的SD卡保留一备份数据。
+瑞斯迈的机器仅会将高分辨率的数据保存7天,图表保存30天。
+SleepyHead可以保存这些数据的副本以备再次使用。
+(强烈建议,除非你的磁盘空间不足或者不在意图表数据)</translation>
+    </message>
+    <message>
+        <source>Allow duplicates near machine events.</source>
+        <translation>允许多重记录趋近机器事件数据。</translation>
+    </message>
+    <message>
+        <source>The visual method of displaying waveform overlay flags.
+</source>
+        <translation>将视窗显示的波形的标记进行叠加。</translation>
+    </message>
+    <message>
+        <source>Upper Percentile</source>
+        <translation>增大</translation>
+    </message>
+    <message>
+        <source>Restart Required</source>
+        <translation>重启请求</translation>
+    </message>
+    <message>
+        <source>Generic mask type. Select the one that's closest to your mask.</source>
+        <translation>通用面罩。选择一款最接近的面罩。</translation>
+    </message>
+    <message>
+        <source>True Maximum</source>
+        <translation>真极大值</translation>
+    </message>
+    <message>
+        <source>For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.</source>
+        <translation>为了保持一致,瑞斯迈的用户需要设置95%,
+它将作为唯一值出现在汇总界面内。</translation>
+    </message>
+    <message>
+        <source>Graph Text</source>
+        <translation>图表文字</translation>
+    </message>
+    <message>
+        <source>Session Settings</source>
+        <translation>会话设置</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</span></p></body></html></source>
+        <translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">像素映射缓存是一种图形加速技术,但是它有可能会导致字体显示不正常.</span></p></body></html></translation>
+    </message>
+    <message>
+        <source>Cache Session Data (uses more system memory)</source>
+        <translation>缓存会话数据(使用更多的内存)</translation>
+    </message>
+    <message>
+        <source>Allow use of multiple CPU cores where available to improve performance. 
+Mainly affects the importer.</source>
+        <translation>允许使用多核CPU以提高性能
+提高导入性能。</translation>
+    </message>
+    <message>
+        <source>Tries to forces the oximetry data to link with CPAP when possible.</source>
+        <translation>多次尝试在可能时将血氧仪数据与CPAP数据相结合。</translation>
+    </message>
+    <message>
+        <source>Line Chart</source>
+        <translation>线形图</translation>
+    </message>
+    <message>
+        <source>How long you want the tooltips to stay visible.</source>
+        <translation>设置工具条可见时间。</translation>
+    </message>
+    <message>
+        <source>Multiple sessions closer together than this value will be kept on the same day.
+</source>
+        <translation>缩小多个会话间距可以使其显示在同一天.</translation>
+    </message>
+    <message>
+        <source>Duration of airflow restriction</source>
+        <translation>气流限制区间</translation>
+    </message>
+    <message>
+        <source>Bar Tops</source>
+        <translation>任务条置顶</translation>
+    </message>
+    <message>
+        <source>Automatically Check For Updates</source>
+        <translation>自动检查更新</translation>
+    </message>
+    <message>
+        <source>I want to try experimental and test builds (Advanced users only please.)</source>
+        <translation>我愿意尝试测试版本(仅适用高阶用户)</translation>
+    </message>
+    <message>
+        <source>as over</source>
+        <translation>大于</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to disable these backups?</source>
+        <translation>你确定要禁用备份吗?</translation>
+    </message>
+    <message>
+        <source>Overview Graphs</source>
+        <translation type="vanished">图表总览</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (only for ResMed so far, highly recommended)</source>
+        <translation type="vanished">在导入的时候为SD卡数据创建备份(仅限瑞斯迈,强烈建议)</translation>
+    </message>
+    <message>
+        <source>Other Visual Settings</source>
+        <translation>其他显示设置</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation>压力</translation>
+    </message>
+    <message>
+        <source>Day Split Time</source>
+        <translation>时段</translation>
+    </message>
+    <message>
+        <source>Big  Text</source>
+        <translation>大文本</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html></source>
+        <translation><html><head/><body><p>此项功能已被取消,但会在后续版本内加入. </p></body></html></translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style= [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">t [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></source>
+        <translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">正在同步血氧数据以及CPAP数据</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">从串口或者SpO2 Review 导入CMS50数据 </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"&gt [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">即时显示模式(需要串口线)可以准确的同步CMS50,但是不能响应CPAP的时钟漂移.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">如果打开血氧仪存储模式的 </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">同时 </span><span style=" font-family:'Sans'; font-size:10pt;">打开CPAP,那么可以一起进行同步. </span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">串口导入的时间戳由前一个晚上的第一个CPAP会话开始,所以请先导入CPAP数据</span></p></body></html></translation>
+    </message>
+    <message>
+        <source>Description</source>
+        <translation>描述</translation>
+    </message>
+    <message>
+        <source>ResMed users probably should use 99th Percentile for visual consistency.</source>
+        <translation>为保证视觉一致性,请瑞斯迈用户选择百分之99.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">备注: </span>漏气配置已不再工作..</p></body></html></translation>
+    </message>
+    <message>
+        <source>ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).</source>
+        <translation>在不同的分辨率下,瑞斯迈S9仅会将SD卡内的数据保存6天到30天.</translation>
+    </message>
+    <message>
+        <source>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</source>
+        <translation>注意使用时间低于4个小时的日子。</translation>
+    </message>
+    <message>
+        <source>Daily view navigation buttons will skip over days without data records</source>
+        <translation>敲击日常查看导航按钮将跳过没有数据的日子</translation>
+    </message>
+    <message>
+        <source> seconds</source>
+        <translation>秒</translation>
+    </message>
+    <message>
+        <source>Mask Type</source>
+        <translation>面罩类型</translation>
+    </message>
+    <message>
+        <source>Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.</source>
+        <translation>为AHI/小时图表的每一个点调节数据量
+默认值到60分钟,强烈建议使用这一默认值。</translation>
+    </message>
+    <message>
+        <source>&Cancel</source>
+        <translation>&取消</translation>
+    </message>
+    <message>
+        <source>Last Checked For Updates: </source>
+        <translation>上次的更新:</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation>详情</translation>
+    </message>
+    <message>
+        <source>&Events</source>
+        <translation type="vanished">&事件</translation>
+    </message>
+    <message>
+        <source>Use Anti-Aliasing</source>
+        <translation>使用反锯齿技术显示</translation>
+    </message>
+    <message>
+        <source>Overpriced ResMed S9 Oximeter</source>
+        <translation type="vanished">定价过高的瑞斯迈S9血氧仪</translation>
+    </message>
+    <message>
+        <source>Animations && Fancy Stuff</source>
+        <translation>动画 && 爱好</translation>
+    </message>
+    <message>
+        <source>&Import</source>
+        <translation>&导入</translation>
+    </message>
+    <message>
+        <source>AHI/Hour Graph Settings</source>
+        <translation>AHI/小时图表设置</translation>
+    </message>
+    <message>
+        <source>Add this Location to the Import List</source>
+        <translation type="vanished">在导入列表中添加新位置</translation>
+    </message>
+    <message>
+        <source>Use Oximetry</source>
+        <translation type="vanished">使用血氧仪</translation>
+    </message>
+    <message>
+        <source>Changes to the following settings needs a restart, but not a recalc.</source>
+        <translation>更改如下设置需要重启,但不需要重新估算。</translation>
+    </message>
+    <message>
+        <source>Compress Session Data (makes SleepyHead data smaller, but day changing slower.)</source>
+        <translation>压缩会话数据(可以使SleepyHead 数据更小)</translation>
+    </message>
+    <message>
+        <source>&Appearance</source>
+        <translation>&外观</translation>
+    </message>
+    <message>
+        <source>The pixel thickness of line plots</source>
+        <translation>行块像素</translation>
+    </message>
+    <message>
+        <source>&Defaults</source>
+        <translation type="vanished">&默认值</translation>
+    </message>
+    <message>
+        <source>Filters the graph list. Simply start typing the name of the graph your looking for.</source>
+        <translation type="vanished">图表过滤器。输入你所要查询的图标的名称。</translation>
+    </message>
+    <message>
+        <source>Combine Close Sessions </source>
+        <translation>关闭所有会话</translation>
+    </message>
+    <message>
+        <source>Allow YAxis Scaling</source>
+        <translation>允许Y轴缩放</translation>
+    </message>
+    <message>
+        <source>Use Pixmap Caching</source>
+        <translation>使用象素映射缓存</translation>
+    </message>
+    <message>
+        <source>Check for new version every</source>
+        <translation>每次都检查是否有新版本</translation>
+    </message>
+    <message>
+        <source>Allows graphs to be "screenshotted" for display purposes.
+The Event Breakdown PIE chart uses this method, as does
+the printing code.
+Unfortunately some older computers/versions of Qt can cause
+this application to be unstable with this feature enabled.</source>
+        <translation>允许对图表截屏
+数据汇总饼图将使用这一方法
+也可以打印代码
+当开启这个功能时,某些旧电脑或者老版本的
+Qt软件会导致软件不稳定.</translation>
+    </message>
+    <message>
+        <source>Maximum Calcs</source>
+        <translation>最大估算值</translation>
+    </message>
+    <message>
+        <source>This makes SleepyHead's data take around half as much space.
+But it makes import and day changing take longer.. 
+If you've got a new computer with a small solid state disk, this is a good option.</source>
+        <translation>这会使得SleepyHead的数据仅占原有大约一半的空间。
+当然,这也会使导入数据的时间变长。
+如果你有一台装有小容量固态硬盘的电脑,这是个不错的选择。</translation>
+    </message>
+    <message>
+        <source>Tooltip Timeout</source>
+        <translation>工具条超时</translation>
+    </message>
+    <message>
+        <source>Preferences</source>
+        <translation>参数设置</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style= [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">t [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">正在同步血氧数据以及CPAP数据</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">从串口或者SpO2 Review 导入CMS50数据 </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"&gt [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">即时显示模式(需要串口线)可以准确的同步CMS50,但是不能响应CPAP的时钟漂移.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">如果打开血氧仪存储模式的 </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">同时 </span><span style=" font-family:'Sans'; font-size:10pt;">打开CPAP,那么可以一起进行同步. </span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">串口导入的时间戳由前一个晚上的第一个CPAP会话开始,所以请先导入CPAP数据</span></p></body></html></translation>
+    </message>
+    <message>
+        <source>Started Using</source>
+        <translation>开始使用</translation>
+    </message>
+    <message>
+        <source>Sourceforge hosts this project for free.. Please be considerate of their resources..</source>
+        <translation>这个免费项目是由SourceForge,请珍惜他人的劳动成果。</translation>
+    </message>
+    <message>
+        <source>Default display height of graphs in pixels</source>
+        <translation>使用默认项目显示图标高度</translation>
+    </message>
+    <message>
+        <source>Leak calcs</source>
+        <translation>漏气计算</translation>
+    </message>
+    <message>
+        <source>Overlay Flags</source>
+        <translation>叠加标记</translation>
+    </message>
+    <message>
+        <source>Confirmation</source>
+        <translation type="vanished">确定</translation>
+    </message>
+    <message>
+        <source>Makes certain plots look more "square waved".</source>
+        <translation>在特定区块显示更多的方波.</translation>
+    </message>
+    <message>
+        <source>Flag changes in oximetry stats</source>
+        <translation type="vanished">血氧统计标记改变</translation>
+    </message>
+    <message>
+        <source>Percentage drop in oxygen saturation</source>
+        <translation>血氧饱和百分比下降</translation>
+    </message>
+    <message>
+        <source>&General</source>
+        <translation>&通用</translation>
+    </message>
+    <message>
+        <source>Keep session data in memory to speed up revisiting days.</source>
+        <translation>将会话数据保留在内存中可以更便捷的回顾。</translation>
+    </message>
+    <message>
+        <source>If you need to conserve disk space, please remember to carry out manual backups.</source>
+        <translation>如果您要释放磁盘空间,请务必先备份.</translation>
+    </message>
+    <message>
+        <source>Link Oximetry and CPAP graphs</source>
+        <translation>合并血氧仪与CPAP图表</translation>
+    </message>
+    <message>
+        <source>Compress SD Card Backups (slower first import, but makes backups smaller)</source>
+        <translation>压缩备份SD卡数据(导入速度变慢,节省空间)</translation>
+    </message>
+    <message>
+        <source>Don't show any compliance information</source>
+        <translation>不显示兼容的信息</translation>
+    </message>
+    <message>
+        <source>Normal Average</source>
+        <translation>正常体重</translation>
+    </message>
+    <message>
+        <source>A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.
+
+Are you sure you want to make these changes?</source>
+        <translation>为了更改数据设置将重建索引,这将花费几分钟的时间。
+
+确定要更数据吗?</translation>
+    </message>
+    <message>
+        <source>Don't touch this unless you know your CPAP clock is out.
+Try to sync it to your PC's clock (which should be synced to a timeserver)</source>
+        <translation>不要设置这项除非你确定CPAP时钟漂移
+尝试与电脑的时钟同步(需要与时钟服务器同步)</translation>
+    </message>
+    <message>
+        <source>Preferred Calculation Methods</source>
+        <translation>首选的计算方法</translation>
+    </message>
+    <message>
+        <source>Statistical Model</source>
+        <translation>统计模型</translation>
+    </message>
+    <message>
+        <source>Double click on the (Y-axis) min/max values to edit them</source>
+        <translation type="vanished">双击Y轴来设置最小/最大值</translation>
+    </message>
+    <message>
+        <source>Graph Tooltips</source>
+        <translation>图形工具提示</translation>
+    </message>
+    <message>
+        <source>Custom User Event Flagging</source>
+        <translation>自定义用户事件标记</translation>
+    </message>
+    <message>
+        <source>milliseconds</source>
+        <translation>毫秒</translation>
+    </message>
+    <message>
+        <source>&Oximetry</source>
+        <translation>&血氧测量</translation>
+    </message>
+    <message>
+        <source>CPAP Clock Drift</source>
+        <translation>CPAP时钟漂移</translation>
+    </message>
+    <message>
+        <source>Import Locations</source>
+        <translation type="vanished">导入位置</translation>
+    </message>
+    <message>
+        <source>Square Wave Plots</source>
+        <translation>方波区块</translation>
+    </message>
+    <message>
+        <source>TextLabel</source>
+        <translation>文本标签</translation>
+    </message>
+    <message>
+        <source>Application Fonts</source>
+        <translation>应用程序字体</translation>
+    </message>
+    <message>
+        <source>Application</source>
+        <translation>应用</translation>
+    </message>
+    <message>
+        <source>Line Thickness</source>
+        <translation>线宽</translation>
+    </message>
+    <message>
+        <source>Use RDI instead of AHI (PRS1 only)</source>
+        <translation>用RDI替换AHI(只适用于飞利浦伟康 System One)</translation>
+    </message>
+    <message>
+        <source>Do not import sessions older than:</source>
+        <translation>请不要导入早于如下时间的数据:</translation>
+    </message>
+    <message>
+        <source>Sessions older than this date will not be imported</source>
+        <translation>早于这个时间的数据将不能导入</translation>
+    </message>
+    <message>
+        <source>dd MMMM yyyy</source>
+        <translation>天天 月月月月 年年年年</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON)</source>
+        <translation type="vanished">在导入SD卡数据时自动备份(对瑞思迈和费雪机型尤其重要)</translation>
+    </message>
+    <message>
+        <source>User definable threshold considered large leak</source>
+        <translation>用户自定义大量漏气数值</translation>
+    </message>
+    <message>
+        <source> L/min</source>
+        <translation>升/分钟</translation>
+    </message>
+    <message>
+        <source>Whether to show the leak redline in the leak graph</source>
+        <translation>是否在漏气图表中显示漏气限值红线</translation>
+    </message>
+    <message>
+        <source>Show Leak Redline</source>
+        <translation>显示漏气限值红线</translation>
+    </message>
+    <message>
+        <source>Oximetery Settings</source>
+        <translation>血氧仪设置</translation>
+    </message>
+    <message>
+        <source>Contec CMS50D+</source>
+        <translation type="vanished">康泰 CMS50D+</translation>
+    </message>
+    <message>
+        <source>Contec CMS50E/F</source>
+        <translation type="vanished">康泰 CMS50E/F</translation>
+    </message>
+    <message>
+        <source>Contec CMS50F v3.7</source>
+        <translation type="vanished">康泰 CMS50F v3.7</translation>
+    </message>
+    <message>
+        <source>Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.</source>
+        <translation>关闭自动备份时不明智的.因为在运行出错的情况下SleepHead需要重新建立数据库.</translation>
+    </message>
+    <message>
+        <source>Are you really sure you want to do this?</source>
+        <translation>确定?</translation>
+    </message>
+    <message>
+        <source>Show in Event Breakdown Piechart</source>
+        <translation>在事件分类饼图中显示</translation>
+    </message>
+    <message>
+        <source>#1</source>
+        <translation>#1</translation>
+    </message>
+    <message>
+        <source>#2</source>
+        <translation>#2</translation>
+    </message>
+    <message>
+        <source>This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.</source>
+        <translation>这个实验性的选项是为了使用SleepHead事件标记来改进对呼吸机事件位置的侦测.</translation>
+    </message>
+    <message>
+        <source>Resync Machine Detected Events (Experimental)</source>
+        <translation>重新同步呼吸机来侦测事件(试验性功能)</translation>
+    </message>
+    <message>
+        <source>Summary only data is more accurate for ResMed users if this is left on.</source>
+        <translation>打开此功能,瑞思迈用户将获得更准确的概要数据.</translation>
+    </message>
+    <message>
+        <source>Don't Split Summary Days</source>
+        <translation>不要分割概要天数</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (Turn this off at your own peril!)</source>
+        <translation>导入时为创建备份(依个人喜好打开或关闭)</translation>
+    </message>
+    <message>
+        <source>C&hannels</source>
+        <translation type="vanished">通&道</translation>
+    </message>
+    <message>
+        <source>Reset &Defaults</source>
+        <translation>恢复&默认设置</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></source>
+        <translation><html><head/><body><p><span style=" font-weight:600;">警告: </span>这仅仅是提示您可以这么做,但是并不意味着是好的.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Show flags for machine detected events that haven't been identified yet.</source>
+        <translation>显示已标记但仍未被识别的事件.</translation>
+    </message>
+    <message>
+        <source>Show Unknown Flags</source>
+        <translation>显示位置标记</translation>
+    </message>
+    <message>
+        <source>Span Events</source>
+        <translation type="vanished">持续事件</translation>
+    </message>
+    <message>
+        <source>Flags</source>
+        <translation type="vanished">标记</translation>
+    </message>
+    <message>
+        <source>Minor Flags</source>
+        <translation type="vanished">最小标记</translation>
+    </message>
+    <message>
+        <source>Waveforms</source>
+        <translation>波形</translation>
+    </message>
+    <message>
+        <source>Data Channels</source>
+        <translation type="vanished">数据通道</translation>
+    </message>
+    <message>
+        <source>Settings Channels</source>
+        <translation type="vanished">设置通道</translation>
+    </message>
+    <message>
+        <source>Unknown Channels</source>
+        <translation type="vanished">位置通道</translation>
+    </message>
+    <message>
+        <source>Name</source>
+        <translation>姓名</translation>
+    </message>
+    <message>
+        <source>Color</source>
+        <translation>颜色</translation>
+    </message>
+    <message>
+        <source>Label</source>
+        <translation>标签</translation>
+    </message>
+    <message>
+        <source>Events</source>
+        <translation type="unfinished">事件</translation>
+    </message>
+    <message>
+        <source>Flag rapid changes in oximetry stats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other oximetry options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag SPO2 Desaturations Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Discard segments under</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag Pulse Rate Above</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag Pulse Rate Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Contec CMS50D+/E/F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Contec CMS50F v3.7+</source>
+        <translation type="unfinished">康泰 CMS50F v3.7+ {50F?}</translation>
+    </message>
+    <message>
+        <source>ChoiceMMed MD300W1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ResMed S9 Oximeter Module</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update Oximeter Clock during import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Import without nagging</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Minor Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Span</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Always Minor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CPAP Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximeter Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Positional Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sleep Stage Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Double click to change the descriptive name this channel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Double click to change the default color for this channel plot/flag/data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Here you can change the type of flag shown for this event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This is the short-form label to indicate this channel on screen.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This is a description of what this channel does.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Upper</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CPAP Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximeter Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Positional Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sleep Stage Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Top Markers</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ProfileSelect</name>
+    <message>
+        <source>Double Checking:
+
+Do you really want "%1" profile to be obliterated?</source>
+        <translation type="vanished">双击:
+
+删除%1配置文件吗?</translation>
+    </message>
+    <message>
+        <source>&Quit</source>
+        <translation>&退出</translation>
+    </message>
+    <message>
+        <source>Create a new user profile.</source>
+        <translation>创建新用户.</translation>
+    </message>
+    <message>
+        <source>Meheh... If your trying to delete because you forgot the password, your going the wrong way about it. Read the docs.
+
+Signed: Nasty Programmer</source>
+        <translation type="vanished">啊哦...如果您在忘记密码的情况下正尝试删除,请阅读此文档.
+
+签名:令人不快的作者</translation>
+    </message>
+    <message>
+        <source>[data directory]</source>
+        <translation>[数据目录]</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to trash the profile "%1"?</source>
+        <translation type="vanished">删除%1配置文件?</translation>
+    </message>
+    <message>
+        <source>Open Profile</source>
+        <translation>打开配置文件</translation>
+    </message>
+    <message>
+        <source>Edit Profile</source>
+        <translation>编辑配置文件</translation>
+    </message>
+    <message>
+        <source>The current location of SleepyHead data store.</source>
+        <translation>SleepyHead数据存于此处.</translation>
+    </message>
+    <message>
+        <source>Incorrect Password</source>
+        <translation>错误密码</translation>
+    </message>
+    <message>
+        <source>Choose a different SleepyHead data folder.</source>
+        <translation>选择其他的SleepyHead数据文件夹.</translation>
+    </message>
+    <message>
+        <source>WTH???</source>
+        <translation type="vanished">What the Hell???</translation>
+    </message>
+    <message>
+        <source>Enter Password for %1</source>
+        <translation>键入密码 %1</translation>
+    </message>
+    <message>
+        <source>New Profile</source>
+        <translation>新配置文件</translation>
+    </message>
+    <message>
+        <source>&Different Folder</source>
+        <translation>&其他文件夹</translation>
+    </message>
+    <message>
+        <source>There was an error deleting the profile directory.. You need to manually remove %1</source>
+        <translation type="vanished">删除配置文件过程中出错,请手动删除%1</translation>
+    </message>
+    <message>
+        <source>&Select User</source>
+        <translation>&选择用户</translation>
+    </message>
+    <message>
+        <source>Okay, I am about to totally OBLITERATE the profile "%1" and all it's contained data..
+
+Don't say you weren't warned. :-p</source>
+        <translation type="vanished">是的,我将完全删除配置文件%1和所有与其相关的数据.
+
+请谨慎选择  :-p</translation>
+    </message>
+    <message>
+        <source>Start with the selected user profile.</source>
+        <translation>用所选的用户设置启动软件.</translation>
+    </message>
+    <message>
+        <source>If you can read this you need to delete this profile directory manually (It's under %1)</source>
+        <translation type="vanished">如果您看到此条信息,请手动删除配置文件目录(在%1下)</translation>
+    </message>
+    <message>
+        <source>Click here if you didn't want to start SleepyHead.</source>
+        <translation>取消启动SleepyHead.</translation>
+    </message>
+    <message>
+        <source>Delete Profile</source>
+        <translation>删除配置文件</translation>
+    </message>
+    <message>
+        <source>Select Profile</source>
+        <translation>选择配置文件</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">问题</translation>
+    </message>
+    <message>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <source>[version]</source>
+        <translation>[版本]</translation>
+    </message>
+    <message>
+        <source>You entered the password wrong too many times.</source>
+        <translation>键入密码错误次数过多.</translation>
+    </message>
+    <message>
+        <source>Enter Password</source>
+        <translation>键入密码</translation>
+    </message>
+    <message>
+        <source>Folder:</source>
+        <translation>文件夹:</translation>
+    </message>
+    <message>
+        <source>Whoops.</source>
+        <translation type="vanished">哎呀.</translation>
+    </message>
+    <message>
+        <source>You entered an Incorrect Password too many times. Exiting!</source>
+        <translation>输入密码错误次数过多,退出!</translation>
+    </message>
+    <message>
+        <source>Search:</source>
+        <translation>查找:</translation>
+    </message>
+    <message>
+        <source>You are about to destroy profile '%1'.</source>
+        <translation>您将要清除'%1'.</translation>
+    </message>
+    <message>
+        <source>Enter the word DELETE below to confirm.</source>
+        <translation>在下面敲入 DELETE 以确认.</translation>
+    </message>
+    <message>
+        <source>Sorry</source>
+        <translation>抱歉</translation>
+    </message>
+    <message>
+        <source>You need to enter DELETE in capital letters.</source>
+        <translation>需要键入全大写字母 DELETE.</translation>
+    </message>
+    <message>
+        <source>Could not open profile.. You will need to delete this profile directory manually</source>
+        <translation>无法打开,请重新自行建立</translation>
+    </message>
+    <message>
+        <source>You will find it under the following location:</source>
+        <translation>您将在如下位置找到:</translation>
+    </message>
+    <message>
+        <source>You entered an incorrect password</source>
+        <translation>密码不正确</translation>
+    </message>
+    <message>
+        <source>If you're trying to delete because you forgot the password, you need to delete it manually.</source>
+        <translation>如果因为忘记密码而删除,请手动操作.</translation>
+    </message>
+    <message>
+        <source>There was an error deleting the profile directory, you need to manually remove it.</source>
+        <translation>配置文件目录出错,请手动移除.</translation>
+    </message>
+    <message>
+        <source>Profile '%1' was succesfully deleted</source>
+        <translation>配置文件 '%1'已成功删除</translation>
+    </message>
+    <message>
+        <source>Create new profile</source>
+        <translation>创建一个新的配置文件</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <source>"</source>
+        <translation>"</translation>
+    </message>
+    <message>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <source>A</source>
+        <translation>未分类</translation>
+    </message>
+    <message>
+        <source>H</source>
+        <translation>低通气</translation>
+    </message>
+    <message>
+        <source>P</source>
+        <translation>压力</translation>
+    </message>
+    <message>
+        <source>??</source>
+        <translation type="vanished">??</translation>
+    </message>
+    <message>
+        <source>AI</source>
+        <translation>呼吸暂停指数</translation>
+    </message>
+    <message>
+        <source>CA</source>
+        <translation>中枢性</translation>
+    </message>
+    <message>
+        <source>EP</source>
+        <translation>呼气压力</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation>气流受限</translation>
+    </message>
+    <message>
+        <source>HI</source>
+        <translation>低通气指数</translation>
+    </message>
+    <message>
+        <source>IE</source>
+        <translation>呼吸</translation>
+    </message>
+    <message>
+        <source>LE</source>
+        <translation>漏气率</translation>
+    </message>
+    <message>
+        <source>LL</source>
+        <translation>大量漏气</translation>
+    </message>
+    <message>
+        <source>Kg</source>
+        <translation>公斤</translation>
+    </message>
+    <message>
+        <source>O2</source>
+        <translation>氧气</translation>
+    </message>
+    <message>
+        <source>OA</source>
+        <translation>阻塞性</translation>
+    </message>
+    <message>
+        <source>NR</source>
+        <translation>未响应事件</translation>
+    </message>
+    <message>
+        <source>PB</source>
+        <translation>周期性呼吸</translation>
+    </message>
+    <message>
+        <source>PC</source>
+        <translation>混合面罩</translation>
+    </message>
+    <message>
+        <source>PP</source>
+        <translation>最高压力</translation>
+    </message>
+    <message>
+        <source>PS</source>
+        <translation>压力</translation>
+    </message>
+    <message>
+        <source>On</source>
+        <translation>开启</translation>
+    </message>
+    <message>
+        <source>RE</source>
+        <translation>呼吸作用</translation>
+    </message>
+    <message>
+        <source>SA</source>
+        <translation>呼吸暂停</translation>
+    </message>
+    <message>
+        <source>SD</source>
+        <translation>SD</translation>
+    </message>
+    <message>
+        <source>UA</source>
+        <translation>未知暂停</translation>
+    </message>
+    <message>
+        <source>VS</source>
+        <translation>鼾声指数</translation>
+    </message>
+    <message>
+        <source>cm</source>
+        <translation>厘米</translation>
+    </message>
+    <message>
+        <source>ft</source>
+        <translation>英尺</translation>
+    </message>
+    <message>
+        <source>hz</source>
+        <translation type="vanished">Hz</translation>
+    </message>
+    <message>
+        <source>lb</source>
+        <translation>磅</translation>
+    </message>
+    <message>
+        <source>oz</source>
+        <translation>盎司</translation>
+    </message>
+    <message>
+        <source>0-1</source>
+        <translation type="vanished">0-1</translation>
+    </message>
+    <message>
+        <source>90%</source>
+        <translation>90%</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation>呼吸暂停低通气指数</translation>
+    </message>
+    <message>
+        <source>ASV</source>
+        <translation>适应性支持通气模式</translation>
+    </message>
+    <message>
+        <source>BMI</source>
+        <translation>体重指数</translation>
+    </message>
+    <message>
+        <source>CAI</source>
+        <translation>中枢性暂停指数</translation>
+    </message>
+    <message>
+        <source>Apr</source>
+        <translation>四月</translation>
+    </message>
+    <message>
+        <source>Aug</source>
+        <translation>八月</translation>
+    </message>
+    <message>
+        <source>Avg</source>
+        <translation>平均</translation>
+    </message>
+    <message>
+        <source>DOB</source>
+        <translation>生日</translation>
+    </message>
+    <message>
+        <source>Bpm</source>
+        <translation type="vanished">Bpm</translation>
+    </message>
+    <message>
+        <source>EPI</source>
+        <translation>呼气压力指数</translation>
+    </message>
+    <message>
+        <source>Dec</source>
+        <translation>十二月</translation>
+    </message>
+    <message>
+        <source>FLI</source>
+        <translation>气流受限指数</translation>
+    </message>
+    <message>
+        <source>End</source>
+        <translation>结束</translation>
+    </message>
+    <message>
+        <source>Feb</source>
+        <translation>二月</translation>
+    </message>
+    <message>
+        <source>L/m</source>
+        <translation type="vanished">升/分钟</translation>
+    </message>
+    <message>
+        <source>Jan</source>
+        <translation>一月</translation>
+    </message>
+    <message>
+        <source>Jul</source>
+        <translation>七月</translation>
+    </message>
+    <message>
+        <source>Jun</source>
+        <translation>六月</translation>
+    </message>
+    <message>
+        <source>NRI</source>
+        <translation>未响应事件指数</translation>
+    </message>
+    <message>
+        <source>Mar</source>
+        <translation>三月</translation>
+    </message>
+    <message>
+        <source>Max</source>
+        <translation>最大</translation>
+    </message>
+    <message>
+        <source>May</source>
+        <translation>五月</translation>
+    </message>
+    <message>
+        <source>Med</source>
+        <translation>中间值</translation>
+    </message>
+    <message>
+        <source>Min</source>
+        <translation>最小</translation>
+    </message>
+    <message>
+        <source>Nov</source>
+        <translation>十一月</translation>
+    </message>
+    <message>
+        <source>Oct</source>
+        <translation>十月</translation>
+    </message>
+    <message>
+        <source>Off</source>
+        <translation>关闭</translation>
+    </message>
+    <message>
+        <source>RDI</source>
+        <translation>呼吸紊乱指数</translation>
+    </message>
+    <message>
+        <source>REI</source>
+        <translation>呼吸作用指数</translation>
+    </message>
+    <message>
+        <source>UAI</source>
+        <translation>未知暂停指数</translation>
+    </message>
+    <message>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <source>UF3</source>
+        <translation>UF3</translation>
+    </message>
+    <message>
+        <source>Sep</source>
+        <translation>九月</translation>
+    </message>
+    <message>
+        <source>VS2</source>
+        <translation>鼾声指数2</translation>
+    </message>
+    <message>
+        <source>bpm</source>
+        <translation>次每分钟</translation>
+    </message>
+    <message>
+        <source>ÇSR</source>
+        <translation>潮式呼吸</translation>
+    </message>
+    <message>
+        <source>APAP</source>
+        <translation>全自动正压通气</translation>
+    </message>
+    <message>
+        <source>CPAP</source>
+        <translation>持续气道正压通气</translation>
+    </message>
+    <message>
+        <source>Min EPAP</source>
+        <translation>呼气压力最小值</translation>
+    </message>
+    <message>
+        <source>EPAP</source>
+        <translation>呼气压力</translation>
+    </message>
+    <message>
+        <source>Date</source>
+        <translation>日期</translation>
+    </message>
+    <message>
+        <source>Min IPAP</source>
+        <translation>吸气压力最小值</translation>
+    </message>
+    <message>
+        <source>IPAP</source>
+        <translation>吸气压力</translation>
+    </message>
+    <message>
+        <source>Last</source>
+        <translation>最后一次</translation>
+    </message>
+    <message>
+        <source>Leak</source>
+        <translation>漏气率</translation>
+    </message>
+    <message>
+        <source>Mode</source>
+        <translation>模式</translation>
+    </message>
+    <message>
+        <source>Name</source>
+        <translation>姓名</translation>
+    </message>
+    <message>
+        <source>None</source>
+        <translation>无</translation>
+    </message>
+    <message>
+        <source>RERA</source>
+        <translation>呼吸努力相关性觉醒</translation>
+    </message>
+    <message>
+        <source>SpO2</source>
+        <translation>血氧饱和度</translation>
+    </message>
+    <message>
+        <source>Resp. Event</source>
+        <translation>呼吸时间</translation>
+    </message>
+    <message>
+        <source>Inclination</source>
+        <translation>侧卧</translation>
+    </message>
+    <message>
+        <source>About SleepyHead</source>
+        <translation>关于SleepyHead</translation>
+    </message>
+    <message>
+        <source>Therapy Pressure</source>
+        <translation>治疗压力</translation>
+    </message>
+    <message>
+        <source>BiPAP</source>
+        <translation>双水平气道正压通气</translation>
+    </message>
+    <message>
+        <source>Brand</source>
+        <translation>品牌</translation>
+    </message>
+    <message>
+        <source>Daily</source>
+        <translation>日常</translation>
+    </message>
+    <message>
+        <source>Email</source>
+        <translation>电子邮件</translation>
+    </message>
+    <message>
+        <source>Error</source>
+        <translation>错误</translation>
+    </message>
+    <message>
+        <source>First</source>
+        <translation>第一次</translation>
+    </message>
+    <message>
+        <source>Ramp Pressure</source>
+        <translation>压力上升</translation>
+    </message>
+    <message>
+        <source>L/min</source>
+        <translation>升/分钟</translation>
+    </message>
+    <message>
+        <source>Hours</source>
+        <translation>小时</translation>
+    </message>
+    <message>
+        <source>Leaks</source>
+        <translation>漏气率</translation>
+    </message>
+    <message>
+        <source>Model</source>
+        <translation>型式</translation>
+    </message>
+    <message>
+        <source>Phone</source>
+        <translation>电话号码</translation>
+    </message>
+    <message>
+        <source>Ready</source>
+        <translation>就绪</translation>
+    </message>
+    <message>
+        <source>W-Avg</source>
+        <translation>W-Avg</translation>
+    </message>
+    <message>
+        <source>Snore</source>
+        <translation>鼾声</translation>
+    </message>
+    <message>
+        <source>Start</source>
+        <translation>开始</translation>
+    </message>
+    <message>
+        <source>Usage</source>
+        <translation>使用</translation>
+    </message>
+    <message>
+        <source>Respiratory Disturbance Index</source>
+        <translation>呼吸紊乱指数</translation>
+    </message>
+    <message>
+        <source>cmH2O</source>
+        <translation>厘米水柱</translation>
+    </message>
+    <message>
+        <source>Pressure Support</source>
+        <translation>压力支持</translation>
+    </message>
+    <message>
+        <source>Hypopnea</source>
+        <translation>低通气</translation>
+    </message>
+    <message>
+        <source>ratio</source>
+        <translation>比率</translation>
+    </message>
+    <message>
+        <source>Tidal Volume</source>
+        <translation>呼吸容量</translation>
+    </message>
+    <message>
+        <source>Entire Day</source>
+        <translation>整天</translation>
+    </message>
+    <message>
+        <source>Heart rate in beats per minute</source>
+        <translation>心脏每分钟的跳动次数</translation>
+    </message>
+    <message>
+        <source>A large mask leak affecting machine performance.</source>
+        <translation>大量漏气影响呼吸机性能.</translation>
+    </message>
+    <message>
+        <source>An restriction in breathing from normal, causing a flattening of the flow waveform.</source>
+        <translation>正常的呼吸限制,导致波形呈扁平状.</translation>
+    </message>
+    <message>
+        <source>Pat. Trig. Breath</source>
+        <translation>患者触发呼吸</translation>
+    </message>
+    <message>
+        <source>Ramp Delay Period</source>
+        <translation>斜坡升压期间</translation>
+    </message>
+    <message>
+        <source>Purge Failed</source>
+        <translation type="vanished">清理失败</translation>
+    </message>
+    <message>
+        <source>Pulse Change</source>
+        <translation>脉搏变化</translation>
+    </message>
+    <message>
+        <source>Sleep Stage</source>
+        <translation>睡眠阶段</translation>
+    </message>
+    <message>
+        <source>Would you like me to purge this data this for you so you can run the new version?</source>
+        <translation type="vanished">希望现在清理数据以使用新数据吗?</translation>
+    </message>
+    <message>
+        <source>Minute Vent.</source>
+        <translation>分钟通气率.</translation>
+    </message>
+    <message>
+        <source>Respiratory Effort Related Arousal</source>
+        <translation>呼吸努力相关微觉醒</translation>
+    </message>
+    <message>
+        <source>SpO2 Drop</source>
+        <translation>血氧饱和度降低</translation>
+    </message>
+    <message>
+        <source>SensAwake feature will reduce pressure when waking is detected.</source>
+        <translation>觉醒侦测功能会在侦测到醒来时降低呼吸机的压力.</translation>
+    </message>
+    <message>
+        <source>Upright angle in degrees</source>
+        <translation>垂直</translation>
+    </message>
+    <message>
+        <source>Higher Expiratory Pressure</source>
+        <translation>更高的呼气压力</translation>
+    </message>
+    <message>
+        <source>Nasal Pillows</source>
+        <translation>鼻枕</translation>
+    </message>
+    <message>
+        <source>SleepyHead has finished sending the job to the printer.</source>
+        <translation>已将报告发送到打印机.</translation>
+    </message>
+    <message>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation>未响应事件指数=%1 漏气指数=%2 呼气压力指数=%3</translation>
+    </message>
+    <message>
+        <source>&Close</source>
+        <translation>&关闭</translation>
+    </message>
+    <message>
+        <source>A vibratory snore</source>
+        <translation>一次振动打鼾</translation>
+    </message>
+    <message>
+        <source>Vibratory Snore</source>
+        <translation>振动打鼾</translation>
+    </message>
+    <message>
+        <source>Lower Inspiratory Pressure</source>
+        <translation>更低的吸气压力</translation>
+    </message>
+    <message>
+        <source>You did not select a directory.
+
+SleepyHead will now start with your old one.
+
+</source>
+        <translation type="vanished">你没有选择目录.
+
+SleepyHead将会从上次的目录启动.
+
+</translation>
+    </message>
+    <message>
+        <source>Resp. Rate</source>
+        <translation>呼吸速率</translation>
+    </message>
+    <message>
+        <source>Insp. Time</source>
+        <translation>吸气时间</translation>
+    </message>
+    <message>
+        <source>Exp. Time</source>
+        <translation>呼气时间</translation>
+    </message>
+    <message>
+        <source>Import Error</source>
+        <translation>导入出错</translation>
+    </message>
+    <message>
+        <source>Machine</source>
+        <translation>机器</translation>
+    </message>
+    <message>
+        <source>A sudden (user definable) drop in blood oxygen saturation</source>
+        <translation>血氧饱和度突然降低</translation>
+    </message>
+    <message>
+        <source>As you did not select a data folder, SleepyHead will exit.
+
+Next time you run, you will be asked again.</source>
+        <translation type="vanished">因为您没有选择一个可用的数据文件夹,SleepyHead将退出.
+
+下次运行时,仍然会询问.</translation>
+    </message>
+    <message>
+        <source>Nasal Interface</source>
+        <translation>鼻接口</translation>
+    </message>
+    <message>
+        <source>There are no graphs visible to print</source>
+        <translation>无可打印图表</translation>
+    </message>
+    <message>
+        <source>Target Vent.</source>
+        <translation>目标通气率.</translation>
+    </message>
+    <message>
+        <source>An apnea that could not fit into a category</source>
+        <translation>不适用于任何分类的呼吸暂停</translation>
+    </message>
+    <message>
+        <source>Sleep position in degrees</source>
+        <translation>睡眠体位角度</translation>
+    </message>
+    <message>
+        <source>minutes</source>
+        <translation type="vanished">分钟</translation>
+    </message>
+    <message>
+        <source>This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>.</source>
+        <translation>此报告由 SleepyHead预发布版生成 (%1), <b>不可作为任何医疗诊断的依据</b>.</translation>
+    </message>
+    <message>
+        <source>Periodic Breathing</source>
+        <translation>周期性呼吸</translation>
+    </message>
+    <message>
+        <source>Ramp Time</source>
+        <translation>斜坡升压时间</translation>
+    </message>
+    <message>
+        <source>Unintentional Leaks</source>
+        <translation>无意识漏气量</translation>
+    </message>
+    <message>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation>是否希望在报告中显示标记区域?</translation>
+    </message>
+    <message>
+        <source>Apnea Hypopnea Index</source>
+        <translation>呼吸暂停低通气指数</translation>
+    </message>
+    <message>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation>请耐心等待.
+禁止一切操作直到完成.</translation>
+    </message>
+    <message>
+        <source>Patient Triggered Breaths</source>
+        <translation>患者出发的呼吸</translation>
+    </message>
+    <message>
+        <source>No Waveform Available</source>
+        <translation type="vanished">没有可用波形</translation>
+    </message>
+    <message>
+        <source>Events</source>
+        <translation>事件</translation>
+    </message>
+    <message>
+        <source>IPAPHi</source>
+        <translation type="vanished">吸气压力最大值</translation>
+    </message>
+    <message>
+        <source>IPAPLo</source>
+        <translation type="vanished">吸气压力最小值</translation>
+    </message>
+    <message>
+        <source>(% %1 in events)</source>
+        <translation>(% %1 事件)</translation>
+    </message>
+    <message>
+        <source>No Data</source>
+        <translation>无数据</translation>
+    </message>
+    <message>
+        <source>SleepyHead Update Notes</source>
+        <translation type="vanished">软件升级信息</translation>
+    </message>
+    <message>
+        <source>Page %1 of %2</source>
+        <translation>页码 %1 到 %2</translation>
+    </message>
+    <message>
+        <source>Median</source>
+        <translation>中值</translation>
+    </message>
+    <message>
+        <source>PS Max</source>
+        <translation>压力支持最大压力</translation>
+    </message>
+    <message>
+        <source>PS Min</source>
+        <translation>最小压力</translation>
+    </message>
+    <message>
+        <source>Full-Face Mask</source>
+        <translation>全脸面罩</translation>
+    </message>
+    <message>
+        <source>Flow Limit.</source>
+        <translation>气流限制.</translation>
+    </message>
+    <message>
+        <source>Choose or create new folder for SleepyHead data</source>
+        <translation>选取或者创建一个SleepyHead数据文件夹</translation>
+    </message>
+    <message>
+        <source>Detected mask leakage including natural Mask leakages</source>
+        <translation>包含自然漏气在内的面罩漏气率</translation>
+    </message>
+    <message>
+        <source>Plethy</source>
+        <translation>足够的</translation>
+    </message>
+    <message>
+        <source>SensAwake</source>
+        <translation>觉醒</translation>
+    </message>
+    <message>
+        <source>ST/ASV</source>
+        <translation>自发/定时 ASV</translation>
+    </message>
+    <message>
+        <source>Median Leaks</source>
+        <translation>漏气率中值</translation>
+    </message>
+    <message>
+        <source>%1 Report</source>
+        <translation>%1报告</translation>
+    </message>
+    <message>
+        <source>Pr. Relief</source>
+        <translation>压力释放</translation>
+    </message>
+    <message>
+        <source>Serial</source>
+        <translation>串号</translation>
+    </message>
+    <message>
+        <source>A user definable event detected by SleepyHead's flow waveform processor.</source>
+        <translation>可被用用户在SleepyHead波形处理器侦测到的事件.</translation>
+    </message>
+    <message>
+        <source>SpO2 %</source>
+        <translation>血氧饱和度 %</translation>
+    </message>
+    <message>
+        <source>I can automatically purge this data for you, or you can cancel now and continue to run in a previous version.
+
+</source>
+        <translation type="vanished">如果继续可以自动清理数据,也可以取消清理进而使用之前的版本.
+
+</translation>
+    </message>
+    <message>
+        <source> Update</source>
+        <translation type="vanished">升级</translation>
+    </message>
+    <message>
+        <source>AHI	%1
+</source>
+        <translation>呼吸暂停低通气指数(AHI)	  %1</translation>
+    </message>
+    <message>
+        <source>Weight</source>
+        <translation>体重</translation>
+    </message>
+    <message>
+        <source>Mask Pressure (High resolution)</source>
+        <translation>面罩压力(高分辨率)</translation>
+    </message>
+    <message>
+        <source>Orientation</source>
+        <translation>定位</translation>
+    </message>
+    <message>
+        <source>Event Flags</source>
+        <translation>呼吸事件</translation>
+    </message>
+    <message>
+        <source>Zombie</source>
+        <translation>呆瓜</translation>
+    </message>
+    <message>
+        <source>Bookmarks</source>
+        <translation>标记簇</translation>
+    </message>
+    <message>
+        <source>An apnea where the airway is open</source>
+        <translation>气道开放情况下的呼吸暂停</translation>
+    </message>
+    <message>
+        <source>Flow Limitation</source>
+        <translation>气流受限</translation>
+    </message>
+    <message>
+        <source>Phone: %1</source>
+        <translation>电话号码:%1</translation>
+    </message>
+    <message>
+        <source>Low Usage Days=%1</source>
+        <translation type="vanished">低使用天数=%1</translation>
+    </message>
+    <message>
+        <source>&Ok, get on with it..</source>
+        <translation>&好的.</translation>
+    </message>
+    <message>
+        <source>SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead</source>
+        <translation>SleepyHead是一款开源的软件 http://sourceforge.net/projects/SleepyHead</translation>
+    </message>
+    <message>
+        <source>RDI	%1
+</source>
+        <translation>呼吸紊乱指数(RDI)	%1</translation>
+    </message>
+    <message>
+        <source>I'm sorry to report that SleepyHead can only track hours of use for this machine.</source>
+        <translation>非常抱歉的统治您SleepyHead只能跟踪读取这款机器仅有的几个小时的数据.</translation>
+    </message>
+    <message>
+        <source>Flow Rate</source>
+        <translation>气流速率</translation>
+    </message>
+    <message>
+        <source>Time taken to breathe out</source>
+        <translation>呼气时间</translation>
+    </message>
+    <message>
+        <source>events</source>
+        <translation type="vanished">事件</translation>
+    </message>
+    <message>
+        <source>An optical Photo-plethysomogram showing heart rhythm</source>
+        <translation>光学探测显示心率</translation>
+    </message>
+    <message>
+        <source>Sorry, I could not purge this data, which means this version of SleepyHead can't start.. SleepyHead's Data folder needs to be removed manually
+
+This folder currently resides at the following location:
+</source>
+        <translation type="vanished">对不起,SleepyHead无法正常启动,数据无法自动清除。请手动删除SleepyHead 的数据文件夹.
+
+文件夹位置如下所示:
+</translation>
+    </message>
+    <message>
+        <source>Pr. Min</source>
+        <translation type="vanished">最小压力</translation>
+    </message>
+    <message>
+        <source>Pr. Max</source>
+        <translation type="vanished">最大压力</translation>
+    </message>
+    <message>
+        <source>I:E Ratio</source>
+        <translation>呼吸比率</translation>
+    </message>
+    <message>
+        <source>Amount of air displaced per breath</source>
+        <translation>每次呼吸气量</translation>
+    </message>
+    <message>
+        <source>Pat. Trig. Breaths</source>
+        <translation>患者触发呼吸率</translation>
+    </message>
+    <message>
+        <source>Address</source>
+        <translation>地址</translation>
+    </message>
+    <message>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%</source>
+        <translation type="vanished">呼吸作用指数=%1 鼾声指数=%2 气流受限指数=%3 周期性呼吸/潮湿呼吸=%4%</translation>
+    </message>
+    <message>
+        <source>Name: %1, %2</source>
+        <translation>名字: %1, %2</translation>
+    </message>
+    <message>
+        <source>Leak Rate</source>
+        <translation>漏气率</translation>
+    </message>
+    <message>
+        <source>Reporting from %1 to %2</source>
+        <translation>正在生成由 %1 到 %2 的报告</translation>
+    </message>
+    <message>
+        <source>Email: %1</source>
+        <translation>电子邮箱: %1</translation>
+    </message>
+    <message>
+        <source>Inspiratory Pressure</source>
+        <translation>吸气压力</translation>
+    </message>
+    <message>
+        <source>A pulse of pressure 'pinged' to detect a closed airway.</source>
+        <translation>通过压力脉冲'砰'可以侦测到气道关闭.</translation>
+    </message>
+    <message>
+        <source>Non Responding Event</source>
+        <translation>未响应事件</translation>
+    </message>
+    <message>
+        <source>Ramp Pr.</source>
+        <translation type="vanished">斜坡升压.</translation>
+    </message>
+    <message>
+        <source>Language</source>
+        <translation type="vanished">语言</translation>
+    </message>
+    <message>
+        <source>Median Leak Rate</source>
+        <translation>漏气率中值</translation>
+    </message>
+    <message>
+        <source>Rate of breaths per minute</source>
+        <translation>每分钟呼吸的次数</translation>
+    </message>
+    <message>
+        <source>Usage Statistics</source>
+        <translation>使用统计</translation>
+    </message>
+    <message>
+        <source>Graph displaying snore volume</source>
+        <translation>图形显示鼾声指数</translation>
+    </message>
+    <message>
+        <source>Max EPAP</source>
+        <translation>呼气压力最大值</translation>
+    </message>
+    <message>
+        <source>Max IPAP</source>
+        <translation>吸气压力最大值</translation>
+    </message>
+    <message>
+        <source>(%%1 compliant, defined as > %2 hours)</source>
+        <translation type="vanished">(%%1 依从性, 定义为 > %2 小时)</translation>
+    </message>
+    <message>
+        <source>Bedtime</source>
+        <translation>睡眠时间</translation>
+    </message>
+    <message>
+        <source>No SleepyHead data folder was found.
+
+Would you like SleepyHead to use the default location for storing its data?
+
+</source>
+        <translation type="vanished">没有找到SleepyHead数据文件夹.
+
+您希望SleepyHead将数据存储于默认文件夹吗?
+
+</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation>压力</translation>
+    </message>
+    <message>
+        <source>Average</source>
+        <translation>平均</translation>
+    </message>
+    <message>
+        <source>Target Minute Ventilation</source>
+        <translation>目标分钟通气率</translation>
+    </message>
+    <message>
+        <source>Amount of air displaced per minute</source>
+        <translation>每分钟的换气量</translation>
+    </message>
+    <message>
+        <source>Percentage of breaths triggered by patient</source>
+        <translation>患者出发的呼吸百分比</translation>
+    </message>
+    <message>
+        <source>Non Data Capable Machine</source>
+        <translation>没有使用机器的数据</translation>
+    </message>
+    <message>
+        <source>Plethysomogram</source>
+        <translation>体积描述术</translation>
+    </message>
+    <message>
+        <source>Unclassified Apnea</source>
+        <translation>未定义的呼吸暂停</translation>
+    </message>
+    <message>
+        <source>Starting Ramp Pressure</source>
+        <translation>开始斜坡升压</translation>
+    </message>
+    <message>
+        <source>DOB: %1</source>
+        <translation>生日:%1</translation>
+    </message>
+    <message>
+        <source>Intellipap event where you breathe out your mouth.</source>
+        <translation>Intellipap侦测到的嘴部呼吸事件.</translation>
+    </message>
+    <message>
+        <source>Flow Limit</source>
+        <translation>气流受限</translation>
+    </message>
+    <message>
+        <source>UAI=%1 </source>
+        <translation>未知暂停指数=%1</translation>
+    </message>
+    <message>
+        <source>Pulse Rate</source>
+        <translation>脉搏</translation>
+    </message>
+    <message>
+        <source>This Machine Record cannot be imported in this profile.
+The Day records overlap with already existing content.</source>
+        <translation>所存数据与此配置文件不符
+数据已被现有内容覆盖.</translation>
+    </message>
+    <message>
+        <source>Graph showing running AHI for the past hour</source>
+        <translation>同行显示过去一个小时的AHI</translation>
+    </message>
+    <message>
+        <source>Graph showing running RDI for the past hour</source>
+        <translation>图形显示过去一个小时的RDI</translation>
+    </message>
+    <message>
+        <source>seconds</source>
+        <translation type="vanished">秒</translation>
+    </message>
+    <message>
+        <source>Mask Time</source>
+        <translation>面罩使用时间</translation>
+    </message>
+    <message>
+        <source>Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.</source>
+        <translation>您的飞利浦伟康呼吸机 (型号 %1) 不适用.</translation>
+    </message>
+    <message>
+        <source>Channel</source>
+        <translation>通道</translation>
+    </message>
+    <message>
+        <source>Hybrid F/F Mask</source>
+        <translation>混合面罩</translation>
+    </message>
+    <message>
+        <source>Max Leaks</source>
+        <translation>最大漏气率</translation>
+    </message>
+    <message>
+        <source>A period of periodic breathing</source>
+        <translation>周期性呼吸期间</translation>
+    </message>
+    <message>
+        <source>Days=%1</source>
+        <translation type="vanished">天数=%1</translation>
+    </message>
+    <message>
+        <source>&Donate</source>
+        <translation>&捐赠</translation>
+    </message>
+    <message>
+        <source>Address:</source>
+        <translation>地址:</translation>
+    </message>
+    <message>
+        <source>Waketime=%1</source>
+        <translation type="vanished">觉醒时间=%1</translation>
+    </message>
+    <message>
+        <source>degrees</source>
+        <translation type="vanished">角度</translation>
+    </message>
+    <message>
+        <source>User Flag #1</source>
+        <translation>用户标记#1</translation>
+    </message>
+    <message>
+        <source>User Flag #2</source>
+        <translation>用户标记#2</translation>
+    </message>
+    <message>
+        <source>User Flag #3</source>
+        <translation>用户标记#3</translation>
+    </message>
+    <message>
+        <source>A ResMed data source showing Respiratory Events</source>
+        <translation>瑞思迈数据源显示的呼吸时间</translation>
+    </message>
+    <message>
+        <source>Bedtime=%1</source>
+        <translation type="vanished">睡眠时间=%1</translation>
+    </message>
+    <message>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</source>
+        <translation>呼吸作用指数=%1 鼾声指数=%2 气流受限指数=%3 周期性呼吸/潮湿呼吸=%4%%</translation>
+    </message>
+    <message>
+        <source>Median rate of detected mask leakage</source>
+        <translation>面罩漏气率的中间值</translation>
+    </message>
+    <message>
+        <source>Mask Pressure</source>
+        <translation>面罩压力</translation>
+    </message>
+    <message>
+        <source>A vibratory snore as detcted by a System One machine</source>
+        <translation>振动打鼾可被System One侦测到</translation>
+    </message>
+    <message>
+        <source>events/hour</source>
+        <translation type="vanished">事件/小时</translation>
+    </message>
+    <message>
+        <source>Reporting data goes here</source>
+        <translation type="vanished">报告数据位置</translation>
+    </message>
+    <message>
+        <source>Respiratory Event</source>
+        <translation>呼吸事件</translation>
+    </message>
+    <message>
+        <source>A type of respiratory event that won't respond to a pressure increase.</source>
+        <translation>未导致压力上升的呼吸事件.</translation>
+    </message>
+    <message>
+        <source>Clear Airway Apnea</source>
+        <translation>开放气道呼吸暂停</translation>
+    </message>
+    <message>
+        <source>Windows User</source>
+        <translation>Windows用户</translation>
+    </message>
+    <message>
+        <source>Unspecified</source>
+        <translation>未定义</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation>问题</translation>
+    </message>
+    <message>
+        <source>Higher Inspiratory Pressure</source>
+        <translation>更高的吸气压力</translation>
+    </message>
+    <message>
+        <source>Bi-Level</source>
+        <translation>双水平</translation>
+    </message>
+    <message>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation>SleepyHead v%1 - http://sleepyhead.sourceforge.net</translation>
+    </message>
+    <message>
+        <source>Unknown</source>
+        <translation>未知</translation>
+    </message>
+    <message>
+        <source>events/hr</source>
+        <translation type="vanished">事件/小时</translation>
+    </message>
+    <message>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <source>Duration</source>
+        <translation>时长</translation>
+    </message>
+    <message>
+        <source>(Sess=%1)</source>
+        <translation type="vanished">(会话=%1)</translation>
+    </message>
+    <message>
+        <source>Sessions</source>
+        <translation>会话</translation>
+    </message>
+    <message>
+        <source>Settings</source>
+        <translation>设置</translation>
+    </message>
+    <message>
+        <source>Overview</source>
+        <translation>总览</translation>
+    </message>
+    <message>
+        <source>Target Minute Ventilation?</source>
+        <translation>目标分钟通气率?</translation>
+    </message>
+    <message>
+        <source>Entire Day's Flow Waveform</source>
+        <translation>全天气流波形</translation>
+    </message>
+    <message>
+        <source>Exiting</source>
+        <translation>正在退出</translation>
+    </message>
+    <message>
+        <source>An restriction in breathing that causes an either an awakening or sleep disturbance.</source>
+        <translation>此类呼吸限制导致既不是觉醒也不是睡眠障碍的状态.</translation>
+    </message>
+    <message>
+        <source>Pressure Support Maximum</source>
+        <translation>压力支持最大值</translation>
+    </message>
+    <message>
+        <source>Graph showing severity of flow limitations</source>
+        <translation>图形显示气流限制的严重程度</translation>
+    </message>
+    <message>
+        <source>: %1 hours, %2 minutes, %3 seconds
+</source>
+        <translation>:%1 小时, %2 分钟, %3 秒
+</translation>
+    </message>
+    <message>
+        <source>Software changes have been made that require the reimporting of the following machines data:
+
+</source>
+        <translation type="vanished">软件设置更改,请重新导入如下数据:
+</translation>
+    </message>
+    <message>
+        <source>A partially obstructed airway</source>
+        <translation>气道部分阻塞</translation>
+    </message>
+    <message>
+        <source>Pressure Support Minimum</source>
+        <translation>压力支持最小值</translation>
+    </message>
+    <message>
+        <source>Large Leak</source>
+        <translation>大量漏气</translation>
+    </message>
+    <message>
+        <source>Wake-up</source>
+        <translation>醒</translation>
+    </message>
+    <message>
+        <source>Warning</source>
+        <translation>警告</translation>
+    </message>
+    <message>
+        <source>Min Pressure</source>
+        <translation>最小压力</translation>
+    </message>
+    <message>
+        <source>Total Leak Rate</source>
+        <translation>总漏气率</translation>
+    </message>
+    <message>
+        <source>No Directory</source>
+        <translation type="vanished">没有目录</translation>
+    </message>
+    <message>
+        <source>Max Pressure</source>
+        <translation>最大压力</translation>
+    </message>
+    <message>
+        <source>MaskPressure</source>
+        <translation>面罩压力</translation>
+    </message>
+    <message>
+        <source>Total Leaks</source>
+        <translation>总漏气量</translation>
+    </message>
+    <message>
+        <source>Minute Ventilation</source>
+        <translation>分钟通气率</translation>
+    </message>
+    <message>
+        <source>Rate of detected mask leakage</source>
+        <translation>面罩漏气率</translation>
+    </message>
+    <message>
+        <source>Breathing flow rate waveform</source>
+        <translation>呼吸流量波形</translation>
+    </message>
+    <message>
+        <source>Lower Expiratory Pressure</source>
+        <translation>更低的呼气压力</translation>
+    </message>
+    <message>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation>暂停指数=%1 低通气指数=%2 中枢性暂停指数=%3</translation>
+    </message>
+    <message>
+        <source>This is a beta software and some functionality may not work as intended yet.</source>
+        <translation type="vanished">此测试版本可能存在某些未知问题.</translation>
+    </message>
+    <message>
+        <source>Time taken to breathe in</source>
+        <translation>吸气时间</translation>
+    </message>
+    <message>
+        <source>Maximum Therapy Pressure</source>
+        <translation>最大治疗压力</translation>
+    </message>
+    <message>
+        <source>Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
+        <translation>无法解析 Channels.xml,已损坏,退出!</translation>
+    </message>
+    <message>
+        <source>Current Selection</source>
+        <translation>当前选择</translation>
+    </message>
+    <message>
+        <source>Obstructive Apnea</source>
+        <translation>阻塞性呼吸暂停</translation>
+    </message>
+    <message>
+        <source>Blood-oxygen saturation percentage</source>
+        <translation>血氧饱和百分比</translation>
+    </message>
+    <message>
+        <source>Inspiratory Time</source>
+        <translation>吸气时间</translation>
+    </message>
+    <message>
+        <source>Respiratory Rate</source>
+        <translation>呼吸频率</translation>
+    </message>
+    <message>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation type="vanished">请将运行软件中遇到的错误发送到SourceForge的SleepyHead页面.</translation>
+    </message>
+    <message>
+        <source>Printing %1 Report</source>
+        <translation>正在打印%1报告</translation>
+    </message>
+    <message>
+        <source>Expiratory Time</source>
+        <translation>呼气时间</translation>
+    </message>
+    <message>
+        <source>Expiratory Puff</source>
+        <translation>嘴部呼吸</translation>
+    </message>
+    <message>
+        <source>Maximum Leak</source>
+        <translation>最大漏气率</translation>
+    </message>
+    <message>
+        <source>Ratio between Inspiratory and Expiratory time</source>
+        <translation>呼气和吸气时间的比率</translation>
+    </message>
+    <message>
+        <source>Minimum Therapy Pressure</source>
+        <translation>最小治疗压力</translation>
+    </message>
+    <message>
+        <source>A sudden (user definable) change in heart rate</source>
+        <translation>心率突变</translation>
+    </message>
+    <message>
+        <source>Oximetry</source>
+        <translation>血氧测定</translation>
+    </message>
+    <message>
+        <source>Oximeter</source>
+        <translation>血氧仪</translation>
+    </message>
+    <message>
+        <source>The maximum rate of mask leakage</source>
+        <translation>面罩的最大漏气率</translation>
+    </message>
+    <message>
+        <source>Machine Database Changes</source>
+        <translation>数据库更改</translation>
+    </message>
+    <message>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.
+
+Are you sure you want to use this folder?
+
+</source>
+        <translation type="vanished">您选了一个非空文件夹,且此文件夹含有SleepyHead可用的数据.
+
+您仍然确认指定这个文件夹吗?
+
+</translation>
+    </message>
+    <message>
+        <source>Expiratory Pressure</source>
+        <translation>呼气压力</translation>
+    </message>
+    <message>
+        <source>Tgt. Min. Vent</source>
+        <translation>目标 分钟 通气</translation>
+    </message>
+    <message>
+        <source>Release Notes</source>
+        <translation>版本注释</translation>
+    </message>
+    <message>
+        <source>Pressure Pulse</source>
+        <translation>压力脉冲</translation>
+    </message>
+    <message>
+        <source>Humidifier</source>
+        <translation>湿度</translation>
+    </message>
+    <message>
+        <source>Patient ID</source>
+        <translation>患者编号</translation>
+    </message>
+    <message>
+        <source>An apnea caused by airway obstruction</source>
+        <translation>气道阻塞状态下的呼吸暂停</translation>
+    </message>
+    <message>
+        <source>Days: %1</source>
+        <translation>天数:%1</translation>
+    </message>
+    <message>
+        <source>Low Usage Days: %1</source>
+        <translation>低使用天数:%1</translation>
+    </message>
+    <message>
+        <source>(%1% compliant, defined as > %2 hours)</source>
+        <translation>(%1% 依从性, 定义为 > %2 小时)</translation>
+    </message>
+    <message>
+        <source>(Sess: %1)</source>
+        <translation>(会话:%1)</translation>
+    </message>
+    <message>
+        <source>Bedtime: %1</source>
+        <translation>睡眠时间:%1</translation>
+    </message>
+    <message>
+        <source>Waketime: %1</source>
+        <translation>觉醒时间:%1</translation>
+    </message>
+    <message>
+        <source>Minutes</source>
+        <translation>分钟</translation>
+    </message>
+    <message>
+        <source>Seconds</source>
+        <translation>秒</translation>
+    </message>
+    <message>
+        <source>Events/hr</source>
+        <translation>事件/小时</translation>
+    </message>
+    <message>
+        <source>Hz</source>
+        <translation>Hz</translation>
+    </message>
+    <message>
+        <source>Litres</source>
+        <translation>升</translation>
+    </message>
+    <message>
+        <source>ml</source>
+        <translation>毫升</translation>
+    </message>
+    <message>
+        <source>Breaths/min</source>
+        <translation>呼吸次数/分钟</translation>
+    </message>
+    <message>
+        <source>Severety (0-1)</source>
+        <translation type="vanished">Severety (0-1)</translation>
+    </message>
+    <message>
+        <source>Degrees</source>
+        <translation>度</translation>
+    </message>
+    <message>
+        <source>Information</source>
+        <translation>消息</translation>
+    </message>
+    <message>
+        <source>Busy</source>
+        <translation>忙</translation>
+    </message>
+    <message>
+        <source>Please Note</source>
+        <translation>请留言</translation>
+    </message>
+    <message>
+        <source>&Yes</source>
+        <translation>&是</translation>
+    </message>
+    <message>
+        <source>&No</source>
+        <translation>&不</translation>
+    </message>
+    <message>
+        <source>&Cancel</source>
+        <translation>&取消</translation>
+    </message>
+    <message>
+        <source>&Destroy</source>
+        <translation>&删除</translation>
+    </message>
+    <message>
+        <source>&Save</source>
+        <translation>&保存</translation>
+    </message>
+    <message>
+        <source>No Data Available</source>
+        <translation>无可用数据</translation>
+    </message>
+    <message>
+        <source>Unknown PRS1 Code %1</source>
+        <translation>未知耳朵PRS1编码%1</translation>
+    </message>
+    <message>
+        <source>PRS1_%1</source>
+        <translation>PRS1_%1</translation>
+    </message>
+    <message>
+        <source>Launching Windows Explorer failed</source>
+        <translation>启动视窗浏览器失败</translation>
+    </message>
+    <message>
+        <source>Could not find explorer.exe in path to launch Windows Explorer.</source>
+        <translation>未找到视窗浏览器的可执行文件.</translation>
+    </message>
+    <message>
+        <source>SleepyHead (%1) needs to upgrade its database for %2 %3 %4</source>
+        <translation>SleepyHead (%1) 需要为 %2 %3 %4升级数据库</translation>
+    </message>
+    <message>
+        <source><b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b></source>
+        <translation><b>SleepyHead 为您保存一份数据备份以备不时之需.</b></translation>
+    </message>
+    <message>
+        <source><i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i></source>
+        <translation><i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i></translation>
+    </message>
+    <message>
+        <source>SleepyHead does not yet have any automatic card backups stored for this device.</source>
+        <translation>SleepyHead 不能为此设备自动备份.</translation>
+    </message>
+    <message>
+        <source>This means you will need to import this machine data again afterwards from your own backups or data card.</source>
+        <translation>这意味着您需要自行由您的存档或者数据卡中导入数据.</translation>
+    </message>
+    <message>
+        <source>Important:</source>
+        <translation>重要提示:</translation>
+    </message>
+    <message>
+        <source>Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore.</source>
+        <translation>一旦升级,你<font size=+1>将不能</font> 在之前的版本中应用此配置文件.</translation>
+    </message>
+    <message>
+        <source>If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.</source>
+        <translation>如果你在意这个,那么就点击不退出,然后手动备份您的配置文件.而后再次运行SleepHead.</translation>
+    </message>
+    <message>
+        <source>Are you ready to upgrade, so you can run the new version of SleepyHead?</source>
+        <translation>确定升级以使用新版SleepHead?</translation>
+    </message>
+    <message>
+        <source>Sorry, the purge operation failed, which means this version of SleepyHead can't start.</source>
+        <translation>抱歉,清除操作失败,SleepHead无法启动.</translation>
+    </message>
+    <message>
+        <source>The machine data folder needs to be removed manually.</source>
+        <translation>数据文件夹需要手动移除.</translation>
+    </message>
+    <message>
+        <source>This folder currently resides at the following location:</source>
+        <translation>本地文档位置:</translation>
+    </message>
+    <message>
+        <source>Rebuilding from %1 Backup</source>
+        <translation>由%1备份重建中</translation>
+    </message>
+    <message>
+        <source>Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?</source>
+        <translation>您希望打开自动备份功能吗?</translation>
+    </message>
+    <message>
+        <source>SleepyHead will now start the import wizard so you can reinstall your %1 data.</source>
+        <translation>SleepHead现在开始导入向导,便于您重新安装%1的数据.</translation>
+    </message>
+    <message>
+        <source>SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:</source>
+        <translation>SleepHead将会推出,然后将尝试打开文件管理器以便于您手动备份配置文件于:</translation>
+    </message>
+    <message>
+        <source>Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.</source>
+        <translation>利用文件管理器来创建配置文件列表的备份,然后重启SleepHead以完成升级.</translation>
+    </message>
+    <message>
+        <source>Vibratory Snore (VS2) </source>
+        <translation>呼吸
+频率
+(呼吸次数/分钟)</translation>
+    </message>
+    <message>
+        <source>Mask On Time</source>
+        <translation>面具使用时间</translation>
+    </message>
+    <message>
+        <source>Time started according to str.edf</source>
+        <translation>计时参照str.edf</translation>
+    </message>
+    <message>
+        <source>Summary Only</source>
+        <translation>仅有概要信息</translation>
+    </message>
+    <message>
+        <source>CPAP Session contains summary data onlyf</source>
+        <translation type="vanished">CPAP会话信息仅含有概要数据</translation>
+    </message>
+    <message>
+        <source>Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.</source>
+        <translation>查找这一版本 <a href='%1'>在Sourceforge的存档</a>.</translation>
+    </message>
+    <message>
+        <source>A faster build of SleepyHead may be available</source>
+        <translation>A faster build of SleepyHead may be available</translation>
+    </message>
+    <message>
+        <source>You will not be bothered with this message again.</source>
+        <translation>你将不会再被此信息打扰.</translation>
+    </message>
+    <message>
+        <source>This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer.</source>
+        <translation>这个版本不错,但是有一个 "<b>%1</b>" Build版会在您的电脑的运行的更加流畅.</translation>
+    </message>
+    <message>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.</source>
+        <translation>SleepyHead此Build版适用于老式缺乏OpenGel 2.0支持的电脑,但是您的电脑对其完全支持.</translation>
+    </message>
+    <message>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.</source>
+        <translation>SleepyHead此Build版适用于老式缺乏OpenGel 2.0支持的电脑,就像您的电脑一样,但是此版本的软件仍可以在您的电脑上较好的使用.</translation>
+    </message>
+    <message>
+        <source>If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.</source>
+        <translation>如果您在如VirtualBOX或者VMwae此类的虚拟机中运行软件,请忽略此信息,因为没有更好的版本以适用于虚拟机.</translation>
+    </message>
+    <message>
+        <source>Incompatible Graphics Hardware</source>
+        <translation>不兼容的显卡</translation>
+    </message>
+    <message>
+        <source>This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.</source>
+        <translation>此Build版本需要OpenGel2.0,但您的电脑不支持.</translation>
+    </message>
+    <message>
+        <source>You may need to update your computers graphics drivers from the GPU makers website. %1</source>
+        <translation>请升级您的显卡. %1</translation>
+    </message>
+    <message>
+        <source>(<a href='http://intel.com/support'>Intel's support site</a>)</source>
+        <translation>(<a href='http://intel.com/support'>英特尔网站</a>)</translation>
+    </message>
+    <message>
+        <source>Because graphs will not render correctly, and it may cause crashes, this build will now exit.</source>
+        <translation>图形渲染出错,将会导致软件崩溃,软件将退出.</translation>
+    </message>
+    <message>
+        <source>Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer.</source>
+        <translation>不要灰心,本软件的 "<b>-BrokenGL</b>"版本可以应用与您的电脑.</translation>
+    </message>
+    <message>
+        <source>No SleepyHead data folder was found.</source>
+        <translation>没有发现SleepyHead数据文件夹.</translation>
+    </message>
+    <message>
+        <source>Would you like SleepyHead to use the default location for storing its data?</source>
+        <translation>您希望SleepyHead在默认文件夹位置储存数据吗?</translation>
+    </message>
+    <message>
+        <source>As you did not select a data folder, SleepyHead will exit.</source>
+        <translation>因为您没有选择一个有效的数据文件夹,SleepyHead将退出.</translation>
+    </message>
+    <message>
+        <source>Next time you run, you will be asked again.</source>
+        <translation>下次运行时,将会再次询问.</translation>
+    </message>
+    <message>
+        <source>You did not select a directory.</source>
+        <translation>你没有选择目录.</translation>
+    </message>
+    <message>
+        <source>SleepyHead will now start with your old one.</source>
+        <translation>SleepHead正从旧的目录启动.</translation>
+    </message>
+    <message>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.</source>
+        <translation>所选的并不是空文件,也没有可用的SleepyHead数据.</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to use this folder?</source>
+        <translation>确认选择这个文件夹吗?</translation>
+    </message>
+    <message>
+        <source>There is a lockfile already present for profile '%1'.</source>
+        <translation>There is a lockfile already present for profile '%1'.</translation>
+    </message>
+    <message>
+        <source>You can only work with one instance of an individual SleepyHead profile at a time.</source>
+        <translation>每次只能打开一个单独的SleepyHead配置文件.</translation>
+    </message>
+    <message>
+        <source>Please close any other instances of SleepyHead running with this profile before proceeding.</source>
+        <translation>在进行之前请关闭其他的正在运行的SleepyHead配置实例.</translation>
+    </message>
+    <message>
+        <source>If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message.</source>
+        <translation>如果没有其他的SleepyHead实例在运行(如,上次崩溃时).请忽略此信息.</translation>
+    </message>
+    <message>
+        <source>There is a lockfile already present for this profile '%1', claimed on '%2'.</source>
+        <translation>There is a lockfile already present for this profile '%1', claimed on '%2'.</translation>
+    </message>
+    <message>
+        <source>If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding.</source>
+        <translation>如果您使用云存储,请确保SleepyHead已经同步完毕,且软件已经关闭.</translation>
+    </message>
+    <message>
+        <source>Unknown.</source>
+        <translation type="vanished">未知.</translation>
+    </message>
+    <message>
+        <source>?</source>
+        <translation>?</translation>
+    </message>
+    <message>
+        <source>Severity (0-1)</source>
+        <translation>严重程度 (0-1)</translation>
+    </message>
+    <message>
+        <source>Fixed</source>
+        <translation>固定的</translation>
+    </message>
+    <message>
+        <source>Auto</source>
+        <translation>自动的</translation>
+    </message>
+    <message>
+        <source>Fixed Bi-Level</source>
+        <translation>固定双水平</translation>
+    </message>
+    <message>
+        <source>Auto Bi-Level (Fixed PS)</source>
+        <translation>自动双水平</translation>
+    </message>
+    <message>
+        <source>ASV Fixed EPAP</source>
+        <translation>ASV Fixed EPAP</translation>
+    </message>
+    <message>
+        <source>ASV Variable EPAP</source>
+        <translation>ASV Variable EPAP</translation>
+    </message>
+    <message>
+        <source>%1 %2</source>
+        <translation>%1 %2</translation>
+    </message>
+    <message>
+        <source>%1-%2 %3</source>
+        <translation type="obsolete">%1-%2 %3</translation>
+    </message>
+    <message>
+        <source>Range</source>
+        <translation>范围</translation>
+    </message>
+    <message>
+        <source>Fixed %1</source>
+        <translation>固定%1</translation>
+    </message>
+    <message>
+        <source>Auto Bi-Level</source>
+        <translation>全自动双水平</translation>
+    </message>
+    <message>
+        <source>Welcome to SleepyHead</source>
+        <translation>欢迎使用SleepyHead</translation>
+    </message>
+    <message>
+        <source>What would you like to do?</source>
+        <translation>确定?</translation>
+    </message>
+    <message>
+        <source>Please Import Some Data</source>
+        <translation>请导入数据</translation>
+    </message>
+    <message>
+        <source>CPAP<br/>Importer</source>
+        <translation>CPAP<br/>数据导入</translation>
+    </message>
+    <message>
+        <source>Oximetery<br/>Wizard</source>
+        <translation>血氧仪<br/>安装向导</translation>
+    </message>
+    <message>
+        <source>View<br/>Statistics</source>
+        <translation>查看<br/>统计</translation>
+    </message>
+    <message>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation>鉴于有些选项与数据导入相关,</br>.请先对配置文件进行设置.</translation>
+    </message>
+    <message>
+        <source>First import can take a few minutes.</source>
+        <translation>第一次导入将会花费数分钟.</translation>
+    </message>
+    <message>
+        <source>Click this box to see this in daily view.</source>
+        <translation>点击方块开启日视图.</translation>
+    </message>
+    <message>
+        <source>The last time you used your %1...</source>
+        <translation>上一次您使用您的%1...</translation>
+    </message>
+    <message>
+        <source>last night</source>
+        <translation>上一晚</translation>
+    </message>
+    <message>
+        <source>yesterday</source>
+        <translation>昨天</translation>
+    </message>
+    <message>
+        <source>%2 days ago</source>
+        <translation>%2 天以前</translation>
+    </message>
+    <message>
+        <source>was %1 (on %2)</source>
+        <translation>是 %1 (在 %2)</translation>
+    </message>
+    <message>
+        <source>perfect :)</source>
+        <translation>很好:)</translation>
+    </message>
+    <message>
+        <source>pretty darn good</source>
+        <translation>非常好</translation>
+    </message>
+    <message>
+        <source>reasonably good</source>
+        <translation>还行</translation>
+    </message>
+    <message>
+        <source>technically "treated"</source>
+        <translation>技术上讲的"治疗"</translation>
+    </message>
+    <message>
+        <source>not very good</source>
+        <translation>不好</translation>
+    </message>
+    <message>
+        <source>horrible, please consult your doctor</source>
+        <translation>恐怖 ,咨询大夫吧</translation>
+    </message>
+    <message>
+        <source>%1 hours, %2 minutes and %3 seconds</source>
+        <translation>%1 小时, %2分钟 %3 秒</translation>
+    </message>
+    <message>
+        <source>You slept for %1.</source>
+        <translation type="vanished">您睡了 %1.</translation>
+    </message>
+    <message>
+        <source><font color = red>You only had the mask on for %1.</font></source>
+        <translation><font color = red>带呼吸面罩 %1.</font></translation>
+    </message>
+    <message>
+        <source>You had no <i>major</i> mask leaks (maximum was %1 %2).</source>
+        <translation>没有 <i>主要的</i> 漏气 (最大是 %1 %2).</translation>
+    </message>
+    <message>
+        <source>You had a small but acceptable amount of <i>major</i> mask leakage.</source>
+        <translation>少量可接受的<i>主要</i> 面罩漏气.</translation>
+    </message>
+    <message>
+        <source>You had significant periods of <i>major</i> mask leakage.</source>
+        <translation>严重的<i>主要</i> 面罩漏气.</translation>
+    </message>
+    <message>
+        <source>Your mask is leaking way too much.. Talk to your CPAP advisor.</source>
+        <translation>漏气太严重,请向呼吸机顾问寻求帮助.</translation>
+    </message>
+    <message>
+        <source>Your CPAP machine blasted you with a constant %1%2 of air</source>
+        <translation>呼吸机以持续的%1%2气流摧残你</translation>
+    </message>
+    <message>
+        <source>Your pressure was under %1%2 for %3% of the time.</source>
+        <translation>压力低于 %1%2 ,持续时间%3%.</translation>
+    </message>
+    <message>
+        <source>Your machine blasted you with a constant %1-%2 %3 of air.</source>
+        <translation>呼吸机以持续的%1-%2 %3 气流摧残你.</translation>
+    </message>
+    <message>
+        <source>Your machine was under %1-%2 %3 for %4% of the time.</source>
+        <translation>压力低于 %1-%2 %3 ,持续时间%4% .</translation>
+    </message>
+    <message>
+        <source>Your EPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation>呼气压力低于 %1%2 ,持续时间 %3% .</translation>
+    </message>
+    <message>
+        <source>Your IPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation>吸气压力低于 %1%2 ,持续时间 %3% .</translation>
+    </message>
+    <message>
+        <source>No CPAP data has been imported yet.</source>
+        <translation>未导入呼吸机数据.</translation>
+    </message>
+    <message>
+        <source>Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> </source>
+        <translation>最新的血氧仪数据: <a onclick='alert("daily=%2");'>%1</a> </translation>
+    </message>
+    <message>
+        <source>(last night)</source>
+        <translation>(上一晚)</translation>
+    </message>
+    <message>
+        <source>(yesterday)</source>
+        <translation>(昨天)</translation>
+    </message>
+    <message>
+        <source>(%2 day ago)</source>
+        <translation>(%2 天以前)</translation>
+    </message>
+    <message>
+        <source>No oximetery data has been imported yet.</source>
+        <translation>未导入血氧仪数据.</translation>
+    </message>
+    <message>
+        <source>Very Important Warning</source>
+        <translation>重要警告</translation>
+    </message>
+    <message>
+        <source><p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer.</source>
+        <translation><p>总是<font size=+1 color=red><b>写保护</b></font> 您的呼吸机SD数据卡,在插入电脑前.</translation>
+    </message>
+    <message>
+        <source><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="vanished"><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>某些操作系统</font></span> 会自动在SD卡上创建文件而不提示,这样会导致呼吸机不能正确识别该卡。</translation>
+    </message>
+    <message>
+        <source>Contec</source>
+        <translation>Contec</translation>
+    </message>
+    <message>
+        <source>CMS50</source>
+        <translation>CMS50</translation>
+    </message>
+    <message>
+        <source>Fisher & Paykel</source>
+        <translation>Fisher & Paykel</translation>
+    </message>
+    <message>
+        <source>ICON</source>
+        <translation>ICON</translation>
+    </message>
+    <message>
+        <source>DeVilbiss</source>
+        <translation>DeVilbiss</translation>
+    </message>
+    <message>
+        <source>Intellipap</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>ChoiceMMed</source>
+        <translation>ChoiceMMed</translation>
+    </message>
+    <message>
+        <source>MD300</source>
+        <translation>MD300</translation>
+    </message>
+    <message>
+        <source>Respironics</source>
+        <translation>Respironics</translation>
+    </message>
+    <message>
+        <source>M-Series</source>
+        <translation>M-Series</translation>
+    </message>
+    <message>
+        <source>Philips Respironics</source>
+        <translation>Philips Respironics</translation>
+    </message>
+    <message>
+        <source>System One</source>
+        <translation>System One</translation>
+    </message>
+    <message>
+        <source>ResMed</source>
+        <translation>ResMed</translation>
+    </message>
+    <message>
+        <source>S9</source>
+        <translation>S9</translation>
+    </message>
+    <message>
+        <source>Somnopose</source>
+        <translation>Somnopose</translation>
+    </message>
+    <message>
+        <source>Somnopose Software</source>
+        <translation>Somnopose Software</translation>
+    </message>
+    <message>
+        <source>Zeo</source>
+        <translation>Zeo</translation>
+    </message>
+    <message>
+        <source>Personal Sleep Coach</source>
+        <translation>睡眠教练</translation>
+    </message>
+    <message>
+        <source>Ramp Event</source>
+        <translation>斜坡启动事件</translation>
+    </message>
+    <message>
+        <source>Ramp</source>
+        <translation>斜坡启动</translation>
+    </message>
+    <message>
+        <source>Your EPAP pressure fixed at %1%2.</source>
+        <translation>呼气压力固定于 %1%2.</translation>
+    </message>
+    <message>
+        <source>Database Outdated
+Please Rebuild CPAP Data</source>
+        <translation>数据库过期
+请重建呼吸机数据</translation>
+    </message>
+    <message>
+        <source>%1 threshold</source>
+        <translation type="vanished">%1 临界值</translation>
+    </message>
+    <message>
+        <source>Sleep</source>
+        <translation type="vanished">睡</translation>
+    </message>
+    <message>
+        <source>Wake</source>
+        <translation type="vanished">醒</translation>
+    </message>
+    <message>
+        <source>Series</source>
+        <translation>系列</translation>
+    </message>
+    <message>
+        <source>Yes</source>
+        <translation>是的</translation>
+    </message>
+    <message>
+        <source>No</source>
+        <translation>不</translation>
+    </message>
+    <message>
+        <source>Auto Bi-Level (Variable PS)</source>
+        <translation>全自动双水平(压力可变)</translation>
+    </message>
+    <message>
+        <source>%1%2</source>
+        <translation>%1%2</translation>
+    </message>
+    <message>
+        <source>Fixed %1 (%2)</source>
+        <translation>固定 %1 (%2)</translation>
+    </message>
+    <message>
+        <source>Min %1 Max %2 (%3)</source>
+        <translation>最小 %1 最大%2(%3)</translation>
+    </message>
+    <message>
+        <source>EPAP %1 IPAP %2 (%3)</source>
+        <translation>呼气压力 %1 吸气压力%2 (%3)</translation>
+    </message>
+    <message>
+        <source>PS %1 over %2-%3 (%4)</source>
+        <translation>压力 %1 超过 %2-%3 (%4)</translation>
+    </message>
+    <message>
+        <source>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</source>
+        <translation>最小呼气压力%1 最大吸气压力%2 压力 %3-%4 (%5)</translation>
+    </message>
+    <message>
+        <source>EPAP %1 PS %2-%3 (%6)</source>
+        <translation>呼气压力 %1 压力 %2-%3 (%6)</translation>
+    </message>
+    <message>
+        <source>SmartFlex Mode</source>
+        <translation>SmartFlex模式</translation>
+    </message>
+    <message>
+        <source>Intellipap pressure relief mode.</source>
+        <translation>Intellipa压力释放模式.</translation>
+    </message>
+    <message>
+        <source>Ramp Only</source>
+        <translation>仅斜坡升压</translation>
+    </message>
+    <message>
+        <source>Full Time</source>
+        <translation>全部时间</translation>
+    </message>
+    <message>
+        <source>SmartFlex Level</source>
+        <translation>SmartFlex 级</translation>
+    </message>
+    <message>
+        <source>Intellipap pressure relief level.</source>
+        <translation>Intellipap 压力释放水平.</translation>
+    </message>
+    <message>
+        <source>SmartFlex Settings</source>
+        <translation>SmartFlex设置</translation>
+    </message>
+    <message>
+        <source>15mm</source>
+        <translation>15mm</translation>
+    </message>
+    <message>
+        <source>22mm</source>
+        <translation>22mm</translation>
+    </message>
+    <message>
+        <source>Flex Mode</source>
+        <translation>Flex模式</translation>
+    </message>
+    <message>
+        <source>PRS1 pressure relief mode.</source>
+        <translation>PRS1 压力释放模式.</translation>
+    </message>
+    <message>
+        <source>C-Flex</source>
+        <translation>C-Flex</translation>
+    </message>
+    <message>
+        <source>C-Flex+</source>
+        <translation>C-Flex+</translation>
+    </message>
+    <message>
+        <source>A-Flex</source>
+        <translation>A-Flex</translation>
+    </message>
+    <message>
+        <source>Rise Time</source>
+        <translation>上升时间</translation>
+    </message>
+    <message>
+        <source>Bi-Flex</source>
+        <translation>Bi-Flex</translation>
+    </message>
+    <message>
+        <source>Flex Level</source>
+        <translation>Flex Level</translation>
+    </message>
+    <message>
+        <source>PRS1 pressure relief setting.</source>
+        <translation>PRS1 压力释放设置.</translation>
+    </message>
+    <message>
+        <source>x1</source>
+        <translation>X1</translation>
+    </message>
+    <message>
+        <source>x2</source>
+        <translation>X2</translation>
+    </message>
+    <message>
+        <source>x3</source>
+        <translation>X3</translation>
+    </message>
+    <message>
+        <source>x4</source>
+        <translation>X4</translation>
+    </message>
+    <message>
+        <source>x5</source>
+        <translation>X5</translation>
+    </message>
+    <message>
+        <source>Humidifier Status</source>
+        <translation>加湿器状态</translation>
+    </message>
+    <message>
+        <source>PRS1 humidifier connected?</source>
+        <translation>PRS1 加湿器连接?</translation>
+    </message>
+    <message>
+        <source>Disconnected</source>
+        <translation>断开</translation>
+    </message>
+    <message>
+        <source>Connected</source>
+        <translation>连接</translation>
+    </message>
+    <message>
+        <source>Humidification Level</source>
+        <translation>加湿程度</translation>
+    </message>
+    <message>
+        <source>PRS1 Humidification level</source>
+        <translation>PRS1加湿水平</translation>
+    </message>
+    <message>
+        <source>Humid. Lvl.</source>
+        <translation>Humid. Lvl.</translation>
+    </message>
+    <message>
+        <source>System One Resistance Status</source>
+        <translation>System One Resistance Status</translation>
+    </message>
+    <message>
+        <source>Sys1 Resist. Status</source>
+        <translation>Sys1 Resist. Status</translation>
+    </message>
+    <message>
+        <source>System One Resistance Setting</source>
+        <translation>System One Resistance Setting</translation>
+    </message>
+    <message>
+        <source>System One Mask Resistance Setting</source>
+        <translation>System One面罩阻力设置</translation>
+    </message>
+    <message>
+        <source>Sys1 Resist. Set</source>
+        <translation>Sys1 Resist. Set</translation>
+    </message>
+    <message>
+        <source>Hose Diameter</source>
+        <translation>管径</translation>
+    </message>
+    <message>
+        <source>Diameter of primary CPAP hose</source>
+        <translation>呼吸机主管内径</translation>
+    </message>
+    <message>
+        <source>System One Resistance Lock</source>
+        <translation>System One 阻力锁定</translation>
+    </message>
+    <message>
+        <source>Whether System One resistance settings are available to you.</source>
+        <translation>System One的阻力设定可用吗.</translation>
+    </message>
+    <message>
+        <source>Sys1 Resist. Lock</source>
+        <translation>Sys1 Resist. Lock</translation>
+    </message>
+    <message>
+        <source>Auto On</source>
+        <translation>自动打开</translation>
+    </message>
+    <message>
+        <source>A few breaths automatically starts machine</source>
+        <translation>自动打开机器在几次呼吸后</translation>
+    </message>
+    <message>
+        <source>Auto Off</source>
+        <translation>自动关闭</translation>
+    </message>
+    <message>
+        <source>Machine automatically switches off</source>
+        <translation>呼吸机自动关闭</translation>
+    </message>
+    <message>
+        <source>Mask Alert</source>
+        <translation>面罩报警</translation>
+    </message>
+    <message>
+        <source>Whether or not machine allows Mask checking.</source>
+        <translation>是否允许呼吸机进行面罩检查.</translation>
+    </message>
+    <message>
+        <source>Show AHI</source>
+        <translation>显示AHI</translation>
+    </message>
+    <message>
+        <source>Whether or not machine shows AHI via LCD panel.</source>
+        <translation>是否在呼吸机LCD屏幕上显示AHI.</translation>
+    </message>
+    <message>
+        <source>Timed Breath</source>
+        <translation>短时间的呼吸</translation>
+    </message>
+    <message>
+        <source>Machine Initiated Breath</source>
+        <translation>呼吸触发机器开启</translation>
+    </message>
+    <message>
+        <source>TB</source>
+        <translation>TB</translation>
+    </message>
+    <message>
+        <source>VPAP Adapt</source>
+        <translation>VPAP自适应</translation>
+    </message>
+    <message>
+        <source>EPR</source>
+        <translation>EPR</translation>
+    </message>
+    <message>
+        <source>ResMed Exhale Pressure Relief</source>
+        <translation>瑞思迈呼气压力释放</translation>
+    </message>
+    <message>
+        <source>Patient???</source>
+        <translation>病患???</translation>
+    </message>
+    <message>
+        <source>EPR Level</source>
+        <translation>呼气压力释放水平</translation>
+    </message>
+    <message>
+        <source>Exhale Pressure Relief Level</source>
+        <translation>呼气压力释放水平</translation>
+    </message>
+    <message>
+        <source>0cmH2O</source>
+        <translation>0cmH2O</translation>
+    </message>
+    <message>
+        <source>1cmH2O</source>
+        <translation>1cmH2O</translation>
+    </message>
+    <message>
+        <source>2cmH2O</source>
+        <translation>2cmH2O</translation>
+    </message>
+    <message>
+        <source>3cmH2O</source>
+        <translation>3cmH2O</translation>
+    </message>
+    <message>
+        <source>EPR: </source>
+        <translation>呼气压力释放:</translation>
+    </message>
+    <message>
+        <source>Weinmann</source>
+        <translation>Weinmann</translation>
+    </message>
+    <message>
+        <source>SOMNOsoft2</source>
+        <translation>SOMNOsoft2</translation>
+    </message>
+    <message>
+        <source>Pressure Min</source>
+        <translation>最小压力</translation>
+    </message>
+    <message>
+        <source>Pressure Max</source>
+        <translation>最大压力</translation>
+    </message>
+    <message>
+        <source>Leak Flag</source>
+        <translation>漏气标志</translation>
+    </message>
+    <message>
+        <source>LF</source>
+        <translation>漏气标志</translation>
+    </message>
+    <message>
+        <source>CPAP Session contains summary data only</source>
+        <translation>仅含有概要数据</translation>
+    </message>
+    <message>
+        <source>PAP Mode</source>
+        <translation>正压通气模式</translation>
+    </message>
+    <message>
+        <source>PAP Device Mode</source>
+        <translation>正压通气模式</translation>
+    </message>
+    <message>
+        <source>ASV (Fixed EPAP)</source>
+        <translation>ASV模式 (固定呼气压力)</translation>
+    </message>
+    <message>
+        <source>ASV (Variable EPAP)</source>
+        <translation>ASV,模式 (可变呼气压力)</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to reset all your channel colors and settings to defaults?</source>
+        <translation>确定将所有通道颜色恢复默认设置吗?</translation>
+    </message>
+    <message>
+        <source>ASV Auto EPAP</source>
+        <translation>ASV 自动呼气压力</translation>
+    </message>
+    <message>
+        <source>You had an AHI of %1, which is considered %2</source>
+        <translation>You had an AHI of %1, which is considered %2</translation>
+    </message>
+    <message>
+        <source>(% of time)</source>
+        <translation>(% of time)</translation>
+    </message>
+    <message>
+        <source>Duration %1:%2:%3</source>
+        <translation>时长 %1:%2:%3</translation>
+    </message>
+    <message>
+        <source>AHI %1</source>
+        <translation>AHI %1</translation>
+    </message>
+    <message>
+        <source>Peak</source>
+        <translation>峰值</translation>
+    </message>
+    <message>
+        <source>Maximum</source>
+        <translation type="vanished">最大</translation>
+    </message>
+    <message>
+        <source>%1% %2</source>
+        <translation>%1% %2</translation>
+    </message>
+    <message>
+        <source>Heated Tubing</source>
+        <translation>加热管路</translation>
+    </message>
+    <message>
+        <source>Heated Tubing Connected</source>
+        <translation>加热管路已连接</translation>
+    </message>
+    <message>
+        <source>Headed Tubing</source>
+        <translation>加热管路</translation>
+    </message>
+    <message>
+        <source>By Pressure</source>
+        <translation>压力</translation>
+    </message>
+    <message>
+        <source>Statistics at Pressure</source>
+        <translation>压力统计</translation>
+    </message>
+    <message>
+        <source>SleepyHead is proudly brought to you by JediMark.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>d MMM [ %1 - %2 ]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1</source>
+        <translation type="unfinished">%1% {1?}</translation>
+    </message>
+    <message>
+        <source>Hide All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Show All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unpin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Plots Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(Summary Only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <translation type="unfinished">%1% %2 {1:?}</translation>
+    </message>
+    <message>
+        <source>Relief: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hours: %1h, %2m, %3s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Machine Information</source>
+        <translation type="unfinished">机器信息</translation>
+    </message>
+    <message>
+        <source>Compliance Only :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphs Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Summary Only :(</source>
+        <translation type="unfinished">仅有概要信息:(</translation>
+    </message>
+    <message>
+        <source>Sessions Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Journal Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SleepyHead found an old Journal folder, but it looks like it's been renamed:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SleepyHead will not touch this folder, and will create a new one instead.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please be careful when playing in SleepyHead's profile folders :-P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SleepyHead picked only the first one of these, and will use it in future:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CMS50F3.7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CMS50F</source>
+        <translation type="unfinished">CMS50F</translation>
+    </message>
+    <message>
+        <source>Loading %1 data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PLease Wait...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perfusion Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A relative assessment of the pulse strength at the monitoring site</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perf. Index %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>APAP (Variable)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Zero</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Upper Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lower Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 Session #%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You machine was on for %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><p><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>or</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snapshot %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QextSerialPort</name>
+    <message>
+        <source>General write operation failure</source>
+        <translation type="vanished">一般写入操作失败</translation>
+    </message>
+    <message>
+        <source>Caught a non-blocked signal (POSIX)</source>
+        <translation type="vanished">抓取到非阻止信号(便携式操作系统接口)</translation>
+    </message>
+    <message>
+        <source>Receive buffer overflow</source>
+        <translation type="vanished">接受缓冲区溢出</translation>
+    </message>
+    <message>
+        <source>There was an I/O error while communicating with the port</source>
+        <translation type="vanished">I/O错误</translation>
+    </message>
+    <message>
+        <source>The %1 file doesn't exists</source>
+        <translation type="vanished">命名为 %1 的文件不存在</translation>
+    </message>
+    <message>
+        <source>General read operation failure</source>
+        <translation type="vanished">一般读取操作失败</translation>
+    </message>
+    <message>
+        <source>The port detected a break condition</source>
+        <translation type="vanished">监测到文件损坏</translation>
+    </message>
+    <message>
+        <source>Character buffer overrun</source>
+        <translation type="vanished">字符缓冲溢出</translation>
+    </message>
+    <message>
+        <source>Permission denied</source>
+        <translation type="vanished">拒绝访问</translation>
+    </message>
+    <message>
+        <source>Invalid file descriptor (port was not opened correctly)</source>
+        <translation type="vanished">无效的文件标示符(端口没有正确打开)</translation>
+    </message>
+    <message>
+        <source>Device is already locked</source>
+        <translation type="vanished">设备已锁定</translation>
+    </message>
+    <message>
+        <source>Transmit buffer overflow</source>
+        <translation type="vanished">发送缓冲区溢出</translation>
+    </message>
+    <message>
+        <source>Operation timed out (POSIX)</source>
+        <translation type="vanished">操作超时(便携式操作系统接口)</translation>
+    </message>
+    <message>
+        <source>No Error has occurred</source>
+        <translation type="vanished">无故障发生</translation>
+    </message>
+    <message>
+        <source>The port detected a parity error in the received data</source>
+        <translation type="vanished">奇偶校验错误</translation>
+    </message>
+    <message>
+        <source>The port detected a framing error (usually caused by incorrect baud rate settings)</source>
+        <translation type="vanished">通信错误(请重新设置波特率)</translation>
+    </message>
+    <message>
+        <source>The file opened by the port is not a valid device</source>
+        <translation type="vanished">请连接适当的设备,此设备无效</translation>
+    </message>
+    <message>
+        <source>Unable to allocate memory tables (POSIX)</source>
+        <translation type="vanished">内存无法分配(便携式操作系统接口)</translation>
+    </message>
+    <message>
+        <source>Unknown error: %1</source>
+        <translation type="vanished">位置错误: %1</translation>
+    </message>
+</context>
+<context>
+    <name>QuaGzipFile</name>
+    <message>
+        <source>Opening gzip for both reading and writing is not supported</source>
+        <translation type="vanished">不支持读写GZIP文件</translation>
+    </message>
+    <message>
+        <source>Could not gzopen() file</source>
+        <translation type="vanished">不能够解压()文件</translation>
+    </message>
+    <message>
+        <source>QIODevice::Append is not supported for GZIP</source>
+        <translation type="vanished">QIODevice::指定打开文件不支持 GZIP 格式文件</translation>
+    </message>
+    <message>
+        <source>You can open a gzip either for reading or for writing. Which is it?</source>
+        <translation type="vanished">读取 还是 写入?</translation>
+    </message>
+</context>
+<context>
+    <name>QuaZIODevice</name>
+    <message>
+        <source>QIODevice::ReadWrite is not supported for QuaZIODevice</source>
+        <translation type="vanished">QIODevice::不支持对 QuaZIODevice 的读写</translation>
+    </message>
+    <message>
+        <source>QIODevice::Append is not supported for QuaZIODevice</source>
+        <translation type="vanished">QIODevice::指定文件不支持 QuaZIODevice</translation>
+    </message>
+</context>
+<context>
+    <name>QuaZipFilePrivate</name>
+    <message>
+        <source>ZIP/UNZIP API error %1</source>
+        <translation>压缩/解压缩 端口错误 %1</translation>
+    </message>
+</context>
+<context>
+    <name>Report</name>
+    <message>
+        <source>Form</source>
+        <translation>表格</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation>about:空白</translation>
+    </message>
+</context>
+<context>
+    <name>SessionBar</name>
+    <message>
+        <source>No Sessions Present</source>
+        <translation>没有会话</translation>
+    </message>
+</context>
+<context>
+    <name>Statistics</name>
+    <message>
+        <source>Days</source>
+        <translation>天数</translation>
+    </message>
+    <message>
+        <source>Best&nbsp;%1</source>
+        <translation>最好&nbsp;%1</translation>
+    </message>
+    <message>
+        <source>Usage Information</source>
+        <translation>使用信息</translation>
+    </message>
+    <message>
+        <source>PS %1</source>
+        <translation type="vanished">压力支持 %1</translation>
+    </message>
+    <message>
+        <source>SleepyHead is pretty much useless without it.</source>
+        <translation type="vanished">SleepyHead非常需要它.</translation>
+    </message>
+    <message>
+        <source>Oximeter Statistics</source>
+        <translation>血氧仪统计</translation>
+    </message>
+    <message>
+        <source>CPAP Usage</source>
+        <translation>CPAP使用情况</translation>
+    </message>
+    <message>
+        <source>Blood Oxygen Saturation</source>
+        <translation>血氧饱和度</translation>
+    </message>
+    <message>
+        <source>Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.</source>
+        <translation>功效显示忽略低于处方设置%1天数的数据.</translation>
+    </message>
+    <message>
+        <source>% of time in %1</source>
+        <translation>% 在 %1 时间中</translation>
+    </message>
+    <message>
+        <source>Last 30 Days</source>
+        <translation>过去三十天</translation>
+    </message>
+    <message>
+        <source>Compliant Days</source>
+        <translation>依从天数</translation>
+    </message>
+    <message>
+        <source>%1 Index</source>
+        <translation>%1 指数</translation>
+    </message>
+    <message>
+        <source>Worst RX Setting</source>
+        <translation>最差治疗方案设定</translation>
+    </message>
+    <message>
+        <source>Best RX Setting</source>
+        <translation>最佳治疗方案设定</translation>
+    </message>
+    <message>
+        <source>90% %1</source>
+        <translation>90% %1</translation>
+    </message>
+    <message>
+        <source>%1 day of %2 Data on %3</source>
+        <translation>%1 天在 %2 中的数据在 %3</translation>
+    </message>
+    <message>
+        <source>Changes to Prescription Settings</source>
+        <translation>改变治疗方案设定</translation>
+    </message>
+    <message>
+        <source>Therapy Efficiacy</source>
+        <translation>治疗效率</translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="vanished">压力释放.</translation>
+    </message>
+    <message>
+        <source>Max %1</source>
+        <translation>最大 %1</translation>
+    </message>
+    <message>
+        <source>%1 Median</source>
+        <translation>%1 中值</translation>
+    </message>
+    <message>
+        <source>Min %1</source>
+        <translation>最小 %1</translation>
+    </message>
+    <message>
+        <source>Most Recent</source>
+        <translation>最近</translation>
+    </message>
+    <message>
+        <source>Pressure Settings</source>
+        <translation>压力设置</translation>
+    </message>
+    <message>
+        <source>Pressure Statistics</source>
+        <translation>压力统计</translation>
+    </message>
+    <message>
+        <source>Compliancy</source>
+        <translation type="vanished">依从性</translation>
+    </message>
+    <message>
+        <source>Last 6 Months</source>
+        <translation>过去六个月</translation>
+    </message>
+    <message>
+        <source>Total Days</source>
+        <translation>总天数</translation>
+    </message>
+    <message>
+        <source>CPAP %1</source>
+        <translation type="vanished">CPAP %1</translation>
+    </message>
+    <message>
+        <source>Average %1</source>
+        <translation>平均 %1</translation>
+    </message>
+    <message>
+        <source>No %1 data available.</source>
+        <translation>%1 数据可用.</translation>
+    </message>
+    <message>
+        <source>Last Use</source>
+        <translation>最后一次</translation>
+    </message>
+    <message>
+        <source>First import can take a few minutes.</source>
+        <translation type="vanished">第一次导入将会花费数分钟.</translation>
+    </message>
+    <message>
+        <source>Pulse Rate</source>
+        <translation>脉搏</translation>
+    </message>
+    <message>
+        <source>First Use</source>
+        <translation>首次</translation>
+    </message>
+    <message>
+        <source>Days AHI &gt;5.0</source>
+        <translation>AHI  &gt;5.0 的天数</translation>
+    </message>
+    <message>
+        <source>EPAP %1</source>
+        <translation type="vanished">呼气压力 %1</translation>
+    </message>
+    <message>
+        <source>Last Week</source>
+        <translation>上周</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation>去年</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation>详情</translation>
+    </message>
+    <message>
+        <source>Worst&nbsp;%1</source>
+        <translation>最差&nbsp;%1</translation>
+    </message>
+    <message>
+        <source>%1 days of %2 Data, between %3 and %4</source>
+        <translation>%1 天的在 %2中的数据,在%3 和 %4 之间</translation>
+    </message>
+    <message>
+        <source>APAP %1 - %2</source>
+        <translation type="vanished">APAP %1 - %2</translation>
+    </message>
+    <message>
+        <source>Please Import Some Data</source>
+        <translation type="vanished">请导入数据</translation>
+    </message>
+    <message>
+        <source>Last Session</source>
+        <translation>上一个会话</translation>
+    </message>
+    <message>
+        <source>Machine Information</source>
+        <translation>机器信息</translation>
+    </message>
+    <message>
+        <source>CPAP Statistics</source>
+        <translation>CPAP统计</translation>
+    </message>
+    <message>
+        <source>IPAP %1</source>
+        <translation type="vanished">吸气压力 %1</translation>
+    </message>
+    <message>
+        <source>Leak Statistics</source>
+        <translation>漏气统计</translation>
+    </message>
+    <message>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="vanished">鉴于有些选项与数据导入相关,</br>.请先对配置文件进行设置.</translation>
+    </message>
+    <message>
+        <source>Average Hours per Night</source>
+        <translation>平均每晚的小时数</translation>
+    </message>
+    <message>
+        <source>Compliance</source>
+        <translation>依从性</translation>
+    </message>
+    <message>
+        <source>% of time above %1 threshold</source>
+        <translation>% 的时间高于 %1 阈值</translation>
+    </message>
+    <message>
+        <source>% of time below %1 threshold</source>
+        <translation>% 的时间低于 %1 阈值</translation>
+    </message>
+    <message>
+        <source>Fixed %1</source>
+        <translation type="vanished">固定%1</translation>
+    </message>
+    <message>
+        <source>I can haz data?!?</source>
+        <translation>I can haz data?!?</translation>
+    </message>
+    <message>
+        <source>This lonely sleepy sheep has no data :(</source>
+        <translation>无数据 :(</translation>
+    </message>
+    <message>
+        <source>Fixed %1 %2</source>
+        <translation type="obsolete">固定%1 %2</translation>
+    </message>
+    <message>
+        <source>Pressure Relief</source>
+        <translation>压力释放</translation>
+    </message>
+</context>
+<context>
+    <name>Summary</name>
+    <message>
+        <source>FL</source>
+        <translation type="vanished">气流受限</translation>
+    </message>
+    <message>
+        <source>Min EPAP</source>
+        <translation type="vanished">呼气压力最小值</translation>
+    </message>
+    <message>
+        <source>Days</source>
+        <translation type="vanished">天数</translation>
+    </message>
+    <message>
+        <source>Best&nbsp;%1</source>
+        <translation type="vanished">最好&nbsp;%1</translation>
+    </message>
+    <message>
+        <source>Usage Information</source>
+        <translation type="vanished">使用信息</translation>
+    </message>
+    <message>
+        <source>Min Pres.</source>
+        <translation type="vanished">最小压力.</translation>
+    </message>
+    <message>
+        <source>Average Pulse Rate</source>
+        <translation type="vanished">平均脉搏</translation>
+    </message>
+    <message>
+        <source>Average Pressure</source>
+        <translation type="vanished">平均压力</translation>
+    </message>
+    <message>
+        <source>SleepyHead is pretty much useless without it.</source>
+        <translation type="vanished">SleepyHead非常需要它.</translation>
+    </message>
+    <message>
+        <source>No CPAP data available.</source>
+        <translation type="vanished">没有可用的CPAP数据.</translation>
+    </message>
+    <message>
+        <source>%1% %2</source>
+        <translation type="vanished">%1% %2</translation>
+    </message>
+    <message>
+        <source>The above has a threshold which excludes day counts less than %1 from the best/worst highlighting</source>
+        <translation type="vanished">以上显示为从最好/最差中排除小于%1的数据</translation>
+    </message>
+    <message>
+        <source>%1 days of CPAP Data, between %2 and %3</source>
+        <translation type="vanished">%1 天的数据, 在 %2.和 %3 之间</translation>
+    </message>
+    <message>
+        <source>Last 30 Days</source>
+        <translation type="vanished">过去三十天</translation>
+    </message>
+    <message>
+        <source>Compliant Days</source>
+        <translation type="vanished">相兼容的天数</translation>
+    </message>
+    <message>
+        <source>No CPAP Machine Data Imported</source>
+        <translation type="vanished">没有CPAP数据被导入</translation>
+    </message>
+    <message>
+        <source>RERA Index</source>
+        <translation type="vanished">呼吸努力相关性觉醒指数</translation>
+    </message>
+    <message>
+        <source>Worst RX Setting</source>
+        <translation type="vanished">最差治疗方案设定</translation>
+    </message>
+    <message>
+        <source>Best RX Setting</source>
+        <translation type="vanished">最佳治疗方案设定</translation>
+    </message>
+    <message>
+        <source>Last 7 Days</source>
+        <translation type="vanished">过去一周</translation>
+    </message>
+    <message>
+        <source>Changes to Prescription Settings</source>
+        <translation type="vanished">改变治疗方案设定</translation>
+    </message>
+    <message>
+        <source>%1 day of Oximetry Data, on %2.</source>
+        <translation type="vanished">%1 天的血氧数据, 在 %2.</translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="vanished">压力释放.</translation>
+    </message>
+    <message>
+        <source>PS Max</source>
+        <translation type="vanished">最大压力</translation>
+    </message>
+    <message>
+        <source>PS Min</source>
+        <translation type="vanished">最小压力</translation>
+    </message>
+    <message>
+        <source>Last 6 months</source>
+        <translation type="vanished">过去六个月</translation>
+    </message>
+    <message>
+        <source>Most Recent</source>
+        <translation type="vanished">最近</translation>
+    </message>
+    <message>
+        <source>Maximum Pulse Rate</source>
+        <translation type="vanished">最大脉搏</translation>
+    </message>
+    <message>
+        <source>Minimum Pulse Rate</source>
+        <translation type="vanished">最小脉搏</translation>
+    </message>
+    <message>
+        <source>Total Days</source>
+        <translation type="vanished">总天数</translation>
+    </message>
+    <message>
+        <source>CPAP Statistics as of</source>
+        <translation type="vanished">CPAP统计开始于</translation>
+    </message>
+    <message>
+        <source>Average %1</source>
+        <translation type="vanished">平均 %1</translation>
+    </message>
+    <message>
+        <source>Max IPAP</source>
+        <translation type="vanished">吸气压力最大值</translation>
+    </message>
+    <message>
+        <source>Last Use</source>
+        <translation type="vanished">最后一次</translation>
+    </message>
+    <message>
+        <source>First import can take a few minutes.</source>
+        <translation type="vanished">第一次导入将会花费数分钟.</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation type="vanished">压力</translation>
+    </message>
+    <message>
+        <source>Hours per Night</source>
+        <translation type="vanished">小时每晚</translation>
+    </message>
+    <message>
+        <source>Oximetry Summary</source>
+        <translation type="vanished">血氧数据概览</translation>
+    </message>
+    <message>
+        <source>First Use</source>
+        <translation type="vanished">首次</translation>
+    </message>
+    <message>
+        <source>Days AHI &gt;5.0</source>
+        <translation type="vanished">AHI  &gt;5.0 的天数</translation>
+    </message>
+    <message>
+        <source>Average SpO2</source>
+        <translation type="vanished">平均血氧饱和度</translation>
+    </message>
+    <message>
+        <source>%1% Pressure</source>
+        <translation type="vanished">%1% 压力</translation>
+    </message>
+    <message>
+        <source>Max Pres.</source>
+        <translation type="vanished">最大压力.</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation type="vanished">去年</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation type="vanished">详情</translation>
+    </message>
+    <message>
+        <source>Worst&nbsp;%1</source>
+        <translation type="vanished">最差&nbsp;%1</translation>
+    </message>
+    <message>
+        <source>%1 days of Oximetry Data, between %2 and %3</source>
+        <translation type="vanished">%1 天的血氧数据, 在 %2 与 %3 之间</translation>
+    </message>
+    <message>
+        <source>% of time in SpO2 Events</source>
+        <translation type="vanished">% 的时间的血氧饱和度事件</translation>
+    </message>
+    <message>
+        <source>SpO2 Events / Hour</source>
+        <translation type="vanished">血样饱和度 事件/小时</translation>
+    </message>
+    <message>
+        <source>Please Import Some Data</source>
+        <translation type="vanished">请导入数据</translation>
+    </message>
+    <message>
+        <source>Machine Information</source>
+        <translation type="vanished">机器信息</translation>
+    </message>
+    <message>
+        <source>%1 day of CPAP Data, on %2.</source>
+        <translation type="vanished">%1 天的数据, 在 %2.</translation>
+    </message>
+    <message>
+        <source>Pulse Change Events / Hour</source>
+        <translation type="vanished">脉搏波动 时间/小时</translation>
+    </message>
+    <message>
+        <source>Minimum SpO2</source>
+        <translation type="vanished">最低宣扬饱和度</translation>
+    </message>
+    <message>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="vanished">鉴于有些选项与数据导入相关,</br>.请先对配置文件进行设置.</translation>
+    </message>
+    <message>
+        <source>Flow Limit Index</source>
+        <translation type="vanished">气流受限指数</translation>
+    </message>
+</context>
+<context>
+    <name>UpdaterWindow</name>
+    <message>
+        <source>Log</source>
+        <translation>登录</translation>
+    </message>
+    <message>
+        <source>Size</source>
+        <translation>大小</translation>
+    </message>
+    <message>
+        <source>Saving as </source>
+        <translation>保存为</translation>
+    </message>
+    <message>
+        <source>&Finished</source>
+        <translation>&完成</translation>
+    </message>
+    <message>
+        <source>Redirected to </source>
+        <translation>重新定位到</translation>
+    </message>
+    <message>
+        <source>A new version of SleepyHead is available!</source>
+        <translation>有更新!</translation>
+    </message>
+    <message>
+        <source>Download Error. Sorry, try again later.</source>
+        <translation>下载出错,请稍后再试.</translation>
+    </message>
+    <message>
+        <source>There was an error parsing the XML Update file.</source>
+        <translation>XML升级文件解析失败.</translation>
+    </message>
+    <message>
+        <source>Updates Complete. SleepyHead needs to restart now, click Finished to do so.</source>
+        <translation>升级完毕,请点击完成来重启SlpeeyHead.</translation>
+    </message>
+    <message>
+        <source>XML update structure parsed cleanly</source>
+        <translation>XML结构升级解析完毕</translation>
+    </message>
+    <message>
+        <source>Version <b>%1</b> is available. You're currently running v%1</source>
+        <translation>版本 <b>%1</b> 已可用. 已安装的 v%1</translation>
+    </message>
+    <message>
+        <source>Please wait while updates are downloaded and installed...</source>
+        <translation>请耐心等待下载安装结束...</translation>
+    </message>
+    <message>
+        <source>Shiny new <b>v%1</b> is available. You're running old and busted v%2</source>
+        <translation>闪亮亮的新版 <b>v%1</b> 已经退出. 速度走起! v%2</translation>
+    </message>
+    <message>
+        <source>SleepyHead Updater</source>
+        <translation>SleepyHead 升级程序</translation>
+    </message>
+    <message>
+        <source>SleepyHead Updates</source>
+        <translation>SLeepyHead升级</translation>
+    </message>
+    <message>
+        <source>Component</source>
+        <translation>元件</translation>
+    </message>
+    <message>
+        <source>Failed</source>
+        <translation>失败</translation>
+    </message>
+    <message>
+        <source>&Upgrade Now</source>
+        <translation>&现在升级</translation>
+    </message>
+    <message>
+        <source>Version Information</source>
+        <translation>版本信息</translation>
+    </message>
+    <message>
+        <source>Build Notes</source>
+        <translation>建档日期</translation>
+    </message>
+    <message>
+        <source>No new updates were found for your platform.</source>
+        <translation>未发现此系统的更新文件.</translation>
+    </message>
+    <message>
+        <source>Download Complete</source>
+        <translation>下载完毕</translation>
+    </message>
+    <message>
+        <source>No updates were found for your platform.</source>
+        <translation>未发现新版本.</translation>
+    </message>
+    <message>
+        <source>Downloading & Installing Updates</source>
+        <translation>正在下载&安装升级文件</translation>
+    </message>
+    <message>
+        <source>Maybe &Later</source>
+        <translation>可能 &后来</translation>
+    </message>
+    <message>
+        <source>Extracting </source>
+        <translation>提取中</translation>
+    </message>
+    <message>
+        <source>Update to QtLibs (v%1)</source>
+        <translation>升级到 QtLibs (v%1)</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation>about:空白</translation>
+    </message>
+    <message>
+        <source>Update Failed :(</source>
+        <translation>升级失败 :(</translation>
+    </message>
+    <message>
+        <source>SleepyHead v%1, codename "%2"</source>
+        <translation>SleepyHead v%1 ,代码名称 "%2</translation>
+    </message>
+    <message>
+        <source>Progress</source>
+        <translation>进行中</translation>
+    </message>
+    <message>
+        <source>Checking for SleepyHead Updates</source>
+        <translation>检查更新</translation>
+    </message>
+    <message>
+        <source>Please wait while downloading and installing updates.</source>
+        <translation>请耐心等待.</translation>
+    </message>
+    <message>
+        <source>File integrity check failed for %1</source>
+        <translation>文件完整性校验失败,由于 %1 的原因</translation>
+    </message>
+    <message>
+        <source>%1 bytes received</source>
+        <translation>已下载 %1 字节</translation>
+    </message>
+    <message>
+        <source>A new version of $APP is available</source>
+        <translation>新版本的$APP</translation>
+    </message>
+    <message>
+        <source>You might need to reinstall manually. Sorry :(</source>
+        <translation>抱歉,请手动安装. :(</translation>
+    </message>
+    <message>
+        <source>Updates</source>
+        <translation>升级文件</translation>
+    </message>
+    <message>
+        <source>Downloading & Installing Updates...</source>
+        <translation>正在下载&安装升级文件...</translation>
+    </message>
+    <message>
+        <source>Version</source>
+        <translation>版本</translation>
+    </message>
+    <message>
+        <source>Update Complete!</source>
+        <translation>升级完毕!</translation>
+    </message>
+    <message>
+        <source>SleepyHead v%1 build notes</source>
+        <translation>SleepyHead  v%1  版本信息</translation>
+    </message>
+    <message>
+        <source>Requesting </source>
+        <translation>正在请求</translation>
+    </message>
+    <message>
+        <source>platform notes</source>
+        <translation>系统信息</translation>
+    </message>
+    <message>
+        <source>Ugh.. Something went wrong with unzipping.</source>
+        <translation>啊...解压缩失败..</translation>
+    </message>
+    <message>
+        <source>An update for SleepyHead is available.</source>
+        <translation>SleepyHead有更新文件可用.</translation>
+    </message>
+    <message>
+        <source>File size mismatch for %1</source>
+        <translation>文件大小不符合于 %1</translation>
+    </message>
+    <message>
+        <source>There was an error completing a network request:
+
+(</source>
+        <translation>联网时出错:
+
+(</translation>
+    </message>
+    <message>
+        <source>Release Notes</source>
+        <translation>版本注释</translation>
+    </message>
+</context>
+<context>
+    <name>gGraph</name>
+    <message>
+        <source>Snapshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraphView</name>
+    <message>
+        <source>100% zoom level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reset Graph Layout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CPAP Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximeter Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Dotted Lines</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Restore X-axis zoom too 100% to view entire days data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Resets all graphs to a uniform height and default order.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Y-Axis</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Remove Clone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Clone %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/Translations/Deutsch.de.ts b/Translations/Deutsch.de.ts
new file mode 100644
index 0000000..9360287
--- /dev/null
+++ b/Translations/Deutsch.de.ts
@@ -0,0 +1,7439 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="de_DE">
+<context>
+    <name>CMS50Loader</name>
+    <message>
+        <source>Could not get data transmission from oximeter.</source>
+        <translation>Keine Datenübertragung vom Oximeter möglich.</translation>
+    </message>
+    <message>
+        <source>Please ensure you select 'upload' from the oximeter devices menu.</source>
+        <translation>Bitte stellen Sie sicher, dass Sie den'Upload' aus dem Menü des Oximeter Gerätes auswählt haben.</translation>
+    </message>
+</context>
+<context>
+    <name>CMS50Serial</name>
+    <message>
+        <source>No valid start time was provided for this oximeter session. You will likely have to adjust your oximeter sessions start time before saving.</source>
+        <translation type="vanished">Es wurde keine gültige Startzeit für diese Oximeter-Sitzung zur Verfügung gestellt. Stellen Sie sicher, dass Sie Ihre Oximetrie-Daten vor der Startzeit gespeichert haben.</translation>
+    </message>
+    <message>
+        <source>Did you remember to start your oximeter recording at exactly the same time you started your CPAP machine?</source>
+        <translation type="vanished">Haben Sie daran gedacht, das Ihre Oximeter Aufnahme genau zur gleichen Zeit, wie Ihre CPAP-Geräte begonnen haben, zu starten?</translation>
+    </message>
+    <message>
+        <source>Import Failed</source>
+        <translation type="vanished">Import fehlgeschlagen</translation>
+    </message>
+    <message>
+        <source>Import Failed. Wait for oximeter and try again.</source>
+        <translation type="vanished">Import fehlgeschlagen. Warten Sie auf die Oximeter-Daten und versuchen Sie es erneut.</translation>
+    </message>
+    <message>
+        <source>Information</source>
+        <translation type="vanished">Information</translation>
+    </message>
+    <message>
+        <source>The most recent CPAP Session time has been selected as the start of your oximetry session.
+If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter.</source>
+        <translation type="vanished">Die letzte CPAP Sitzungszeit wurde als Beginn Ihrer Oxymetrie Sitzung ausgewählt.
+Wenn Sie vergessen haben, die heutigen CPAP-Daten zu importieren, sollten Sie Dies jetzt tun und dann wieder von Ihrem Oximeter importieren.</translation>
+    </message>
+    <message>
+        <source>Set Oximeter to Upload</source>
+        <translation type="vanished">Oximeter zum hochladen verbunden</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">Frage</translation>
+    </message>
+    <message>
+        <source>Please Wait, Importing...</source>
+        <translation type="vanished">Bitte warten Sie bis der Import abgeschlossen ist...</translation>
+    </message>
+    <message>
+        <source>Processing...</source>
+        <translation type="vanished">Verarbeitung...</translation>
+    </message>
+    <message>
+        <source>That's ok, I will use the time provided by your oximeter, however it will sync better next time if you start your oximeter recording at the same time your CPAP machine starts up.</source>
+        <translation type="vanished">Um eine ordnungsgemäße Syncronisation zu gewährleisten starten Sie bitte Ihr CPAP-Gerät gleichzeitig mit Ihrem Oximeter-Gerät.</translation>
+    </message>
+    <message>
+        <source>If you haven't set your oximeter clock you will have to manually edit this time before saving this oximetry session.</source>
+        <translation type="vanished">Wenn Sie Ihre Oximeter Uhr nicht eingestellt haben, müssen Sie Diese vor dem Speichern der Oxymetrie-Sitzung, manuell festlegen.</translation>
+    </message>
+    <message>
+        <source>It looks like your oximeter doesn't provide a valid start time, I'm going to set this oximetry session starting time to the CPAP starting time anyway.</source>
+        <translation type="vanished">Es sieht aus als ob Sie Ihrem Oximeter keine gültige Startzeit gegeben haben. Das Programm wird die Oximeter Startzeit auf die Startzeit Ihres CPAP-Gerätes festlegen.</translation>
+    </message>
+    <message>
+        <source>You may have to adjust it manually if you remember the real start time before saving this session.</source>
+        <translation type="vanished">Eventuell müssen Sie die richtige Startzeit vor dem speichern der Sitzung manuell anpassen.</translation>
+    </message>
+    <message>
+        <source>(Also, did you remember to import todays CPAP data first?)</source>
+        <translation type="vanished">(Haben Sie daran gedacht, zuerst die heutigen CPAP-Daten zu importieren?)</translation>
+    </message>
+    <message>
+        <source>The most recent CPAP Session time has been selected as the start of your oximetry session.</source>
+        <translation type="vanished">Die letzte CPAP Sitzungszeit wurde als Beginn Ihrer Oxymetrie Sitzung ausgewählt.</translation>
+    </message>
+    <message>
+        <source>If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter.</source>
+        <translation type="vanished">Wenn Sie vergessen haben, die letzten CPAP-Daten zu importieren, tun Sie das jetzt und importieren Sie dann die Oximeterdaten erneut.</translation>
+    </message>
+    <message>
+        <source>No valid start time was provided for this oximeter session.</source>
+        <translation type="vanished">Es wurde keine gültige Startzeit, für diese Oximeter-Sitzung, zur Verfügung gestellt.</translation>
+    </message>
+    <message>
+        <source>You will likely have to adjust your oximeter sessions start time before saving.</source>
+        <translation type="vanished">Sie werden wahrscheinlich die Oximeter Sitzungs Startzeit vor dem Speichern einstellen müssen.</translation>
+    </message>
+    <message>
+        <source>Something went wrong with reading from the Oximeter.</source>
+        <translation type="vanished">Das lesen aus dem Oximeter-Gerät hat nicht funktioniert.</translation>
+    </message>
+    <message>
+        <source>Please wait for oximeter to finish tranmitting than try restarting import again.</source>
+        <translation type="vanished">Bitte warten Sie bis das Oximeter fertig übertragen hat und starten Sie dann erneut den Import.</translation>
+    </message>
+</context>
+<context>
+    <name>Daily</name>
+    <message>
+        <source>B</source>
+        <translation>B</translation>
+    </message>
+    <message>
+        <source>u</source>
+        <translation>u</translation>
+    </message>
+    <message>
+        <source>U1</source>
+        <translation type="vanished">U1</translation>
+    </message>
+    <message>
+        <source>U2</source>
+        <translation type="vanished">U2</translation>
+    </message>
+    <message>
+        <source>U3</source>
+        <translation type="vanished">U3</translation>
+    </message>
+    <message>
+        <source> i </source>
+        <translation> i </translation>
+    </message>
+    <message>
+        <source>%1%</source>
+        <translation type="vanished">%1%</translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>Avg</source>
+        <translation type="vanished">Durchschnitt</translation>
+    </message>
+    <message>
+        <source>Big</source>
+        <translation>Groß</translation>
+    </message>
+    <message>
+        <source>Med</source>
+        <translation type="vanished">Med</translation>
+    </message>
+    <message>
+        <source>100%</source>
+        <translation type="vanished">100%</translation>
+    </message>
+    <message>
+        <source>Form</source>
+        <translation>Form</translation>
+    </message>
+    <message>
+        <source>Next</source>
+        <translation>Weiter</translation>
+    </message>
+    <message>
+        <source>Prev</source>
+        <translation>Zurück</translation>
+    </message>
+    <message>
+        <source>Wake</source>
+        <translation>Aufgewacht</translation>
+    </message>
+    <message>
+        <source>Color</source>
+        <translation>Farbe</translation>
+    </message>
+    <message>
+        <source>Int. Pulse</source>
+        <translation type="vanished">Int. Puls</translation>
+    </message>
+    <message>
+        <source>Notes</source>
+        <translation>Aufzeichnungen</translation>
+    </message>
+    <message>
+        <source>Reset</source>
+        <translation type="vanished">Rücksetzen</translation>
+    </message>
+    <message>
+        <source>Sleep</source>
+        <translation>Zu Bett</translation>
+    </message>
+    <message>
+        <source>Small</source>
+        <translation>Klein</translation>
+    </message>
+    <message>
+        <source>Show all graphs</source>
+        <translation>Alle Diagramme zeigen</translation>
+    </message>
+    <message>
+        <source>Journal</source>
+        <translation>Journal</translation>
+    </message>
+    <message>
+        <source>Reset the graph heights to uniform sizes</source>
+        <translation type="vanished">Stellen Sie die Diagramme auf eine einheitliche Höhe ein</translation>
+    </message>
+    <message>
+        <source>Position Sensor Sessions</source>
+        <translation>Position Sensor Sitzungen</translation>
+    </message>
+    <message>
+        <source>Add Bookmark</source>
+        <translation>Neues Lesezeichen</translation>
+    </message>
+    <message>
+        <source>Remove Bookmark</source>
+        <translation>Lesezeichen entfernen</translation>
+    </message>
+    <message>
+        <source>Pick a Colour</source>
+        <translation>Wählen Sie eine Farbe</translation>
+    </message>
+    <message>
+        <source>Complain to your Equipment Provider!</source>
+        <translation>Beschweren Sie sich bei Ihren Anbieter!</translation>
+    </message>
+    <message>
+        <source>Session Information</source>
+        <translation>Sitzungsinformationen</translation>
+    </message>
+    <message>
+        <source>Sessions all off!</source>
+        <translation>Alle Sitzungen schließen!</translation>
+    </message>
+    <message>
+        <source>Oximetery Sessions</source>
+        <translation>Oximetrie Sitzungen</translation>
+    </message>
+    <message>
+        <source>%1 event</source>
+        <translation>%1 Ereignis</translation>
+    </message>
+    <message>
+        <source>Go to the most recent day with data records</source>
+        <translation>Zum letzten Tag mit Datensätzen</translation>
+    </message>
+    <message>
+        <source>Machine Settings</source>
+        <translation>Geräteeinstellungen</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">Keine Diagramme an!</translation>
+    </message>
+    <message>
+        <source><b>Please Note:</b> This day just contains summary data, only limited information is available .</source>
+        <translation type="vanished"><b> Bitte beachten Sie: </ b> Dieser Tag enthält nur zusammengefasste Daten und es stehen nur begrenzte Informationen zur Verfügung.</translation>
+    </message>
+    <message>
+        <source>B.M.I.</source>
+        <translation>B.M.I.</translation>
+    </message>
+    <message>
+        <source>Sleep Stage Sessions</source>
+        <translation>Schlafstadium Sitzungen</translation>
+    </message>
+    <message>
+        <source>Oximeter Information</source>
+        <translation>Oximeter Informationen</translation>
+    </message>
+    <message>
+        <source>Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked.</source>
+        <translation type="vanished">Oximetriedaten existieren für diesen Tag, aber die Zeitstempel sindl unterschiedlich, so dass die Grafiken nicht verknüpft werden.</translation>
+    </message>
+    <message>
+        <source>Ctrl+B</source>
+        <translation>Ctrl+B</translation>
+    </message>
+    <message>
+        <source>Ctrl+I</source>
+        <translation>Ctrl+I</translation>
+    </message>
+    <message>
+        <source>Events</source>
+        <translation>Ereignisse</translation>
+    </message>
+    <message>
+        <source>CPAP Sessions</source>
+        <translation>CPAP Sitzung</translation>
+    </message>
+    <message>
+        <source>Medium</source>
+        <translation>Mittel</translation>
+    </message>
+    <message>
+        <source>Zoom fully out</source>
+        <translation type="vanished">Vergrößern voll aus</translation>
+    </message>
+    <message>
+        <source>Starts</source>
+        <translation>Startet</translation>
+    </message>
+    <message>
+        <source>Sorry, your machine only provides compliance data.</source>
+        <translation>Es tut uns leid, Ihr Gerät bietet nur Compliance-Daten.</translation>
+    </message>
+    <message>
+        <source>Weight</source>
+        <translation>Gewicht</translation>
+    </message>
+    <message>
+        <source>This bookmarked is in a currently disabled area..</source>
+        <translation>Dies ist ein mit Lesezeichen derzeit deaktivierter Bereich ..</translation>
+    </message>
+    <message>
+        <source>Zombie</source>
+        <translation>Nicht gut</translation>
+    </message>
+    <message>
+        <source>Bookmarks</source>
+        <translation>Lesezeichen</translation>
+    </message>
+    <message>
+        <source>%1 events</source>
+        <translation>%1 Ereignisse</translation>
+    </message>
+    <message>
+        <source>events</source>
+        <translation>ereignisse</translation>
+    </message>
+    <message>
+        <source>BRICK :(</source>
+        <translation>BLOCK :(</translation>
+    </message>
+    <message>
+        <source>Int. SpO2</source>
+        <translation type="vanished">Int. SpO2</translation>
+    </message>
+    <message>
+        <source>Event Breakdown</source>
+        <translation>Ereignis Pannen</translation>
+    </message>
+    <message>
+        <source>Selection AHI</source>
+        <translation type="vanished">Auswahl AHI</translation>
+    </message>
+    <message>
+        <source>SpO2 Desaturations</source>
+        <translation>SpO2 Entsättigungen</translation>
+    </message>
+    <message>
+        <source>Awesome</source>
+        <translation>Sehr gut</translation>
+    </message>
+    <message>
+        <source>Pulse Change events</source>
+        <translation>Pulsereignis ändern</translation>
+    </message>
+    <message>
+        <source>SpO2 Baseline Used</source>
+        <translation>SpO2-Baseline Gebraucht</translation>
+    </message>
+    <message>
+        <source>Zero hours??</source>
+        <translation>Null-Stunden??</translation>
+    </message>
+    <message>
+        <source>Go to the previous day</source>
+        <translation>Zum vorherigen Tag</translation>
+    </message>
+    <message>
+        <source>Drop down this list to show/hide available graphs.</source>
+        <translation>Lassen Sie sich diese Liste der Grafiken / verbergen verfügbar zeigen.</translation>
+    </message>
+    <message>
+        <source>Bookmark at %1</source>
+        <translation>Lesezeichen bei %1</translation>
+    </message>
+    <message>
+        <source>Statistics</source>
+        <translation>Statistiken</translation>
+    </message>
+    <message>
+        <source>Events/hour</source>
+        <translation type="vanished">Ereignisse/Stunde</translation>
+    </message>
+    <message>
+        <source>Breakdown</source>
+        <translation>Aufschlüsselung</translation>
+    </message>
+    <message>
+        <source>Unknown Session</source>
+        <translation>Unbekannte Sitzung</translation>
+    </message>
+    <message>
+        <source>Sessions exist for this day but are switched off.</source>
+        <translation>Sitzungen existieren heute sind aber ausgeschaltet.</translation>
+    </message>
+    <message>
+        <source>PAP Mode: %1<br/></source>
+        <translation>PAP Modus: %1<br/></translation>
+    </message>
+    <message>
+        <source>Duration</source>
+        <translation>Dauer</translation>
+    </message>
+    <message>
+        <source>View Size</source>
+        <translation>Größen</translation>
+    </message>
+    <message>
+        <source>Hide all graphs</source>
+        <translation>Ausblenden aller Diagramme</translation>
+    </message>
+    <message>
+        <source>Impossibly short session</source>
+        <translation>Sehr kurze Sitzung</translation>
+    </message>
+    <message>
+        <source>No Graphs :(</source>
+        <translation type="vanished">Keine Diagramme :(</translation>
+    </message>
+    <message>
+        <source>No %1 events are recorded this day</source>
+        <translation>Keine %1-Ereignisse werden an diesem Tag aufgezeichnet</translation>
+    </message>
+    <message>
+        <source>Show or hide the calender</source>
+        <translation>Ein / Aus Kalender</translation>
+    </message>
+    <message>
+        <source>One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.</source>
+        <translation>Eine oder mehrere Signalaufzeichnung für diese Sitzung hatte fehlerhafte Quelldaten. Einige Wellenlagerung Punkte können nicht richtig übereinstimmen.</translation>
+    </message>
+    <message>
+        <source>I'm feeling...</source>
+        <translation>Ich fühle mich ...</translation>
+    </message>
+    <message>
+        <source>No data available</source>
+        <translation type="vanished">Keine Daten vorhanden</translation>
+    </message>
+    <message>
+        <source>Go to the next day</source>
+        <translation>Gehen Sie auf den nächsten Tag</translation>
+    </message>
+    <message>
+        <source>Session Start Times</source>
+        <translation>Sitzungsstartzeit</translation>
+    </message>
+    <message>
+        <source>Session End Times</source>
+        <translation>Sitzungsendzeit</translation>
+    </message>
+    <message>
+        <source>%1%2</source>
+        <translation>%1% {1%2?}</translation>
+    </message>
+    <message>
+        <source>This day just contains summary data, only limited information is available .</source>
+        <translation>Dieser Tag enthält nur zusammengefasste Daten. Es stehen nur begrenzte Informationen zur Verfügung.</translation>
+    </message>
+    <message>
+        <source>Time over leak redline</source>
+        <translation>Zeit über Leck rote Linie</translation>
+    </message>
+    <message>
+        <source>Machine Settings Unavailable</source>
+        <translation>Geräteeinstellungen nicht verfügbar</translation>
+    </message>
+    <message>
+        <source>EPR:%1 EPR_LEVEL:%2</source>
+        <translation type="vanished">EPR:%1 EPR_LEVEL:%2</translation>
+    </message>
+    <message>
+        <source>This day has missing pressure, mode and settings data.</source>
+        <translation>An diesem Tag fehlen die Einstellungsdaten für den Druck.</translation>
+    </message>
+    <message>
+        <source>Summary Only :(</source>
+        <translation type="vanished">Nur die Zusammenfassung: (</translation>
+    </message>
+    <message>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <source>Flags:</source>
+        <translation type="vanished">Flaggen:</translation>
+    </message>
+    <message>
+        <source>Total time in apnea</source>
+        <translation>Gesamtzeit des Apnoe</translation>
+    </message>
+    <message>
+        <source>Total ramp time</source>
+        <translation>Gesamte Rampenzeit</translation>
+    </message>
+    <message>
+        <source>Time outside of ramp</source>
+        <translation>Außerhalb der Rampenzeit</translation>
+    </message>
+    <message>
+        <source>AHI excluding ramp</source>
+        <translation>AHI ohne Rampe</translation>
+    </message>
+    <message>
+        <source>Hide all events</source>
+        <translation>Alle Ereignisse einblenden</translation>
+    </message>
+    <message>
+        <source>Show all events</source>
+        <translation>Alle Ereignisse anzeigen</translation>
+    </message>
+    <message>
+        <source>Flags</source>
+        <translation type="unfinished">Flaggen</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation type="unfinished">Diagramme</translation>
+    </message>
+    <message>
+        <source>"Nothing's here!"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Bob is bored with this days lack of data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ExportCSV</name>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation>AHI</translation>
+    </message>
+    <message>
+        <source>End</source>
+        <translation>Ende</translation>
+    </message>
+    <message>
+        <source> %1%</source>
+        <translation> %1%</translation>
+    </message>
+    <message>
+        <source> Avg</source>
+        <translation> Gem</translation>
+    </message>
+    <message>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <source>End:</source>
+        <translation>Ende:</translation>
+    </message>
+    <message>
+        <source>Quick Range:</source>
+        <translation>Zeitspanne:</translation>
+    </message>
+    <message>
+        <source>Daily</source>
+        <translation>Täglich</translation>
+    </message>
+    <message>
+        <source>Event</source>
+        <translation>Ereignis</translation>
+    </message>
+    <message>
+        <source>Start</source>
+        <translation>Start</translation>
+    </message>
+    <message>
+        <source>Last Fortnight</source>
+        <translation>Letzten Vierzehn Tage</translation>
+    </message>
+    <message>
+        <source>Most Recent Day</source>
+        <translation>Neuste Tag</translation>
+    </message>
+    <message>
+        <source> Count</source>
+        <translation>Land</translation>
+    </message>
+    <message>
+        <source>Filename:</source>
+        <translation>Dateiname:</translation>
+    </message>
+    <message>
+        <source>Select file to export to</source>
+        <translation>Wählen Sie die Datei, um zu Exportieren</translation>
+    </message>
+    <message>
+        <source>Resolution:</source>
+        <translation>Auflösung:</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation>Aufheben</translation>
+    </message>
+    <message>
+        <source>Dates:</source>
+        <translation>Termine:</translation>
+    </message>
+    <message>
+        <source>Custom</source>
+        <translation>In Gebrauch</translation>
+    </message>
+    <message>
+        <source>Export</source>
+        <translation>Export</translation>
+    </message>
+    <message>
+        <source>Start:</source>
+        <translation>Start:</translation>
+    </message>
+    <message>
+        <source>Data/Duration</source>
+        <translation>Daten / Dauer</translation>
+    </message>
+    <message>
+        <source>CSV Files (*.csv)</source>
+        <translation>CSV Dateien (*.csv)</translation>
+    </message>
+    <message>
+        <source>Last Month</source>
+        <translation>Letzter Monat</translation>
+    </message>
+    <message>
+        <source>SleepyHead_</source>
+        <translation>SleepyHead_</translation>
+    </message>
+    <message>
+        <source>Last 6 Months</source>
+        <translation>Letzten 6 Monate</translation>
+    </message>
+    <message>
+        <source>Total Time</source>
+        <translation>Gesamte Zeit</translation>
+    </message>
+    <message>
+        <source>DateTime</source>
+        <translation>Datum-Zeit</translation>
+    </message>
+    <message>
+        <source>Session Count</source>
+        <translation>Sitzungs Anzahl</translation>
+    </message>
+    <message>
+        <source>Session</source>
+        <translation>Sitzung</translation>
+    </message>
+    <message>
+        <source>Everything</source>
+        <translation>Alles</translation>
+    </message>
+    <message>
+        <source>Last Week</source>
+        <translation>Letzte Woche</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation>Letztes Jahr</translation>
+    </message>
+    <message>
+        <source>Export as CSV</source>
+        <translation>Export in CSV Datei</translation>
+    </message>
+    <message>
+        <source>Sessions_</source>
+        <translation>Sitzungen_</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation>Details</translation>
+    </message>
+    <message>
+        <source>Summary_</source>
+        <translation>Zusammenfassung_</translation>
+    </message>
+    <message>
+        <source>Details_</source>
+        <translation>Details_</translation>
+    </message>
+    <message>
+        <source>Sessions</source>
+        <translation>Sitzungen</translation>
+    </message>
+</context>
+<context>
+    <name>FPIconLoader</name>
+    <message>
+        <source>Import Error</source>
+        <translation>Import Fehler</translation>
+    </message>
+    <message>
+        <source>This Machine Record cannot be imported in this profile.</source>
+        <translation>Dieser Geräte-Datensatz kann in diesem Profil nicht importiert werden.</translation>
+    </message>
+    <message>
+        <source>The Day records overlap with already existing content.</source>
+        <translation>Die Aufzeichnungen dieses Tages überschneiden sich mit bereits vorhandenen Inhalt.</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <source>-</source>
+        <translation>-</translation>
+    </message>
+    <message>
+        <source>F4</source>
+        <translation>F4</translation>
+    </message>
+    <message>
+        <source>F5</source>
+        <translation>F5</translation>
+    </message>
+    <message>
+        <source>F6</source>
+        <translation>F6</translation>
+    </message>
+    <message>
+        <source>F7</source>
+        <translation>F7</translation>
+    </message>
+    <message>
+        <source>F8</source>
+        <translation>F8</translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>F11</source>
+        <translation>F11</translation>
+    </message>
+    <message>
+        <source>F12</source>
+        <translation>F12</translation>
+    </message>
+    <message>
+        <source>Yes</source>
+        <translation type="vanished">Ja</translation>
+    </message>
+    <message>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <source>Gah!</source>
+        <translation>Bah!</translation>
+    </message>
+    <message>
+        <source>Help</source>
+        <translation>Hilfe</translation>
+    </message>
+    <message>
+        <source>CPAP data was recently purged and needs to be re-imported.</source>
+        <translation type="vanished">CPAP-Daten wurden kürzlich gereinigt und mussen neu importiert werden.</translation>
+    </message>
+    <message>
+        <source>DISCLAIMER:</source>
+        <translation>HAFTUNGSAUSSCHLUSS:</translation>
+    </message>
+    <message>
+        <source>About SleepyHead</source>
+        <translation>Über SleepyHead</translation>
+    </message>
+    <message>
+        <source>&Data</source>
+        <translation>&Daten</translation>
+    </message>
+    <message>
+        <source>&File</source>
+        <translation>&Datei</translation>
+    </message>
+    <message>
+        <source>&Help</source>
+        <translation>&Hilfe</translation>
+    </message>
+    <message>
+        <source>&View</source>
+        <translation>&Ansicht</translation>
+    </message>
+    <message>
+        <source>There was a problem opening Somnopose Data File: </source>
+        <translation>Es gab ein Problem beim Öffnen CSV Datendatei:</translation>
+    </message>
+    <message>
+        <source>&About SleepyHead</source>
+        <translation>&Über SleepyHead</translation>
+    </message>
+    <message>
+        <source>E&xit</source>
+        <translation>&Schließen</translation>
+    </message>
+    <message>
+        <source>Daily</source>
+        <translation>Täglich</translation>
+    </message>
+    <message>
+        <source>Note:</source>
+        <translation>Hinweis:</translation>
+    </message>
+    <message>
+        <source>Import &ZEO Data</source>
+        <translation>Import &ZEO Daten</translation>
+    </message>
+    <message>
+        <source>Copyright:</source>
+        <translation>Urheberrecht:</translation>
+    </message>
+    <message>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, and Sean Stangl.</source>
+        <translation type="vanished">James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99 und Sean Stangl.</translation>
+    </message>
+    <message>
+        <source>MSeries Import complete</source>
+        <translation>M-Serie komplett Importiert</translation>
+    </message>
+    <message>
+        <source>There was an error saving screenshot to file "%1"</source>
+        <translation>Es gab einen Fehler beim Speichern Screenshot in Datei "%1"</translation>
+    </message>
+    <message>
+        <source>This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.</source>
+        <translation>Diese Software wurde entwickelt, um Ihnen bei der Überprüfung der von CPAP-Geräten produzierten Daten, in der Behandlung von verschiedenen Schlafstörungen zu helfen.</translation>
+    </message>
+    <message>
+        <source>Importing Data</source>
+        <translation>Importieren von Daten</translation>
+    </message>
+    <message>
+        <source>No CPAP data card detected, launching file dialog...</source>
+        <translation>Kein CPAP-Datenkarte erkannt, Dateidialog starten ...</translation>
+    </message>
+    <message>
+        <source>Select another folder</source>
+        <translation type="vanished">Wählen Sie einen anderen</translation>
+    </message>
+    <message>
+        <source>Online Users &Guide</source>
+        <translation>Online &Handbuch</translation>
+    </message>
+    <message>
+        <source>The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.</source>
+        <translation>Der Autor kann nicht von Nutzern, die sich selbst oder Andere durch den Gebrauch oder Missbrauch dieser Software schaden, haftbar gemacht werden.</translation>
+    </message>
+    <message>
+        <source>Please wait, launching file dialog...</source>
+        <translation>Bitte warten, Dialog-Datein starten ...</translation>
+    </message>
+    <message>
+        <source>View O&ximetry</source>
+        <translation type="vanished">&Oximetrieansicht</translation>
+    </message>
+    <message>
+        <source>Online Help Resources</source>
+        <translation>Online Hilfe</translation>
+    </message>
+    <message>
+        <source>View &Welcome</source>
+        <translation>&Willkommensansicht</translation>
+    </message>
+    <message>
+        <source>Currenly supported machines:</source>
+        <translation>Currenly unterstützte Geräte:</translation>
+    </message>
+    <message>
+        <source>Loading Data</source>
+        <translation>Lade Daten</translation>
+    </message>
+    <message>
+        <source>This software comes with absolutely no warranty, either express of implied.</source>
+        <translation>Diese Software arbeitet ausdrücklich ohne Garantie.</translation>
+    </message>
+    <message>
+        <source>There was a problem opening MSeries block File: </source>
+        <translation>Es gab ein Problem beim Öffnen von M-Serie Block-Datei:</translation>
+    </message>
+    <message>
+        <source><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</source>
+        <translation><a href='http://www.apneuvereniging.nl/forum'>ApneuVereinigung</a>,</translation>
+    </message>
+    <message>
+        <source>SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>.</source>
+        <translation>SleepyHead ist mit der <a href="http://qt-project.org"> Qt Application Framework </ a> erstellt.</translation>
+    </message>
+    <message>
+        <source>Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters</source>
+        <translation>Contec CMS50D +, CMS50E und CMS50F (nicht 50FW) Pulsoximeter</translation>
+    </message>
+    <message>
+        <source>Kudos & Credits</source>
+        <translation>Lob & Dank</translation>
+    </message>
+    <message>
+        <source>Recalculations are complete, the application now needs to restart to display the changes.</source>
+        <translation>Warten Sie bis die Rückrechnungen abgeschlossen sind, Anwendung jetzt neu zu starten, um die Änderungen anzuzeigen.</translation>
+    </message>
+    <message>
+        <source>Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)</source>
+        <translation>Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV-Modelle)</translation>
+    </message>
+    <message>
+        <source>&copy;2011-2014</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Build Date</source>
+        <translation type="vanished">Herstellungsdatum</translation>
+    </message>
+    <message>
+        <source>Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt</source>
+        <translation>Bitte um einen Wiederaufbau von SleepyHead mit Qt 4.8.5 oder höher, das Drucken verursacht einen Absturz mit dieser Version von Qt</translation>
+    </message>
+    <message>
+        <source>Philips Respironics System One (CPAP, Auto, BiPAP & ASV models)</source>
+        <translation type="vanished">Philips Respironics System One (CPAP, AutoPAP, BiPAP & ASV Modelle)</translation>
+    </message>
+    <message>
+        <source>&About</source>
+        <translation>&Schließen</translation>
+    </message>
+    <message>
+        <source>Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</source>
+        <translation>Vergessen Sie nicht, auf <a href="http://www.facebook.com/SleepyHeadCPAP"> Facebook </ a> oder <a href mag / +1 SleepyHead = "http://plus.google.com/ u/0/b/101426655252362287937 "> Google+</translation>
+    </message>
+    <message>
+        <source>&Link Graph Groups</source>
+        <translation>&Link-Diagramm Gruppen</translation>
+    </message>
+    <message>
+        <source>Further Information</source>
+        <translation>Weitere Informationen</translation>
+    </message>
+    <message>
+        <source>View &Daily</source>
+        <translation>&Tagesansicht</translation>
+    </message>
+    <message>
+        <source>View &Overview</source>
+        <translation>&Übersichtsansicht</translation>
+    </message>
+    <message>
+        <source>Import Problem
+
+Couldn't find any new Machine Data at the locations given</source>
+        <translation type="vanished">Import Problem
+
+Konnte keine neuen Gerätedaten an diesem Standorten finden</translation>
+    </message>
+    <message>
+        <source>Access to Preferences has been blocked until recalculation completes.</source>
+        <translation>Zugriff auf Einstellungen wurde blockiert, bis die Neuberechnung abgeschlossen ist.</translation>
+    </message>
+    <message>
+        <source>Import RemStar &MSeries Data</source>
+        <translation>Import REMSTAR & M-Serie Daten</translation>
+    </message>
+    <message>
+        <source>Loading</source>
+        <translation>Laden</translation>
+    </message>
+    <message>
+        <source>&Help Browser</source>
+        <translation>&Browser  Hilfe</translation>
+    </message>
+    <message>
+        <source>Got a neat idea on how to improve SleepyHead? Check out SleepyHeads <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">Idea Torrent</a></source>
+        <translation type="vanished">Haben Sie eine gute Idee, wie man SleepyHead verbessern kann? Schauen Sie unter SleepyHead <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/"> Idea Torrent </ a></translation>
+    </message>
+    <message>
+        <source>Do you have a CMS50[x] Oximeter?
+One is required to use this section.</source>
+        <translation type="vanished">Haben Sie eine CMS50 [x] Oximeter?
+Eines ist erforderlich, um diesen Abschnitt zu verwenden.</translation>
+    </message>
+    <message>
+        <source>&Current Selected Day</source>
+        <translation type="vanished">&Daten des ausgewählten Tages</translation>
+    </message>
+    <message>
+        <source>Change &User</source>
+        <translation>&Benutzer ändern</translation>
+    </message>
+    <message>
+        <source>All data for current CPAP machine</source>
+        <translation>Alle Daten für das aktuelle CPAP-Gerät</translation>
+    </message>
+    <message>
+        <source>In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.</source>
+        <translation>In dem Update-Code, verwendet Sleepyhead <a href="http://sourceforge.net/projects/quazip"> QuaZip </ a> von Sergey A. Tachenov, die eine C + +-Wrapper über Gilles Vollant die PLZ / UNZIP Paket ist.</translation>
+    </message>
+    <message>
+        <source>Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users.</source>
+        <translation>Plus ein paar <a href='qrc:/docs/usage.html'> Verwendungshinweise </ a>, und einige wichtige Informationen für Mac-Nutzer.</translation>
+    </message>
+    <message>
+        <source>Friendly forums to talk and learn about Sleep Apnea:</source>
+        <translation>Bitte sprechen Sie freundlich in den Foren um mehr über SleepyHead zu erfahren:</translation>
+    </message>
+    <message>
+        <source>Please wait, scanning for CPAP data cards...</source>
+        <translation>Bitte warten, Scannen von CPAP-Datenkarten ...</translation>
+    </message>
+    <message>
+        <source>View S&tatistics</source>
+        <translation>Statistik &anzeigen</translation>
+    </message>
+    <message>
+        <source>Monthly</source>
+        <translation>Monatlich</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="vanished">Schließen</translation>
+    </message>
+    <message>
+        <source>Change &Language</source>
+        <translation>&Sprache auswählen</translation>
+    </message>
+    <message>
+        <source>This software is released under the GNU Public License v3.0<br/></source>
+        <translation>Diese Software wird unter der GNU Public Lizenz v3.0 veröffentlicht <br/></translation>
+    </message>
+    <message>
+        <source>Loading Event Data</source>
+        <translation>Lade Ereignisdaten</translation>
+    </message>
+    <message>
+        <source>SleepyHead's Online <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation type="vanished">SleepyHead`s Online <a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></translation>
+    </message>
+    <message>
+        <source>No guarantees are made regarding the accuracy of any data this program displays.</source>
+        <translation>Bezüglich der Genauigkeit der Daten übernehmen wir keine Garantie.</translation>
+    </message>
+    <message>
+        <source>It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module.</source>
+        <translation type="vanished">Es nutzt die Cross-Plattform <a href="http://code.google.com/p/qextserialport"> QExtSerialPort </ a>-Bibliothek für Zugriff auf serielle Ports in dem Pulsoximetrie-Modul.</translation>
+    </message>
+    <message>
+        <source>Import</source>
+        <translation>Import</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:
+
+</source>
+        <translation type="vanished">Sind Sie sicher, dass Sie alle CPAP-Daten für das folgenden Gerät reinigen wollen:</translation>
+    </message>
+    <message>
+        <source>The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation>Der Autor und alle Mitwirkenden übernehmen keinerlei Verantwortung für Schäden, Probleme aus der Nutzung oder falschen Verwendung dieser Software.</translation>
+    </message>
+    <message>
+        <source>It comes with no guarantee of fitness for any particular purpose.</source>
+        <translation>Ohne Garantie.</translation>
+    </message>
+    <message>
+        <source>Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="vanished">Besonderen Dank an Pugsy von <a href='http://cpaptalk.com'> CPAPTalk </ a> für ihre Hilfe mit Dokumentation und Tutorials, sowie alle, die sich durch die Prüfung geholfen und teilen ihre CPAP-Daten.</translation>
+    </message>
+    <message>
+        <source>Would you like this done automatically from the Backup Folder?</source>
+        <translation type="vanished">Möchten Sie diesen Import Standort für das nächste Mal merken?</translation>
+    </message>
+    <message>
+        <source>Please wait, importing from backup folder(s)...</source>
+        <translation>Bitte warten, Import von Backup-Ordner (n) ...</translation>
+    </message>
+    <message>
+        <source>Welcome to SleepyHead</source>
+        <translation>Willkommen bei SleepyHead</translation>
+    </message>
+    <message>
+        <source>SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.</source>
+        <translation>SleepyHead wurde durch einen Software-Entwickler mit persönlichen Erfahrungen mit einer Schlafstörung entwickelt und durch das Feedback vieler anderer Tester, die sich mit ähnlichen Bedingungen auseinandersetzen müssen.</translation>
+    </message>
+    <message>
+        <source>Restart Required</source>
+        <translation>Neustart erforderlich</translation>
+    </message>
+    <message>
+        <source>ResMed S9 Oximeter Attachment</source>
+        <translation>ResMed S9 Oxymeter Adapter</translation>
+    </message>
+    <message>
+        <source>&Bookmarks</source>
+        <translation type="vanished">&Lesezeichen</translation>
+    </message>
+    <message>
+        <source>Right &Sidebar</source>
+        <translation>&Seitenleiste rechts</translation>
+    </message>
+    <message>
+        <source>This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.</source>
+        <translation>Dies ist KEINE medizinische Software, es ist nur ein Recherche-Tool, welches eine visuelle Interpretation der Daten, welche von unterstützten Geräten aufgezeichnet wird, bietet.</translation>
+    </message>
+    <message>
+        <source>Click here to choose a folder</source>
+        <translation type="vanished">Klicken Sie hier, um einen Ordner zu wählen,</translation>
+    </message>
+    <message>
+        <source>&Rebuild Oximetry Indices</source>
+        <translation type="vanished">&Wiederaufbau Oximeter-Indizes</translation>
+    </message>
+    <message>
+        <source>branch</source>
+        <translation>Zweig</translation>
+    </message>
+    <message>
+        <source>Translators:</source>
+        <translation>Übersetzer:</translation>
+    </message>
+    <message>
+        <source>Profile</source>
+        <translation>Profile</translation>
+    </message>
+    <message>
+        <source>View Statistics</source>
+        <translation>Statistiken anzeigen</translation>
+    </message>
+    <message>
+        <source>CPAP Data Located</source>
+        <translation>CPAP-Daten liegen an</translation>
+    </message>
+    <message>
+        <source>Access to Import has been blocked while recalculations are in progress.</source>
+        <translation>Der Zugang zu Import wurde blockiert, während Neuberechnungen im Gange sind.</translation>
+    </message>
+    <message>
+        <source>Sleep Disorder Terms &Glossary</source>
+        <translation>&Schlafstörungen Nutzungswörterbuch</translation>
+    </message>
+    <message>
+        <source>This is a beta release, some features may not yet behave as expected.</source>
+        <translation>Dies ist eine Beta-Version und einige Funktionen funktionieren noch nicht wie erwartet.</translation>
+    </message>
+    <message>
+        <source>Copyright</source>
+        <translation>Urheberrechte</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation>Leere Seite</translation>
+    </message>
+    <message>
+        <source>SleepyHead Project Page</source>
+        <translation>SleepyHead-Projekt-Seite</translation>
+    </message>
+    <message>
+        <source>*** <u>Use at your own risk</u> ***</source>
+        <translation>*** <u> Benutzung auf eigene Gefahr </ u> ***</translation>
+    </message>
+    <message>
+        <source>&Records</source>
+        <translation type="vanished">&Datensätze</translation>
+    </message>
+    <message>
+        <source>Use &AntiAliasing</source>
+        <translation>Verwenden Sie &Antialiasing</translation>
+    </message>
+    <message>
+        <source>I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.</source>
+        <translation>Ich empfehle, nicht mit diesem Browser zu Surfen. Es wird funktionieren, aber er ist vor allem als Hilfe-Browser gedacht.</translation>
+    </message>
+    <message>
+        <source>About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia</source>
+        <translation>Über <a href='http://en.wikipedia.org/wiki/Sleep_apnea'> Schlafapnoe </ a> auf Wikipedia</translation>
+    </message>
+    <message>
+        <source>This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.</source>
+        <translation>Dies ist <font color='red'> <u> KEINE </ u> </ font> medizinische Software. Diese Anwendung ist nur ein Daten-Viewer und keine Garantie hinsichtlich der Genauigkeit oder Richtigkeit von Berechnungen oder Daten, die angezeigt werden.</translation>
+    </message>
+    <message>
+        <source>Somnopause Data Import complete</source>
+        <translation>Somnopause Data Import abgeschlossen</translation>
+    </message>
+    <message>
+        <source>Report Mode</source>
+        <translation>Report Modus</translation>
+    </message>
+    <message>
+        <source>Bugfixes, Patches and Platform Help:</source>
+        <translation>Fehlerbehebung, Patches und Platform-Hilfe:</translation>
+    </message>
+    <message>
+        <source><a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation type="vanished"><a href="http://sourceforge.net/apps/mediawiki/sleepyhead/index.php?title=Glossary"> Glossar der Schlafstörung Bedingungen </ a> <br/></translation>
+    </message>
+    <message>
+        <source>&Profiles</source>
+        <translation>&Profile</translation>
+    </message>
+    <message>
+        <source>DeVilbiss Intellipap (Auto)</source>
+        <translation>DeVilbiss Intellipap (Auto)</translation>
+    </message>
+    <message>
+        <source>SleepyHead, brought to you by Jedimark</source>
+        <translation>SleepyHead, entwickelt von Jedimark</translation>
+    </message>
+    <message>
+        <source>Use this software entirely at your own risk.</source>
+        <translation>Benutzen Sie diese Software auf eigenes Risiko.</translation>
+    </message>
+    <message>
+        <source>Printing Disabled</source>
+        <translation>Drucken abschalten</translation>
+    </message>
+    <message>
+        <source>Standard</source>
+        <translation>Standard</translation>
+    </message>
+    <message>
+        <source>There was a problem opening ZEO File: </source>
+        <translation>Es gab ein Problem beim Öffnen der ZEO Datei:</translation>
+    </message>
+    <message>
+        <source>Loading...</source>
+        <translation>Laden...</translation>
+    </message>
+    <message>
+        <source>CPAP Datacard structures were detected at the following locations:</source>
+        <translation type="vanished">CPAP Datacard Strukturen wurden an folgenden Orten festgestellt:</translation>
+    </message>
+    <message>
+        <source>Statistics</source>
+        <translation>Statistiken</translation>
+    </message>
+    <message>
+        <source>&Statistics</source>
+        <translation>&Statistiken</translation>
+    </message>
+    <message>
+        <source>Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder.</source>
+        <translation>Bitte denken Sie daran, den Import vom Stammordner oder Laufwerkbuchstaben der Datenkarte durchzuführen, und nicht auf einem Unterordner verweisen.</translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here.</source>
+        <translation type="vanished">Arie Klerk (Dutch), Steffen Reitz (Deutsch), und Andere, die ich noch hier hinzufügen werde.</translation>
+    </message>
+    <message>
+        <source>Ctrl+Tab</source>
+        <translation>Ctrl+Tab</translation>
+    </message>
+    <message>
+        <source>&Support SleepyHead Development</source>
+        <translation>SleepyHead Entwicklung & Support</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html></source>
+        <translation><html> <head/> <body> <p> <span style=" font-weight:600;"> Achtung: </ span> Das ist eine Pre-Release-Software. Einige Teile dieses Programms können noch nicht, wie vorgesehen, funktionieren . </ p> </ body> </ html></translation>
+    </message>
+    <message>
+        <source>3rd Party Libaries:</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>ResMed S9 models (CPAP, Auto, VPAP)</source>
+        <translation>ResMed S9 Modellen (CPAP, AutoPAP, VPAP)</translation>
+    </message>
+    <message>
+        <source>Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.</source>
+        <translation>Ihr Arzt sollte Ihre erste und einzige Quelle der Führung über die wichtige Frage der Verwaltung Ihrer Gesundheit  sein.</translation>
+    </message>
+    <message>
+        <source>&Advanced</source>
+        <translation>&Fortgeschrittene</translation>
+    </message>
+    <message>
+        <source>Zeo CSV Import complete</source>
+        <translation>Zeo CSV Import abgeschlossen</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">Frage</translation>
+    </message>
+    <message>
+        <source>&Import Data</source>
+        <translation>&Daten Importieren</translation>
+    </message>
+    <message>
+        <source>Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version.</source>
+        <translation>Hier sind die <a href='qrc:/docs/release_notes.html'> Release Notes </ a> für diese Version.</translation>
+    </message>
+    <message>
+        <source>This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.</source>
+        <translation>Diese Software ist NICHT geeignet für die medizinische Diagnostik, CPAP complaince Berichterstattung und ähnliche Zwecke..</translation>
+    </message>
+    <message>
+        <source>Print &Report</source>
+        <translation>&Drucken</translation>
+    </message>
+    <message>
+        <source>&Reset Graph Layout</source>
+        <translation>&Zurücksetzen der Diagrammansicht</translation>
+    </message>
+    <message>
+        <source>Performance will be degraded during these recalculations.</source>
+        <translation>Die Leistung wird in diesen Neuberechnungen abgebaut werden.</translation>
+    </message>
+    <message>
+        <source>This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>.</source>
+        <translation>Diese Software ist frei unter der <a href="qrc:/COPYING"> GNU Public Lizenz </ a> veröffentlicht.</translation>
+    </message>
+    <message>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <source>If you can read this, the restart command didn't work. Your going to have to do it yourself manually.</source>
+        <translation>Wenn Sie dies lesen können, zählt der Befehl Neustart nicht. manuell Neustarten.</translation>
+    </message>
+    <message>
+        <source>SleepyHead Wiki</source>
+        <translation>SleepyHead Wiki</translation>
+    </message>
+    <message>
+        <source>Take &Screenshot</source>
+        <translation>&Bildschirmverwaltung</translation>
+    </message>
+    <message>
+        <source>Overview</source>
+        <translation>Übersicht</translation>
+    </message>
+    <message>
+        <source>Exp&ort</source>
+        <translation type="vanished">&Exportieren</translation>
+    </message>
+    <message>
+        <source>Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.</source>
+        <translation>Vielen Dank für die Verwendung von SleepyHead. Wenn Sie innerhalb Ihrer Mittel Ressourcen finden, beachten Sie bitte die Förderung zukünftiger Entwicklung durch eine Spende über PayPal.</translation>
+    </message>
+    <message>
+        <source>Show Debug Pane</source>
+        <translation>Debug-Fenster anzeigen</translation>
+    </message>
+    <message>
+        <source>Revision:</source>
+        <translation>Überprüfung:</translation>
+    </message>
+    <message>
+        <source>Task Completed</source>
+        <translation>Erledigt</translation>
+    </message>
+    <message>
+        <source>&Edit Profile</source>
+        <translation>&Profil bearbeiten</translation>
+    </message>
+    <message>
+        <source>Import Reminder</source>
+        <translation>Import Erinnerung</translation>
+    </message>
+    <message>
+        <source>Recalculations are now complete.</source>
+        <translation>Neuberechnungen sind nun abgeschlossen.</translation>
+    </message>
+    <message>
+        <source>Welcome</source>
+        <translation>Willkommen</translation>
+    </message>
+    <message>
+        <source>Import &Somnopose Data</source>
+        <translation>Import & CSV Daten</translation>
+    </message>
+    <message>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone.</source>
+        <translation type="vanished">James Marshall, Reich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Schlaufen, manders99, Sean Stangl und Roy Stone.</translation>
+    </message>
+    <message>
+        <source>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/></source>
+        <translation>SleepyHead ist <a href='http://www.sourceforge.net/projects/sleepyhead'> Projekt-Website </ a> auf Sourceforge <br/></translation>
+    </message>
+    <message>
+        <source>Check for &Updates</source>
+        <translation>Suche nach &Updates</translation>
+    </message>
+    <message>
+        <source>Screenshot saved to file "%1"</source>
+        <translation>Screenshot Datei gespeichert "%1"</translation>
+    </message>
+    <message>
+        <source>&Preferences</source>
+        <translation>&Einstellungen</translation>
+    </message>
+    <message>
+        <source>Fisher & Paykel ICON (CPAP, Auto)</source>
+        <translation>Fisher & Paykel ICON (CPAP, Auto)</translation>
+    </message>
+    <message>
+        <source>Recalculating Summaries</source>
+        <translation>Neuberechnung Zusammenfassungen</translation>
+    </message>
+    <message>
+        <source>&Fullscreen Toggle</source>
+        <translation>&Vollbild umschalten</translation>
+    </message>
+    <message>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation>Bitte melden Sie alle Fehler, die Sie finden, auf der SleepyHead Sourceforge-Seite.</translation>
+    </message>
+    <message>
+        <source>&Frequently Asked Questions</source>
+        <translation>&Häufig gestellte Fragen</translation>
+    </message>
+    <message>
+        <source>&Purge CPAP Data</source>
+        <translation type="vanished">&Säuberung der CPAP Daten</translation>
+    </message>
+    <message>
+        <source>qrc:/docs/index.html</source>
+        <translation>qrc:/docs/index.html</translation>
+    </message>
+    <message>
+        <source>Shift+F2</source>
+        <translation>Shift+F2</translation>
+    </message>
+    <message>
+        <source>Oximetry</source>
+        <translation>Oxymetrie</translation>
+    </message>
+    <message>
+        <source>Please wait, SleepyHead is importing data...</source>
+        <translation type="vanished">Bitte warten, SleepyHead ist beim Importieren von Daten ...</translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz (German).</source>
+        <translation type="vanished">Arie Klerk (Dutch), Steffen Reitz (Deutsch).</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations
+
+</source>
+        <translation type="vanished">Die Daten wurden erfolgreich von folgenden Orten importiert
+
+</translation>
+    </message>
+    <message>
+        <source>Recalculating Indices</source>
+        <translation>Neuberechnung der Indizes</translation>
+    </message>
+    <message>
+        <source><a href='http://s7.zetaboards.com/Apnea_Board/index'>Apnea Board</a></source>
+        <translation type="vanished"><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</translation>
+    </message>
+    <message>
+        <source>(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)</source>
+        <translation>(Das Programm unterstützt keine SSL-Verschlüsselung, so dass es keine gute Idee ist, Ihre Passwörter oder persönliche Daten irgendwo einzugeben.)</translation>
+    </message>
+    <message>
+        <source>Data Folder Location</source>
+        <translation type="vanished">Datenordner Standort</translation>
+    </message>
+    <message>
+        <source>Change &Data Folder</source>
+        <translation>&Datenordner ändern</translation>
+    </message>
+    <message>
+        <source>License:</source>
+        <translation>Lizenz:</translation>
+    </message>
+    <message>
+        <source>&Navigation</source>
+        <translation type="vanished">&Navigation</translation>
+    </message>
+    <message>
+        <source>Are you sure?</source>
+        <translation type="vanished">Sind Sie sicher?</translation>
+    </message>
+    <message>
+        <source>Date Range</source>
+        <translation>Datumsbereich</translation>
+    </message>
+    <message>
+        <source>Purge Oximetery Data</source>
+        <translation>Bereinigen der Oximetrie Daten</translation>
+    </message>
+    <message>
+        <source>Purge &Current Selected Day</source>
+        <translation>Bereinigen & aktualisieren des aktuell ausgewählten Tages</translation>
+    </message>
+    <message>
+        <source>Current Days</source>
+        <translation>Aktuelle Tage</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations:</source>
+        <translation type="vanished">Die Daten wurden erfolgreich von folgenden Orten importiert:</translation>
+    </message>
+    <message>
+        <source>Couldn't find any new Machine Data at the locations given.</source>
+        <translation type="vanished">Es konnten keine neuen Gerätedaten an den Standorten gefunden werden.</translation>
+    </message>
+    <message>
+        <source>Import Problem</source>
+        <translation>Importproblem</translation>
+    </message>
+    <message>
+        <source>Build Date: %1 %2</source>
+        <translation>Erstellungsdatum: %1 %2</translation>
+    </message>
+    <message>
+        <source>Graphics Engine: %1</source>
+        <translation>Grafikfunktion: %1</translation>
+    </message>
+    <message>
+        <source>Data Folder Location: %1</source>
+        <translation type="vanished">Datenordner Stanort: %1</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:</source>
+        <translation type="vanished">Sind Sie sicher, dass Sie alle CPAP-Daten für das folgenden Gerät reinigen wollen:</translation>
+    </message>
+    <message>
+        <source>Not all session data could be removed, you have to delete the following folder manually.</source>
+        <translation type="vanished">Da nicht alle Sitzungs-Daten entfernt werden konnten, müssen Sie den folgenden Ordner manuell löschen.</translation>
+    </message>
+    <message>
+        <source>Machine data has been successfully purged.</source>
+        <translation type="vanished">Gerätedaten wurden erfolgreich gelöscht.</translation>
+    </message>
+    <message>
+        <source>Would you like to reimport from the backup folder?</source>
+        <translation type="vanished">Möchten Sie aus dem Backup-Ordner importieren?</translation>
+    </message>
+    <message>
+        <source>Please wait, importing...</source>
+        <translation type="vanished">Bitte warten Sie, bis der Import abgeschlossen ist...</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to delete oximetry data for %1</source>
+        <translation>Sind Sie sicher, dass Sie die Oximetriedaten löschen möchten %1</translation>
+    </message>
+    <message>
+        <source><b>Please be aware you can not undo this operation!</b></source>
+        <translation><b>Bitte beachten Sie, dass Sie diesen Vorgang nicht rückgängig machen können!</b></translation>
+    </message>
+    <message>
+        <source>Select the day with valid oximetry data in daily view first.</source>
+        <translation>Wählen Sie den Tag mit gültigen Oximetriedaten in der täglichen Ansicht zuerst.</translation>
+    </message>
+    <message>
+        <source>Exit</source>
+        <translation>Ausgang</translation>
+    </message>
+    <message>
+        <source>O&ximetry Wizard</source>
+        <translation>O&ximetrie Assistent</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum.</source>
+        <translation type="vanished"><b> Achtung: </ b> Diese Pre-Release-Build ist nur für Beta-Tester gedacht. Bitte <b> NICHT </ b> Aktien außerhalb des SleepyHead Testing Forums.</translation>
+    </message>
+    <message>
+        <source>Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version.</source>
+        <translation type="vanished">Bitte melden Sie Fehler für diesen Build auf dem SleepyHead Testing Forum, überprüfen Sie aber zuerst die Release Thread, um sicherzustellen, dass Sie die aktuellste Version verwenden.</translation>
+    </message>
+    <message>
+        <source>When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.</source>
+        <translation>Wenn Sie Fehler melden, stellen Sie bitte sicher, dass Sie die SleepyHead Versionsnummer, Betriebssystem Details und CPAP-Geräte-Modelldaten angeben.</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes.</source>
+        <translation type="vanished"><b> Achtung: </ b> Die Berichte die die Software erzeugt sind nicht für die Einhaltung oder medizinische Diagnosezwecke geeignet.</translation>
+    </message>
+    <message>
+        <source>These messages are only a temporary feature. Some people thought they were an error.</source>
+        <translation type="vanished">Diese Meldungen sind nur einer temporären Funktion zugeordnet. Einige Nutzer dachten, dass die Meldungen Fehler waren.</translation>
+    </message>
+    <message>
+        <source>Choose a folder</source>
+        <translation>Wählen Sie einen Ordner</translation>
+    </message>
+    <message>
+        <source>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Benutzerhandbuch</a><br/></translation>
+    </message>
+    <message>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Häufig gestellte Fragen</a><br/></translation>
+    </message>
+    <message>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossar der Schlafstörung AGB</a><br/></translation>
+    </message>
+    <message>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></translation>
+    </message>
+    <message>
+        <source><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></source>
+        <translation><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></translation>
+    </message>
+    <message>
+        <source>Toggle &Line Cursor</source>
+        <translation>Knie & Linien Pfeiltasten</translation>
+    </message>
+    <message>
+        <source>Ctrl+S</source>
+        <translation type="vanished">Ctrl+S</translation>
+    </message>
+    <message>
+        <source>Rebuild CPAP Data</source>
+        <translation>Wiederaufbau der CPAP Daten</translation>
+    </message>
+    <message>
+        <source>&Automatic Oximetry Cleanup</source>
+        <translation>&Automatische Bereinigung der Oxymetrie</translation>
+    </message>
+    <message>
+        <source>Foo</source>
+        <translation type="vanished">Foo</translation>
+    </message>
+    <message>
+        <source>Please insert your CPAP data card...</source>
+        <translation>Bitte benutzen Sie Ihre CPAP-Datenkarte ...</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to rebuild all CPAP data for the following machine:</source>
+        <translation>Sind Sie sicher, dass Sie alle CPAP Daten für das folgende Gerät neu erstellen möchten:</translation>
+    </message>
+    <message>
+        <source>Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way.</source>
+        <translation>Bitte beachten Sie, dass dies zu einem Verlust der Daten führen kann, wenn die interne Sicherungen von SleepyHead deaktiviert ist.</translation>
+    </message>
+    <message>
+        <source>For some reason, SleepyHead does not have internal backups for the following machine:</source>
+        <translation>Aus irgendeinem Grund hat SleepyHead keine interne Sicherungen für folgendes Gerät:</translation>
+    </message>
+    <message>
+        <source>Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.</source>
+        <translation>Vorausgesetzt, Sie haben <i> <b> eigene </ b> Backups für ALLE Ihre CPAP-Daten </ i>, die Sie noch vervollständigen können erstellt. Aber Sie müssen die Backups manuell wiederherstellen.</translation>
+    </message>
+    <message>
+        <source>Are you really sure you want to do this?</source>
+        <translation>Sind Sie wirklich sicher, dass Sie das tun wollen?</translation>
+    </message>
+    <message>
+        <source>A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:</source>
+        <translation>Ein Datenberechtigungsfehler ist aufgetreten. Sie müssen den Ordner selbst löschen:</translation>
+    </message>
+    <message>
+        <source>Because there are no internal backups to rebuild from, you will have to restore from your own.</source>
+        <translation>Es existiert keine interne Datensicherung. Sie müssen Ihre eigene verwenden.</translation>
+    </message>
+    <message>
+        <source>Would you like to import from your own backups now? (you will have no data visible for this machine until you do)</source>
+        <translation>Möchten Sie jetzt Ihr eigenes Backup importieren? (Es wird nichts angezeigt bevor Sie nicht Ihre Daten einspielen)</translation>
+    </message>
+    <message>
+        <source>A %1 file structure for a %2 was located at:</source>
+        <translation>Eine%1 Dateistruktur für eine %2 wurde in:</translation>
+    </message>
+    <message>
+        <source>A %1 file structure was located at:</source>
+        <translation>Eine%1 Dateistruktur befindet sich unter:</translation>
+    </message>
+    <message>
+        <source>Would you like to import from this location?</source>
+        <translation>Möchten Sie von diesem Ort impoertieren?</translation>
+    </message>
+    <message>
+        <source>Specify</source>
+        <translation>einzeln Ausführen</translation>
+    </message>
+    <message>
+        <source>Navigation</source>
+        <translation>Navigation</translation>
+    </message>
+    <message>
+        <source>Bookmarks</source>
+        <translation>Lesezeichen</translation>
+    </message>
+    <message>
+        <source>Records</source>
+        <translation>Aufnehmen</translation>
+    </message>
+    <message>
+        <source>Purge ALL CPAP Data</source>
+        <translation>Säuberung aller CPAP-Daten</translation>
+    </message>
+    <message>
+        <source>F10</source>
+        <translation>F10</translation>
+    </message>
+    <message>
+        <source>Ctrl+L</source>
+        <translation>Ctrl+L</translation>
+    </message>
+    <message>
+        <source>Daily Sidebar</source>
+        <translation>Randleiste täglich</translation>
+    </message>
+    <message>
+        <source>Daily Calendar</source>
+        <translation>Kalender täglich</translation>
+    </message>
+    <message>
+        <source>F9</source>
+        <translation>F9</translation>
+    </message>
+    <message>
+        <source>Imported %1 CPAP session(s) from
+
+%2</source>
+        <translation>Importiert%1 CPAP-Sitzung(en) von
+
+%2</translation>
+    </message>
+    <message>
+        <source>Import Success</source>
+        <translation>Erfolgreicher Import</translation>
+    </message>
+    <message>
+        <source>Already up to date with CPAP data at
+
+%1</source>
+        <translation>Bereits aktuelle CPAP Daten
+
+%1</translation>
+    </message>
+    <message>
+        <source>Up to date</source>
+        <translation>Neuster Sand</translation>
+    </message>
+    <message>
+        <source>Couldn't find any valid Machine Data at
+
+%1</source>
+        <translation>Hier konnten keine gültigen Gerätedaten gefunden werden
+
+%1</translation>
+    </message>
+    <message>
+        <source>You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine:</source>
+        <translation>Sie sind dabei, <font size=+2>Auslöschen</font> SleepyHead der Gerätedatenbank für folgendes Gerät:</translation>
+    </message>
+    <message>
+        <source>Note as a precaution, the backup folder will be left in place.</source>
+        <translation>Als Vorsichtsmaßnahme werden die Backup Ordner an Ort und Stelle belassen.</translation>
+    </message>
+    <message>
+        <source>Are you <b>absolutely sure</b> you want to proceed?</source>
+        <translation>Sind Sie <b>absolut sicher</b> das Sie fortfahren möchten?</translation>
+    </message>
+    <message>
+        <source>Exp&ort Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Backup &Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Make sure your keep your SleepyHead data folder backed up when trying testing versions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please ensure you are running the latest version before reporting any bugs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This red message line is intentional, and will not be a feature in the final version...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Data Folder Location: <a href="file://%1">%2</a></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1's Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Choose where to save journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>XML Files (*.xml)</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MinMaxWidget</name>
+    <message>
+        <source>Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Override</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The Minimum Y-Axis value.. Note this can be a negative number if you wish.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>The Maximum Y-Axis value.. Must be greater than Minimum to work.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Scaling Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This button resets the Min and Max to match the Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>NewProfile</name>
+    <message>
+        <source>ASV</source>
+        <translation>ASV</translation>
+    </message>
+    <message>
+        <source>APAP</source>
+        <translation>APAP</translation>
+    </message>
+    <message>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <source>Male</source>
+        <translation>Männlich</translation>
+    </message>
+    <message>
+        <source>&Back</source>
+        <translation>&Zurück</translation>
+    </message>
+    <message>
+        <source>&Next</source>
+        <translation>&Weiter</translation>
+    </message>
+    <message>
+        <source>TimeZone</source>
+        <translation>Zeitzone</translation>
+    </message>
+    <message>
+        <source>Email</source>
+        <translation>E-mail</translation>
+    </message>
+    <message>
+        <source>Phone</source>
+        <translation>Telefon</translation>
+    </message>
+    <message>
+        <source>Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.</source>
+        <translation>Alle Berichte die erzeugt werden, sind nur zum persönlichen Gebrauch und  in keiner Weise für die Einhaltung medizinischer Diagnosezwecke geeignet.</translation>
+    </message>
+    <message>
+        <source>SleepyHead is copyright &copy;2011-2014 Mark Watkins</source>
+        <translation>SleepyHead ist copyright &copy;2011-2014 Mark Watkins</translation>
+    </message>
+    <message>
+        <source>The author will not be held liable for <u>anything</u> related to the use or misuse of this software.</source>
+        <translation>Der Autor haftet nicht für <u> nichts </ u>, was mit den Gebrauch oder Missbrauch dieser Software im Zusammenhang steht.</translation>
+    </message>
+    <message>
+        <source>&Close this window</source>
+        <translation>&Fenster schliessen</translation>
+    </message>
+    <message>
+        <source>Edit User Profile</source>
+        <translation>Benutzerprofil bearbeiten</translation>
+    </message>
+    <message>
+        <source>qrc:/docs/update_notes.html</source>
+        <translation type="vanished">qrc:/docs/intro.html</translation>
+    </message>
+    <message>
+        <source>CPAP Treatment Information</source>
+        <translation>CPAP-Behandlung Information</translation>
+    </message>
+    <message>
+        <source>Password Protect Profile</source>
+        <translation>Projektpasswort</translation>
+    </message>
+    <message>
+        <source>Accuracy of any data displayed is not and can not be guaranteed.</source>
+        <translation>Für die Korrektheit der Daten kann nicht garantiert werden.</translation>
+    </message>
+    <message>
+        <source>D.O.B.</source>
+        <translation>Geb. Dat.</translation>
+    </message>
+    <message>
+        <source>Female</source>
+        <translation>Weiblich</translation>
+    </message>
+    <message>
+        <source>Gender</source>
+        <translation>Geschlecht</translation>
+    </message>
+    <message>
+        <source>Height</source>
+        <translation>Größe</translation>
+    </message>
+    <message>
+        <source>Contact Information</source>
+        <translation>Kontaktinformationen</translation>
+    </message>
+    <message>
+        <source>Locale Settings</source>
+        <translation>Ländereinstellungen</translation>
+    </message>
+    <message>
+        <source>SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.</source>
+        <translation>SleepyHead ist nur als Daten-Viewer geeignet und definitiv kein Ersatz für eine kompetente medizinische Anleitung für Ihren Arzt bestimmt.</translation>
+    </message>
+    <message>
+        <source>Welcome to SleepyHead</source>
+        <translation>Willkommen bei SleepyHead</translation>
+    </message>
+    <message>
+        <source>CPAP Mode</source>
+        <translation>CPAP Modus</translation>
+    </message>
+    <message>
+        <source>Select Country</source>
+        <translation>Land wählen</translation>
+    </message>
+    <message>
+        <source>PLEASE READ CAREFULLY</source>
+        <translation>BITTE LESEN SIE</translation>
+    </message>
+    <message>
+        <source>Untreated AHI</source>
+        <translation>Unbehandelter AHI</translation>
+    </message>
+    <message>
+        <source>Keep the kids out.. Nothing more.. This isn't meant to be uber security.</source>
+        <translation>Die Software ist nichts für Kinder.</translation>
+    </message>
+    <message>
+        <source>metric</source>
+        <translation>metrisch</translation>
+    </message>
+    <message>
+        <source>Address</source>
+        <translation>Adresse</translation>
+    </message>
+    <message>
+        <source>I agree to all the conditions above.</source>
+        <translation>Ich bin mit allen oben genannten Bedingungen einverstanden.</translation>
+    </message>
+    <message>
+        <source>DST Zone</source>
+        <translation>Automatische Sommerzeit</translation>
+    </message>
+    <message>
+        <source>archiac</source>
+        <translation>archaïsch</translation>
+    </message>
+    <message>
+        <source>RX Pressure</source>
+        <translation>RX Druck</translation>
+    </message>
+    <message>
+        <source>Password</source>
+        <translation>Passwort</translation>
+    </message>
+    <message>
+        <source>Use of this software is entirely at your own risk.</source>
+        <translation>Die Nutzung der Software erfolgt auf eigene Gefahr.</translation>
+    </message>
+    <message>
+        <source>Passwords don't match</source>
+        <translation>Passwörter stimmen nicht überein</translation>
+    </message>
+    <message>
+        <source>First Name</source>
+        <translation>Vorname</translation>
+    </message>
+    <message>
+        <source>Last Name</source>
+        <translation>Nachname</translation>
+    </message>
+    <message>
+        <source>Country</source>
+        <translation>Land</translation>
+    </message>
+    <message>
+        <source>&Cancel</source>
+        <translation>&Schließen</translation>
+    </message>
+    <message>
+        <source>&Finish</source>
+        <translation>&Ende</translation>
+    </message>
+    <message>
+        <source>Bi-Level</source>
+        <translation>Bi-Level</translation>
+    </message>
+    <message>
+        <source>Profile Changes</source>
+        <translation>Profiländerungen</translation>
+    </message>
+    <message>
+        <source>Personal Information (for reports)</source>
+        <translation>Persönliche Informationen (für Berichte)</translation>
+    </message>
+    <message>
+        <source>User Name</source>
+        <translation>Benutzername</translation>
+    </message>
+    <message>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <source>SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</source>
+        <translation>SleepyHead ist frei unter der <a href='qrc:/COPYING'> GNU Public License </ a> veröffentlicht worden, und ist ohne Garantie und ohne Ansprüche, für die Eignung eines bestimmten Zwecks.</translation>
+    </message>
+    <message>
+        <source>This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</source>
+        <translation>Diese Software wird entwickelt, um Ihnen bei der Überprüfung der von Ihrem CPAP-Geräte und zugehörige Ausrüstung erzeugten Daten zu unterstützen.</translation>
+    </message>
+    <message>
+        <source>User Information</source>
+        <translation>Benutzerinformationen</translation>
+    </message>
+    <message>
+        <source>Empty Username</source>
+        <translation type="vanished">Kein Benutzername</translation>
+    </message>
+    <message>
+        <source>...twice...</source>
+        <translation>... zweimal ...</translation>
+    </message>
+    <message>
+        <source>Doctors Name</source>
+        <translation>Name des Arztes</translation>
+    </message>
+    <message>
+        <source>Doctors / Clinic Information</source>
+        <translation>Name des Arztes in der Klinik</translation>
+    </message>
+    <message>
+        <source>Practice Name</source>
+        <translation>Name der Praxis</translation>
+    </message>
+    <message>
+        <source>Date Diagnosed</source>
+        <translation>Diagnosedatum</translation>
+    </message>
+    <message>
+        <source>TextLabel</source>
+        <translation>Textlabel</translation>
+    </message>
+    <message>
+        <source>Accept and save this information?</source>
+        <translation>Akzeptieren und speichern Sie diese Informationen?</translation>
+    </message>
+    <message>
+        <source>Patient ID</source>
+        <translation>Patient-ID</translation>
+    </message>
+    <message>
+        <source>Please provide a username for this profile</source>
+        <translation>Bitte geben Sie einen Benutzernamen für dieses Profil an</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation>Leere Seite</translation>
+    </message>
+</context>
+<context>
+    <name>Overview</name>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>L/b</source>
+        <translation>L/b</translation>
+    </message>
+    <message>
+        <source>% PB</source>
+        <translation>% PB</translation>
+    </message>
+    <message>
+        <source>%PTB</source>
+        <translation>%PTB</translation>
+    </message>
+    <message>
+        <source>End:</source>
+        <translation>Ende:</translation>
+    </message>
+    <message>
+        <source>Form</source>
+        <translation>Form</translation>
+    </message>
+    <message>
+        <source>Target
+Ventilation
+(L/min)</source>
+        <translation>Ziel
+Lüftung
+(L/min)</translation>
+    </message>
+    <message>
+        <source>Usage</source>
+        <translation>Verwendung</translation>
+    </message>
+    <message>
+        <source>Respiratory
+Disturbance
+Index</source>
+        <translation>Atem-
+Störung
+Index</translation>
+    </message>
+    <message>
+        <source>Show all graphs</source>
+        <translation>Alle Diagramme zeigen</translation>
+    </message>
+    <message>
+        <source>Reset view to selected date range</source>
+        <translation>Ansicht zurücksetzen zu ausgewählten Zeitraum</translation>
+    </message>
+    <message>
+        <source>Zombie Meter</source>
+        <translation>Mir geht es</translation>
+    </message>
+    <message>
+        <source>Drop down to see list of graphs to switch on/off.</source>
+        <translation>Drop-Down-Liste, Diagramme, Ein-/ Ausschalten.</translation>
+    </message>
+    <message>
+        <source>Peak RDI
+Shows RDI Clusters
+(RDI/hr)</source>
+        <translation>Spitzen RDI
+Zeigt FEI-Cluster
+(RDI/h)</translation>
+    </message>
+    <message>
+        <source>Peak AHI
+Shows AHI Clusters
+(AHI/hr)</source>
+        <translation>Spitzen AHI
+Zeigt AHI-Cluster
+(AHI/h)</translation>
+    </message>
+    <message>
+        <source>Usage
+(hours)</source>
+        <translation>Verwendung
+(Stunden)</translation>
+    </message>
+    <message>
+        <source>Last Three Months</source>
+        <translation>Letzten 3 Monate</translation>
+    </message>
+    <message>
+        <source>Respiratory
+Rate
+(breaths/min)</source>
+        <translation type="vanished">Atem-
+Rate
+(Atemzüge / min)</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">Keine Diagramme an!</translation>
+    </message>
+    <message>
+        <source>Custom</source>
+        <translation>Gebrauch</translation>
+    </message>
+    <message>
+        <source>How you felt
+(0-10)</source>
+        <translation>Wie fühlen Sie sich?
+(0-10)</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation>Diagramme</translation>
+    </message>
+    <message>
+        <source>Range:</source>
+        <translation>Zeitraum:</translation>
+    </message>
+    <message>
+        <source>Start:</source>
+        <translation>Start:</translation>
+    </message>
+    <message>
+        <source>SensAwake
+(count)</source>
+        <translation>SensAwake
+(Anzahl)</translation>
+    </message>
+    <message>
+        <source>Last Month</source>
+        <translation>Letzter Monat</translation>
+    </message>
+    <message>
+        <source>Apnea
+Hypopnea
+Index</source>
+        <translation>Apnoe
+Hypopnoe
+Index</translation>
+    </message>
+    <message>
+        <source>% in PB</source>
+        <translation type="vanished">% in PB</translation>
+    </message>
+    <message>
+        <source>Last 6 Months</source>
+        <translation>Letzten 6 Monate</translation>
+    </message>
+    <message>
+        <source>Body
+Mass
+Index</source>
+        <translation>Body
+Masse
+Index</translation>
+    </message>
+    <message>
+        <source>Minute
+Ventilation
+(L/min)</source>
+        <translation>Atem-Minuten
+Volumen
+(L/min)</translation>
+    </message>
+    <message>
+        <source>Oxygen Saturation
+(%)</source>
+        <translation>Sauerstoffsättigung in
+(%)</translation>
+    </message>
+    <message>
+        <source>Session Times</source>
+        <translation>Anwendungszeit</translation>
+    </message>
+    <message>
+        <source>Last Two Weeks</source>
+        <translation>Letzten zwei Wochen</translation>
+    </message>
+    <message>
+        <source>Everything</source>
+        <translation>Alles</translation>
+    </message>
+    <message>
+        <source>Last Week</source>
+        <translation>Letzte Woche</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation>Letztes Jahr</translation>
+    </message>
+    <message>
+        <source>breaths/min</source>
+        <translation>Atmungen pro Minuten</translation>
+    </message>
+    <message>
+        <source>Toggle Graph Visibility</source>
+        <translation>Umschalten Sichtbarkeit Diagramm</translation>
+    </message>
+    <message>
+        <source>Peak AHI</source>
+        <translation>Spitzen AHI</translation>
+    </message>
+    <message>
+        <source>Peak RDI</source>
+        <translation>Spitzen RDI</translation>
+    </message>
+    <message>
+        <source>Events/Hr</source>
+        <translation type="vanished">Ereignisse/h</translation>
+    </message>
+    <message>
+        <source>Hide all graphs</source>
+        <translation>Alle Diagramme zeigen</translation>
+    </message>
+    <message>
+        <source>Periodic
+Breathing
+(% of night)</source>
+        <translation type="vanished">periodischer
+Atem
+(% der Nacht)</translation>
+    </message>
+    <message>
+        <source>Patient
+Triggered
+Breaths
+(%)</source>
+        <translation>vom Patient
+ausgelöste
+Atemzüge
+(%)</translation>
+    </message>
+    <message>
+        <source>Session Times
+(hours)</source>
+        <translation>Sitzungs Zeiten
+(Stunden)</translation>
+    </message>
+    <message>
+        <source>
+(count)</source>
+        <translation>
+(Anzahl)</translation>
+    </message>
+    <message>
+        <source>Last Two Months</source>
+        <translation>Letzten 2 Monate</translation>
+    </message>
+    <message>
+        <source>Tidal
+Volume
+(ml)</source>
+        <translation>Atem-Zug-
+Volumen
+(ml)</translation>
+    </message>
+    <message>
+        <source>% in %1</source>
+        <translation>% in %1</translation>
+    </message>
+    <message>
+        <source>%1
+(% of night)</source>
+        <translation>%1
+(% der Nacht)</translation>
+    </message>
+    <message>
+        <source>Large Leaks
+(% of night)</source>
+        <translation>Große Lecks
+(% der Nacht)</translation>
+    </message>
+    <message>
+        <source>% %1</source>
+        <translation>% %1</translation>
+    </message>
+</context>
+<context>
+    <name>OximeterImport</name>
+    <message>
+        <source>Dialog</source>
+        <translation>Dialog</translation>
+    </message>
+    <message>
+        <source>Oximeter Import Wizard</source>
+        <translation>Oximeter Import-Assistenten</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Diese Übersetzung bitte nicht durchführen, weil eine neue Aufteilung stattfinden wird)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Skip this page next time.</source>
+        <translation>Überspringen Sie diese Seite das nächste Mal.</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html></source>
+        <translation><html><head/><body><p>SleepyHead unterstütztl Contec CMS50D + / E / F Serien Oximeter, <br/>sowie Daten-Dateien welche durch die Software von Choicemmed MD300W1 Oximeter "erzeugt werden.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Where would you like to import from?</source>
+        <translation>Von wo wollen Sie importieren?</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html></source>
+        <translation><html><head/><body><p>Diese Option ermöglicht den Import (über Kabel) aus Ihrem Oximeter.</p><p>Nach der Auswahl dieser Option, werden einige Einstellungen im Oximeter erforderlich sein um den Upload zu starten.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Directly from a recording on a device</source>
+        <translation>Direkt von einer Aufnahme auf einem Gerät</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html></source>
+        <translation><html><head/><body><p>Sollten Sie das Pulsoximeter über Nacht an einem PC betreiben kann diese Option sehr nützlich sein um Herzrhythmusstörungen zu erkennen.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Record attached to computer overnight (provides plethysomogram)</source>
+        <translation>Waren Sie über Nacht an den PC angeschlossen benutzen Sie das (Plethysonogramm)</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html></source>
+        <translation><html><head/><body><p>Diese Option ermöglicht den Import von Dateien, welche durch Software von SpO2 Review erzeugt wurde.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Import from a datafile saved by another program, like SpO2Review</source>
+        <translation>Import aus einer Datendatei von einem anderen Programm, welche von SpO2Review gespeichert wurden</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p>& [...]
+        <translation><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Erinnerung für CPAP-Anwender: </span><span style=" color:#fb0000;">Haben Sie daran gedacht, zuerst Ihre CPAP-Daten zu importieren?</span></p><p>Wenn Sie das vergessen haben, werden Sie keine gültige Zeit für diese Oxymetrie Sitzung erhalten.<br/><br/>Um sicherzustellen,dass eine gute Synchronisierung zwis [...]
+    </message>
+    <message>
+        <source>Please connect your oximeter device</source>
+        <translation>Bitte verbinden Sie Ihr Oximeter-Gerät</translation>
+    </message>
+    <message>
+        <source>Press Start to commence recording</source>
+        <translation>Drücken Sie Start, um die Aufnahme zu beginnen</translation>
+    </message>
+    <message>
+        <source>Show Live Graphs</source>
+        <translation>Live-Diagramme anzeigen</translation>
+    </message>
+    <message>
+        <source>Duration</source>
+        <translation>Dauer</translation>
+    </message>
+    <message>
+        <source>SpO2 %</source>
+        <translation>SpO2 %</translation>
+    </message>
+    <message>
+        <source>Pulse Rate</source>
+        <translation>Pulsrate</translation>
+    </message>
+    <message>
+        <source>Multiple Sessions Detected</source>
+        <translation>Mehrere Sitzungen erkannt</translation>
+    </message>
+    <message>
+        <source>Please choose which one you want to import into SleepyHead</source>
+        <translation>Bitte wählen Sie, welche Sie in SleepyHead importieren möchten</translation>
+    </message>
+    <message>
+        <source>Import Time</source>
+        <translation type="vanished">Importzeit</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation>Details</translation>
+    </message>
+    <message>
+        <source>Import Completed. When did the recording start?</source>
+        <translation>Import abgeschlossen. Wann hat die Aufnahme zu starten?</translation>
+    </message>
+    <message>
+        <source>Day recording (normally would of) started</source>
+        <translation>Normalerweise wird der Tag der Aufnahme gestartet</translation>
+    </message>
+    <message>
+        <source>Oximeter Starting time</source>
+        <translation>Oximeter Startzeit</translation>
+    </message>
+    <message>
+        <source>I want to use the time reported by my oximeter's built in clock.</source>
+        <translation>Ich will die Zeit von meiner im Oximeter eingebauten Uhr verwenden.</translation>
+    </message>
+    <message>
+        <source>I started this oximeter recording at (or near) the same time as a session on my CPAP machine.</source>
+        <translation>Ich begann diese Oximeter Aufnahme zur gleichen Zeit (oder nahe der Zeit) wie eine Session auf meinem CPAP-Gerät.</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html></source>
+        <translation><html><head/><body><p>SleepyHead benötigt eine Startzeit um zu wissen wo diese Oxymetrie-Sitzung gespeichert werden soll.</p><p>Wählen Sie eine der folgenden Optionen:</p></body></html></translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html></source>
+        <translation><html><head/><body><p>Hinweis: Synchronisieren Sie die CPAP-Sitzungs- Startzeit. Danach wird das Ergebnis immer genauer sein.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Choose CPAP session to sync to:</source>
+        <translation>Wählen Sie aus um die CPAP-Sitzung zu synchronisieren:</translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>You can manually adjust the time here if required:</source>
+        <translation>Falls erforderlich, können Sie hier die Zeit manuell einstellen:</translation>
+    </message>
+    <message>
+        <source>HH:mm:ssap</source>
+        <translation>HH:mm:ssap</translation>
+    </message>
+    <message>
+        <source>&Cancel</source>
+        <translation>&Schließen</translation>
+    </message>
+    <message>
+        <source>&Information Page</source>
+        <translation>&Informationsseite</translation>
+    </message>
+    <message>
+        <source>&Retry</source>
+        <translation>&Wiederholen</translation>
+    </message>
+    <message>
+        <source>&Choose Session</source>
+        <translation>&Wählen Sie die Sitzung</translation>
+    </message>
+    <message>
+        <source>&End Recording</source>
+        <translation>&Aufnahme Beenden</translation>
+    </message>
+    <message>
+        <source>&Sync and Save</source>
+        <translation>&Sync und Speichern</translation>
+    </message>
+    <message>
+        <source>&Save and Finish</source>
+        <translation>&Speichern und Beenden</translation>
+    </message>
+    <message>
+        <source>&Start</source>
+        <translation>&Start</translation>
+    </message>
+    <message>
+        <source>Scanning for compatible oximeters</source>
+        <translation>Scannen von kompatieblen Oximetern</translation>
+    </message>
+    <message>
+        <source>Could not detect any connected oximeter devices.</source>
+        <translation>Konnte keine angeschlossenen Oximeter Geräte erkennen.</translation>
+    </message>
+    <message>
+        <source>Connecting to %1 Oximeter</source>
+        <translation>Anschließen an ein %1 Oximeter</translation>
+    </message>
+    <message>
+        <source>Select upload option on %1</source>
+        <translation>Wählen Sie eine Uploadfunktion %1</translation>
+    </message>
+    <message>
+        <source>Waiting for you to start the upload process...</source>
+        <translation>Warten Sie bis der Uploadvorgang startet...</translation>
+    </message>
+    <message>
+        <source>%1 device is uploading data...</source>
+        <translation>%1 Gerät Hochladen von Daten...</translation>
+    </message>
+    <message>
+        <source>Please wait until oximeter upload process completes. Do not unplug your oximeter.</source>
+        <translation>Bitte warten Sie, bis der Oximeter Upload-Vorgang abgeschlossen ist. Nicht das Oximeter trennen.</translation>
+    </message>
+    <message>
+        <source>Oximeter import completed..</source>
+        <translation>Oximerterdatenimport abgeschlossen..</translation>
+    </message>
+    <message>
+        <source>Select a valid oximetry data file</source>
+        <translation>Wählen Sie eine gültige Oximetriedatendatei aus</translation>
+    </message>
+    <message>
+        <source>No Oximetery module could parse the given file:</source>
+        <translation>Das Oximetery Modul konnte die angegebene Datei nicht analysieren:</translation>
+    </message>
+    <message>
+        <source>Oximeter not detected</source>
+        <translation>Kein Oximeter angeschlossen</translation>
+    </message>
+    <message>
+        <source>Couldn't access oximeter</source>
+        <translation>Konnte nicht auf das Oxiimeter zugreifen</translation>
+    </message>
+    <message>
+        <source>Live Oximetery Mode</source>
+        <translation>Live Oximetrie Modus</translation>
+    </message>
+    <message>
+        <source>Starting up...</source>
+        <translation>Sarten Sie...</translation>
+    </message>
+    <message>
+        <source>If you can still read this after a few seconds, cancel and try again</source>
+        <translation>Sollte der Vorgang zu lange dauern, starten Sie Ihn nach ein paar Sekunden erneut</translation>
+    </message>
+    <message>
+        <source>Live Import Stopped</source>
+        <translation>Live Import stoppen</translation>
+    </message>
+    <message>
+        <source>Live Oximetery Stopped</source>
+        <translation>Live Oximetrie stoppen</translation>
+    </message>
+    <message>
+        <source>Live Oximetery import has been stopped</source>
+        <translation>Live-Oximetrie-Import wurde gestoppt</translation>
+    </message>
+    <message>
+        <source>%1 session(s) on %2, starting at %3</source>
+        <translation>%1 Sitzung(en) an %2, Starten ab %3</translation>
+    </message>
+    <message>
+        <source>No CPAP data available on %1</source>
+        <translation>Keine CPAP Daten auf%1 verfügbar</translation>
+    </message>
+    <message>
+        <source>%1</source>
+        <translation>%1</translation>
+    </message>
+    <message>
+        <source>Recording...</source>
+        <translation>Aufnahme...</translation>
+    </message>
+    <message>
+        <source>Finger not detected</source>
+        <translation>Kein Fingerchlip angeschlossen</translation>
+    </message>
+    <message>
+        <source>I want to use the time my computer recorded for this live oximetry session.</source>
+        <translation>Ich möchte die Zeit von meinem Computer für diese Live-Oxymetrie-Sitzung benutzen.</translation>
+    </message>
+    <message>
+        <source>I need to set the time manually, because my oximeter doesn't have an internal clock.</source>
+        <translation>Ich muss die Zeit manuell einstellen, denn mein Oximeter hat keine eigebaute Uhr.</translation>
+    </message>
+    <message>
+        <source>Something went wrong getting session data</source>
+        <translation>Ein Fehler ist immer wenn Sitzungs-Daten nicht übereinstimmen</translation>
+    </message>
+    <message>
+        <source>CMS50 Session %1</source>
+        <translation>CMS50 Sitzung %1</translation>
+    </message>
+    <message>
+        <source>Oximetry Files (*.spo *.spor *.spo2 *.dat)</source>
+        <translation>Oximetriedateiendungen (*.spo *.spor *.dat)</translation>
+    </message>
+    <message>
+        <source>Start Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>"%1", session %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Waiting for %1 to start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Waiting for the device to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Oximetry</name>
+    <message>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <source>Form</source>
+        <translation>Form</translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation type="vanished">speichern</translation>
+    </message>
+    <message>
+        <source>SpO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <source>Please make sure your oximeter is switched on, and in the right mode to transmit data.</source>
+        <translation type="vanished">Bitte stellen Sie sicher, dass Ihr Oximeter eingeschaltet ist, und in dem richtigen Modus, um Daten zu übertragen.</translation>
+    </message>
+    <message>
+        <source>&Stop</source>
+        <translation type="vanished">&Stop</translation>
+    </message>
+    <message>
+        <source>Pulse</source>
+        <translation>Puls</translation>
+    </message>
+    <message>
+        <source>Please connect oximeter device</source>
+        <translation type="vanished">Bitte verbinden Sie das Oximeter-Gerät</translation>
+    </message>
+    <message>
+        <source>&Start</source>
+        <translation type="vanished">&Start</translation>
+    </message>
+    <message>
+        <source>Creating a new oximetry session will destroy the old one.
+Would you like to save it first?</source>
+        <translation type="vanished">Erstellen einer neuen Sitzung wird die Pulsoximetriedaten löschen.
+Möchten Sie diese zuerst speichern?</translation>
+    </message>
+    <message>
+        <source>Would you like to save this oximetery session?</source>
+        <translation type="vanished">Möchten Sie die Oximetriesitzung speichern?</translation>
+    </message>
+    <message>
+        <source>&Open .spo/R File</source>
+        <translation>&Öffnen .spo/R Datei</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="vanished">Stornieren</translation>
+    </message>
+    <message>
+        <source>Check Oximeter is Ready</source>
+        <translation type="vanished">Überprüfen Sie ob das  Oximeter bereit ist</translation>
+    </message>
+    <message>
+        <source>Oximeter Error!</source>
+        <translation type="vanished">Oximeter Fehler!</translation>
+    </message>
+    <message>
+        <source>Couldn't open oximetry file "</source>
+        <translation type="vanished">Konnte Oximetriedatei nicht öffnen "</translation>
+    </message>
+    <message>
+        <source>Save Session?</source>
+        <translation type="vanished">Sitzung speichern?</translation>
+    </message>
+    <message>
+        <source>R&eset</source>
+        <translation>R&eset</translation>
+    </message>
+    <message>
+        <source>Select an oximetry file</source>
+        <translation type="vanished">Wählen Sie eine Oxymetrie-Datei</translation>
+    </message>
+    <message>
+        <source>Oximetry Error!
+
+Something is wrong with the device connection.</source>
+        <translation type="vanished">Oxymetrie Fehler!
+
+Etwas ist falsch mit dem Geräteanschluss.</translation>
+    </message>
+    <message>
+        <source>Serial &Import</source>
+        <translation>Serien & Import</translation>
+    </message>
+    <message>
+        <source>Oximetry Files (*.spo *.spoR)</source>
+        <translation type="vanished">Oxymetrie-Dateien (*. Spo *. Spor)</translation>
+    </message>
+    <message>
+        <source>Serial Port</source>
+        <translation>Serien Port</translation>
+    </message>
+    <message>
+        <source>d/MM/yy h:mm:ss AP</source>
+        <translation>d/MM/yy h:mm:ss AP</translation>
+    </message>
+    <message>
+        <source>Please Wait</source>
+        <translation type="vanished">Bitte warten</translation>
+    </message>
+    <message>
+        <source>&Start Live</source>
+        <translation>&Start-Live</translation>
+    </message>
+    <message>
+        <source>Connect Oximeter</source>
+        <translation type="vanished">Oximeter schließen</translation>
+    </message>
+    <message>
+        <source>Please make sure Oximeter device is in upload mode.</source>
+        <translation type="vanished">Bitte stellen Sie sicher ob das Oximeter Gerät im Upload-Modus ist.</translation>
+    </message>
+    <message>
+        <source>Control</source>
+        <translation type="vanished">Kontrolle</translation>
+    </message>
+    <message>
+        <source>Oximetry live recording has been terminated due to timeout.</source>
+        <translation type="vanished">Oxymetrie Live-Aufnahme wurde wegen Zeitüberschreitung beendet.</translation>
+    </message>
+    <message>
+        <source>Destroy It</source>
+        <translation type="vanished">Zerstören Sie</translation>
+    </message>
+    <message>
+        <source>&Rescan Ports</source>
+        <translation>&Ports neu scannen</translation>
+    </message>
+    <message>
+        <source>Opening this oximetry file will destroy the current session.
+Would you like to keep it?</source>
+        <translation type="vanished">Öffnen dieser Datei wird die aktuelle Sitzung löschen.
+Möchten Sie zuerst speichern?</translation>
+    </message>
+    <message>
+        <source>Device Connected</source>
+        <translation type="vanished">Gerät angeschlossen</translation>
+    </message>
+    <message>
+        <source>Keep This Recording?</source>
+        <translation type="vanished">Möchten Sie diese Aufnahme behalten?</translation>
+    </message>
+    <message>
+        <source>Oximeter Error
+
+The device has not responded.. Make sure it's switched on.</source>
+        <translation type="vanished">Oximeter Fehler
+
+Das Gerät hat nicht geantwortet .. Stellen Sie sicher, das es eingeschaltet ist.</translation>
+    </message>
+    <message>
+        <source>Oximeter Error
+
+The device did not respond.. Make sure it's switched on.</source>
+        <translation type="vanished">Oximeter Fehler
+
+Das Gerät hat nicht reagiert .. Stellen Sie sicher, das es eingeschaltet ist.</translation>
+    </message>
+    <message>
+        <source>Opening this oximetry session will destroy the unsavedsession in the oximetry tab.
+Would you like to store it first?</source>
+        <translation type="vanished">Öffnen dieser Sitzung wird die Pulsoximetrie unsavedsession in der Registerkarte Oxymetrie löschen.
+Möchten Sie zuerst speichern?</translation>
+    </message>
+    <message>
+        <source>No Oximetry Data</source>
+        <translation type="vanished">Keine Oximetriedaten</translation>
+    </message>
+    <message>
+        <source>Current oximetry session still has unsaved data in it.</source>
+        <translation type="vanished">Die aktuelle Oxymetrie-Sitzung entspricht immer noch nicht den gespeicherten Daten.</translation>
+    </message>
+    <message>
+        <source>Would you like to save it first?</source>
+        <translation type="vanished">Möchten Sie die daten zuerst speichern?</translation>
+    </message>
+</context>
+<context>
+    <name>PreferencesDialog</name>
+    <message>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <source>s</source>
+        <translation>s</translation>
+    </message>
+    <message>
+        <source>ID</source>
+        <translation type="vanished">ID</translation>
+    </message>
+    <message>
+        <source>&Ok</source>
+        <translation>&OK</translation>
+    </message>
+    <message>
+        <source>N/A</source>
+        <translation type="vanished">N/A</translation>
+    </message>
+    <message>
+        <source> bpm</source>
+        <translation> bpm</translation>
+    </message>
+    <message>
+        <source>Graph Height</source>
+        <translation>Diagrammhöhe</translation>
+    </message>
+    <message>
+        <source>Font</source>
+        <translation>Schriftart</translation>
+    </message>
+    <message>
+        <source>Leak</source>
+        <translation>Leck</translation>
+    </message>
+    <message>
+        <source>SPO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <source>Show</source>
+        <translation type="vanished">Zeigen</translation>
+    </message>
+    <message>
+        <source>Size</source>
+        <translation>Größe</translation>
+    </message>
+    <message>
+        <source>Type</source>
+        <translation>Typ</translation>
+    </message>
+    <message>
+        <source>Skip Login Screen</source>
+        <translation>Weiter mit Anmeldebildschirm</translation>
+    </message>
+    <message>
+        <source>Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA)</source>
+        <translation>Zeigt Respiratory Disturbance Index anstelle des Apnoe / Hypopnoe-Index (RDI = AHI + RERA)</translation>
+    </message>
+    <message>
+        <source>&CPAP</source>
+        <translation>&CPAP</translation>
+    </message>
+    <message>
+        <source>General Settings</source>
+        <translation>Allgemeine Einstellungen</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html></source>
+        <translation><html> <head/> <body> <p> Dies macht Blättern im einfacher auf empfindliche bidirektionale TouchPads gezoomt </p><p> 50ms ist der empfohlenen Wert. </p></body></html></translation>
+    </message>
+    <message>
+        <source>Daily Graphs</source>
+        <translation type="vanished">Tagesgrafik</translation>
+    </message>
+    <message>
+        <source>Compress ResMed (EDF) backups to save disk space.
+Backed up EDF files are stored in the .gz format, 
+which is common on Mac & Linux platforms.. 
+
+SleepyHead can import from this compressed backup directory natively.. 
+To use with ResScan will require the .gz files to be uncompressed first..</source>
+        <translation>Komprimieren ResMed (EDF) Backups, um Speicherplatz zu sparen.
+Gesicherte EDF-Dateien werden im. Gz-Format gespeichert,
+die häufig auf Mac & Linux-Plattformen ist ..
+
+Soll SleepyHead aus diesem komprimierten Backup-Verzeichnis nativ importieren ..
+Wenn Sie ResScan verwenden werden die. Gz-Dateien benötigen, müssen aber zuerst dekomprimiert werden ..</translation>
+    </message>
+    <message>
+        <source>Event</source>
+        <translation type="vanished">Veranstaltung</translation>
+    </message>
+    <message>
+        <source>Event Duration</source>
+        <translation>Veranstaltungdauer</translation>
+    </message>
+    <message>
+        <source>Graph</source>
+        <translation type="vanished">Diagramm</translation>
+    </message>
+    <message>
+        <source>Pulse</source>
+        <translation>Puls</translation>
+    </message>
+    <message>
+        <source>days.</source>
+        <translation>tägl.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></source>
+        <translation><! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html> <head> <meta name="qrichtext" content="1" /> <style type="text/css">
+p, li {white-space: pre-wrap; }
+</ style> </ head> <body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Sessions in der Dauer kürzer als diese nicht angezeigt <span style=" font-style:italic;">. </ span> </ p>
+<p style = "-qt-Absatz-type: leer, margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;-qt-Block-indent: 0; text-indent : 0px; font-style: italic; "> </ p> </ body> </ html></translation>
+    </message>
+    <message>
+        <source>The name of your mask, or at least the name you call it.</source>
+        <translation>Der Name der Maske, oder zumindest der Name, wie Sie die Maske bezeichnen.</translation>
+    </message>
+    <message>
+        <source>Ignore Short Sessions</source>
+        <translation>Ignorieren von kurzen Sitzungen</translation>
+    </message>
+    <message>
+        <source>Percentage of restriction in airflow from the median value. 
+A value of 20% works well for detecting apneas. </source>
+        <translation>Prozentualer Anteil der Einschränkung des Luftstroms aus dem Mittelwert.
+Ein Wert von 20% eignet sich gut zum Nachweis von Apnoen.</translation>
+    </message>
+    <message>
+        <source>Sessions starting before this time will go to the previous calendar day.</source>
+        <translation>Sitzungen vor dieser Zeit werden auf den voangegangenen Tag genommen.</translation>
+    </message>
+    <message>
+        <source>The date you started using this mask</source>
+        <translation>Das Datum, an dem Sie mit dieser Maske begonnen haben</translation>
+    </message>
+    <message>
+        <source>Session Storage Options</source>
+        <translation>Sitzungs Speicher Optonen</translation>
+    </message>
+    <message>
+        <source>Graph Titles</source>
+        <translation>Diagrammtitel</translation>
+    </message>
+    <message>
+        <source>Zero Reset</source>
+        <translation>Nullsetzung</translation>
+    </message>
+    <message>
+        <source>The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes.</source>
+        <translation>Die folgenden Optionen beeinflussen die Menge an Speicherplatz welcher Sleepyhead verwendet, und Diese haben einen Einfluss darauf, wie lange der Import dauert.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html></source>
+        <translation><! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html> <head> <meta name="qrichtext" content="1" /> <style type="text/css">
+p, li {white-space: pre-wrap; }
+</ style> </ head> <body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Individuelle Beflaggung ist ein experimentellen Verfahren zum Nachweis von Veranstaltungen, die von der Maschine verpasst. Sie sind <span style=" text-decoration: underline;"> nicht </ span> in AHI enthalten. </ P> </ body> </ html></translation>
+    </message>
+    <message>
+        <source>Show event breakdown pie chart</source>
+        <translation>Zeige Ereignis Aufschlüsselung im Kreisdiagramm</translation>
+    </message>
+    <message>
+        <source>Enable/disable experimental event flagging enhancements. 
+It allows detecting borderline events, and some the machine missed.
+This option must be enabled before import, otherwise a purge is required.</source>
+        <translation>Aktivieren/Deaktivieren experimentellen Veranstaltung Markieren von Verbesserungen.
+Es wird erlaubt, Borderline-Ereignisse, und einige die Maschine verpasst.
+Diese Option muss vor dem Import aktiviert werden, da sonst eine Reinigung erforderlich ist.</translation>
+    </message>
+    <message>
+        <source>Flow Restriction</source>
+        <translation>Durchflussbegrenzung</translation>
+    </message>
+    <message>
+        <source>Show Compliance</source>
+        <translation>Einhaltung Anzeigen</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to reset your graph preferences to the defaults?</source>
+        <translation type="vanished">Sind Sie sicher, dass Sie Ihre Grafik-Einstellungen auf die Standardwerte zurücksetzen wollen?</translation>
+    </message>
+    <message>
+        <source>Minimum duration of drop in oxygen saturation</source>
+        <translation>Mindestdauer des Abfalls der Sauerstoffsättigung</translation>
+    </message>
+    <message>
+        <source>Overview Linecharts</source>
+        <translation>Übersicht Liniendiagramme</translation>
+    </message>
+    <message>
+        <source>Whether to allow changing yAxis scales by double clicking on yAxis labels</source>
+        <translation>Ob sich ändernde yAchse Skalen durch Doppelklick auf yAchse Etiketten ermöglichen</translation>
+    </message>
+    <message>
+        <source>Contec CMS50</source>
+        <translation type="vanished">Contec CMS50</translation>
+    </message>
+    <message>
+        <source>Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</source>
+        <translation>Pixmap-Caching ist eine Grafikbeschleunigungstechnik, welche zu Problemen mit der Anzeige von Schrift in dem Grafik-Anzeigebereich auf Ihrer Plattform führen kann.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data.  </span></p></body></html></source>
+        <translation><! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html> <head> <meta name="qrichtext" content="1" /> <style type="text/css">
+p, li {white-space: pre-wrap; }
+</ style> </ head> <body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style = "font-style: italic;"> Ändern SD Backup-Komprimierungsoptionen nicht automatisch Backup-Daten komprimieren. </ span> </ p> </ body> </ html></translation>
+    </message>
+    <message>
+        <source>Bypass the login screen and load the most recent User Profile</source>
+        <translation>Umgehen Sie den Login-Bildschirm und laden Sie das neueste Benutzerprofil</translation>
+    </message>
+    <message>
+        <source>Data Reindex Required</source>
+        <translation>Erforderliche Daten indizieren</translation>
+    </message>
+    <message>
+        <source>Scroll Dampening</source>
+        <translation>Bildlauf Dämpfung</translation>
+    </message>
+    <message>
+        <source> hours</source>
+        <translation>Stunden</translation>
+    </message>
+    <message>
+        <source>Nasal Pillows</source>
+        <translation>Nasenpolster</translation>
+    </message>
+    <message>
+        <source>If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.</source>
+        <translation>Diese Daten können nicht zurückgeholt werden.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></source>
+        <translation><! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html> <head> <meta name="qrichtext" content="1" /> <style type="text/css">
+p, li {white-space: pre-wrap; }
+</ style> </ head> <body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Wenn Ihr Interesse an Test helfen neue Features und Bugfixes früh, klicken Sie hier. </ p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style = "font-style: italic;"> Aber bitte gewarnt, dies wird manchmal bedeuten breaky Code werden .. </ span> </ p>
+<p style = "-qt-Absatz-type: leer, margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;-qt-Block-indent: 0; text-indent : 0px; "> </ p> </ body> </ html></translation>
+    </message>
+    <message>
+        <source>Leak Profile</source>
+        <translation>Leck Profil</translation>
+    </message>
+    <message>
+        <source>Standard Bars</source>
+        <translation>Standardbalken</translation>
+    </message>
+    <message>
+        <source>Mask Profile</source>
+        <translation>Masken Profil</translation>
+    </message>
+    <message>
+        <source>99% Percentile</source>
+        <translation>99% Prozentuale</translation>
+    </message>
+    <message>
+        <source>Small chunks of oximetry data under this amount will be discarded.</source>
+        <translation>Kleine Abschnitte von Oximetriedaten unter diesem Betrag, werden verworfen.</translation>
+    </message>
+    <message>
+        <source>Top & Bottom Markers</source>
+        <translation type="vanished">Oben & Unten Markierungen</translation>
+    </message>
+    <message>
+        <source>Reset the counter to zero at beginning of each (time) window.</source>
+        <translation>Setzen Sie den Zähler auf Null zu Beginn eines jeden (Zeit-) Abschnittes.</translation>
+    </message>
+    <message>
+        <source>One or more of the changes you have made will require this application to be restarted,
+in order for these changes to come into effect.
+
+Would you like do this now?</source>
+        <translation>Eine oder mehrere der Änderungen, die Sie vorgenommen haben, benötigen das diese Anwendung neu gestartet wird,
+damit diese Änderungen in Kraft treten.
+
+Möchten Sie das jetzt tun?</translation>
+    </message>
+    <message>
+        <source>Not entirely sure if this will get to live or not..</source>
+        <translation type="vanished">Nicht völlig sicher, wenn das kommen wird, um zu leben, oder nicht..</translation>
+    </message>
+    <message>
+        <source>Discard chunks under</source>
+        <translation type="vanished">Verwerfen Sie die Teile nach</translation>
+    </message>
+    <message>
+        <source> minutes</source>
+        <translation>minuten</translation>
+    </message>
+    <message>
+        <source>Minutes</source>
+        <translation>Minuten</translation>
+    </message>
+    <message>
+        <source>Graph Settings</source>
+        <translation>Diagramm-Einstellungen</translation>
+    </message>
+    <message>
+        <source>CPAP Mask Information</source>
+        <translation>CPAP Maskeninformation</translation>
+    </message>
+    <message>
+        <source>Method of unintentional leaks calculation if not provided by your machine.
+Note: Statistical Model is experimental.</source>
+        <translation>Methode der Berechnung, wenn unbeabsichtigte Lecks von Ihrem Gerät nicht zur Verfügung gestellt werden.
+Hinweis: Statistisches Modell ist experimentell.</translation>
+    </message>
+    <message>
+        <source>Bold  </source>
+        <translation>Fett  </translation>
+    </message>
+    <message>
+        <source>Colour</source>
+        <translation type="vanished">Farbe</translation>
+    </message>
+    <message>
+        <source>Minimum duration of pulse change event.</source>
+        <translation>Mindestdauer von Pulswechsel-Ereignissen.</translation>
+    </message>
+    <message>
+        <source>Anti-Aliasing applies smoothing to graph plots.. 
+Certain plots look more attractive with this on. 
+This also affects printed reports.
+
+Try it and see if you like it.</source>
+        <translation>Anti-Aliasing gilt für eine Verbesserung der grphischen Darstellung ..
+Bestimmte Darstellungen sehen besser aus wenn Sie das aktivieren.
+Dies wirkt sich auch auf gedruckte Berichte Berichte aus.
+
+Probieren Sie es aus und sehen, ob es Ihnen gefällt.</translation>
+    </message>
+    <message>
+        <source>Oximetry Graphs</source>
+        <translation type="vanished">Oximetriediagramm</translation>
+    </message>
+    <message>
+        <source>Median is recommended for ResMed users.</source>
+        <translation>Mittlere ist für ResMed Benutzer empfohlen.</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation type="vanished">Diagramme</translation>
+    </message>
+    <message>
+        <source>of usage per night</source>
+        <translation>Nutzung pro Nacht</translation>
+    </message>
+    <message>
+        <source>&Check for Updates now</source>
+        <translation>&Prüfen auf eine neue Version</translation>
+    </message>
+    <message>
+        <source>Italic</source>
+        <translation>Kursiv</translation>
+    </message>
+    <message>
+        <source>Enable Multithreading</source>
+        <translation>aktivieren Sie Multithreading</translation>
+    </message>
+    <message>
+        <source>This may not be a good idea</source>
+        <translation>Das ist keine gute Idee</translation>
+    </message>
+    <message>
+        <source>Weighted Average</source>
+        <translation>gewichteter Durchschnitt</translation>
+    </message>
+    <message>
+        <source>Median</source>
+        <translation>Mittlere</translation>
+    </message>
+    <message>
+        <source>Sudden change in Pulse Rate of at least this amount</source>
+        <translation>Plötzliche Änderung in Pulsfrequenz von mindestens diesen Betrag</translation>
+    </message>
+    <message>
+        <source>Search</source>
+        <translation>Suche</translation>
+    </message>
+    <message>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+SleepyHead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translation>Dies hält eine Sicherung der SD-Karte Daten für ResMed Maschinen,
+
+ResMed Maschinen hochauflösende Daten, die älter als 7 Tage zu löschen,
+Grafik und Daten, die älter als 30 Tage ..
+
+Sleepyhead können eine Kopie dieser Daten halten, wenn Sie jemals brauchen werden, um neu zu installieren.
+(Sehr empfehlenswert, es sei denn, Ihre kurz auf Speicherplatz oder nicht über die Diagrammdaten care)</translation>
+    </message>
+    <message>
+        <source>Window</source>
+        <translation>Windows</translation>
+    </message>
+    <message>
+        <source>Middle Calculations</source>
+        <translation>Mittel Berechnungen</translation>
+    </message>
+    <message>
+        <source>Skip over Empty Days</source>
+        <translation>Leere Tage überspringen</translation>
+    </message>
+    <message>
+        <source>Allow duplicates near machine events.</source>
+        <translation>Gerät für Duplikate von Ereignissen zulassen.</translation>
+    </message>
+    <message>
+        <source>The visual method of displaying waveform overlay flags.
+</source>
+        <translation>Das visuelle Verfahren zur Darstellung von Wellenüberlagerungsansichten.</translation>
+    </message>
+    <message>
+        <source>Upper Percentile</source>
+        <translation>Obere Prozentuale</translation>
+    </message>
+    <message>
+        <source>Restart Required</source>
+        <translation>Neustart erforderlich</translation>
+    </message>
+    <message>
+        <source>Generic mask type. Select the one that's closest to your mask.</source>
+        <translation>Generischer Maskentyp. Wählen Sie den aus, der Ihrer Maske am ehesten gleicht.</translation>
+    </message>
+    <message>
+        <source>True Maximum</source>
+        <translation>Echte Maximum</translation>
+    </message>
+    <message>
+        <source>For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.</source>
+        <translation>Für Konsistenz sollten ResMed Nutzer hier 95% verwenden,
+denn dies ist der einzige Wert in der Tageszusammenfassung der lieferbar ist.</translation>
+    </message>
+    <message>
+        <source>Graph Text</source>
+        <translation>Diagrammtext</translation>
+    </message>
+    <message>
+        <source>Session Settings</source>
+        <translation>Sitzungseinstellungen</translation>
+    </message>
+    <message>
+        <source>Cache Session Data (uses more system memory)</source>
+        <translation>Cache-Sitzungs-Daten (verbraucht mehr Systemspeicher)</translation>
+    </message>
+    <message>
+        <source>Allow use of multiple CPU cores where available to improve performance. 
+Mainly affects the importer.</source>
+        <translation>Erlaubt die Verwendung von mehreren CPU-Kernen, wenn verfügbar, um die Leistung zu verbessern.
+Vor allem wirkt sich das auf den Import von Daten aus.</translation>
+    </message>
+    <message>
+        <source>Tries to forces the oximetry data to link with CPAP when possible.</source>
+        <translation>Versucht, die Oximetriedaten mit CPAP zu verlinken, wenn Dies möglich ist.</translation>
+    </message>
+    <message>
+        <source>Line Chart</source>
+        <translation>Liniendiagramm</translation>
+    </message>
+    <message>
+        <source>How long you want the tooltips to stay visible.</source>
+        <translation>Wie lange sollen die Tooltips sichtbar bleiben.</translation>
+    </message>
+    <message>
+        <source>Multiple sessions closer together than this value will be kept on the same day.
+</source>
+        <translation>Mehrere Sitzungen näher als dieser Wert wird am gleichen Tag gehalten werden.</translation>
+    </message>
+    <message>
+        <source>Duration of airflow restriction</source>
+        <translation>Dauer der Behinderung des Luftstroms</translation>
+    </message>
+    <message>
+        <source>Bar Tops</source>
+        <translation>Balkendiagramme</translation>
+    </message>
+    <message>
+        <source>Automatically Check For Updates</source>
+        <translation>Automatisch nach Updates suchen</translation>
+    </message>
+    <message>
+        <source>I want to try experimental and test builds (Advanced users only please.)</source>
+        <translation>Ich will versuchen, Versuchs-und Tests zu benutzen (Bitte nur fortgeschrittene Benutzer.)</translation>
+    </message>
+    <message>
+        <source>as over</source>
+        <translation>mehr als</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to disable these backups?</source>
+        <translation>Sind Sie sicher, dass Sie diese Sicherungen deaktivieren wollen?</translation>
+    </message>
+    <message>
+        <source>Overview Graphs</source>
+        <translation type="vanished">Übersichtsdiagramme</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (only for ResMed so far, highly recommended)</source>
+        <translation type="vanished">SD-Karte Backups erstellen während des Imports (nur für ResMed, sehr zu empfehlen)</translation>
+    </message>
+    <message>
+        <source>Other Visual Settings</source>
+        <translation>Andere Visuelle Einstellungen</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation>Druck</translation>
+    </message>
+    <message>
+        <source>Day Split Time</source>
+        <translation>Tages Zwischenzeit</translation>
+    </message>
+    <message>
+        <source>Big  Text</source>
+        <translation>Großer Text</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html></source>
+        <translation><html> <head/> <body> <p> Diese Eigenschaften haben vor kurzem beschnitten worden. Sie werden später wieder zu kommen. </ p> </ body> </ html></translation>
+    </message>
+    <message>
+        <source>Description</source>
+        <translation>Beschreibung</translation>
+    </message>
+    <message>
+        <source>ResMed users probably should use 99th Percentile for visual consistency.</source>
+        <translation>ResMed Benutzer sollte 99. Perzentile für die visuelle Konsistenz verwenden.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html></source>
+        <translation><! DOCTYPE HTML PUBLIC "- / / W3C / / DTD HTML 4.0 / / EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html> <head> <meta name="qrichtext" content="1" /> <style type="text/css">
+p, li {white-space: pre-wrap; }
+</ style> </ head> <body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style = "font-weight: 600; font-style: normal;"> Hinweis: </ span> Leak Profile derzeit noch nicht funktioniert .. </ p> </ body> </ html></translation>
+    </message>
+    <message>
+        <source>ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).</source>
+        <translation>ResMed S9 Geräte routinemäßig bestimmte Daten von der SD-Karte, die älter als 7 und 30 Tagen (je nach Auflösung) zu löschen.</translation>
+    </message>
+    <message>
+        <source>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</source>
+        <translation>Tage mit der Benutzung des Gerätes mit unter 4 Stunden ist "nicht konform".mehr als 4 Stnden sind in Ordnung.</translation>
+    </message>
+    <message>
+        <source>Daily view navigation buttons will skip over days without data records</source>
+        <translation>Tagesansicht Navigationstasten wird die Tage ohne Datensätze überspringen</translation>
+    </message>
+    <message>
+        <source> seconds</source>
+        <translation>Sekunden</translation>
+    </message>
+    <message>
+        <source>Mask Type</source>
+        <translation>Maskentyp</translation>
+    </message>
+    <message>
+        <source>Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.</source>
+        <translation>Stellt die Datenmenge für jeden Punkt in dem AHI/ Stunde Diagramm bereit.
+Standardwerte auf 60 Minuten .. Sehr zu empfehlen.</translation>
+    </message>
+    <message>
+        <source>&Cancel</source>
+        <translation>&Abbrechen</translation>
+    </message>
+    <message>
+        <source>Last Checked For Updates: </source>
+        <translation>Letzte Kontrolle Updates:</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation>Details</translation>
+    </message>
+    <message>
+        <source>&Events</source>
+        <translation type="vanished">&Veranstaltungen</translation>
+    </message>
+    <message>
+        <source>Use Anti-Aliasing</source>
+        <translation>Verwenden Sie Anti-Aliasing</translation>
+    </message>
+    <message>
+        <source>Animations && Fancy Stuff</source>
+        <translation>Animationen && gutes Material</translation>
+    </message>
+    <message>
+        <source>&Import</source>
+        <translation>&Importieren</translation>
+    </message>
+    <message>
+        <source>AHI/Hour Graph Settings</source>
+        <translation>AHI/ Stunde Grafik-Einstellungen</translation>
+    </message>
+    <message>
+        <source>Use Oximetry</source>
+        <translation type="vanished">Oxymetrie verwenden</translation>
+    </message>
+    <message>
+        <source>Changes to the following settings needs a restart, but not a recalc.</source>
+        <translation>Änderungen an den folgenden Einstellungen benötigt einen Neustart, aber keine Neuberechnung.</translation>
+    </message>
+    <message>
+        <source>Compress Session Data (makes SleepyHead data smaller, but day changing slower.)</source>
+        <translation>Komprimieren der Sitzungsdaten (Daten macht Sleepyhead kleiner, aber das wechseln zum Tag langsamer)</translation>
+    </message>
+    <message>
+        <source>&Appearance</source>
+        <translation>& Erscheinungsbild</translation>
+    </message>
+    <message>
+        <source>The pixel thickness of line plots</source>
+        <translation>Die Pixeldicke von Liniendiagrammen</translation>
+    </message>
+    <message>
+        <source>&Defaults</source>
+        <translation type="vanished">& Standard</translation>
+    </message>
+    <message>
+        <source>Filters the graph list. Simply start typing the name of the graph your looking for.</source>
+        <translation type="vanished">Filtert die Grafik-Liste. Suchen Sie einfach die Grafik, die Sie starten wollen.</translation>
+    </message>
+    <message>
+        <source>Combine Close Sessions </source>
+        <translation>Kombinieren Schließen Sitzung</translation>
+    </message>
+    <message>
+        <source>Allow YAxis Scaling</source>
+        <translation>Erlauben Sie YAxis Skalierung</translation>
+    </message>
+    <message>
+        <source>Use Pixmap Caching</source>
+        <translation>Verwenden Pixmap Zwischenspeicherung</translation>
+    </message>
+    <message>
+        <source>Check for new version every</source>
+        <translation>Alle auf neue Version prüfen</translation>
+    </message>
+    <message>
+        <source>Allows graphs to be "screenshotted" for display purposes.
+The Event Breakdown PIE chart uses this method, as does
+the printing code.
+Unfortunately some older computers/versions of Qt can cause
+this application to be unstable with this feature enabled.</source>
+        <translation>Ermöglicht Graphen zu "screenshotted"für die Anzeige zu werden.
+Das Event-Pannenkreisdiagramm verwendet diese Methode, wie auch
+der Druck Code.
+Leider sind einige ältere Computer / Qt-Versionen kann dazu führen,
+diese Anwendung instabil mit dieser Funktion aktiviert sein.</translation>
+    </message>
+    <message>
+        <source>Maximum Calcs</source>
+        <translation>Maximale Calcs</translation>
+    </message>
+    <message>
+        <source>This makes SleepyHead's data take around half as much space.
+But it makes import and day changing take longer.. 
+If you've got a new computer with a small solid state disk, this is a good option.</source>
+        <translation>Dies macht die SleepyHead Daten etwa halb so groß.
+Aber es macht den Import und den Wechsel zur Tagesansicht langsamer ..
+Wenn Sie einen Computer mit einem kleinen Speicherplatz haben, ist dies eine gute Option.</translation>
+    </message>
+    <message>
+        <source>Tooltip Timeout</source>
+        <translation>Kurzinfo Zeitüberschreitung</translation>
+    </message>
+    <message>
+        <source>Preferences</source>
+        <translation>Einstellungen</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style= [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">t [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></source>
+        <translation><! DOCTYPE HTML PUBLIC " - / / W3C / / DTD HTML 4.0 / / EN " " http://www.w3.org/TR/REC-html40/strict.dtd " >
+<html> <head> <meta name="qrichtext" content="1" /> <style type="text/css">
+p, li { white-space : pre -wrap ; }
+</ style> </ head> <body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style = "font -family: " Sans '; font-size: 10pt ; font-weight: 600; " > Syncing Oxymetrie und CPAP Daten < / span> < / p>
+<p align = "justify" style = " -qt- Absatz -type: leer, margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; font-family: " Sans '; font-size: 10pt ; " > <br /> < / p>
+<p align = "justify" style = " margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; " > <span style=" font-family:'Sans'; font-size:10pt;"> CMS50 von SpO2Review (von . Spor -Dateien) oder die serielle Import-Methode importiert Daten nicht </ span> <span style = "font- Familie : " Sans '; font-size: 10pt ; font-weight: 600; text-decoration : un [...]
+<p align = "justify" style = " -qt- Absatz -type: leer, margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; font-family: " Sans '; font-size: 10pt ; " > <br /> < / p>
+<p align = "justify" style = " margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; " > <span style=" font-family:'Sans'; font-size:10pt;"> Live-View -Modus ( mit einem seriellen Kabel ) ist eine Möglichkeit , um eine genaue Synchronisierung auf CMS50 Oximeter acheive , aber nicht Zähler für CPAP Uhr driften. </ span> </ p>
+<p align = "justify" style = " -qt- Absatz -type: leer, margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; font-family: " Sans '; font-size: 10pt ; " > <br /> < / p>
+<p align = "justify" style = " margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; " > <span style=" font-family:'Sans'; font-size:10pt;"> Wenn Sie Ihr Oximeter an </ span> <span style = " font-family starten Sie die Aufnahme -Modus: " Sans '; font-size : 10pt ; font- style: italic ; " > genau </ span> <span style=" font [...]
+<p align = "justify" style = " -qt- Absatz -type: leer, margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; font-family: " Sans '; font-size: 10pt ; " > <br /> < / p>
+<p align = "justify" style = " margin-top : 0px ; margin-bottom: 0px ; margin-left: 0px ; margin-right : 0px ; -qt- Block -indent : 0; text-indent : 0px ; " > <span style=" font-family:'Sans'; font-size:10pt;"> die Serienimportvorgangdauert die Startzeit von den letzten Nächten CPAP ersten Sitzung. (Denken Sie daran , zuerst Ihre CPAP -Daten importieren ! ) </ Span> </ p> < / body> < / html></translation>
+    </message>
+    <message>
+        <source>Started Using</source>
+        <translation>Erste Schritte mit</translation>
+    </message>
+    <message>
+        <source>Sourceforge hosts this project for free.. Please be considerate of their resources..</source>
+        <translation>Sourceforge hält dieses Projekt kostenlos .. Mit Rücksicht auf ihre Ressourcen ..</translation>
+    </message>
+    <message>
+        <source>Default display height of graphs in pixels</source>
+        <translation>Standardanzeige Höhe von Diagrammen in Pixel</translation>
+    </message>
+    <message>
+        <source>Leak calcs</source>
+        <translation>Berechnung der Leck</translation>
+    </message>
+    <message>
+        <source>Overlay Flags</source>
+        <translation>Übersichtsbezeichnung</translation>
+    </message>
+    <message>
+        <source>Confirmation</source>
+        <translation type="vanished">Bestätigung</translation>
+    </message>
+    <message>
+        <source>Makes certain plots look more "square waved".</source>
+        <translation>Macht bestimmte Abschnitte vom Aussehen her "schwenkbar".</translation>
+    </message>
+    <message>
+        <source>Flag changes in oximetry stats</source>
+        <translation type="vanished">Bezeichnungsveränderungen in Oxymetrie Statistik</translation>
+    </message>
+    <message>
+        <source>Percentage drop in oxygen saturation</source>
+        <translation>Prozentualer Abfall der Sauerstoffsättigung</translation>
+    </message>
+    <message>
+        <source>&General</source>
+        <translation>&Allgemein</translation>
+    </message>
+    <message>
+        <source>Keep session data in memory to speed up revisiting days.</source>
+        <translation>Halten Sie Sitzungsdaten im Speicher um die Wiederanzeige der Tage zu beschleunigen.</translation>
+    </message>
+    <message>
+        <source>If you need to conserve disk space, please remember to carry out manual backups.</source>
+        <translation>Wenn Sie Speicherplatz sparen müssen, denken Sie bitte daran, manuelle Backups zu erstellen.</translation>
+    </message>
+    <message>
+        <source>Link Oximetry and CPAP graphs</source>
+        <translation>Link-Oxymetrie und CPAP Diagramme</translation>
+    </message>
+    <message>
+        <source>Compress SD Card Backups (slower first import, but makes backups smaller)</source>
+        <translation>Komprimieren der Backups auf der SD-Karte (langsamer beim ersten Import, aber macht Backups kleiner)</translation>
+    </message>
+    <message>
+        <source>Don't show any compliance information</source>
+        <translation>Keine Gewährungsinformationen mehr anzeigen</translation>
+    </message>
+    <message>
+        <source>Normal Average</source>
+        <translation>Normaler Durchschnitt</translation>
+    </message>
+    <message>
+        <source>A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.
+
+Are you sure you want to make these changes?</source>
+        <translation>Ein Daten Reindizierung proceedure ist erforderlich, um diese Änderungen zu übernehmen. Dieser Vorgang kann einige Minuten dauern.
+
+Sind Sie sicher, dass Sie diese Änderungen vornehmen wollen?</translation>
+    </message>
+    <message>
+        <source>Don't touch this unless you know your CPAP clock is out.
+Try to sync it to your PC's clock (which should be synced to a timeserver)</source>
+        <translation>Wählen Sie diese, wenn Sie wissen, dass Ihre CPAP Uhr aus ist.
+Versuchen Sie mit Ihrer PC-Uhr zu synchronisieren (was im Zeitserver synchronisiert werden sollte)</translation>
+    </message>
+    <message>
+        <source>Preferred Calculation Methods</source>
+        <translation>Bevorzugte Berechnungsmethoden</translation>
+    </message>
+    <message>
+        <source>Statistical Model</source>
+        <translation>Statistische Modelle</translation>
+    </message>
+    <message>
+        <source>Double click on the (Y-axis) min/max values to edit them</source>
+        <translation type="vanished">Klicken Sie doppelt auf die (Y-Achse) min / max-Werte, um sie zu bearbeiten</translation>
+    </message>
+    <message>
+        <source>Graph Tooltips</source>
+        <translation>Diagramm Tooltips</translation>
+    </message>
+    <message>
+        <source>Custom User Event Flagging</source>
+        <translation>Individuelles Benutzerereignis kennzeichnen</translation>
+    </message>
+    <message>
+        <source>milliseconds</source>
+        <translation>millisekunden</translation>
+    </message>
+    <message>
+        <source>&Oximetry</source>
+        <translation>&Oxymetrie</translation>
+    </message>
+    <message>
+        <source>CPAP Clock Drift</source>
+        <translation>CPAP Wecker benutzen</translation>
+    </message>
+    <message>
+        <source>Square Wave Plots</source>
+        <translation>Quadratwelle-Anschläge</translation>
+    </message>
+    <message>
+        <source>TextLabel</source>
+        <translation>Textlabel</translation>
+    </message>
+    <message>
+        <source>Application Fonts</source>
+        <translation>Anwendungs Schriften</translation>
+    </message>
+    <message>
+        <source>Application</source>
+        <translation>Anwendung</translation>
+    </message>
+    <message>
+        <source>Line Thickness</source>
+        <translation>Linienstärke</translation>
+    </message>
+    <message>
+        <source>Use RDI instead of AHI (PRS1 only)</source>
+        <translation>Verwenden Sie anstelle von RDI AHI (nur PRS1)</translation>
+    </message>
+    <message>
+        <source>Do not import sessions older than:</source>
+        <translation>Keine älteren als diese Sitzung importieren:</translation>
+    </message>
+    <message>
+        <source>Sessions older than this date will not be imported</source>
+        <translation>Sitzungen älter als dieses Datum werden nicht importiert</translation>
+    </message>
+    <message>
+        <source>dd MMMM yyyy</source>
+        <translation>dd MMMM yyyy</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON)</source>
+        <translation type="vanished">Während des Imports SD-Karten Backup erstellen (Dies ist für ResMed und FP ICON ziemlich wichtig)</translation>
+    </message>
+    <message>
+        <source>User definable threshold considered large leak</source>
+        <translation>Frei definierbare Schwelle als großes Leck</translation>
+    </message>
+    <message>
+        <source> L/min</source>
+        <translation> L/min</translation>
+    </message>
+    <message>
+        <source>Whether to show the leak redline in the leak graph</source>
+        <translation>Ob die Leck rote Linie im Leck Graphen angezeigt werden soll</translation>
+    </message>
+    <message>
+        <source>Show Leak Redline</source>
+        <translation>Zeige Leck rote Linie</translation>
+    </message>
+    <message>
+        <source>Oximetery Settings</source>
+        <translation>Oximetereinstellungen</translation>
+    </message>
+    <message>
+        <source>Contec CMS50D+</source>
+        <translation type="vanished">Contec CMS50D+</translation>
+    </message>
+    <message>
+        <source>Contec CMS50E/F</source>
+        <translation type="vanished">Contec CMS50E/F</translation>
+    </message>
+    <message>
+        <source>Contec CMS50F v3.7</source>
+        <translation type="vanished">Contec CMS50F v3.7</translation>
+    </message>
+    <message>
+        <source>Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.</source>
+        <translation>Das Abschalten der automatischen Backups ist keine gute Idee, weil SleepyHead Dieses braucht, um die Datenbank neu zu erstellen, wenn Fehler gefunden wurden.</translation>
+    </message>
+    <message>
+        <source>Are you really sure you want to do this?</source>
+        <translation>Sind Sie wirklich sicher, dass Sie das tun wollen?</translation>
+    </message>
+    <message>
+        <source>Show in Event Breakdown Piechart</source>
+        <translation>Die Ereignispannen als Kreisdiagramm anzeigen</translation>
+    </message>
+    <message>
+        <source>#1</source>
+        <translation>#1</translation>
+    </message>
+    <message>
+        <source>#2</source>
+        <translation>#2</translation>
+    </message>
+    <message>
+        <source>This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.</source>
+        <translation>Diese experimentelle Option versucht, das Markieren von Ereignis-System zu verwenden, um von SleepyHead erkannte Geräteereignisse in ihrerPositionierung zu verbessern.</translation>
+    </message>
+    <message>
+        <source>Resync Machine Detected Events (Experimental)</source>
+        <translation>Nach der Resynchronisierung des Gerätes erfasste Ereignisse (experimentell)</translation>
+    </message>
+    <message>
+        <source>Summary only data is more accurate for ResMed users if this is left on.</source>
+        <translation>Nur zusammengefasste Daten sind genauer für ResMed Benutzer, wenn dieser nach links auf.</translation>
+    </message>
+    <message>
+        <source>Don't Split Summary Days</source>
+        <translation>Kein gesplitteten Übersichttage</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (Turn this off at your own peril!)</source>
+        <translation>Erstellen Sie ein SD-Karten Backup während des Imports (Deaktivieren Sie dieses auf eigene Gefahr!)</translation>
+    </message>
+    <message>
+        <source>C&hannels</source>
+        <translation type="vanished">K&anäle</translation>
+    </message>
+    <message>
+        <source>Reset &Defaults</source>
+        <translation>Zurücksetzen &Standardwerte</translation>
+    </message>
+    <message>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></source>
+        <translation><html><head/><body><p><span style=" font-weight:600;">Warnung: </span>Nur weil Sie können, bedeutet das nicht,dass es eine gute Übung ist.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Show flags for machine detected events that haven't been identified yet.</source>
+        <translation>Erfasste Ereignissflaggen vom Gerät, die noch nicht identifiziert wurden.</translation>
+    </message>
+    <message>
+        <source>Show Unknown Flags</source>
+        <translation>Unbekannte Flaggen zeigen</translation>
+    </message>
+    <message>
+        <source>Span Events</source>
+        <translation type="vanished">Spanne des Ereignisses</translation>
+    </message>
+    <message>
+        <source>Flags</source>
+        <translation type="vanished">Flaggen</translation>
+    </message>
+    <message>
+        <source>Minor Flags</source>
+        <translation type="vanished">Kleine Flaggen</translation>
+    </message>
+    <message>
+        <source>Waveforms</source>
+        <translation>Wellenformen</translation>
+    </message>
+    <message>
+        <source>Data Channels</source>
+        <translation type="vanished">Datenkanäle</translation>
+    </message>
+    <message>
+        <source>Settings Channels</source>
+        <translation type="vanished">Einstellungskanäle</translation>
+    </message>
+    <message>
+        <source>Unknown Channels</source>
+        <translation type="vanished">unbekannte Kanäle</translation>
+    </message>
+    <message>
+        <source>Name</source>
+        <translation>Name</translation>
+    </message>
+    <message>
+        <source>Color</source>
+        <translation>Farbe</translation>
+    </message>
+    <message>
+        <source>Label</source>
+        <translation>Aufschrift</translation>
+    </message>
+    <message>
+        <source>Events</source>
+        <translation type="unfinished">Ereignisse</translation>
+    </message>
+    <message>
+        <source>Flag rapid changes in oximetry stats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Other oximetry options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag SPO2 Desaturations Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Discard segments under</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag Pulse Rate Above</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag Pulse Rate Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Contec CMS50D+/E/F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Contec CMS50F v3.7+</source>
+        <translation type="unfinished">Contec CMS50F v3.7+ {50F?}</translation>
+    </message>
+    <message>
+        <source>ChoiceMMed MD300W1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>ResMed S9 Oximeter Module</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Update Oximeter Clock during import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Import without nagging</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Minor Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Span</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Always Minor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Flag Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CPAP Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximeter Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Positional Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sleep Stage Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Double click to change the descriptive name this channel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Double click to change the default color for this channel plot/flag/data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Here you can change the type of flag shown for this event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This is the short-form label to indicate this channel on screen.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>This is a description of what this channel does.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Upper</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CPAP Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximeter Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Positional Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Sleep Stage Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Top Markers</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ProfileSelect</name>
+    <message>
+        <source>Double Checking:
+
+Do you really want "%1" profile to be obliterated?</source>
+        <translation type="vanished">Doppelprüfung :
+
+Wollen Sie wirklich das "%1"-Profil, löschen?</translation>
+    </message>
+    <message>
+        <source>&Quit</source>
+        <translation>&Beenden</translation>
+    </message>
+    <message>
+        <source>Create a new user profile.</source>
+        <translation>Erstellen Sie ein neues Benutzerprofil.</translation>
+    </message>
+    <message>
+        <source>Meheh... If your trying to delete because you forgot the password, your going the wrong way about it. Read the docs.
+
+Signed: Nasty Programmer</source>
+        <translation type="vanished">Moment ... Wenn Sie versuchen zu löschen, weil Sie das Passwort vergessen haben, ist das nicht richtig. Lesen Sie die Dokumentation.
+
+Unterzeichnet: Nasty Programmer</translation>
+    </message>
+    <message>
+        <source>[data directory]</source>
+        <translation>[Datenverzeichnis]</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to trash the profile "%1"?</source>
+        <translation type="vanished">Sind Sie sicher, dass Sie das Profil löschen wollen "%1"?</translation>
+    </message>
+    <message>
+        <source>Open Profile</source>
+        <translation>Profil Öffnen</translation>
+    </message>
+    <message>
+        <source>Edit Profile</source>
+        <translation>Profil bearbeiten</translation>
+    </message>
+    <message>
+        <source>The current location of SleepyHead data store.</source>
+        <translation>Der aktuelle Ort des SleepyHead Datenspeichers.</translation>
+    </message>
+    <message>
+        <source>Incorrect Password</source>
+        <translation>Inkorrektes Passwort</translation>
+    </message>
+    <message>
+        <source>Choose a different SleepyHead data folder.</source>
+        <translation>Wählen Sie einen anderen SleepyHead Datenordner aus.</translation>
+    </message>
+    <message>
+        <source>WTH???</source>
+        <translation type="vanished">WTH???</translation>
+    </message>
+    <message>
+        <source>Enter Password for %1</source>
+        <translation>Passwort eingeben für %1</translation>
+    </message>
+    <message>
+        <source>New Profile</source>
+        <translation>Neues Profil</translation>
+    </message>
+    <message>
+        <source>&Different Folder</source>
+        <translation>&Anderen Ordner</translation>
+    </message>
+    <message>
+        <source>There was an error deleting the profile directory.. You need to manually remove %1</source>
+        <translation type="vanished">Es gab einen Fehler beim Löschen des Profil- Verzeichnises .. Sie müssen es manuell entfernen %1</translation>
+    </message>
+    <message>
+        <source>&Select User</source>
+        <translation>&Zum ausgewählten Benutzer</translation>
+    </message>
+    <message>
+        <source>Okay, I am about to totally OBLITERATE the profile "%1" and all it's contained data..
+
+Don't say you weren't warned. :-p</source>
+        <translation type="vanished">Okay, ich bin einverstanden das Profil "%1" und alle enthaltenen Daten völlig zu löschen ..
+
+Sagen Sie nicht, dass Sie nicht gewarnt wurden. :-p</translation>
+    </message>
+    <message>
+        <source>Start with the selected user profile.</source>
+        <translation>Beginnen Sie mit dem ausgewählten Benutzerprofil.</translation>
+    </message>
+    <message>
+        <source>If you can read this you need to delete this profile directory manually (It's under %1)</source>
+        <translation type="vanished">Wenn Sie Dies lesen müssen Sie das Profil-Verzeichnis manuell löschen (es ist unter %1)</translation>
+    </message>
+    <message>
+        <source>Click here if you didn't want to start SleepyHead.</source>
+        <translation>Klicken Sie hier, wenn Sie nicht wollen, das Sleepyhead startet.</translation>
+    </message>
+    <message>
+        <source>Delete Profile</source>
+        <translation>Profil löschen</translation>
+    </message>
+    <message>
+        <source>Select Profile</source>
+        <translation>Wählen Sie ein Profil aus</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">Frage</translation>
+    </message>
+    <message>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <source>[version]</source>
+        <translation>(Version)</translation>
+    </message>
+    <message>
+        <source>You entered the password wrong too many times.</source>
+        <translation>Sie haben zu oft das falsche Kennwort eingegeben.</translation>
+    </message>
+    <message>
+        <source>Enter Password</source>
+        <translation>Passwort eingeben</translation>
+    </message>
+    <message>
+        <source>Folder:</source>
+        <translation>Ordner:</translation>
+    </message>
+    <message>
+        <source>Whoops.</source>
+        <translation type="vanished">Hoppla.</translation>
+    </message>
+    <message>
+        <source>You entered an Incorrect Password too many times. Exiting!</source>
+        <translation>Sie haben zu oft ein falsches Passwort eingegeben. Verlassen!</translation>
+    </message>
+    <message>
+        <source>Search:</source>
+        <translation>Suche:</translation>
+    </message>
+    <message>
+        <source>You are about to destroy profile '%1'.</source>
+        <translation>Sie sind dabei, das Profil zu zerstören '%1'.</translation>
+    </message>
+    <message>
+        <source>Enter the word DELETE below to confirm.</source>
+        <translation>Um fortzufahren bestätigen Sie unten das Wort LÖSCHEN.</translation>
+    </message>
+    <message>
+        <source>Sorry</source>
+        <translation>Entschuldigung</translation>
+    </message>
+    <message>
+        <source>You need to enter DELETE in capital letters.</source>
+        <translation>Sie müssen DELETE in Großbuchstaben eingeben.</translation>
+    </message>
+    <message>
+        <source>Could not open profile.. You will need to delete this profile directory manually</source>
+        <translation>Kann Profil nicht öffnen .. Sie sollten das Profil-Verzeichnis manuell löschen</translation>
+    </message>
+    <message>
+        <source>You will find it under the following location:</source>
+        <translation>Sie finden es unter der folgenden Position:</translation>
+    </message>
+    <message>
+        <source>You entered an incorrect password</source>
+        <translation>Sie haben ein falsches Passwort eingegeben</translation>
+    </message>
+    <message>
+        <source>If you're trying to delete because you forgot the password, you need to delete it manually.</source>
+        <translation>Wenn Sie versuchen das Profil zu löschen, weil Sie Ihr Passwort vergessen haben, müssen Sie es manuell löschen.</translation>
+    </message>
+    <message>
+        <source>There was an error deleting the profile directory, you need to manually remove it.</source>
+        <translation>Es gab einen Fehler beim Löschen des Profil-Verzeichnisses, sie müssen es manuell entfernen.</translation>
+    </message>
+    <message>
+        <source>Profile '%1' was succesfully deleted</source>
+        <translation>Profil '%1' wurde erfolgreich gelöscht</translation>
+    </message>
+    <message>
+        <source>Create new profile</source>
+        <translation>Neues Profil erstellen</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <source>"</source>
+        <translation>"</translation>
+    </message>
+    <message>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <source>A</source>
+        <translation>A</translation>
+    </message>
+    <message>
+        <source>H</source>
+        <translation>H</translation>
+    </message>
+    <message>
+        <source>P</source>
+        <translation>P</translation>
+    </message>
+    <message>
+        <source>??</source>
+        <translation type="vanished">??</translation>
+    </message>
+    <message>
+        <source>AI</source>
+        <translation>AI</translation>
+    </message>
+    <message>
+        <source>CA</source>
+        <translation>CA</translation>
+    </message>
+    <message>
+        <source>EP</source>
+        <translation>EP</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation>FL</translation>
+    </message>
+    <message>
+        <source>HI</source>
+        <translation>HI</translation>
+    </message>
+    <message>
+        <source>IE</source>
+        <translation>IE</translation>
+    </message>
+    <message>
+        <source>LE</source>
+        <translation>LE</translation>
+    </message>
+    <message>
+        <source>LL</source>
+        <translation>LL</translation>
+    </message>
+    <message>
+        <source>Kg</source>
+        <translation>kg</translation>
+    </message>
+    <message>
+        <source>O2</source>
+        <translation>O2</translation>
+    </message>
+    <message>
+        <source>OA</source>
+        <translation>OA</translation>
+    </message>
+    <message>
+        <source>NR</source>
+        <translation>NR</translation>
+    </message>
+    <message>
+        <source>PB</source>
+        <translation>PB</translation>
+    </message>
+    <message>
+        <source>PC</source>
+        <translation>PC</translation>
+    </message>
+    <message>
+        <source>PP</source>
+        <translation>PP</translation>
+    </message>
+    <message>
+        <source>PS</source>
+        <translation>PS</translation>
+    </message>
+    <message>
+        <source>On</source>
+        <translation>An</translation>
+    </message>
+    <message>
+        <source>RE</source>
+        <translation>RE</translation>
+    </message>
+    <message>
+        <source>SA</source>
+        <translation>SA</translation>
+    </message>
+    <message>
+        <source>SD</source>
+        <translation>SD</translation>
+    </message>
+    <message>
+        <source>UA</source>
+        <translation>UA</translation>
+    </message>
+    <message>
+        <source>VS</source>
+        <translation>VS</translation>
+    </message>
+    <message>
+        <source>cm</source>
+        <translation>cm</translation>
+    </message>
+    <message>
+        <source>ft</source>
+        <translation>ft</translation>
+    </message>
+    <message>
+        <source>hz</source>
+        <translation type="vanished">hz</translation>
+    </message>
+    <message>
+        <source>lb</source>
+        <translation>lb</translation>
+    </message>
+    <message>
+        <source>oz</source>
+        <translation>oz</translation>
+    </message>
+    <message>
+        <source>0-1</source>
+        <translation type="vanished">0=offen, 1=zu</translation>
+    </message>
+    <message>
+        <source>90%</source>
+        <translation>90%</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation>AHI</translation>
+    </message>
+    <message>
+        <source>ASV</source>
+        <translation>ASV</translation>
+    </message>
+    <message>
+        <source>BMI</source>
+        <translation>BMI</translation>
+    </message>
+    <message>
+        <source>CAI</source>
+        <translation>CAI</translation>
+    </message>
+    <message>
+        <source>Apr</source>
+        <translation>Apr</translation>
+    </message>
+    <message>
+        <source>Aug</source>
+        <translation>Aug</translation>
+    </message>
+    <message>
+        <source>Avg</source>
+        <translation>Gem</translation>
+    </message>
+    <message>
+        <source>DOB</source>
+        <translation>Geburtsdatum</translation>
+    </message>
+    <message>
+        <source>Bpm</source>
+        <translation type="vanished">Bpm</translation>
+    </message>
+    <message>
+        <source>EPI</source>
+        <translation>EPI</translation>
+    </message>
+    <message>
+        <source>Dec</source>
+        <translation>Dez</translation>
+    </message>
+    <message>
+        <source>FLI</source>
+        <translation>FLI</translation>
+    </message>
+    <message>
+        <source>End</source>
+        <translation>Ende</translation>
+    </message>
+    <message>
+        <source>Feb</source>
+        <translation>Feb</translation>
+    </message>
+    <message>
+        <source>L/m</source>
+        <translation type="vanished">L/m</translation>
+    </message>
+    <message>
+        <source>Jan</source>
+        <translation>Jan</translation>
+    </message>
+    <message>
+        <source>Jul</source>
+        <translation>Jul</translation>
+    </message>
+    <message>
+        <source>Jun</source>
+        <translation>Jun</translation>
+    </message>
+    <message>
+        <source>NRI</source>
+        <translation>NRI</translation>
+    </message>
+    <message>
+        <source>Mar</source>
+        <translation>März</translation>
+    </message>
+    <message>
+        <source>Max</source>
+        <translation>Max</translation>
+    </message>
+    <message>
+        <source>May</source>
+        <translation>Mai</translation>
+    </message>
+    <message>
+        <source>Med</source>
+        <translation>Med</translation>
+    </message>
+    <message>
+        <source>Min</source>
+        <translation>Min</translation>
+    </message>
+    <message>
+        <source>Nov</source>
+        <translation>Nov</translation>
+    </message>
+    <message>
+        <source>Oct</source>
+        <translation>Okt</translation>
+    </message>
+    <message>
+        <source>Off</source>
+        <translation>Aus</translation>
+    </message>
+    <message>
+        <source>RDI</source>
+        <translation>RDI</translation>
+    </message>
+    <message>
+        <source>REI</source>
+        <translation>REI</translation>
+    </message>
+    <message>
+        <source>UAI</source>
+        <translation>UAI</translation>
+    </message>
+    <message>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <source>UF3</source>
+        <translation>UF3</translation>
+    </message>
+    <message>
+        <source>Sep</source>
+        <translation>Sep</translation>
+    </message>
+    <message>
+        <source>VS2</source>
+        <translation>VS2</translation>
+    </message>
+    <message>
+        <source>bpm</source>
+        <translation>bpm</translation>
+    </message>
+    <message>
+        <source>ÇSR</source>
+        <translation>CSR</translation>
+    </message>
+    <message>
+        <source>APAP</source>
+        <translation>APAP</translation>
+    </message>
+    <message>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <source>Min EPAP</source>
+        <translation>Min EPAP</translation>
+    </message>
+    <message>
+        <source>EPAP</source>
+        <translation>EPAP</translation>
+    </message>
+    <message>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <source>Min IPAP</source>
+        <translation>Min. IPAP</translation>
+    </message>
+    <message>
+        <source>IPAP</source>
+        <translation>IPAP</translation>
+    </message>
+    <message>
+        <source>Last</source>
+        <translation>Letzte Verwendung</translation>
+    </message>
+    <message>
+        <source>Leak</source>
+        <translation>Leck</translation>
+    </message>
+    <message>
+        <source>Mode</source>
+        <translation>Modus</translation>
+    </message>
+    <message>
+        <source>Name</source>
+        <translation>Name</translation>
+    </message>
+    <message>
+        <source>None</source>
+        <translation>Keiner</translation>
+    </message>
+    <message>
+        <source>RERA</source>
+        <translation>RERA</translation>
+    </message>
+    <message>
+        <source>SpO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <source>Resp. Event</source>
+        <translation>Resp. Ereignis</translation>
+    </message>
+    <message>
+        <source>Inclination</source>
+        <translation>Neigung</translation>
+    </message>
+    <message>
+        <source>About SleepyHead</source>
+        <translation>Über SleepyHead</translation>
+    </message>
+    <message>
+        <source>Therapy Pressure</source>
+        <translation>Therapiedruck</translation>
+    </message>
+    <message>
+        <source>BiPAP</source>
+        <translation>BiPAP</translation>
+    </message>
+    <message>
+        <source>Brand</source>
+        <translation>Marke</translation>
+    </message>
+    <message>
+        <source>Daily</source>
+        <translation>Täglich</translation>
+    </message>
+    <message>
+        <source>Email</source>
+        <translation>E-mail</translation>
+    </message>
+    <message>
+        <source>Error</source>
+        <translation>Fehler</translation>
+    </message>
+    <message>
+        <source>First</source>
+        <translation>Erste Verwendung</translation>
+    </message>
+    <message>
+        <source>Ramp Pressure</source>
+        <translation>Rampen Druck</translation>
+    </message>
+    <message>
+        <source>L/min</source>
+        <translation>L/min</translation>
+    </message>
+    <message>
+        <source>Hours</source>
+        <translation>Stunden</translation>
+    </message>
+    <message>
+        <source>Leaks</source>
+        <translation>Lecks</translation>
+    </message>
+    <message>
+        <source>Model</source>
+        <translation>Model</translation>
+    </message>
+    <message>
+        <source>Phone</source>
+        <translation>Telefon</translation>
+    </message>
+    <message>
+        <source>Ready</source>
+        <translation>Bereit</translation>
+    </message>
+    <message>
+        <source>W-Avg</source>
+        <translation>W-Durchschnitt</translation>
+    </message>
+    <message>
+        <source>Snore</source>
+        <translation>Schnarchen</translation>
+    </message>
+    <message>
+        <source>Start</source>
+        <translation>Start</translation>
+    </message>
+    <message>
+        <source>Usage</source>
+        <translation>Verwendung</translation>
+    </message>
+    <message>
+        <source>Respiratory Disturbance Index</source>
+        <translation>Atem-Störungs-Verzeichnis</translation>
+    </message>
+    <message>
+        <source>cmH2O</source>
+        <translation>cmH2O</translation>
+    </message>
+    <message>
+        <source>Pressure Support</source>
+        <translation>Druckunterstützung</translation>
+    </message>
+    <message>
+        <source>Hypopnea</source>
+        <translation>Hypopnoe</translation>
+    </message>
+    <message>
+        <source>ratio</source>
+        <translation>Verhältnis</translation>
+    </message>
+    <message>
+        <source>Tidal Volume</source>
+        <translation>AZV</translation>
+    </message>
+    <message>
+        <source>Entire Day</source>
+        <translation>Ganzer Tag</translation>
+    </message>
+    <message>
+        <source>Heart rate in beats per minute</source>
+        <translation>Die Herzfrequenz in Schlägen pro Minute</translation>
+    </message>
+    <message>
+        <source>A large mask leak affecting machine performance.</source>
+        <translation>Eine zu große Maske beeinflußt die Geräteleistung.</translation>
+    </message>
+    <message>
+        <source>An restriction in breathing from normal, causing a flattening of the flow waveform.</source>
+        <translation>Eine Einschränkung bei der normalen Atmung, was zu einer Abflachung der Strömungswellenform führt.</translation>
+    </message>
+    <message>
+        <source>Pat. Trig. Breath</source>
+        <translation>Pat. Trig. Atem</translation>
+    </message>
+    <message>
+        <source>Ramp Delay Period</source>
+        <translation>Rampen-Verzögerungszeit</translation>
+    </message>
+    <message>
+        <source>Purge Failed</source>
+        <translation type="vanished">Bereinigen fehlgeschlagen</translation>
+    </message>
+    <message>
+        <source>Pulse Change</source>
+        <translation>Impulsänderung</translation>
+    </message>
+    <message>
+        <source>Sleep Stage</source>
+        <translation>Schlafstadium</translation>
+    </message>
+    <message>
+        <source>Would you like me to purge this data this for you so you can run the new version?</source>
+        <translation type="vanished">Soll das Programm diese Daten für Sie reinigen, so dass Sie die neue Version benutzen können?</translation>
+    </message>
+    <message>
+        <source>Minute Vent.</source>
+        <translation>Minuten Vent.</translation>
+    </message>
+    <message>
+        <source>Respiratory Effort Related Arousal</source>
+        <translation>Atemanstrengung bei Erregung</translation>
+    </message>
+    <message>
+        <source>SpO2 Drop</source>
+        <translation>SpO2-Tropfen</translation>
+    </message>
+    <message>
+        <source>SensAwake feature will reduce pressure when waking is detected.</source>
+        <translation>(SensAwake Funktion) wird den Druck reduzieren, wenn die Funktion erkennt, dass Sie wachwerden.</translation>
+    </message>
+    <message>
+        <source>Upright angle in degrees</source>
+        <translation>Bis rechten Winkel in Grad</translation>
+    </message>
+    <message>
+        <source>Higher Expiratory Pressure</source>
+        <translation>Höherer Expirationsdruck</translation>
+    </message>
+    <message>
+        <source>Nasal Pillows</source>
+        <translation>Nasenpolster</translation>
+    </message>
+    <message>
+        <source>SleepyHead has finished sending the job to the printer.</source>
+        <translation>SleepyHead hat den Auftrag an den Drucker gesendet.</translation>
+    </message>
+    <message>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation>NRI=%1 LKI=%2 EPI=%3</translation>
+    </message>
+    <message>
+        <source>&Close</source>
+        <translation>&Schließen</translation>
+    </message>
+    <message>
+        <source>A vibratory snore</source>
+        <translation>Eine Schnarchvibration</translation>
+    </message>
+    <message>
+        <source>Vibratory Snore</source>
+        <translation>Schnarchvibration</translation>
+    </message>
+    <message>
+        <source>Lower Inspiratory Pressure</source>
+        <translation>Niedrigster Inspirationsdruck</translation>
+    </message>
+    <message>
+        <source>You did not select a directory.
+
+SleepyHead will now start with your old one.
+
+</source>
+        <translation type="vanished">Sie haben kein Verzeichnis ausgewählt.
+
+SleepyHead wird nun mit Ihren alten Daten starten.</translation>
+    </message>
+    <message>
+        <source>Resp. Rate</source>
+        <translation>Resp. Rate</translation>
+    </message>
+    <message>
+        <source>Insp. Time</source>
+        <translation>Insp. Zeit</translation>
+    </message>
+    <message>
+        <source>Exp. Time</source>
+        <translation>Exp. Zeit</translation>
+    </message>
+    <message>
+        <source>Import Error</source>
+        <translation>Import Fehler</translation>
+    </message>
+    <message>
+        <source>Machine</source>
+        <translation>Gerät</translation>
+    </message>
+    <message>
+        <source>A sudden (user definable) drop in blood oxygen saturation</source>
+        <translation>Ein plötzlicher (frei definierbarer) Abfall der Blutsauerstoffsättigung</translation>
+    </message>
+    <message>
+        <source>As you did not select a data folder, SleepyHead will exit.
+
+Next time you run, you will be asked again.</source>
+        <translation type="vanished">Wenn Sie keinen Datenordner auswählen, wird Sleepyhead geschlossen.
+
+Wenn sie das nächste Mal starten, werden Sie wieder gefragt.</translation>
+    </message>
+    <message>
+        <source>Nasal Interface</source>
+        <translation>Nasen Schnittstelle</translation>
+    </message>
+    <message>
+        <source>There are no graphs visible to print</source>
+        <translation>Im Druck sind keine Diagramme sichtbar</translation>
+    </message>
+    <message>
+        <source>Target Vent.</source>
+        <translation>Ziel Vent.</translation>
+    </message>
+    <message>
+        <source>An apnea that could not fit into a category</source>
+        <translation>Ein Apnoe ohne Kategorie</translation>
+    </message>
+    <message>
+        <source>Sleep position in degrees</source>
+        <translation>Schlafposition in Grad</translation>
+    </message>
+    <message>
+        <source>minutes</source>
+        <translation type="vanished">minuten</translation>
+    </message>
+    <message>
+        <source>This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>.</source>
+        <translation>Dieser Bericht wurde von einer Pre-Release-Version von Sleepyhead (%1) erzeugt, <b> und eignet sich in keiner Weise für medizinische Diagnosezwecke. </ b>.</translation>
+    </message>
+    <message>
+        <source>Periodic Breathing</source>
+        <translation>Regelmäßige Atmung</translation>
+    </message>
+    <message>
+        <source>Ramp Time</source>
+        <translation>Rampenzeit</translation>
+    </message>
+    <message>
+        <source>Unintentional Leaks</source>
+        <translation>Unbeabsichtigte Lecks</translation>
+    </message>
+    <message>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation>Möchten Sie die Lesezeichen Bereiche in diesem Bericht anzeigen?</translation>
+    </message>
+    <message>
+        <source>Apnea Hypopnea Index</source>
+        <translation>Apnoe-Hypopnoe-Index</translation>
+    </message>
+    <message>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation>Dieser Vorgang nimmt einige Zeit in Anspruch ..
+Bitte warten Sie, bis er abgeschlossen ist.</translation>
+    </message>
+    <message>
+        <source>Patient Triggered Breaths</source>
+        <translation>Durch Patienten ausgelöste Atemzüge</translation>
+    </message>
+    <message>
+        <source>No Waveform Available</source>
+        <translation type="vanished">Kein Wellenform verfügbar</translation>
+    </message>
+    <message>
+        <source>Events</source>
+        <translation>Ereignisse</translation>
+    </message>
+    <message>
+        <source>(% %1 in events)</source>
+        <translation>(% %1 der Ereignisse)</translation>
+    </message>
+    <message>
+        <source>No Data</source>
+        <translation>Keine Daten</translation>
+    </message>
+    <message>
+        <source>Page %1 of %2</source>
+        <translation>Seite %1 von %2</translation>
+    </message>
+    <message>
+        <source>Median</source>
+        <translation>Mittlere</translation>
+    </message>
+    <message>
+        <source>PS Max</source>
+        <translation>PS Max</translation>
+    </message>
+    <message>
+        <source>PS Min</source>
+        <translation>PS Min</translation>
+    </message>
+    <message>
+        <source>Full-Face Mask</source>
+        <translation>Nase-Mund Maske</translation>
+    </message>
+    <message>
+        <source>Flow Limit.</source>
+        <translation>Fließgrenze.</translation>
+    </message>
+    <message>
+        <source>Choose or create new folder for SleepyHead data</source>
+        <translation>Wählen Sie oder erstellen Sie einen neuen Ordner für die SleepyHead Daten</translation>
+    </message>
+    <message>
+        <source>Detected mask leakage including natural Mask leakages</source>
+        <translation>Erkannte Masken Lecks einschließlich der natürlichen Maskenlecks</translation>
+    </message>
+    <message>
+        <source>Plethy</source>
+        <translation>Plethy (Ein Gerät zum Bestimmen und Registrieren der Variationen in der Größe oder des Volumens eines Schenkels, der Arm oder Bein, und somit die Variationen in der Menge des Blutes in dem Glied.)</translation>
+    </message>
+    <message>
+        <source>SensAwake</source>
+        <translation>Druckverminderungstechnologie während des Wachwerdens</translation>
+    </message>
+    <message>
+        <source>ST/ASV</source>
+        <translation>ST/ASV</translation>
+    </message>
+    <message>
+        <source>Median Leaks</source>
+        <translation>Mittlere Lecks</translation>
+    </message>
+    <message>
+        <source>%1 Report</source>
+        <translation>%1 Bericht</translation>
+    </message>
+    <message>
+        <source>Pr. Relief</source>
+        <translation>Druckentlastung</translation>
+    </message>
+    <message>
+        <source>Serial</source>
+        <translation>Serien Nummer</translation>
+    </message>
+    <message>
+        <source>A user definable event detected by SleepyHead's flow waveform processor.</source>
+        <translation>Der SleepyHead Flusswellenformprozessor hat ein definierbares Ereignis erkannt.</translation>
+    </message>
+    <message>
+        <source>SpO2 %</source>
+        <translation>SpO2 %</translation>
+    </message>
+    <message>
+        <source>I can automatically purge this data for you, or you can cancel now and continue to run in a previous version.
+
+</source>
+        <translation type="vanished">Das Programm kann diese Daten für Sieautomatisch reinigen, oder Sie können jetzt abbrechen und weiter in einer früheren Version bleiben.
+
+</translation>
+    </message>
+    <message>
+        <source>AHI	%1
+</source>
+        <translation>AHI	%1
+</translation>
+    </message>
+    <message>
+        <source>Weight</source>
+        <translation>Gewicht</translation>
+    </message>
+    <message>
+        <source>Mask Pressure (High resolution)</source>
+        <translation>Maskendruck (hohe Auflösung)</translation>
+    </message>
+    <message>
+        <source>Orientation</source>
+        <translation>Orientierung</translation>
+    </message>
+    <message>
+        <source>Event Flags</source>
+        <translation>Ereignismarkierungen</translation>
+    </message>
+    <message>
+        <source>Zombie</source>
+        <translation>Mir geht es</translation>
+    </message>
+    <message>
+        <source>Bookmarks</source>
+        <translation>Lesezeichen</translation>
+    </message>
+    <message>
+        <source>An apnea where the airway is open</source>
+        <translation>Atemaussetzer obwohl Atemwege offen sind</translation>
+    </message>
+    <message>
+        <source>Flow Limitation</source>
+        <translation>Flusslimitierung</translation>
+    </message>
+    <message>
+        <source>Phone: %1</source>
+        <translation>Telefon: %1</translation>
+    </message>
+    <message>
+        <source>Low Usage Days=%1</source>
+        <translation type="vanished">Wenige Nutzungstage =%1</translation>
+    </message>
+    <message>
+        <source>&Ok, get on with it..</source>
+        <translation>&Ok, weitermachen mit..</translation>
+    </message>
+    <message>
+        <source>SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead</source>
+        <translation>SleepyHead ist eine kostenlose Open-Source-Software von http://sourceforge.net/projects/SleepyHead</translation>
+    </message>
+    <message>
+        <source>RDI	%1
+</source>
+        <translation>RDI	%1
+</translation>
+    </message>
+    <message>
+        <source>I'm sorry to report that SleepyHead can only track hours of use for this machine.</source>
+        <translation>Es tut mir leid, aber SleepyHead kann für dieses Gerät nur Stunden verfolgen.</translation>
+    </message>
+    <message>
+        <source>Flow Rate</source>
+        <translation>Fließrate</translation>
+    </message>
+    <message>
+        <source>Time taken to breathe out</source>
+        <translation>Ausatmungszeit</translation>
+    </message>
+    <message>
+        <source>events</source>
+        <translation type="vanished">Ereignisse</translation>
+    </message>
+    <message>
+        <source>An optical Photo-plethysomogram showing heart rhythm</source>
+        <translation>Eine optische Darstellung vom Herzrhythmus</translation>
+    </message>
+    <message>
+        <source>Sorry, I could not purge this data, which means this version of SleepyHead can't start.. SleepyHead's Data folder needs to be removed manually
+
+This folder currently resides at the following location:
+</source>
+        <translation type="vanished">Entschuldigung, konnte diese Daten nicht löschen, was bedeutet, diese Version von SleepyHead kann nicht starten .. Daten-Ordner von SleepyHead muss manuell entfernt werden
+
+Dieser Ordner befindet sich derzeit an der folgenden Position:</translation>
+    </message>
+    <message>
+        <source>Pr. Min</source>
+        <translation type="vanished">min. Druck</translation>
+    </message>
+    <message>
+        <source>Pr. Max</source>
+        <translation type="vanished">max. Druck</translation>
+    </message>
+    <message>
+        <source>I:E Ratio</source>
+        <translation>I: E-Verhältnis</translation>
+    </message>
+    <message>
+        <source>Amount of air displaced per breath</source>
+        <translation>Luftmenge pro Atemzug verdrängt</translation>
+    </message>
+    <message>
+        <source>Pat. Trig. Breaths</source>
+        <translation>Pat. Trig. Atemzüge</translation>
+    </message>
+    <message>
+        <source>Address</source>
+        <translation>Adresse</translation>
+    </message>
+    <message>
+        <source>Name: %1, %2</source>
+        <translation>Name: %1, %2</translation>
+    </message>
+    <message>
+        <source>Leak Rate</source>
+        <translation>Leckrate</translation>
+    </message>
+    <message>
+        <source>Reporting from %1 to %2</source>
+        <translation>Berichterstattung vom %1 bis %2</translation>
+    </message>
+    <message>
+        <source>Email: %1</source>
+        <translation>E-mail: %1</translation>
+    </message>
+    <message>
+        <source>Inspiratory Pressure</source>
+        <translation>Einatmungsdruck</translation>
+    </message>
+    <message>
+        <source>A pulse of pressure 'pinged' to detect a closed airway.</source>
+        <translation>Ein Druckimpuls um geschlossene Atemwege zu öffnen.</translation>
+    </message>
+    <message>
+        <source>Non Responding Event</source>
+        <translation>Kein Ereignis registriert</translation>
+    </message>
+    <message>
+        <source>Ramp Pr.</source>
+        <translation type="vanished">Anlauf Dr.</translation>
+    </message>
+    <message>
+        <source>Median Leak Rate</source>
+        <translation>Mittlere Leckrate</translation>
+    </message>
+    <message>
+        <source>Rate of breaths per minute</source>
+        <translation>Bewerten der Atemzüge pro Minute</translation>
+    </message>
+    <message>
+        <source>Usage Statistics</source>
+        <translation>Verwendung der Statistik</translation>
+    </message>
+    <message>
+        <source>Graph displaying snore volume</source>
+        <translation>Graphische Anzeige Schnarchvolumen</translation>
+    </message>
+    <message>
+        <source>Max EPAP</source>
+        <translation>Max EPAP</translation>
+    </message>
+    <message>
+        <source>Max IPAP</source>
+        <translation>Max IPAP</translation>
+    </message>
+    <message>
+        <source>(%%1 compliant, defined as > %2 hours)</source>
+        <translation type="vanished">(%%1 konform, definiert als >%2 Stunden)</translation>
+    </message>
+    <message>
+        <source>Bedtime</source>
+        <translation>     Schlafenszeit</translation>
+    </message>
+    <message>
+        <source>No SleepyHead data folder was found.
+
+Would you like SleepyHead to use the default location for storing its data?
+
+</source>
+        <translation type="vanished">Es wurde kein SleepyHead Datenordner gefunden.
+
+Möchten Sie den Sleepyhead Standardordner zum Speichern ihrer Daten verwenden?</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation>Druck</translation>
+    </message>
+    <message>
+        <source>Average</source>
+        <translation>Durchschnitt</translation>
+    </message>
+    <message>
+        <source>Target Minute Ventilation</source>
+        <translation>Zielminutenvolumen</translation>
+    </message>
+    <message>
+        <source>Amount of air displaced per minute</source>
+        <translation>Atemminutenvolumen</translation>
+    </message>
+    <message>
+        <source>Percentage of breaths triggered by patient</source>
+        <translation>Prozentualer Anteil der Atemzüge vom Patienten ausgelöst</translation>
+    </message>
+    <message>
+        <source>Non Data Capable Machine</source>
+        <translation>Gerät nicht Datenfähig</translation>
+    </message>
+    <message>
+        <source>Plethysomogram</source>
+        <translation>Plethysomogramm</translation>
+    </message>
+    <message>
+        <source>Unclassified Apnea</source>
+        <translation>Apnoe ohne Zuordnung</translation>
+    </message>
+    <message>
+        <source>Starting Ramp Pressure</source>
+        <translation>Anlaufdruck</translation>
+    </message>
+    <message>
+        <source>DOB: %1</source>
+        <translation>Geb.-Datum: %1</translation>
+    </message>
+    <message>
+        <source>Intellipap event where you breathe out your mouth.</source>
+        <translation>Intellipap Ereignis, bei der Sie mit dem Mund ausatmen.</translation>
+    </message>
+    <message>
+        <source>Flow Limit</source>
+        <translation>Fließgrenze</translation>
+    </message>
+    <message>
+        <source>UAI=%1 </source>
+        <translation>UAI=%1 </translation>
+    </message>
+    <message>
+        <source>Pulse Rate</source>
+        <translation>Pulsrate</translation>
+    </message>
+    <message>
+        <source>This Machine Record cannot be imported in this profile.
+The Day records overlap with already existing content.</source>
+        <translation>Dieser Gerätedatensatz kann nicht in diesem Profil importiert werden.
+Die Tagessätze überschneiden sich mit bereits vorhandenen Inhalten.</translation>
+    </message>
+    <message>
+        <source>Graph showing running AHI for the past hour</source>
+        <translation>Diagrammanzeige des AHI der letzten Stunde</translation>
+    </message>
+    <message>
+        <source>Graph showing running RDI for the past hour</source>
+        <translation>Diagrammanzeige des RDI der letzten Stunde</translation>
+    </message>
+    <message>
+        <source>seconds</source>
+        <translation type="vanished">Sekunden</translation>
+    </message>
+    <message>
+        <source>Mask Time</source>
+        <translation>Maskenzeit</translation>
+    </message>
+    <message>
+        <source>Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.</source>
+        <translation>Ihr Philips Respironics CPAP-Gerät (Modell%1) ist leider nicht in der Lage ein Datenmodell zu erstellen.</translation>
+    </message>
+    <message>
+        <source>Channel</source>
+        <translation>Kanal</translation>
+    </message>
+    <message>
+        <source>Hybrid F/F Mask</source>
+        <translation>Hybrid F / F-Maske</translation>
+    </message>
+    <message>
+        <source>Max Leaks</source>
+        <translation>Max Lecks</translation>
+    </message>
+    <message>
+        <source>A period of periodic breathing</source>
+        <translation>Zeitraum der wiederkehrenden Atmung</translation>
+    </message>
+    <message>
+        <source>Days=%1</source>
+        <translation type="vanished">Tage=%1</translation>
+    </message>
+    <message>
+        <source>&Donate</source>
+        <translation>&Spenden</translation>
+    </message>
+    <message>
+        <source>Address:</source>
+        <translation>Adresse:</translation>
+    </message>
+    <message>
+        <source>Waketime=%1</source>
+        <translation type="vanished">Aufwachzeit=%1</translation>
+    </message>
+    <message>
+        <source>degrees</source>
+        <translation type="vanished">Grad</translation>
+    </message>
+    <message>
+        <source>User Flag #1</source>
+        <translation>Benutzer Markierung #1</translation>
+    </message>
+    <message>
+        <source>User Flag #2</source>
+        <translation>Benutzer Markierung #2</translation>
+    </message>
+    <message>
+        <source>User Flag #3</source>
+        <translation>Benutzer Markierung #3</translation>
+    </message>
+    <message>
+        <source>A ResMed data source showing Respiratory Events</source>
+        <translation>Die ResMed Datenquelle, der Atem Ereignisse</translation>
+    </message>
+    <message>
+        <source>Bedtime=%1</source>
+        <translation type="vanished">Schlafengehen=%1</translation>
+    </message>
+    <message>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</source>
+        <translation>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</translation>
+    </message>
+    <message>
+        <source>Median rate of detected mask leakage</source>
+        <translation>Mittlere Rate der bemerkten Masken Lecks</translation>
+    </message>
+    <message>
+        <source>Mask Pressure</source>
+        <translation>Maskendruck</translation>
+    </message>
+    <message>
+        <source>A vibratory snore as detcted by a System One machine</source>
+        <translation>Eine Schnarchvibration die durch ein System One endeckt wurde</translation>
+    </message>
+    <message>
+        <source>events/hour</source>
+        <translation type="vanished">Ereignisse/Stunde</translation>
+    </message>
+    <message>
+        <source>Reporting data goes here</source>
+        <translation type="vanished">Die Berichtsdaten befinden sich hier</translation>
+    </message>
+    <message>
+        <source>Respiratory Event</source>
+        <translation>Atem Ereignis</translation>
+    </message>
+    <message>
+        <source>A type of respiratory event that won't respond to a pressure increase.</source>
+        <translation>Eine Art von Atem Ereignis, welches auf keinen Druckanstieg reagiert.</translation>
+    </message>
+    <message>
+        <source>Clear Airway Apnea</source>
+        <translation>Klarer Atemwegsverschluss</translation>
+    </message>
+    <message>
+        <source>Windows User</source>
+        <translation>Windows Benutzer</translation>
+    </message>
+    <message>
+        <source>Unspecified</source>
+        <translation>Unspezifisch</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation>Frage</translation>
+    </message>
+    <message>
+        <source>Higher Inspiratory Pressure</source>
+        <translation>Höchster Inspirationsdruck</translation>
+    </message>
+    <message>
+        <source>Bi-Level</source>
+        <translation>Zweite Ebene</translation>
+    </message>
+    <message>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation>SleepyHead v%1 - http://sleepyhead.sourceforge.net</translation>
+    </message>
+    <message>
+        <source>Unknown</source>
+        <translation>Unbekannt</translation>
+    </message>
+    <message>
+        <source>events/hr</source>
+        <translation type="vanished">Ereignisse/h</translation>
+    </message>
+    <message>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <source>Duration</source>
+        <translation>Dauer</translation>
+    </message>
+    <message>
+        <source>(Sess=%1)</source>
+        <translation type="vanished">(Sess=%1)</translation>
+    </message>
+    <message>
+        <source>Sessions</source>
+        <translation>Sitzungen</translation>
+    </message>
+    <message>
+        <source>Settings</source>
+        <translation>Einstellungen</translation>
+    </message>
+    <message>
+        <source>Overview</source>
+        <translation>Überblick</translation>
+    </message>
+    <message>
+        <source>Target Minute Ventilation?</source>
+        <translation>Zielminutenvolumen?</translation>
+    </message>
+    <message>
+        <source>Entire Day's Flow Waveform</source>
+        <translation>Gesamte Tages Flusswellenform</translation>
+    </message>
+    <message>
+        <source>Exiting</source>
+        <translation>Verlassen</translation>
+    </message>
+    <message>
+        <source>An restriction in breathing that causes an either an awakening or sleep disturbance.</source>
+        <translation>Eine Einschränkung bei der Atmung, die entweder ein Erwachen oder eine Schlafstörung verursacht.</translation>
+    </message>
+    <message>
+        <source>Pressure Support Maximum</source>
+        <translation>Druckunterstützung Maximum</translation>
+    </message>
+    <message>
+        <source>Graph showing severity of flow limitations</source>
+        <translation>Graphische Darstellung des Schweregrades der Flusslimitierungen</translation>
+    </message>
+    <message>
+        <source>: %1 hours, %2 minutes, %3 seconds
+</source>
+        <translation>: %1 Stunden, %2 Minuten, %3 Sekunden
+</translation>
+    </message>
+    <message>
+        <source>Software changes have been made that require the reimporting of the following machines data:
+
+</source>
+        <translation type="vanished">Es sind Software Änderungen vorgenommen wurden, die das Wiederherstellen der folgenden Geräte-Daten benötigen:</translation>
+    </message>
+    <message>
+        <source>A partially obstructed airway</source>
+        <translation>Teilweise behinderte Atemwege</translation>
+    </message>
+    <message>
+        <source>Pressure Support Minimum</source>
+        <translation>Druckunterstützung Minimum</translation>
+    </message>
+    <message>
+        <source>Large Leak</source>
+        <translation>Großes Leck</translation>
+    </message>
+    <message>
+        <source>Wake-up</source>
+        <translation>Aufwachzeit</translation>
+    </message>
+    <message>
+        <source>Warning</source>
+        <translation>Warnung</translation>
+    </message>
+    <message>
+        <source>Min Pressure</source>
+        <translation>Mindestdruck</translation>
+    </message>
+    <message>
+        <source>Total Leak Rate</source>
+        <translation>Gesamtleckrate</translation>
+    </message>
+    <message>
+        <source>No Directory</source>
+        <translation type="vanished">Kein Verzeichnis</translation>
+    </message>
+    <message>
+        <source>Max Pressure</source>
+        <translation>Größter Druck</translation>
+    </message>
+    <message>
+        <source>MaskPressure</source>
+        <translation>Maskendruck</translation>
+    </message>
+    <message>
+        <source>Total Leaks</source>
+        <translation>Anzahl der Lecks</translation>
+    </message>
+    <message>
+        <source>Minute Ventilation</source>
+        <translation>Minutenvolumen</translation>
+    </message>
+    <message>
+        <source>Rate of detected mask leakage</source>
+        <translation>Anzahl erkannter Masken Lecks</translation>
+    </message>
+    <message>
+        <source>Breathing flow rate waveform</source>
+        <translation>Atemflussrate Wellenform</translation>
+    </message>
+    <message>
+        <source>Lower Expiratory Pressure</source>
+        <translation>Niedriger Exspirationsdruck</translation>
+    </message>
+    <message>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation>AI=%1 HI=%2 CAI=%3 </translation>
+    </message>
+    <message>
+        <source>Time taken to breathe in</source>
+        <translation>Einatmungszeit</translation>
+    </message>
+    <message>
+        <source>Maximum Therapy Pressure</source>
+        <translation>Größter Therapiedruck</translation>
+    </message>
+    <message>
+        <source>Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
+        <translation>Konnte die Kanäle.xml nicht analysieren. Bitte beenden Sie den Vorgang!!</translation>
+    </message>
+    <message>
+        <source>Current Selection</source>
+        <translation>Aktuelle Auswahl</translation>
+    </message>
+    <message>
+        <source>Obstructive Apnea</source>
+        <translation>Obstruktiver Schlafapnoe</translation>
+    </message>
+    <message>
+        <source>Blood-oxygen saturation percentage</source>
+        <translation>Blutsauerstoffsättigung in Prozent</translation>
+    </message>
+    <message>
+        <source>Inspiratory Time</source>
+        <translation>Einatemzeit</translation>
+    </message>
+    <message>
+        <source>Respiratory Rate</source>
+        <translation>Atemfrequenz</translation>
+    </message>
+    <message>
+        <source>Printing %1 Report</source>
+        <translation>Drucken %1 Bericht</translation>
+    </message>
+    <message>
+        <source>Expiratory Time</source>
+        <translation>Ausatemzeit</translation>
+    </message>
+    <message>
+        <source>Expiratory Puff</source>
+        <translation>Ausatem Hauch</translation>
+    </message>
+    <message>
+        <source>Maximum Leak</source>
+        <translation>Maximale Lecks</translation>
+    </message>
+    <message>
+        <source>Ratio between Inspiratory and Expiratory time</source>
+        <translation>Verhältnis zwischen den expiratorischen Zeiten</translation>
+    </message>
+    <message>
+        <source>Minimum Therapy Pressure</source>
+        <translation>Kleinster Theraphiedruck</translation>
+    </message>
+    <message>
+        <source>A sudden (user definable) change in heart rate</source>
+        <translation>Eine plötzliche (frei definierbare) Veränderung der Herzfrequenz</translation>
+    </message>
+    <message>
+        <source>Oximetry</source>
+        <translation>Oximetrie</translation>
+    </message>
+    <message>
+        <source>Oximeter</source>
+        <translation>Oximeter</translation>
+    </message>
+    <message>
+        <source>The maximum rate of mask leakage</source>
+        <translation>Der Höchstsatz der Maskenlecks</translation>
+    </message>
+    <message>
+        <source>Machine Database Changes</source>
+        <translation>Gerätedatenbankänderungen</translation>
+    </message>
+    <message>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.
+
+Are you sure you want to use this folder?
+
+</source>
+        <translation type="vanished">Der Ordner, den Sie gewählt haben, beinhaltet noch gültige SleepHead Daten.
+
+Sind Sie sicher, dass Sie diesen Ordner nutzen wollen?</translation>
+    </message>
+    <message>
+        <source>Expiratory Pressure</source>
+        <translation>Ausatmungsdruck</translation>
+    </message>
+    <message>
+        <source>Tgt. Min. Vent</source>
+        <translation>Tgt. Minute entlüften</translation>
+    </message>
+    <message>
+        <source>Release Notes</source>
+        <translation>Versionshinweise</translation>
+    </message>
+    <message>
+        <source>Pressure Pulse</source>
+        <translation>Druckimpuls</translation>
+    </message>
+    <message>
+        <source>Humidifier</source>
+        <translation>Luftbefeuchter</translation>
+    </message>
+    <message>
+        <source>Patient ID</source>
+        <translation>Patienten-Nr</translation>
+    </message>
+    <message>
+        <source>An apnea caused by airway obstruction</source>
+        <translation>Eine Apnoe durch Obstruktion der Atemwege verursacht</translation>
+    </message>
+    <message>
+        <source>Days: %1</source>
+        <translation>Tage: %1</translation>
+    </message>
+    <message>
+        <source>Low Usage Days: %1</source>
+        <translation>Tage mit zu geringer Nutzung: %1</translation>
+    </message>
+    <message>
+        <source>(%1% compliant, defined as > %2 hours)</source>
+        <translation>(%1% konform, definiert als >%2 Stunden)</translation>
+    </message>
+    <message>
+        <source>(Sess: %1)</source>
+        <translation>(Sitzung: %1)</translation>
+    </message>
+    <message>
+        <source>Bedtime: %1</source>
+        <translation>Schlafenszeit: %1</translation>
+    </message>
+    <message>
+        <source>Waketime: %1</source>
+        <translation>Aufwachzeit: %1</translation>
+    </message>
+    <message>
+        <source>Minutes</source>
+        <translation>Minuten</translation>
+    </message>
+    <message>
+        <source>Seconds</source>
+        <translation>Sekunden</translation>
+    </message>
+    <message>
+        <source>Events/hr</source>
+        <translation>Ereignisse/Stunde</translation>
+    </message>
+    <message>
+        <source>Hz</source>
+        <translation>Hz</translation>
+    </message>
+    <message>
+        <source>Breaths/min</source>
+        <translation>Atmungen/min</translation>
+    </message>
+    <message>
+        <source>Severety (0-1)</source>
+        <translation type="vanished">Außergewöhnliche Schwere (0-1)</translation>
+    </message>
+    <message>
+        <source>Degrees</source>
+        <translation>Grad</translation>
+    </message>
+    <message>
+        <source>Information</source>
+        <translation>Information</translation>
+    </message>
+    <message>
+        <source>Busy</source>
+        <translation>Beschäftigt</translation>
+    </message>
+    <message>
+        <source>Please Note</source>
+        <translation>Bitte warten Sie</translation>
+    </message>
+    <message>
+        <source>&Yes</source>
+        <translation>&Ja</translation>
+    </message>
+    <message>
+        <source>&No</source>
+        <translation>&Nein</translation>
+    </message>
+    <message>
+        <source>&Cancel</source>
+        <translation>&Schließen</translation>
+    </message>
+    <message>
+        <source>&Destroy</source>
+        <translation>&Vernichten</translation>
+    </message>
+    <message>
+        <source>&Save</source>
+        <translation>&Speichern</translation>
+    </message>
+    <message>
+        <source>Unknown PRS1 Code %1</source>
+        <translation>Unbekannt PRS1 Code %1</translation>
+    </message>
+    <message>
+        <source>PRS1_%1</source>
+        <translation>PRS1_%1</translation>
+    </message>
+    <message>
+        <source>Sorry, the purge operation failed, which means this version of SleepyHead can't start.</source>
+        <translation>Entschuldigung, der Reinigungsvorgang ist fehlgeschlagen, was bedeutet, dass diese Version von SleepyHead nicht gestartet werden kann.</translation>
+    </message>
+    <message>
+        <source>The machine data folder needs to be removed manually.</source>
+        <translation>Die Gerätedaten-Ordner müssen manuell entfernt werden.</translation>
+    </message>
+    <message>
+        <source>This folder currently resides at the following location:</source>
+        <translation>Dieser Ordner befindet sich derzeit an der folgenden Position:</translation>
+    </message>
+    <message>
+        <source>Mask On Time</source>
+        <translation>Masken-Einschaltzeit</translation>
+    </message>
+    <message>
+        <source>Time started according to str.edf</source>
+        <translation>Zeit nach str.edf gestartet</translation>
+    </message>
+    <message>
+        <source>Summary Only</source>
+        <translation>Nur Zusammenfassung</translation>
+    </message>
+    <message>
+        <source>CPAP Session contains summary data onlyf</source>
+        <translation type="vanished">CPAP-Sitzung enthält nur zusammengefasste Daten</translation>
+    </message>
+    <message>
+        <source>Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.</source>
+        <translation>Suchen Sie in diesem Aufbau <a href='%1'>SleepyHead's Dateien gehostet Sourceforge</a>.</translation>
+    </message>
+    <message>
+        <source>A faster build of SleepyHead may be available</source>
+        <translation>Bald wird eine schnellere Version von SleepyHead verfügbar sein</translation>
+    </message>
+    <message>
+        <source>You will not be bothered with this message again.</source>
+        <translation>Sie werden mit dieser Nachricht nicht wieder belästigt werden.</translation>
+    </message>
+    <message>
+        <source>This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer.</source>
+        <translation>Diese Version wird gut laufen, aber ein "<b>%1</b>" markierte Version von SleepyHead wird wahrscheinlich viel besser auf Ihrem Computer laufen.</translation>
+    </message>
+    <message>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.</source>
+        <translation>Dieser Aufbau von SleepyHead wurde entwickelt, um mit älteren Rechner ohne OpenGL 2.0-Unterstützung zu arbeiten, aber es sieht so aus als ob Ihr Computer die volle Unterstützung bietet.</translation>
+    </message>
+    <message>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.</source>
+        <translation>Dieser Aufbau von SleepyHead wurde entwickelt, um mit älteren Rechnern ohne OpenGL 2.0-Unterstützung zu arbeiten, aber es kann immer noch eine bessere Version für den Computer verfügbar sein.</translation>
+    </message>
+    <message>
+        <source>If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.</source>
+        <translation>Wenn Sie mit einer virtuellen Maschine wie VirtualBox oder VMware arbeiten, ignorieren Sie bitte diese Nachricht, da kein besserer Aufbau verfügbar ist.</translation>
+    </message>
+    <message>
+        <source>Incompatible Graphics Hardware</source>
+        <translation>Inkompatible Grafik Hardware</translation>
+    </message>
+    <message>
+        <source>This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.</source>
+        <translation>Dieser Aufbau von SleepyHead benötigt OpenGL 2.0-Unterstützung um vollständig funktionieren zu können, aber leider fehlt Ihrem Computer diese Fähigkeit.</translation>
+    </message>
+    <message>
+        <source>You may need to update your computers graphics drivers from the GPU makers website. %1</source>
+        <translation>Möglicherweise müssen Sie Ihren Computer-Grafiktreiber von der GPU-Hersteller Website aktualisieren. %1</translation>
+    </message>
+    <message>
+        <source>(<a href='http://intel.com/support'>Intel's support site</a>)</source>
+        <translation>(<a href='http://intel.com/support'>Support-Website von Intel</a>)</translation>
+    </message>
+    <message>
+        <source>Because graphs will not render correctly, and it may cause crashes, this build will now exit.</source>
+        <translation>Da die Grafiken nicht richtig funktionieren, kann es zu Abstürzen führen. Dieser Aufbau wird jetzt beendet.</translation>
+    </message>
+    <message>
+        <source>Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer.</source>
+        <translation>Lassen Sie sich nicht entmutigen, es gibt einen weiteren Aufbau "<b>-BrokenGL </ b>", der auf Ihrem Computer funktionieren sollte.</translation>
+    </message>
+    <message>
+        <source>No SleepyHead data folder was found.</source>
+        <translation>Es wurden keine SleepyHead Datenordner gefunden.</translation>
+    </message>
+    <message>
+        <source>Would you like SleepyHead to use the default location for storing its data?</source>
+        <translation>Möchten Sie den SleepyHead Standardordner zum Speichern ihrer Daten verwenden?</translation>
+    </message>
+    <message>
+        <source>As you did not select a data folder, SleepyHead will exit.</source>
+        <translation>Wenn Sie keinen Datenordner auswählen wird SleepyHead geschlossen.</translation>
+    </message>
+    <message>
+        <source>Next time you run, you will be asked again.</source>
+        <translation>Beim nächsten Startvorgang werden Sie wieder gefragt.</translation>
+    </message>
+    <message>
+        <source>You did not select a directory.</source>
+        <translation>Sie haben kein Verzeichnis ausgewählt.</translation>
+    </message>
+    <message>
+        <source>SleepyHead will now start with your old one.</source>
+        <translation>SleepyHead versucht mit Ihren alten Daten zu starten.</translation>
+    </message>
+    <message>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.</source>
+        <translation>Der Ordner, den Sie gewählt haben, ist nicht leer. Es sind noch gültige SleepyHead Daten enthalten.</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to use this folder?</source>
+        <translation>Sind Sie sicher, dass Sie diesen Ordner nutzen möchten?</translation>
+    </message>
+    <message>
+        <source>Unknown.</source>
+        <translation type="vanished">Unbekannt.</translation>
+    </message>
+    <message>
+        <source>Litres</source>
+        <translation>Liter</translation>
+    </message>
+    <message>
+        <source>ml</source>
+        <translation>ml</translation>
+    </message>
+    <message>
+        <source>No Data Available</source>
+        <translation>Keine Daten verfügbar</translation>
+    </message>
+    <message>
+        <source>Launching Windows Explorer failed</source>
+        <translation>Das Starten vom Windows Explorer ist gescheitert</translation>
+    </message>
+    <message>
+        <source>Could not find explorer.exe in path to launch Windows Explorer.</source>
+        <translation>Explorer.exe konnte nicht den Pfad im Windows-Explorer starten.</translation>
+    </message>
+    <message>
+        <source>SleepyHead (%1) needs to upgrade its database for %2 %3 %4</source>
+        <translation>SleepyHead (%1) braucht, um seine Datenbank zu aktualisieren %2 %3 %4</translation>
+    </message>
+    <message>
+        <source><b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b></source>
+        <translation><b> SleepyHead hält eine Sicherung der Geräte-Datenkarte, die es für diesen Zweck verwendet. </ b></translation>
+    </message>
+    <message>
+        <source><i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i></source>
+        <translation><i> Ihre alten Gerätedaten sollten regeneriert werden. Sie haben die Backup-Funktion während eines früheren Datenimports nicht deaktiviert. </ i></translation>
+    </message>
+    <message>
+        <source>SleepyHead does not yet have any automatic card backups stored for this device.</source>
+        <translation>SleepyHead verfügt noch nicht über alle für dieses Gerät gespeicherten automatischen Karten Backups.</translation>
+    </message>
+    <message>
+        <source>This means you will need to import this machine data again afterwards from your own backups or data card.</source>
+        <translation>Das heißt, Sie müssen diese Gerätedaten danach wieder von Ihren eigenen Backups oder Datenkarte importieren.</translation>
+    </message>
+    <message>
+        <source>Important:</source>
+        <translation>Wichtig:</translation>
+    </message>
+    <message>
+        <source>Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore.</source>
+        <translation>Wenn Sie ein Upgrade beauftragen, können Sie <font size=+1> nicht </ font> dieses Profil verwenden mehr mit der vorherigen Version.</translation>
+    </message>
+    <message>
+        <source>If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.</source>
+        <translation>Wenn Sie besorgt sind, klicken Sie auf Nein, um Ihr Profil manuell zu beenden und starten Sie ein Backup, bevor Sie Schlafmütze wieder verwenden.</translation>
+    </message>
+    <message>
+        <source>Are you ready to upgrade, so you can run the new version of SleepyHead?</source>
+        <translation>Sie können Sie die neue Version von Sleepyhead benutzen. Sind Sie bereit für ein Upgrade?</translation>
+    </message>
+    <message>
+        <source>Rebuilding from %1 Backup</source>
+        <translation>Wiederaufbau von%1-Backup</translation>
+    </message>
+    <message>
+        <source>Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?</source>
+        <translation>Möchten Sie auf automatische Sicherungen wechseln, so dass beim nächsten Mal, wenn Sie eine neue Version von SleepyHead benutzen, diese wieder aufgebaut wird?</translation>
+    </message>
+    <message>
+        <source>SleepyHead will now start the import wizard so you can reinstall your %1 data.</source>
+        <translation>SleepyHead wird nun den Import-Assistenten starten, so dass Sie Ihre%1 Daten neu installieren können.</translation>
+    </message>
+    <message>
+        <source>SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:</source>
+        <translation>SleepyHead wird jetzt beendet, versuchen Sie Ihren Dateimanager zu starten, so dass Sie Ihr Profil manuell zurück holen:</translation>
+    </message>
+    <message>
+        <source>Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.</source>
+        <translation>Verwenden Sie Ihren Datei-Manager um eine Kopie von Ihrem Profilverzeichnis zu machen, danach starten Sie Sleepyhead und führen den Upgrade-Prozess zu Ende.</translation>
+    </message>
+    <message>
+        <source>Vibratory Snore (VS2) </source>
+        <translation>Vibrations-Schnarchen (VS2) </translation>
+    </message>
+    <message>
+        <source>There is a lockfile already present for profile '%1'.</source>
+        <translation>Es ist eine bereits für Ihr Profil vorliegende Sperrdatei '%1'.</translation>
+    </message>
+    <message>
+        <source>You can only work with one instance of an individual SleepyHead profile at a time.</source>
+        <translation>Sie können nur mit einer Instanz eines einzelnen SleepyHead-Profils zur gleichen Zeit arbeiten.</translation>
+    </message>
+    <message>
+        <source>Please close any other instances of SleepyHead running with this profile before proceeding.</source>
+        <translation>Bitte schließen Sie alle anderen Instanzen von Sleepyhead mit diesem Profil, bevor Sie fortfahren.</translation>
+    </message>
+    <message>
+        <source>If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message.</source>
+        <translation>Wenn keine anderen Instanzen von Sleepyhead ausgeführt werden (z. B., Absturz beim letzten startenl!),können Sie diese Nachricht ignorieren.</translation>
+    </message>
+    <message>
+        <source>There is a lockfile already present for this profile '%1', claimed on '%2'.</source>
+        <translation>Es ist ein bereits für dieses Profil vorhanden Sperrdatei '%1', behauptete auf '%2'.</translation>
+    </message>
+    <message>
+        <source>If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding.</source>
+        <translation>Wenn Sie mit Cloud-Storage arbeiten, stellen Sie sicher das Sleepyhead auf den anderen PC geschlossen ist. Sie müssen warten bis die Syncronisierung mit dem anderen PC abgeschlossen ist.</translation>
+    </message>
+    <message>
+        <source>?</source>
+        <translation>?</translation>
+    </message>
+    <message>
+        <source>Severity (0-1)</source>
+        <translation>Außergewöhnliche Schwere (0-1)</translation>
+    </message>
+    <message>
+        <source>Fixed</source>
+        <translation>Fest</translation>
+    </message>
+    <message>
+        <source>Auto</source>
+        <translation>Auto</translation>
+    </message>
+    <message>
+        <source>Fixed Bi-Level</source>
+        <translation>Feste Doppelebene</translation>
+    </message>
+    <message>
+        <source>Auto Bi-Level (Fixed PS)</source>
+        <translation>Automatische Doppelebene (Fest PS)</translation>
+    </message>
+    <message>
+        <source>ASV Fixed EPAP</source>
+        <translation>ASV fest EPAP</translation>
+    </message>
+    <message>
+        <source>ASV Variable EPAP</source>
+        <translation>ASV Variable EPAP</translation>
+    </message>
+    <message>
+        <source>%1 %2</source>
+        <translation>%1 %2</translation>
+    </message>
+    <message>
+        <source>%1-%2 %3</source>
+        <translation type="obsolete">%1-%2 %3</translation>
+    </message>
+    <message>
+        <source>Range</source>
+        <translation>Angebot</translation>
+    </message>
+    <message>
+        <source>Fixed %1</source>
+        <translation>Fest %1</translation>
+    </message>
+    <message>
+        <source>Auto Bi-Level</source>
+        <translation>Automatische Doppelebene</translation>
+    </message>
+    <message>
+        <source>Welcome to SleepyHead</source>
+        <translation>Willkommen bei SleepyHead</translation>
+    </message>
+    <message>
+        <source>What would you like to do?</source>
+        <translation>Was möchten Sie tun?</translation>
+    </message>
+    <message>
+        <source>Please Import Some Data</source>
+        <translation>Bitte Importieren Sie einige Daten</translation>
+    </message>
+    <message>
+        <source>CPAP<br/>Importer</source>
+        <translation>CPAP<br/>Importeur</translation>
+    </message>
+    <message>
+        <source>Oximetery<br/>Wizard</source>
+        <translation>Oximetrie<br/>Assistent</translation>
+    </message>
+    <message>
+        <source>View<br/>Statistics</source>
+        <translation>Ansicht<br/>Statistik</translation>
+    </message>
+    <message>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation>Es könnte eine gute Idee sein, Vorlieben zuerst zu überprüfen, </ br> da gibt es einige Optionen, die Sie verändern können.</translation>
+    </message>
+    <message>
+        <source>First import can take a few minutes.</source>
+        <translation>Der erste Import kann ein paar Minuten dauern.</translation>
+    </message>
+    <message>
+        <source>Click this box to see this in daily view.</source>
+        <translation>Klicken Sie auf dieses Feld, um die täglichen Ansicht anzuzeigen.</translation>
+    </message>
+    <message>
+        <source>The last time you used your %1...</source>
+        <translation>Das letzte Mal verwendet %1...</translation>
+    </message>
+    <message>
+        <source>last night</source>
+        <translation>letzte Nacht</translation>
+    </message>
+    <message>
+        <source>yesterday</source>
+        <translation>gestern</translation>
+    </message>
+    <message>
+        <source>%2 days ago</source>
+        <translation>%2 vor Tagen</translation>
+    </message>
+    <message>
+        <source>was %1 (on %2)</source>
+        <translation>war %1 (an %2)</translation>
+    </message>
+    <message>
+        <source>perfect :)</source>
+        <translation>perfekt :)</translation>
+    </message>
+    <message>
+        <source>pretty darn good</source>
+        <translation>verdammt gut</translation>
+    </message>
+    <message>
+        <source>reasonably good</source>
+        <translation>mäßig gut</translation>
+    </message>
+    <message>
+        <source>technically "treated"</source>
+        <translation>technisch "behandelt"</translation>
+    </message>
+    <message>
+        <source>not very good</source>
+        <translation>nicht sehr gut</translation>
+    </message>
+    <message>
+        <source>horrible, please consult your doctor</source>
+        <translation>schrecklich, konsultieren Sie bitte Ihren Arzt</translation>
+    </message>
+    <message>
+        <source>%1 hours, %2 minutes and %3 seconds</source>
+        <translation>%1 Stunden, %2 Minuten und %3 Sekunden</translation>
+    </message>
+    <message>
+        <source>You slept for %1.</source>
+        <translation type="vanished">Sie schliefen %1.</translation>
+    </message>
+    <message>
+        <source><font color = red>You only had the mask on for %1.</font></source>
+        <translation><font color = red>Sie hatten nur die Maske auf %1.</font></translation>
+    </message>
+    <message>
+        <source>You had no <i>major</i> mask leaks (maximum was %1 %2).</source>
+        <translation>Sie hatten keine <i>großen</i> Maskenlecks (maximum war %1 %2).</translation>
+    </message>
+    <message>
+        <source>You had a small but acceptable amount of <i>major</i> mask leakage.</source>
+        <translation>Sie hatte eine kleine, aber akzeptable Menge von <i> großen </ i> Masken Leckagen.</translation>
+    </message>
+    <message>
+        <source>You had significant periods of <i>major</i> mask leakage.</source>
+        <translation>Sie hatten erhebliche Zeiträume von <i> Großen </ i> Maskenlecks.</translation>
+    </message>
+    <message>
+        <source>Your mask is leaking way too much.. Talk to your CPAP advisor.</source>
+        <translation>Ihre Maske ist zu oft undicht .. Sprechen Sie mit Ihrem CPAP-Berater.</translation>
+    </message>
+    <message>
+        <source>Your CPAP machine blasted you with a constant %1%2 of air</source>
+        <translation>Ihr CPAP-Gerät versorgt Sie mit einer konstanten %1%2 Luft</translation>
+    </message>
+    <message>
+        <source>Your pressure was under %1%2 for %3% of the time.</source>
+        <translation>Für diese Zeit war Ihr Druck unter %1%2 für %3%.</translation>
+    </message>
+    <message>
+        <source>Your machine blasted you with a constant %1-%2 %3 of air.</source>
+        <translation>Ihr Gerät versorgt Sie mit einer konstanten %1-%2 %3 Luft.</translation>
+    </message>
+    <message>
+        <source>Your machine was under %1-%2 %3 for %4% of the time.</source>
+        <translation>Ihr Gerät war in dieser Zeit unter %1-%2 %3 für %4%.</translation>
+    </message>
+    <message>
+        <source>Your EPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation>Ihre EPAP- Druck war unter %1%2 für %3% diese Zeit.</translation>
+    </message>
+    <message>
+        <source>Your IPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation>Ihre IPAP- Druck war unter %1%2 für %3% diese Zeit.</translation>
+    </message>
+    <message>
+        <source>No CPAP data has been imported yet.</source>
+        <translation>Es wurden noch keine CPAP-Daten importiert.</translation>
+    </message>
+    <message>
+        <source>Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> </source>
+        <translation>Neuste Oximetriedaten: <a onclick='alert("daily=%2");'>%1</a> </translation>
+    </message>
+    <message>
+        <source>(last night)</source>
+        <translation>(letzte Nacht)</translation>
+    </message>
+    <message>
+        <source>(yesterday)</source>
+        <translation>(gestern)</translation>
+    </message>
+    <message>
+        <source>(%2 day ago)</source>
+        <translation>(%2 Vortag)</translation>
+    </message>
+    <message>
+        <source>No oximetery data has been imported yet.</source>
+        <translation>Es wurden noch keine Oximetriedaten importiert.</translation>
+    </message>
+    <message>
+        <source>Very Important Warning</source>
+        <translation>Sehr wichtige Warnung</translation>
+    </message>
+    <message>
+        <source><p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer.</source>
+        <translation><p>IMMER <font size=+1 color=red><b>write protect</b></font> CPAP SDCards, bevor Sie sie in Ihren Computer.</translation>
+    </message>
+    <message>
+        <source><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="vanished"><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> Index-Dateien, um die Karte zu schreiben, ohne zu fragen, was Ihre Karte unlesbar machen können von Ihrem CPAP-Gerät.</translation>
+    </message>
+    <message>
+        <source>Contec</source>
+        <translation>Contec</translation>
+    </message>
+    <message>
+        <source>CMS50</source>
+        <translation>CMS50</translation>
+    </message>
+    <message>
+        <source>Fisher & Paykel</source>
+        <translation>Fisher & Paykel</translation>
+    </message>
+    <message>
+        <source>ICON</source>
+        <translation>ICON</translation>
+    </message>
+    <message>
+        <source>DeVilbiss</source>
+        <translation>DeVilbiss</translation>
+    </message>
+    <message>
+        <source>Intellipap</source>
+        <translation>Intellipap</translation>
+    </message>
+    <message>
+        <source>ChoiceMMed</source>
+        <translation>ChoiceMMed</translation>
+    </message>
+    <message>
+        <source>MD300</source>
+        <translation>MD300</translation>
+    </message>
+    <message>
+        <source>Respironics</source>
+        <translation>Respironics</translation>
+    </message>
+    <message>
+        <source>M-Series</source>
+        <translation>M-Series</translation>
+    </message>
+    <message>
+        <source>Philips Respironics</source>
+        <translation>Philips Respironics</translation>
+    </message>
+    <message>
+        <source>System One</source>
+        <translation>System One</translation>
+    </message>
+    <message>
+        <source>ResMed</source>
+        <translation>ResMed</translation>
+    </message>
+    <message>
+        <source>S9</source>
+        <translation>S9</translation>
+    </message>
+    <message>
+        <source>Somnopose</source>
+        <translation>Somnopose</translation>
+    </message>
+    <message>
+        <source>Somnopose Software</source>
+        <translation>Somnopose Software</translation>
+    </message>
+    <message>
+        <source>Zeo</source>
+        <translation>Zeo</translation>
+    </message>
+    <message>
+        <source>Personal Sleep Coach</source>
+        <translation>Persönlichen Schlaftrainer</translation>
+    </message>
+    <message>
+        <source>Ramp Event</source>
+        <translation>Rampenereignis</translation>
+    </message>
+    <message>
+        <source>Ramp</source>
+        <translation>Rampe</translation>
+    </message>
+    <message>
+        <source>Your EPAP pressure fixed at %1%2.</source>
+        <translation>Ihre EPAP Druck fixiert ein %1%2.</translation>
+    </message>
+    <message>
+        <source>Database Outdated
+Please Rebuild CPAP Data</source>
+        <translation>veraltete Datenbank
+Bitte Rebuild CPAP Daten laden</translation>
+    </message>
+    <message>
+        <source>%1 threshold</source>
+        <translation type="vanished">%1 Schwelle</translation>
+    </message>
+    <message>
+        <source>Sleep</source>
+        <translation type="vanished">Zu Bett</translation>
+    </message>
+    <message>
+        <source>Wake</source>
+        <translation type="vanished">Aufgewacht</translation>
+    </message>
+    <message>
+        <source>Series</source>
+        <translation>Serie</translation>
+    </message>
+    <message>
+        <source>Yes</source>
+        <translation>Ja</translation>
+    </message>
+    <message>
+        <source>No</source>
+        <translation>Nein</translation>
+    </message>
+    <message>
+        <source>Auto Bi-Level (Variable PS)</source>
+        <translation>Automatische Doppelebene (Variable PS)</translation>
+    </message>
+    <message>
+        <source>%1%2</source>
+        <translation>%1% {1%2?}</translation>
+    </message>
+    <message>
+        <source>Fixed %1 (%2)</source>
+        <translation>Fest %1 (%2)</translation>
+    </message>
+    <message>
+        <source>Min %1 Max %2 (%3)</source>
+        <translation>Min %1 Max %2 (%3)</translation>
+    </message>
+    <message>
+        <source>EPAP %1 IPAP %2 (%3)</source>
+        <translation>EPAP %1 IPAP %2 (%3)</translation>
+    </message>
+    <message>
+        <source>PS %1 over %2-%3 (%4)</source>
+        <translation>PS %1 über %2-%3 (%4)</translation>
+    </message>
+    <message>
+        <source>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</source>
+        <translation>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</translation>
+    </message>
+    <message>
+        <source>EPAP %1 PS %2-%3 (%6)</source>
+        <translation>EPAP %1 PS %2-%3 (%6)</translation>
+    </message>
+    <message>
+        <source>SmartFlex Mode</source>
+        <translation>SmartFlex-Modus</translation>
+    </message>
+    <message>
+        <source>Intellipap pressure relief mode.</source>
+        <translation>Intellipap Druckmodus.</translation>
+    </message>
+    <message>
+        <source>Ramp Only</source>
+        <translation>Nur Rampe</translation>
+    </message>
+    <message>
+        <source>Full Time</source>
+        <translation>Volle Zeit</translation>
+    </message>
+    <message>
+        <source>SmartFlex Level</source>
+        <translation>Smartflex Ebene</translation>
+    </message>
+    <message>
+        <source>Intellipap pressure relief level.</source>
+        <translation>Intellipap Druckniveau.</translation>
+    </message>
+    <message>
+        <source>SmartFlex Settings</source>
+        <translation>SmartFlex Einstellungen</translation>
+    </message>
+    <message>
+        <source>15mm</source>
+        <translation>15mm</translation>
+    </message>
+    <message>
+        <source>22mm</source>
+        <translation>22mm</translation>
+    </message>
+    <message>
+        <source>Flex Mode</source>
+        <translation>Flex Modus</translation>
+    </message>
+    <message>
+        <source>PRS1 pressure relief mode.</source>
+        <translation>PRS1 Druckmodus.</translation>
+    </message>
+    <message>
+        <source>C-Flex</source>
+        <translation>C-Flex</translation>
+    </message>
+    <message>
+        <source>C-Flex+</source>
+        <translation>C-Flex+</translation>
+    </message>
+    <message>
+        <source>A-Flex</source>
+        <translation>A-Flex</translation>
+    </message>
+    <message>
+        <source>Rise Time</source>
+        <translation>Anstiegszeit</translation>
+    </message>
+    <message>
+        <source>Bi-Flex</source>
+        <translation>Bi-Flex</translation>
+    </message>
+    <message>
+        <source>Flex Level</source>
+        <translation>Flex-Ebene</translation>
+    </message>
+    <message>
+        <source>PRS1 pressure relief setting.</source>
+        <translation>PRS1 Druckeinstellung.</translation>
+    </message>
+    <message>
+        <source>x1</source>
+        <translation>x1</translation>
+    </message>
+    <message>
+        <source>x2</source>
+        <translation>x2</translation>
+    </message>
+    <message>
+        <source>x3</source>
+        <translation>x3</translation>
+    </message>
+    <message>
+        <source>x4</source>
+        <translation>x4</translation>
+    </message>
+    <message>
+        <source>x5</source>
+        <translation>x5</translation>
+    </message>
+    <message>
+        <source>Humidifier Status</source>
+        <translation>Luftbefeuchter Status</translation>
+    </message>
+    <message>
+        <source>PRS1 humidifier connected?</source>
+        <translation>PRS1 Luftbefeuchter angeschlossen?</translation>
+    </message>
+    <message>
+        <source>Disconnected</source>
+        <translation>Getrennt</translation>
+    </message>
+    <message>
+        <source>Connected</source>
+        <translation>Angeschlossen</translation>
+    </message>
+    <message>
+        <source>Humidification Level</source>
+        <translation>Befeuchtung Ebene</translation>
+    </message>
+    <message>
+        <source>PRS1 Humidification level</source>
+        <translation>PRS1 Befeuchtung Ebene</translation>
+    </message>
+    <message>
+        <source>Humid. Lvl.</source>
+        <translation>Feucht. Lvl.</translation>
+    </message>
+    <message>
+        <source>System One Resistance Status</source>
+        <translation>System One Resistenzstatus</translation>
+    </message>
+    <message>
+        <source>Sys1 Resist. Status</source>
+        <translation>SYS1 Resistenzstatus</translation>
+    </message>
+    <message>
+        <source>System One Resistance Setting</source>
+        <translation>System One Resistenzeinstellungen</translation>
+    </message>
+    <message>
+        <source>System One Mask Resistance Setting</source>
+        <translation>System One Masken Resistenzeinstellungen</translation>
+    </message>
+    <message>
+        <source>Sys1 Resist. Set</source>
+        <translation>Sys1 Resist. Einst</translation>
+    </message>
+    <message>
+        <source>Hose Diameter</source>
+        <translation>Schlauchdurchmesser</translation>
+    </message>
+    <message>
+        <source>Diameter of primary CPAP hose</source>
+        <translation>Durchmesser des Primär CPAP Schlauch</translation>
+    </message>
+    <message>
+        <source>System One Resistance Lock</source>
+        <translation>System One Widerstandssperre</translation>
+    </message>
+    <message>
+        <source>Whether System One resistance settings are available to you.</source>
+        <translation>Die Widerstandseinstellungen von System One sind für Sie da.</translation>
+    </message>
+    <message>
+        <source>Sys1 Resist. Lock</source>
+        <translation>Sys1 Widerst. Sperre</translation>
+    </message>
+    <message>
+        <source>Auto On</source>
+        <translation>Automatisch ein</translation>
+    </message>
+    <message>
+        <source>A few breaths automatically starts machine</source>
+        <translation>Nach ein paar Atemzügen startet dias Gerät autmatisch</translation>
+    </message>
+    <message>
+        <source>Auto Off</source>
+        <translation>Automatisch aus</translation>
+    </message>
+    <message>
+        <source>Machine automatically switches off</source>
+        <translation>Gerät schaltet sich automatisch aus</translation>
+    </message>
+    <message>
+        <source>Mask Alert</source>
+        <translation>Maskenalarm</translation>
+    </message>
+    <message>
+        <source>Whether or not machine allows Mask checking.</source>
+        <translation>Soll das Gerät die Maskenprüfung ermöglichen.</translation>
+    </message>
+    <message>
+        <source>Show AHI</source>
+        <translation>Zeige AHI</translation>
+    </message>
+    <message>
+        <source>Whether or not machine shows AHI via LCD panel.</source>
+        <translation>Soll das Gerät AHI über LCD-Panel zeigen.</translation>
+    </message>
+    <message>
+        <source>Timed Breath</source>
+        <translation>Zeitüberschreitung Atem</translation>
+    </message>
+    <message>
+        <source>Machine Initiated Breath</source>
+        <translation>Gerät Initiiert Atem</translation>
+    </message>
+    <message>
+        <source>TB</source>
+        <translation>TB</translation>
+    </message>
+    <message>
+        <source>VPAP Adapt</source>
+        <translation>VPAP Anpassung</translation>
+    </message>
+    <message>
+        <source>EPR</source>
+        <translation>EPR</translation>
+    </message>
+    <message>
+        <source>ResMed Exhale Pressure Relief</source>
+        <translation>ResMed Ausatem Druckentlastung</translation>
+    </message>
+    <message>
+        <source>Patient???</source>
+        <translation>Patient???</translation>
+    </message>
+    <message>
+        <source>EPR Level</source>
+        <translation>EPR Ebene</translation>
+    </message>
+    <message>
+        <source>Exhale Pressure Relief Level</source>
+        <translation>Ausatem Druckentlastungs Ebene</translation>
+    </message>
+    <message>
+        <source>0cmH2O</source>
+        <translation>0cmH2O</translation>
+    </message>
+    <message>
+        <source>1cmH2O</source>
+        <translation>1cmH2O</translation>
+    </message>
+    <message>
+        <source>2cmH2O</source>
+        <translation>2cmH2O</translation>
+    </message>
+    <message>
+        <source>3cmH2O</source>
+        <translation>3cmH2O</translation>
+    </message>
+    <message>
+        <source>EPR: </source>
+        <translation>EPR: </translation>
+    </message>
+    <message>
+        <source>Weinmann</source>
+        <translation>Weinmann</translation>
+    </message>
+    <message>
+        <source>SOMNOsoft2</source>
+        <translation>SOMNOsoft2</translation>
+    </message>
+    <message>
+        <source>Pressure Min</source>
+        <translation>Mindestdruck</translation>
+    </message>
+    <message>
+        <source>Pressure Max</source>
+        <translation>Maximaler Druck</translation>
+    </message>
+    <message>
+        <source>Leak Flag</source>
+        <translation>Leck Flagge</translation>
+    </message>
+    <message>
+        <source>LF</source>
+        <translation>LF</translation>
+    </message>
+    <message>
+        <source>CPAP Session contains summary data only</source>
+        <translation>CPAP Sitzung enthält nur Übersichtsdaten</translation>
+    </message>
+    <message>
+        <source>PAP Mode</source>
+        <translation>PAP Modus</translation>
+    </message>
+    <message>
+        <source>PAP Device Mode</source>
+        <translation>PAP Gerätemodus</translation>
+    </message>
+    <message>
+        <source>ASV (Fixed EPAP)</source>
+        <translation>ASV (Fest EPAP)</translation>
+    </message>
+    <message>
+        <source>ASV (Variable EPAP)</source>
+        <translation>ASV (Variabel EPAP)</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to reset all your channel colors and settings to defaults?</source>
+        <translation>Sind Sie sicher, dass Sie wollen, alle Ihre Kanal-Farben und-Einstellungen auf die Standardwerte zurücksetzen?</translation>
+    </message>
+    <message>
+        <source>ASV Auto EPAP</source>
+        <translation>ASV Auto EPAP</translation>
+    </message>
+    <message>
+        <source>You had an AHI of %1, which is considered %2</source>
+        <translation>AHI von %1, die Sie hatten %2</translation>
+    </message>
+    <message>
+        <source>(% of time)</source>
+        <translation>(% der Zeit)</translation>
+    </message>
+    <message>
+        <source>Duration %1:%2:%3</source>
+        <translation>Dauer %1:%2:%3</translation>
+    </message>
+    <message>
+        <source>AHI %1</source>
+        <translation>AHI %1</translation>
+    </message>
+    <message>
+        <source>Peak</source>
+        <translation>Spitze</translation>
+    </message>
+    <message>
+        <source>Maximum</source>
+        <translation type="vanished">Maximum</translation>
+    </message>
+    <message>
+        <source>%1% %2</source>
+        <translation>%1% %2</translation>
+    </message>
+    <message>
+        <source>Heated Tubing</source>
+        <translation>beheizte Schläuche</translation>
+    </message>
+    <message>
+        <source>Heated Tubing Connected</source>
+        <translation>beheizter Schlauch angeschlossen</translation>
+    </message>
+    <message>
+        <source>Headed Tubing</source>
+        <translation>geleitete Schläuche</translation>
+    </message>
+    <message>
+        <source>By Pressure</source>
+        <translation>durch Druck</translation>
+    </message>
+    <message>
+        <source>Statistics at Pressure</source>
+        <translation>Statistiken des Drucks</translation>
+    </message>
+    <message>
+        <source>SleepyHead is proudly brought to you by JediMark.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>d MMM [ %1 - %2 ]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1</source>
+        <translation type="unfinished">%1</translation>
+    </message>
+    <message>
+        <source>Hide All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Show All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unpin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Plots Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>(Summary Only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1: %2</source>
+        <translation type="unfinished">%1% %2 {1:?}</translation>
+    </message>
+    <message>
+        <source>Relief: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Hours: %1h, %2m, %3s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Machine Information</source>
+        <translation type="unfinished">Geräte-Informationen</translation>
+    </message>
+    <message>
+        <source>Compliance Only :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Graphs Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Summary Only :(</source>
+        <translation type="unfinished">Nur die Zusammenfassung: (</translation>
+    </message>
+    <message>
+        <source>Sessions Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Journal Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SleepyHead found an old Journal folder, but it looks like it's been renamed:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SleepyHead will not touch this folder, and will create a new one instead.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Please be careful when playing in SleepyHead's profile folders :-P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>SleepyHead picked only the first one of these, and will use it in future:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CMS50F3.7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CMS50F</source>
+        <translation type="unfinished">CMS50F</translation>
+    </message>
+    <message>
+        <source>Loading %1 data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>PLease Wait...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perfusion Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>A relative assessment of the pulse strength at the monitoring site</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Perf. Index %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>APAP (Variable)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Zero</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Upper Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Lower Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>%1 Session #%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You machine was on for %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><p><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>or</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Snapshot %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QextSerialPort</name>
+    <message>
+        <source>General write operation failure</source>
+        <translation type="vanished">Allgemeiner Schreibvorgangsausfall</translation>
+    </message>
+    <message>
+        <source>Caught a non-blocked signal (POSIX)</source>
+        <translation type="vanished">Ein nicht blockiertes Signal empangen (POSIX)</translation>
+    </message>
+    <message>
+        <source>Receive buffer overflow</source>
+        <translation type="vanished">Empfangspufferüberlauf</translation>
+    </message>
+    <message>
+        <source>There was an I/O error while communicating with the port</source>
+        <translation type="vanished">Es gab einen I /O-Fehler während der Kommunikation mit dem Port</translation>
+    </message>
+    <message>
+        <source>The %1 file doesn't exists</source>
+        <translation type="vanished">Die Datei %1 existiert nicht</translation>
+    </message>
+    <message>
+        <source>General read operation failure</source>
+        <translation type="vanished">Allgemeiner Betriebsausfall</translation>
+    </message>
+    <message>
+        <source>The port detected a break condition</source>
+        <translation type="vanished">Der Port ist unterbrochen</translation>
+    </message>
+    <message>
+        <source>Character buffer overrun</source>
+        <translation type="vanished">Zeichenpufferüberlauf</translation>
+    </message>
+    <message>
+        <source>Permission denied</source>
+        <translation type="vanished">Zugriff verweigert</translation>
+    </message>
+    <message>
+        <source>Invalid file descriptor (port was not opened correctly)</source>
+        <translation type="vanished">Ungültige Dateibeschreibung (Port wurde nicht richtig geöffnet)</translation>
+    </message>
+    <message>
+        <source>Device is already locked</source>
+        <translation type="vanished">Gerät bereits gesperrt</translation>
+    </message>
+    <message>
+        <source>Transmit buffer overflow</source>
+        <translation type="vanished">Sendepufferüberlauf</translation>
+    </message>
+    <message>
+        <source>Operation timed out (POSIX)</source>
+        <translation type="vanished">Betriebszeitüberschreitung (POSIX)</translation>
+    </message>
+    <message>
+        <source>No Error has occurred</source>
+        <translation type="vanished">Kein Fehler aufgetreten</translation>
+    </message>
+    <message>
+        <source>The port detected a parity error in the received data</source>
+        <translation type="vanished">Der Port hat einen Paritätsfehler in den empfangenen Daten</translation>
+    </message>
+    <message>
+        <source>The port detected a framing error (usually caused by incorrect baud rate settings)</source>
+        <translation type="vanished">Der Anschluss erkennt einen Rahmenfehler (in der Regel durch falsche Baudrate verursacht)</translation>
+    </message>
+    <message>
+        <source>The file opened by the port is not a valid device</source>
+        <translation type="vanished">Die Datei von der der Port geöffnet ist, ist kein gültiges Gerät</translation>
+    </message>
+    <message>
+        <source>Unable to allocate memory tables (POSIX)</source>
+        <translation type="vanished">Kann Speicher nicht den Tabellen zuweisen (POSIX)</translation>
+    </message>
+    <message>
+        <source>Unknown error: %1</source>
+        <translation type="vanished">Unbekannter Fehler: %1</translation>
+    </message>
+</context>
+<context>
+    <name>QuaZipFilePrivate</name>
+    <message>
+        <source>ZIP/UNZIP API error %1</source>
+        <translation>PLZ / UNZIP API-Fehler %1</translation>
+    </message>
+</context>
+<context>
+    <name>Report</name>
+    <message>
+        <source>Form</source>
+        <translation>Form</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation>Leere Seite</translation>
+    </message>
+</context>
+<context>
+    <name>SessionBar</name>
+    <message>
+        <source>No Sessions Present</source>
+        <translation>Gegenwärtig keine Sitzung</translation>
+    </message>
+</context>
+<context>
+    <name>Statistics</name>
+    <message>
+        <source>FL</source>
+        <translation type="vanished">FL</translation>
+    </message>
+    <message>
+        <source>Days</source>
+        <translation>Tage</translation>
+    </message>
+    <message>
+        <source>Best&nbsp;%1</source>
+        <translation>Bester&nbsp;%1</translation>
+    </message>
+    <message>
+        <source>Usage Information</source>
+        <translation>Nutzungsdaten</translation>
+    </message>
+    <message>
+        <source>PS %1</source>
+        <translation type="vanished">PS %1</translation>
+    </message>
+    <message>
+        <source>SleepyHead is pretty much useless without it.</source>
+        <translation type="vanished">SleepyHead benötigt den durchschnittlichen Druck.</translation>
+    </message>
+    <message>
+        <source>Oximeter Statistics</source>
+        <translation>Oximetrie-Statistik</translation>
+    </message>
+    <message>
+        <source>CPAP Usage</source>
+        <translation>CPAP-Nutzung</translation>
+    </message>
+    <message>
+        <source>Blood Oxygen Saturation</source>
+        <translation>Blutsauerstoffsättigung</translation>
+    </message>
+    <message>
+        <source>Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.</source>
+        <translation>Diese Darstellung ignoriert Therapieeinstellungen mit weniger als %1 Tagen der aufgezeichneten Daten.</translation>
+    </message>
+    <message>
+        <source>% of time in %1</source>
+        <translation>% der Zeit in %1</translation>
+    </message>
+    <message>
+        <source>Last 30 Days</source>
+        <translation>Die letzten 30 Tage</translation>
+    </message>
+    <message>
+        <source>Compliant Days</source>
+        <translation>Konforme Tage</translation>
+    </message>
+    <message>
+        <source>%1 Index</source>
+        <translation>%1 Index</translation>
+    </message>
+    <message>
+        <source>Worst RX Setting</source>
+        <translation>Schlechteste RX-Einstellung</translation>
+    </message>
+    <message>
+        <source>Best RX Setting</source>
+        <translation>Beste RX-Einstellung</translation>
+    </message>
+    <message>
+        <source>90% %1</source>
+        <translation>90% %1</translation>
+    </message>
+    <message>
+        <source>%1 day of %2 Data on %3</source>
+        <translation>%1 Tage %2 Daten über %3</translation>
+    </message>
+    <message>
+        <source>Changes to Prescription Settings</source>
+        <translation>Änderungen an den Einstellungen nur nach Absprache mit Ihrem Arzt vornehmen</translation>
+    </message>
+    <message>
+        <source>Therapy Efficiacy</source>
+        <translation>Therapie-Effizienz</translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="vanished">Druck Mind.</translation>
+    </message>
+    <message>
+        <source>Max %1</source>
+        <translation>Max %1</translation>
+    </message>
+    <message>
+        <source>%1 Median</source>
+        <translation>%1 Mittlere</translation>
+    </message>
+    <message>
+        <source>Min %1</source>
+        <translation>Min %1</translation>
+    </message>
+    <message>
+        <source>Most Recent</source>
+        <translation>Der letzte Tag</translation>
+    </message>
+    <message>
+        <source>Pressure Settings</source>
+        <translation>Druckeinstellungen</translation>
+    </message>
+    <message>
+        <source>Pressure Statistics</source>
+        <translation>Druck-Statistik</translation>
+    </message>
+    <message>
+        <source>Compliancy</source>
+        <translation type="vanished">Kompatibilität</translation>
+    </message>
+    <message>
+        <source>Last 6 Months</source>
+        <translation>Die letzten 6 Monate</translation>
+    </message>
+    <message>
+        <source>Total Days</source>
+        <translation>Tage insgesamt</translation>
+    </message>
+    <message>
+        <source>CPAP %1</source>
+        <translation type="vanished">CPAP %1</translation>
+    </message>
+    <message>
+        <source>Average %1</source>
+        <translation>Durchschnittlich %1</translation>
+    </message>
+    <message>
+        <source>No %1 data available.</source>
+        <translation>Keine %1 Daten verfügbar.</translation>
+    </message>
+    <message>
+        <source>Last Use</source>
+        <translation>Zuletzt verwendet</translation>
+    </message>
+    <message>
+        <source>First import can take a few minutes.</source>
+        <translation type="vanished">Der erste Import kann ein paar Minuten dauern.</translation>
+    </message>
+    <message>
+        <source>Pulse Rate</source>
+        <translation>Pulsrate</translation>
+    </message>
+    <message>
+        <source>First Use</source>
+        <translation>Erste Verwendung</translation>
+    </message>
+    <message>
+        <source>Days AHI &gt;5.0</source>
+        <translation>Tage AHI &gt;5.0</translation>
+    </message>
+    <message>
+        <source>EPAP %1</source>
+        <translation type="vanished">EPAP %1</translation>
+    </message>
+    <message>
+        <source>Last Week</source>
+        <translation>Letzte Woche</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation>Letztes Jahr</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation>Details</translation>
+    </message>
+    <message>
+        <source>Worst&nbsp;%1</source>
+        <translation>Schlechtester&nbsp;%1</translation>
+    </message>
+    <message>
+        <source>%1 days of %2 Data, between %3 and %4</source>
+        <translation>%1 Tage %2 Daten, zwischen %3 und %4</translation>
+    </message>
+    <message>
+        <source>APAP %1 - %2</source>
+        <translation type="vanished">APAP %1 - %2</translation>
+    </message>
+    <message>
+        <source>Please Import Some Data</source>
+        <translation type="vanished">Bitte Importieren Sie einige Daten</translation>
+    </message>
+    <message>
+        <source>Last Session</source>
+        <translation>Die letzte Sitzung</translation>
+    </message>
+    <message>
+        <source>Machine Information</source>
+        <translation>Geräte-Informationen</translation>
+    </message>
+    <message>
+        <source>CPAP Statistics</source>
+        <translation>CPAP-Statistik</translation>
+    </message>
+    <message>
+        <source>IPAP %1</source>
+        <translation type="vanished">IPAP %1</translation>
+    </message>
+    <message>
+        <source>Leak Statistics</source>
+        <translation>Leck-Statistik</translation>
+    </message>
+    <message>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="vanished">Es könnte eine gute Idee sein, Vorlieben zuerst zu überprüfen, </ br> da gibt es einige Optionen, die Sie verändern können.</translation>
+    </message>
+    <message>
+        <source>Average Hours per Night</source>
+        <translation>Durchschnittliche Stunden pro Nacht</translation>
+    </message>
+    <message>
+        <source>Compliance</source>
+        <translation>Beachtung</translation>
+    </message>
+    <message>
+        <source>% of time above %1 threshold</source>
+        <translation>% der Zeit über %1 Schwelle</translation>
+    </message>
+    <message>
+        <source>% of time below %1 threshold</source>
+        <translation>% der Zeit unter %1 Schwelle</translation>
+    </message>
+    <message>
+        <source>Fixed %1</source>
+        <translation type="vanished">Fest %1</translation>
+    </message>
+    <message>
+        <source>I can haz data?!?</source>
+        <translation>Ich kann Daten haz?!?</translation>
+    </message>
+    <message>
+        <source>This lonely sleepy sheep has no data :(</source>
+        <translation>Diese Daten sind keine Schlafdaten :(</translation>
+    </message>
+    <message>
+        <source>Fixed %1 %2</source>
+        <translation type="obsolete">Fest %1 %2</translation>
+    </message>
+    <message>
+        <source>Pressure Relief</source>
+        <translation>Druckentlastung</translation>
+    </message>
+</context>
+<context>
+    <name>UpdaterWindow</name>
+    <message>
+        <source>Log</source>
+        <translation>Anmelden</translation>
+    </message>
+    <message>
+        <source>Size</source>
+        <translation>Größe</translation>
+    </message>
+    <message>
+        <source>Saving as </source>
+        <translation>Speichern als </translation>
+    </message>
+    <message>
+        <source>&Finished</source>
+        <translation>&Fertig</translation>
+    </message>
+    <message>
+        <source>Redirected to </source>
+        <translation>umgeleitet</translation>
+    </message>
+    <message>
+        <source>A new version of SleepyHead is available!</source>
+        <translation>Eine neue Version von SleepyHead ist vorhanden!</translation>
+    </message>
+    <message>
+        <source>Download Error. Sorry, try again later.</source>
+        <translation>Download-Fehler. Es tut uns leid, versuchen Sie es später erneut.</translation>
+    </message>
+    <message>
+        <source>There was an error parsing the XML Update file.</source>
+        <translation>Es gab einen Fehler beim Analysieren der XML Update Datei.</translation>
+    </message>
+    <message>
+        <source>Updates Complete. SleepyHead needs to restart now, click Finished to do so.</source>
+        <translation>Updates komplett. SleepyHead muss jetzt neu starten, klicken Sie auf Fertig, um dies zu tun.</translation>
+    </message>
+    <message>
+        <source>XML update structure parsed cleanly</source>
+        <translation>XML-Update-Struktur sauber analysiert</translation>
+    </message>
+    <message>
+        <source>Version <b>%1</b> is available. You're currently running v%1</source>
+        <translation>Version <b>%1 </ b> zur Verfügung. Es wird derzeit ausgeführt v%1</translation>
+    </message>
+    <message>
+        <source>Please wait while updates are downloaded and installed...</source>
+        <translation>Bitte warten Sie solange, bis Updates heruntergeladen und installiert wurden ...</translation>
+    </message>
+    <message>
+        <source>Shiny new <b>v%1</b> is available. You're running old and busted v%2</source>
+        <translation>Eine neue Version <b> v%1</ b> zur Verfügung. Sie betreiben eine alte Version v%2</translation>
+    </message>
+    <message>
+        <source>SleepyHead Updater</source>
+        <translation>SleepyHead Updater</translation>
+    </message>
+    <message>
+        <source>SleepyHead Updates</source>
+        <translation>SleepyHead Updates</translation>
+    </message>
+    <message>
+        <source>Component</source>
+        <translation>Komponente</translation>
+    </message>
+    <message>
+        <source>Failed</source>
+        <translation>Gescheitert</translation>
+    </message>
+    <message>
+        <source>&Upgrade Now</source>
+        <translation>&Jetzt ein Upgrade</translation>
+    </message>
+    <message>
+        <source>Version Information</source>
+        <translation>Versionsinformationen</translation>
+    </message>
+    <message>
+        <source>Build Notes</source>
+        <translation>Erstellen Sie Notizen</translation>
+    </message>
+    <message>
+        <source>No new updates were found for your platform.</source>
+        <translation>Es wurden keine neuen Updates für Ihre Plattform gefunden.</translation>
+    </message>
+    <message>
+        <source>Download Complete</source>
+        <translation>Download komplett</translation>
+    </message>
+    <message>
+        <source>No updates were found for your platform.</source>
+        <translation>Es stehen keine neuen Updates zur Verfügung.</translation>
+    </message>
+    <message>
+        <source>Downloading & Installing Updates</source>
+        <translation>Herunterladen & Installieren von Updates</translation>
+    </message>
+    <message>
+        <source>Maybe &Later</source>
+        <translation>Möglicherweise &Später</translation>
+    </message>
+    <message>
+        <source>Extracting </source>
+        <translation>Extrahieren </translation>
+    </message>
+    <message>
+        <source>Update to QtLibs (v%1)</source>
+        <translation>Aktualisieren Sie QtLibs (v%1)</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation>Leere Seite</translation>
+    </message>
+    <message>
+        <source>Update Failed :(</source>
+        <translation>Update fehlgeschlagen: (</translation>
+    </message>
+    <message>
+        <source>SleepyHead v%1, codename "%2"</source>
+        <translation>SleepyHead v%1, Deckname "%2"</translation>
+    </message>
+    <message>
+        <source>Progress</source>
+        <translation>Fortschritt</translation>
+    </message>
+    <message>
+        <source>Checking for SleepyHead Updates</source>
+        <translation>Es wird nach Updates für SleepyHead gesucht</translation>
+    </message>
+    <message>
+        <source>Please wait while downloading and installing updates.</source>
+        <translation>Bitte warten Sie, während das Herunterladen und die Installation von Updates läuft.</translation>
+    </message>
+    <message>
+        <source>File integrity check failed for %1</source>
+        <translation>Datei-Integritätsprüfung fehlgeschlagen %1</translation>
+    </message>
+    <message>
+        <source>%1 bytes received</source>
+        <translation>%1 Bytes empfangen</translation>
+    </message>
+    <message>
+        <source>A new version of $APP is available</source>
+        <translation>Eine neue Version von $APP ist vorhanden</translation>
+    </message>
+    <message>
+        <source>You might need to reinstall manually. Sorry :(</source>
+        <translation>Möglicherweise müssen Sie manuell neu installieren. Es tut uns leid: (</translation>
+    </message>
+    <message>
+        <source>Updates</source>
+        <translation>Updates</translation>
+    </message>
+    <message>
+        <source>Downloading & Installing Updates...</source>
+        <translation>Herunterladen & Installieren von Updates...</translation>
+    </message>
+    <message>
+        <source>Version</source>
+        <translation>Version</translation>
+    </message>
+    <message>
+        <source>Update Complete!</source>
+        <translation>Update komplett!</translation>
+    </message>
+    <message>
+        <source>SleepyHead v%1 build notes</source>
+        <translation>SleepyHead v%1 Aufbau Hinweise</translation>
+    </message>
+    <message>
+        <source>Requesting </source>
+        <translation>Anfordern </translation>
+    </message>
+    <message>
+        <source>platform notes</source>
+        <translation>Plattform Notizen</translation>
+    </message>
+    <message>
+        <source>Ugh.. Something went wrong with unzipping.</source>
+        <translation>Pfui .. Etwas ist schiefgelaufen mit dem Entpacken.</translation>
+    </message>
+    <message>
+        <source>An update for SleepyHead is available.</source>
+        <translation>Ein Update für SleepyHead ist vorhanden.</translation>
+    </message>
+    <message>
+        <source>File size mismatch for %1</source>
+        <translation>Dateigröße Fehlanpassung für %1</translation>
+    </message>
+    <message>
+        <source>There was an error completing a network request:
+
+(</source>
+        <translation>Es gab einen Fehler bei einer Netzwerkanfrage:
+
+(</translation>
+    </message>
+    <message>
+        <source>Release Notes</source>
+        <translation>Versionshinweise</translation>
+    </message>
+</context>
+<context>
+    <name>gGraph</name>
+    <message>
+        <source>Snapshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraphView</name>
+    <message>
+        <source>100% zoom level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Reset Graph Layout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CPAP Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Oximeter Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Dotted Lines</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Restore X-axis zoom too 100% to view entire days data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Resets all graphs to a uniform height and default order.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Y-Axis</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Remove Clone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Clone %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/Translations/English.en_UK.ts b/Translations/English.en_UK.ts
new file mode 100644
index 0000000..c902452
--- /dev/null
+++ b/Translations/English.en_UK.ts
@@ -0,0 +1,7938 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="en_US">
+<context>
+    <name>CMS50Loader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Could not get data transmission from oximeter.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Please ensure you select 'upload' from the oximeter devices menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Daily</name>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="435"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="506"/>
+        <source>Go to the previous day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="525"/>
+        <source>Prev</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="551"/>
+        <source>Show or hide the calender</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="574"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="614"/>
+        <source>Go to the next day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="636"/>
+        <source>Next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="674"/>
+        <source>Go to the most recent day with data records</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="852"/>
+        <source>Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="914"/>
+        <source>View Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="959"/>
+        <location filename="../sleepyhead/daily.ui" line="1374"/>
+        <source>Notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1013"/>
+        <source>Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1038"/>
+        <source> i </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1041"/>
+        <source>Ctrl+I</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1054"/>
+        <source>B</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1057"/>
+        <source>Ctrl+B</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1069"/>
+        <source>u</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1079"/>
+        <source>Color</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1099"/>
+        <source>Small</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1104"/>
+        <source>Medium</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1109"/>
+        <source>Big</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1168"/>
+        <source>Zombie</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1181"/>
+        <source>I'm feeling...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1197"/>
+        <source>Weight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1271"/>
+        <source>Awesome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1309"/>
+        <source>B.M.I.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1325"/>
+        <source>Bookmarks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1346"/>
+        <source>Add Bookmark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1369"/>
+        <source>Starts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1382"/>
+        <source>Remove Bookmark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1475"/>
+        <source>Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1527"/>
+        <source>Graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1552"/>
+        <source>Drop down this list to show/hide available graphs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>Breakdown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="212"/>
+        <source>UF1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="213"/>
+        <source>UF2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="517"/>
+        <source>No %1 events are recorded this day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="615"/>
+        <source>%1 event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="616"/>
+        <source>%1 events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="651"/>
+        <source>Session Start Times</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="652"/>
+        <source>Session End Times</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="837"/>
+        <source>Session Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="892"/>
+        <source>Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="869"/>
+        <source>CPAP Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="872"/>
+        <source>Oximetery Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="875"/>
+        <source>Sleep Stage Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="878"/>
+        <source>Position Sensor Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="883"/>
+        <source>Unknown Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="933"/>
+        <source>One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="945"/>
+        <source>Machine Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="949"/>
+        <source>Machine Settings Unavailable</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1232"/>
+        <source>Total ramp time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1236"/>
+        <source>Time outside of ramp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1246"/>
+        <source>AHI excluding ramp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1587"/>
+        <source>"Nothing's here!"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1590"/>
+        <source>Bob is bored with this days lack of data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Hide all events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Show all events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1057"/>
+        <source>Oximeter Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1061"/>
+        <source>SpO2 Desaturations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1062"/>
+        <source>Pulse Change events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1063"/>
+        <source>SpO2 Baseline Used</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1093"/>
+        <source>PAP Mode: %1<br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1098"/>
+        <source>This day has missing pressure, mode and settings data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1140"/>
+        <source>%1%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1135"/>
+        <source>Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1206"/>
+        <source>This day just contains summary data, only limited information is available .</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1216"/>
+        <source>Total time in apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1226"/>
+        <source>Time over leak redline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Sleep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Wake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1523"/>
+        <source>Event Breakdown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1558"/>
+        <source>Sessions all off!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1560"/>
+        <source>Sessions exist for this day but are switched off.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1563"/>
+        <source>Impossibly short session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1564"/>
+        <source>Zero hours??</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1567"/>
+        <source>BRICK :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1568"/>
+        <source>Sorry, your machine only provides compliance data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1569"/>
+        <source>Complain to your Equipment Provider!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1869"/>
+        <source>Pick a Colour</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2131"/>
+        <source>This bookmarked is in a currently disabled area..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2174"/>
+        <source>Bookmark at %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2365"/>
+        <source>Show all graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2385"/>
+        <source>Hide all graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ExportCSV</name>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="14"/>
+        <source>Export as CSV</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="24"/>
+        <source>Dates:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="37"/>
+        <source>Resolution:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="46"/>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="53"/>
+        <source>Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="60"/>
+        <source>Daily</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="85"/>
+        <source>Filename:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="107"/>
+        <source>Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="114"/>
+        <source>Export</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="131"/>
+        <source>Start:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="154"/>
+        <source>End:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="192"/>
+        <source>Quick Range:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="60"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="122"/>
+        <source>Most Recent Day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="205"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="125"/>
+        <source>Last Week</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="210"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="128"/>
+        <source>Last Fortnight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="215"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="131"/>
+        <source>Last Month</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="220"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="134"/>
+        <source>Last 6 Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="225"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="137"/>
+        <source>Last Year</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="230"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="119"/>
+        <source>Everything</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="235"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="108"/>
+        <source>Custom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="248"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="73"/>
+        <source>SleepyHead_</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="76"/>
+        <source>Details_</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="78"/>
+        <source>Sessions_</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="80"/>
+        <source>Summary_</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="87"/>
+        <source>Select file to export to</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="88"/>
+        <source>CSV Files (*.csv)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>DateTime</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Data/Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <source>Session Count</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>End</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>Total Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="207"/>
+        <source> Count</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="211"/>
+        <source> Avg</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="215"/>
+        <source> %1%</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>FPIconLoader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="128"/>
+        <source>Import Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>This Machine Record cannot be imported in this profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>The Day records overlap with already existing content.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="441"/>
+        <source>SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1007"/>
+        <source>&Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="981"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="998"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1035"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3050"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3107"/>
+        <source>about:blank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1073"/>
+        <source>Report Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1080"/>
+        <source>Standard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1090"/>
+        <source>Monthly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1097"/>
+        <source>Date Range</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1141"/>
+        <source>&Help Browser</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1204"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1224"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1244"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="2932"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1317"/>
+        <source>qrc:/docs/index.html</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1633"/>
+        <source>Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1683"/>
+        <source>Daily</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1727"/>
+        <source>Overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1771"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1096"/>
+        <source>Oximetry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1821"/>
+        <source>Import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1871"/>
+        <source>Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3136"/>
+        <source>&File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3154"/>
+        <source>&View</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3172"/>
+        <source>&Help</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3188"/>
+        <source>&Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3192"/>
+        <source>&Advanced</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3196"/>
+        <source>Purge Oximetery Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3212"/>
+        <source>Rebuild CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3250"/>
+        <source>&Import Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3253"/>
+        <source>Shift+F2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3258"/>
+        <source>&Preferences</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3263"/>
+        <source>&Profiles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="276"/>
+        <source>E&xit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3268"/>
+        <source>Exit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3273"/>
+        <source>View &Daily</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3276"/>
+        <source>F5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3281"/>
+        <source>View &Overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3284"/>
+        <source>F6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3289"/>
+        <source>View &Welcome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3292"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3439"/>
+        <source>F4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3297"/>
+        <source>-</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3300"/>
+        <source>Ctrl+Tab</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3308"/>
+        <source>Use &AntiAliasing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3313"/>
+        <source>&About SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3321"/>
+        <source>&Fullscreen Toggle</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3324"/>
+        <source>F11</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3332"/>
+        <source>Show Debug Pane</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3337"/>
+        <source>&Reset Graph Layout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3342"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="273"/>
+        <source>Check for &Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3347"/>
+        <source>Take &Screenshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3350"/>
+        <source>F12</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3355"/>
+        <source>O&ximetry Wizard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3358"/>
+        <source>F7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3363"/>
+        <source>Print &Report</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3368"/>
+        <source>&Edit Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3376"/>
+        <source>&Link Graph Groups</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3520"/>
+        <source>Daily Calendar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3523"/>
+        <source>F9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3528"/>
+        <source>Backup &Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3386"/>
+        <source>Online Users &Guide</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3391"/>
+        <source>&Frequently Asked Questions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3396"/>
+        <source>&Automatic Oximetry Cleanup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3487"/>
+        <source>Toggle &Line Cursor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3401"/>
+        <source>Change &User</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3406"/>
+        <source>Purge &Current Selected Day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3411"/>
+        <source>All data for current CPAP machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3422"/>
+        <source>Right &Sidebar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3490"/>
+        <source>Ctrl+L</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3506"/>
+        <source>Daily Sidebar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3509"/>
+        <source>F8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3430"/>
+        <source>View S&tatistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1606"/>
+        <source>Navigation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1993"/>
+        <source>Bookmarks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3077"/>
+        <source>Records</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3202"/>
+        <source>Purge ALL CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3381"/>
+        <source>Exp&ort Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3425"/>
+        <source>F10</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3433"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3436"/>
+        <source>View Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3444"/>
+        <source>Import &ZEO Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3449"/>
+        <source>Import RemStar &MSeries Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3454"/>
+        <source>&Support SleepyHead Development</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3459"/>
+        <source>Sleep Disorder Terms &Glossary</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3464"/>
+        <source>Change &Language</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3469"/>
+        <source>Change &Data Folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3474"/>
+        <source>Import &Somnopose Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3479"/>
+        <source>Current Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="151"/>
+        <source>Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="942"/>
+        <source>Welcome</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="272"/>
+        <source>&About</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="300"/>
+        <source>Loading...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="609"/>
+        <source>Loading Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="720"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2062"/>
+        <source>Please wait, importing from backup folder(s)...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="878"/>
+        <source>Please wait, scanning for CPAP data cards...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="318"/>
+        <source>When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Import Problem</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="814"/>
+        <source>Please insert your CPAP data card...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="866"/>
+        <source>Access to Import has been blocked while recalculations are in progress.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="899"/>
+        <source>CPAP Data Located</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="916"/>
+        <source>Please wait, launching file dialog...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="922"/>
+        <source>No CPAP data card detected, launching file dialog...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="928"/>
+        <source>Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="929"/>
+        <source>Import Reminder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1017"/>
+        <source>Importing Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1079"/>
+        <source>Welcome to SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1082"/>
+        <source>About SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1083"/>
+        <source>This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1085"/>
+        <source>SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1087"/>
+        <source>This is a beta release, some features may not yet behave as expected.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1088"/>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1090"/>
+        <source>Currenly supported machines:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1091"/>
+        <source>CPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1092"/>
+        <source>Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1093"/>
+        <source>ResMed S9 models (CPAP, Auto, VPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1094"/>
+        <source>DeVilbiss Intellipap (Auto)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1095"/>
+        <source>Fisher & Paykel ICON (CPAP, Auto)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1097"/>
+        <source>Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1098"/>
+        <source>ResMed S9 Oximeter Attachment</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1099"/>
+        <source>Online Help Resources</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1100"/>
+        <source>Note:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1101"/>
+        <source>I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1103"/>
+        <source>(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1114"/>
+        <source>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1116"/>
+        <source>Further Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1118"/>
+        <source>Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1120"/>
+        <source>Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1122"/>
+        <source>About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1125"/>
+        <source>Friendly forums to talk and learn about Sleep Apnea:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1126"/>
+        <source><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>Copyright:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>&copy;2011-2014</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1137"/>
+        <source>License:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1138"/>
+        <source>This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1141"/>
+        <source>DISCLAIMER:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1143"/>
+        <source>This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1145"/>
+        <source>The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1147"/>
+        <source>Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1149"/>
+        <source>*** <u>Use at your own risk</u> ***</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1293"/>
+        <source>Loading</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>Revision:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>branch</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1327"/>
+        <source>Build Date: %1 %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1329"/>
+        <source>Graphics Engine: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2649"/>
+        <source>%1's Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>Choose where to save journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>XML Files (*.xml)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2037"/>
+        <source>Are you sure you want to rebuild all CPAP data for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2040"/>
+        <source>Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2048"/>
+        <source>For some reason, SleepyHead does not have internal backups for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2051"/>
+        <source>Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2052"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2124"/>
+        <source>A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2065"/>
+        <source>Because there are no internal backups to rebuild from, you will have to restore from your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1355"/>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1366"/>
+        <source>Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2066"/>
+        <source>Would you like to import from your own backups now? (you will have no data visible for this machine until you do)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2097"/>
+        <source>You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2100"/>
+        <source>Note as a precaution, the backup folder will be left in place.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2101"/>
+        <source>Are you <b>absolutely sure</b> you want to proceed?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2587"/>
+        <source>Are you sure you want to delete oximetry data for %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2589"/>
+        <source><b>Please be aware you can not undo this operation!</b></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2609"/>
+        <source>Select the day with valid oximetry data in daily view first.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1332"/>
+        <source>Copyright</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="314"/>
+        <source><b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="315"/>
+        <source>If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="316"/>
+        <source>Make sure your keep your SleepyHead data folder backed up when trying testing versions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="317"/>
+        <source>Please ensure you are running the latest version before reporting any bugs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="319"/>
+        <source>Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="320"/>
+        <source>Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="321"/>
+        <source>This red message line is intentional, and will not be a feature in the final version...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Imported %1 CPAP session(s) from
+
+%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Import Success</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Already up to date with CPAP data at
+
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Up to date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Couldn't find any valid Machine Data at
+
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="821"/>
+        <source>Choose a folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="892"/>
+        <source>A %1 file structure for a %2 was located at:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="894"/>
+        <source>A %1 file structure was located at:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="901"/>
+        <source>Would you like to import from this location?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="905"/>
+        <source>Specify</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1106"/>
+        <source>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1108"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1110"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1112"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1127"/>
+        <source><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1331"/>
+        <source>Data Folder Location: <a href="file://%1">%2</a></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1333"/>
+        <source>This software is released under the GNU Public License v3.0<br/></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1337"/>
+        <source>SleepyHead Project Page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1340"/>
+        <source>SleepyHead Wiki</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1344"/>
+        <source>Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1349"/>
+        <source>SleepyHead, brought to you by Jedimark</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1353"/>
+        <source>Kudos & Credits</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1354"/>
+        <source>Bugfixes, Patches and Platform Help:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Translators:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1361"/>
+        <source>3rd Party Libaries:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1362"/>
+        <source>SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1364"/>
+        <source>In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1371"/>
+        <source>Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1376"/>
+        <source>This software comes with absolutely no warranty, either express of implied.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1377"/>
+        <source>It comes with no guarantee of fitness for any particular purpose.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1378"/>
+        <source>No guarantees are made regarding the accuracy of any data this program displays.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1380"/>
+        <source>This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1382"/>
+        <source>This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1385"/>
+        <source>The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1387"/>
+        <source>Use this software entirely at your own risk.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1456"/>
+        <source>Access to Preferences has been blocked until recalculation completes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1545"/>
+        <source>There was an error saving screenshot to file "%1"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1547"/>
+        <source>Screenshot saved to file "%1"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1567"/>
+        <source>Printing Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1568"/>
+        <source>Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>Gah!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>If you can read this, the restart command didn't work. Your going to have to do it yourself manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2287"/>
+        <source>Performance will be degraded during these recalculations.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2288"/>
+        <source>Recalculating Indices</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2300"/>
+        <source>Loading Event Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2302"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2362"/>
+        <source>Recalculating Summaries</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2374"/>
+        <source>Restart Required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2375"/>
+        <source>Recalculations are complete, the application now needs to restart to display the changes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Recalculations are now complete.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Task Completed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2404"/>
+        <source>There was a problem opening ZEO File: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2408"/>
+        <source>Zeo CSV Import complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2430"/>
+        <source>There was a problem opening MSeries block File: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2434"/>
+        <source>MSeries Import complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2492"/>
+        <source>There was a problem opening Somnopose Data File: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2496"/>
+        <source>Somnopause Data Import complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MinMaxWidget</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1773"/>
+        <source>Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1774"/>
+        <source>Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1775"/>
+        <source>Override</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1776"/>
+        <source>The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1782"/>
+        <source>The Minimum Y-Axis value.. Note this can be a negative number if you wish.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1783"/>
+        <source>The Maximum Y-Axis value.. Must be greater than Minimum to work.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1818"/>
+        <source>Scaling Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1840"/>
+        <source>This button resets the Min and Max to match the Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>NewProfile</name>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="14"/>
+        <source>Edit User Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="70"/>
+        <source>I agree to all the conditions above.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="111"/>
+        <source>User Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="137"/>
+        <source>User Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="152"/>
+        <source>Keep the kids out.. Nothing more.. This isn't meant to be uber security.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="155"/>
+        <source>Password Protect Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="182"/>
+        <source>Password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="196"/>
+        <source>...twice...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="213"/>
+        <source>Locale Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="285"/>
+        <source>Country</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="253"/>
+        <source>TimeZone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="54"/>
+        <source>about:blank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="240"/>
+        <source>DST Zone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="320"/>
+        <source>Personal Information (for reports)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="344"/>
+        <source>First Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="354"/>
+        <source>Last Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="364"/>
+        <source>D.O.B.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="380"/>
+        <source>Gender</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="393"/>
+        <source>Male</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="398"/>
+        <source>Female</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="414"/>
+        <source>Height</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="453"/>
+        <source>metric</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="458"/>
+        <source>archiac</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="471"/>
+        <source>Contact Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="498"/>
+        <location filename="../sleepyhead/newprofile.ui" line="773"/>
+        <source>Address</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="515"/>
+        <location filename="../sleepyhead/newprofile.ui" line="804"/>
+        <source>Email</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="525"/>
+        <location filename="../sleepyhead/newprofile.ui" line="794"/>
+        <source>Phone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="570"/>
+        <source>CPAP Treatment Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="597"/>
+        <source>Date Diagnosed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="611"/>
+        <source>Untreated AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="625"/>
+        <source>CPAP Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="633"/>
+        <source>CPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="638"/>
+        <source>APAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="643"/>
+        <source>Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="648"/>
+        <source>ASV</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="656"/>
+        <source>RX Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="702"/>
+        <source>Doctors / Clinic Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="729"/>
+        <source>Doctors Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="746"/>
+        <source>Practice Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="756"/>
+        <source>Patient ID</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="852"/>
+        <source>SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="867"/>
+        <source>TextLabel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="943"/>
+        <source>&Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="959"/>
+        <source>&Back</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="975"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="275"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="284"/>
+        <source>&Next</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="59"/>
+        <source>Select Country</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="109"/>
+        <source>Welcome to SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="111"/>
+        <source>This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="114"/>
+        <source>SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="116"/>
+        <source>PLEASE READ CAREFULLY</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="117"/>
+        <source>SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="120"/>
+        <source>Accuracy of any data displayed is not and can not be guaranteed.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="122"/>
+        <source>Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="125"/>
+        <source>The author will not be held liable for <u>anything</u> related to the use or misuse of this software.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="129"/>
+        <source>Use of this software is entirely at your own risk.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="132"/>
+        <source>SleepyHead is copyright &copy;2011-2014 Mark Watkins</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="157"/>
+        <source>Please provide a username for this profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="167"/>
+        <source>Passwords don't match</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Profile Changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Accept and save this information?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="273"/>
+        <source>&Finish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="449"/>
+        <source>&Close this window</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Overview</name>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="68"/>
+        <source>Range:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="82"/>
+        <source>Last Week</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="87"/>
+        <source>Last Two Weeks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="92"/>
+        <source>Last Month</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="97"/>
+        <source>Last Two Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="102"/>
+        <source>Last Three Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="107"/>
+        <source>Last 6 Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="112"/>
+        <source>Last Year</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="117"/>
+        <source>Everything</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="122"/>
+        <source>Custom</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="130"/>
+        <source>Start:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="153"/>
+        <source>End:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="176"/>
+        <source>Reset view to selected date range</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="195"/>
+        <location filename="../sleepyhead/overview.ui" line="244"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="225"/>
+        <source>Toggle Graph Visibility</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="260"/>
+        <source>Drop down to see list of graphs to switch on/off.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="264"/>
+        <source>Graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="121"/>
+        <source>Respiratory
+Disturbance
+Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="123"/>
+        <source>Apnea
+Hypopnea
+Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage
+(hours)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times
+(hours)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>% in %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <source>%1
+(% of night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>Large Leaks
+(% of night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI
+Shows RDI Clusters
+(RDI/hr)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI
+Shows AHI Clusters
+(AHI/hr)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="157"/>
+        <source>Tidal
+Volume
+(ml)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="158"/>
+        <source>Minute
+Ventilation
+(L/min)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="159"/>
+        <source>Target
+Ventilation
+(L/min)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="160"/>
+        <source>Patient
+Triggered
+Breaths
+(%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="161"/>
+        <source>
+(count)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="163"/>
+        <source>Oxygen Saturation
+(%)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="164"/>
+        <source>SensAwake
+(count)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="167"/>
+        <source>Body
+Mass
+Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="168"/>
+        <source>How you felt
+(0-10)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="185"/>
+        <source>Zombie Meter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="254"/>
+        <source>breaths/min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="262"/>
+        <source>L/b</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="284"/>
+        <source>%PTB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="311"/>
+        <source>% PB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="314"/>
+        <source>% %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="670"/>
+        <source>Show all graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="683"/>
+        <source>Hide all graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>OximeterImport</name>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="14"/>
+        <source>Dialog</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="39"/>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="35"/>
+        <source>Oximeter Import Wizard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="749"/>
+        <source>Skip this page next time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="789"/>
+        <source><html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="823"/>
+        <source>Where would you like to import from?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="846"/>
+        <source><html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="852"/>
+        <source>Directly from a recording on a device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="872"/>
+        <source><html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="878"/>
+        <source>Record attached to computer overnight (provides plethysomogram)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="895"/>
+        <source><html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="901"/>
+        <source>Import from a datafile saved by another program, like SpO2Review</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="942"/>
+        <source><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p>& [...]
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="964"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1000"/>
+        <source>Please connect your oximeter device</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1026"/>
+        <source>Press Start to commence recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1072"/>
+        <source>Show Live Graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1103"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1357"/>
+        <source>Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1139"/>
+        <source>SpO2 %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1221"/>
+        <source>Pulse Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1313"/>
+        <source>Multiple Sessions Detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1329"/>
+        <source>Please choose which one you want to import into SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1352"/>
+        <source>Start Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1362"/>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1379"/>
+        <source>Import Completed. When did the recording start?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1403"/>
+        <source>Day recording (normally would of) started</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1449"/>
+        <source>Oximeter Starting time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1461"/>
+        <source>I want to use the time reported by my oximeter's built in clock.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1477"/>
+        <source>I started this oximeter recording at (or near) the same time as a session on my CPAP machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1506"/>
+        <source><html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1538"/>
+        <source><html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1559"/>
+        <source>Choose CPAP session to sync to:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1598"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1637"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1679"/>
+        <source>You can manually adjust the time here if required:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1700"/>
+        <source>HH:mm:ssap</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1753"/>
+        <source>&Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1760"/>
+        <source>&Information Page</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1780"/>
+        <source>&Retry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1787"/>
+        <source>&Choose Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1794"/>
+        <source>&End Recording</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1801"/>
+        <source>&Sync and Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1808"/>
+        <source>&Save and Finish</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1815"/>
+        <source>&Start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="170"/>
+        <source>Scanning for compatible oximeters</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="202"/>
+        <source>Could not detect any connected oximeter devices.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="209"/>
+        <source>Connecting to %1 Oximeter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="269"/>
+        <source>"%1", session %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="288"/>
+        <source>Waiting for %1 to start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="289"/>
+        <source>Waiting for the device to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="291"/>
+        <source>Select upload option on %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="292"/>
+        <source>Waiting for you to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="323"/>
+        <source>%1 device is uploading data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="324"/>
+        <source>Please wait until oximeter upload process completes. Do not unplug your oximeter.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="341"/>
+        <source>Oximeter import completed..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Select a valid oximetry data file</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Oximetry Files (*.spo *.spor *.spo2 *.dat)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="391"/>
+        <source>No Oximetery module could parse the given file:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="413"/>
+        <source>Oximeter not detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="420"/>
+        <source>Couldn't access oximeter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="431"/>
+        <source>Live Oximetery Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="434"/>
+        <source>Starting up...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="435"/>
+        <source>If you can still read this after a few seconds, cancel and try again</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="478"/>
+        <source>Live Import Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="479"/>
+        <source>Live Oximetery Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="480"/>
+        <source>Live Oximetery import has been stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="527"/>
+        <source>%1 session(s) on %2, starting at %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="531"/>
+        <source>No CPAP data available on %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="537"/>
+        <source>%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="650"/>
+        <source>Recording...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="657"/>
+        <source>Finger not detected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="750"/>
+        <source>I want to use the time my computer recorded for this live oximetry session.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="753"/>
+        <source>I need to set the time manually, because my oximeter doesn't have an internal clock.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="764"/>
+        <source>Something went wrong getting session data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="993"/>
+        <source>CMS50 Session %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Oximetry</name>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="89"/>
+        <source>Date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="102"/>
+        <source>d/MM/yy h:mm:ss AP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="131"/>
+        <source>R&eset</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="160"/>
+        <source>SpO2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="245"/>
+        <source>Pulse</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="346"/>
+        <source>...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="366"/>
+        <source>&Open .spo/R File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="385"/>
+        <source>Serial &Import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="398"/>
+        <source>&Start Live</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="421"/>
+        <source>Serial Port</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="450"/>
+        <source>&Rescan Ports</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>PreferencesDialog</name>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="23"/>
+        <source>Preferences</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="58"/>
+        <source>&Import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="79"/>
+        <source>Session Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="102"/>
+        <source>Combine Close Sessions </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="112"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="197"/>
+        <source>Minutes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="132"/>
+        <source>Multiple sessions closer together than this value will be kept on the same day.
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="187"/>
+        <source>Ignore Short Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="211"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="252"/>
+        <source>Day Split Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="262"/>
+        <source>Sessions starting before this time will go to the previous calendar day.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="282"/>
+        <source>Keep session data in memory to speed up revisiting days.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="285"/>
+        <source>Cache Session Data (uses more system memory)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="395"/>
+        <source>Session Storage Options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="419"/>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+SleepyHead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="435"/>
+        <source>This makes SleepyHead's data take around half as much space.
+But it makes import and day changing take longer.. 
+If you've got a new computer with a small solid state disk, this is a good option.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="440"/>
+        <source>Compress Session Data (makes SleepyHead data smaller, but day changing slower.)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="447"/>
+        <source>Compress ResMed (EDF) backups to save disk space.
+Backed up EDF files are stored in the .gz format, 
+which is common on Mac & Linux platforms.. 
+
+SleepyHead can import from this compressed backup directory natively.. 
+To use with ResScan will require the .gz files to be uncompressed first..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="455"/>
+        <source>Compress SD Card Backups (slower first import, but makes backups smaller)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="467"/>
+        <source>The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="477"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data.  </span></p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="508"/>
+        <source>&CPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="535"/>
+        <source>CPAP Mask Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="562"/>
+        <source>Mask Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="569"/>
+        <source>Generic mask type. Select the one that's closest to your mask.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="587"/>
+        <source>Description</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="594"/>
+        <source>The name of your mask, or at least the name you call it.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="607"/>
+        <source>Method of unintentional leaks calculation if not provided by your machine.
+Note: Statistical Model is experimental.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="612"/>
+        <source>Mask Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="617"/>
+        <source>Statistical Model</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="631"/>
+        <source>Leak calcs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="644"/>
+        <source>Started Using</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="657"/>
+        <source>The date you started using this mask</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="673"/>
+        <source>Leak Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="687"/>
+        <source>Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="692"/>
+        <source>Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1153"/>
+        <source>Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1156"/>
+        <source>Use RDI instead of AHI (PRS1 only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1069"/>
+        <source>Don't show any compliance information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1072"/>
+        <source>Show Compliance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1105"/>
+        <source>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1108"/>
+        <source> hours</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1130"/>
+        <source>as over</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1137"/>
+        <source>of usage per night</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="728"/>
+        <source>Enable/disable experimental event flagging enhancements. 
+It allows detecting borderline events, and some the machine missed.
+This option must be enabled before import, otherwise a purge is required.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="733"/>
+        <source>Custom User Event Flagging</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="797"/>
+        <source>Flow Restriction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="843"/>
+        <source>Percentage of restriction in airflow from the median value. 
+A value of 20% works well for detecting apneas. </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="760"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="847"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1432"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1487"/>
+        <source>%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="875"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="821"/>
+        <source>Duration of airflow restriction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="804"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="824"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1377"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1406"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1477"/>
+        <source>s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="814"/>
+        <source>Event Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="857"/>
+        <source>Allow duplicates near machine events.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="947"/>
+        <source>AHI/Hour Graph Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="983"/>
+        <source>Window</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="990"/>
+        <source>Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="994"/>
+        <source> minutes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1010"/>
+        <source>Reset the counter to zero at beginning of each (time) window.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1013"/>
+        <source>Zero Reset</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1029"/>
+        <source>CPAP Clock Drift</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="318"/>
+        <source>Do not import sessions older than:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="325"/>
+        <source>Sessions older than this date will not be imported</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="351"/>
+        <source>dd MMMM yyyy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1036"/>
+        <source>Don't touch this unless you know your CPAP clock is out.
+Try to sync it to your PC's clock (which should be synced to a timeserver)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1040"/>
+        <source> seconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="934"/>
+        <source>User definable threshold considered large leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="937"/>
+        <source> L/min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="924"/>
+        <source>Whether to show the leak redline in the leak graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="927"/>
+        <source>Show Leak Redline</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1189"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1261"/>
+        <source>Search</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1310"/>
+        <source>&Oximetry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1537"/>
+        <source>Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1331"/>
+        <source>Oximetery Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="770"/>
+        <source>Show in Event Breakdown Piechart</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="777"/>
+        <source>#1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="784"/>
+        <source>#2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="905"/>
+        <source>This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="908"/>
+        <source>Resync Machine Detected Events (Experimental)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1550"/>
+        <source>Tries to forces the oximetry data to link with CPAP when possible.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1553"/>
+        <source>Link Oximetry and CPAP graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1367"/>
+        <source>SPO2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1429"/>
+        <source>Percentage drop in oxygen saturation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1422"/>
+        <source>Pulse</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1387"/>
+        <source>Sudden change in Pulse Rate of at least this amount</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1390"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1514"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1521"/>
+        <source> bpm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1374"/>
+        <source>Minimum duration of drop in oxygen saturation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1403"/>
+        <source>Minimum duration of pulse change event.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1474"/>
+        <source>Small chunks of oximetry data under this amount will be discarded.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1629"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style= [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">t [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1649"/>
+        <source>&General</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1679"/>
+        <source>Changes to the following settings needs a restart, but not a recalc.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1682"/>
+        <source>Preferred Calculation Methods</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1709"/>
+        <source>Middle Calculations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1716"/>
+        <source>Upper Percentile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1723"/>
+        <source>For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1737"/>
+        <source>Median is recommended for ResMed users.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1741"/>
+        <source>Median</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1746"/>
+        <source>Weighted Average</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1751"/>
+        <source>Normal Average</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1771"/>
+        <source>ResMed users probably should use 99th Percentile for visual consistency.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1775"/>
+        <source>True Maximum</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1780"/>
+        <source>99% Percentile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1788"/>
+        <source>Maximum Calcs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1798"/>
+        <source>General Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1850"/>
+        <source>Daily view navigation buttons will skip over days without data records</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1853"/>
+        <source>Skip over Empty Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1839"/>
+        <source>Allow use of multiple CPU cores where available to improve performance. 
+Mainly affects the importer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1843"/>
+        <source>Enable Multithreading</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1829"/>
+        <source>Bypass the login screen and load the most recent User Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="361"/>
+        <source>Summary only data is more accurate for ResMed users if this is left on.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="364"/>
+        <source>Don't Split Summary Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="428"/>
+        <source>Create SD Card Backups during Import (Turn this off at your own peril!)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1166"/>
+        <source>Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1212"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1284"/>
+        <source>Reset &Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1225"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1297"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1238"/>
+        <source>Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1355"/>
+        <source>Flag rapid changes in oximetry stats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1448"/>
+        <source>Other oximetry options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1454"/>
+        <source>Flag SPO2 Desaturations Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1464"/>
+        <source>Discard segments under</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1494"/>
+        <source>Flag Pulse Rate Above</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1504"/>
+        <source>Flag Pulse Rate Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1574"/>
+        <source>Contec CMS50D+/E/F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1579"/>
+        <source>Contec CMS50F v3.7+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1584"/>
+        <source>ChoiceMMed MD300W1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1589"/>
+        <source>ResMed S9 Oximeter Module</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1610"/>
+        <source>If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1613"/>
+        <source>Update Oximeter Clock during import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1819"/>
+        <source>Show flags for machine detected events that haven't been identified yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1822"/>
+        <source>Show Unknown Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1832"/>
+        <source>Skip Login Screen</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1860"/>
+        <source>Import without nagging</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1892"/>
+        <source>Automatically Check For Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1909"/>
+        <source>Check for new version every</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1916"/>
+        <source>Sourceforge hosts this project for free.. Please be considerate of their resources..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1932"/>
+        <source>days.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1997"/>
+        <source>&Check for Updates now</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2020"/>
+        <source>Last Checked For Updates: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2033"/>
+        <source>TextLabel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2055"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2064"/>
+        <source>I want to try experimental and test builds (Advanced users only please.)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2088"/>
+        <source>&Appearance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2120"/>
+        <source>Graph Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2127"/>
+        <source>Bar Tops</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2132"/>
+        <source>Line Chart</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2140"/>
+        <source>Overview Linecharts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2165"/>
+        <source><html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2193"/>
+        <source>milliseconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2213"/>
+        <source>How long you want the tooltips to stay visible.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2259"/>
+        <source>Scroll Dampening</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2269"/>
+        <source>Tooltip Timeout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2285"/>
+        <source>Default display height of graphs in pixels</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2304"/>
+        <source>Graph Tooltips</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2317"/>
+        <source>The visual method of displaying waveform overlay flags.
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2322"/>
+        <source>Standard Bars</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2327"/>
+        <source>Top Markers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2335"/>
+        <source>Graph Height</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2351"/>
+        <source>Overlay Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2361"/>
+        <source>Line Thickness</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2373"/>
+        <source>The pixel thickness of line plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2422"/>
+        <source>Other Visual Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2428"/>
+        <source>Anti-Aliasing applies smoothing to graph plots.. 
+Certain plots look more attractive with this on. 
+This also affects printed reports.
+
+Try it and see if you like it.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2435"/>
+        <source>Use Anti-Aliasing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2442"/>
+        <source>Makes certain plots look more "square waved".</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2445"/>
+        <source>Square Wave Plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2452"/>
+        <source>Allows graphs to be "screenshotted" for display purposes.
+The Event Breakdown PIE chart uses this method, as does
+the printing code.
+Unfortunately some older computers/versions of Qt can cause
+this application to be unstable with this feature enabled.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2459"/>
+        <source>Show event breakdown pie chart</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2466"/>
+        <source>Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2469"/>
+        <source>Use Pixmap Caching</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2476"/>
+        <source><html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2479"/>
+        <source>Animations && Fancy Stuff</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2486"/>
+        <source>Whether to allow changing yAxis scales by double clicking on yAxis labels</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2489"/>
+        <source>Allow YAxis Scaling</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2508"/>
+        <source>Application Fonts</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2543"/>
+        <source>Font</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2562"/>
+        <source>Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2581"/>
+        <source>Bold  </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2603"/>
+        <source>Italic</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2616"/>
+        <source>Application</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2680"/>
+        <source>Graph Text</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2741"/>
+        <source>Graph Titles</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2802"/>
+        <source>Big  Text</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2863"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="410"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="530"/>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2920"/>
+        <source>&Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2927"/>
+        <source>&Ok</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="68"/>
+        <source>Nasal Pillows</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="406"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="525"/>
+        <source>Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="407"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="526"/>
+        <source>Color</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="408"/>
+        <source>Flag Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="409"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="529"/>
+        <source>Label</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="425"/>
+        <source>CPAP Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="426"/>
+        <source>Oximeter Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="427"/>
+        <source>Positional Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="428"/>
+        <source>Sleep Stage Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="429"/>
+        <source>Unknown Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="468"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="589"/>
+        <source>Double click to change the descriptive name this channel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="476"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="596"/>
+        <source>Double click to change the default color for this channel plot/flag/data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="484"/>
+        <source>Here you can change the type of flag shown for this event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="489"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="612"/>
+        <source>This is the short-form label to indicate this channel on screen.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="495"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="618"/>
+        <source>This is a description of what this channel does.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="527"/>
+        <source>Lower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="528"/>
+        <source>Upper</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="546"/>
+        <source>CPAP Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="547"/>
+        <source>Oximeter Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="548"/>
+        <source>Positional Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="549"/>
+        <source>Sleep Stage Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="602"/>
+        <source>Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="607"/>
+        <source>Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="709"/>
+        <source>Data Reindex Required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="710"/>
+        <source>A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.
+
+Are you sure you want to make these changes?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="716"/>
+        <source>Restart Required</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="717"/>
+        <source>One or more of the changes you have made will require this application to be restarted,
+in order for these changes to come into effect.
+
+Would you like do this now?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1141"/>
+        <source>Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1142"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="61"/>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="62"/>
+        <source>Minor Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="63"/>
+        <source>Span</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="64"/>
+        <source>Always Minor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1095"/>
+        <source>This may not be a good idea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1096"/>
+        <source>ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1097"/>
+        <source>If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1098"/>
+        <source>If you need to conserve disk space, please remember to carry out manual backups.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1099"/>
+        <source>Are you sure you want to disable these backups?</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>ProfileSelect</name>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="14"/>
+        <source>Select Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="115"/>
+        <source>Search:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="188"/>
+        <source>Start with the selected user profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="191"/>
+        <source>&Select User</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="212"/>
+        <source>Create a new user profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="215"/>
+        <source>New Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="232"/>
+        <source>Choose a different SleepyHead data folder.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="238"/>
+        <source>&Different Folder</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="271"/>
+        <source>SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="284"/>
+        <source>[version]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="307"/>
+        <source>Click here if you didn't want to start SleepyHead.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="310"/>
+        <source>&Quit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="367"/>
+        <source>Folder:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="380"/>
+        <source>The current location of SleepyHead data store.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="386"/>
+        <source>[data directory]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="94"/>
+        <source>Open Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="95"/>
+        <source>Edit Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="97"/>
+        <source>Delete Profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="144"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="224"/>
+        <source>Enter Password for %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="163"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="373"/>
+        <source>Incorrect Password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="165"/>
+        <source>You entered the password wrong too many times.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>Enter the word DELETE below to confirm.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>You are about to destroy profile '%1'.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>Sorry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>You need to enter DELETE in capital letters.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="214"/>
+        <source>Could not open profile.. You will need to delete this profile directory manually</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="215"/>
+        <source>You will find it under the following location:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="243"/>
+        <source>You entered an incorrect password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="246"/>
+        <source>If you're trying to delete because you forgot the password, you need to delete it manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="259"/>
+        <source>There was an error deleting the profile directory, you need to manually remove it.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="263"/>
+        <source>Profile '%1' was succesfully deleted</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="292"/>
+        <source>Create new profile</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="357"/>
+        <source>Enter Password</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="376"/>
+        <source>You entered an Incorrect Password too many times. Exiting!</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1276"/>
+        <source>No Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="404"/>
+        <source>Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="402"/>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="405"/>
+        <source>Duration</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="419"/>
+        <source>(% %1 in events)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Feb</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Mar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Apr</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>May</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jun</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Jul</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Aug</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Sep</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Oct</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Nov</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Dec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="321"/>
+        <source>cm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="322"/>
+        <source>"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="323"/>
+        <source>ft</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="324"/>
+        <source>lb</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="325"/>
+        <source>oz</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="326"/>
+        <source>Kg</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="327"/>
+        <source>cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="328"/>
+        <source>Hours</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="329"/>
+        <source>Minutes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="330"/>
+        <source>Seconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="331"/>
+        <source>Events/hr</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="333"/>
+        <source>Hz</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="334"/>
+        <source>bpm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="336"/>
+        <source>Litres</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="337"/>
+        <source>ml</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="338"/>
+        <source>Breaths/min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="339"/>
+        <source>?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="341"/>
+        <source>Severity (0-1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="342"/>
+        <source>Degrees</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="345"/>
+        <source>Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="346"/>
+        <source>Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="347"/>
+        <source>Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="348"/>
+        <source>Busy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="349"/>
+        <source>Please Note</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="352"/>
+        <source>Compliance Only :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="353"/>
+        <source>Graphs Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="354"/>
+        <source>Summary Only :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="355"/>
+        <source>Sessions Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="359"/>
+        <source>&Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="360"/>
+        <source>&No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="361"/>
+        <source>&Cancel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="362"/>
+        <source>&Destroy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="363"/>
+        <source>&Save</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="365"/>
+        <source>BMI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="366"/>
+        <source>Weight</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="367"/>
+        <source>Zombie</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="368"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="259"/>
+        <source>Pulse Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="369"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="266"/>
+        <source>SpO2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="370"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="273"/>
+        <source>Plethy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="371"/>
+        <source>Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="373"/>
+        <source>Daily</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="374"/>
+        <source>Overview</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="375"/>
+        <source>Oximetry</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="377"/>
+        <source>Oximeter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="378"/>
+        <source>Event Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="381"/>
+        <source>CPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="382"/>
+        <source>BiPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="383"/>
+        <source>Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="384"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1065"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1072"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1076"/>
+        <source>EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="385"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1068"/>
+        <source>Min EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="386"/>
+        <source>Max EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="387"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1066"/>
+        <source>IPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="388"/>
+        <source>Min IPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="389"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1069"/>
+        <source>Max IPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="390"/>
+        <source>APAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="391"/>
+        <source>ASV</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="392"/>
+        <source>ST/ASV</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="394"/>
+        <source>Humidifier</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="396"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="187"/>
+        <source>H</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="397"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="181"/>
+        <source>OA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="398"/>
+        <source>A</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="399"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="175"/>
+        <source>CA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="400"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="197"/>
+        <source>FL</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="401"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="238"/>
+        <source>SA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="402"/>
+        <source>LE</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="403"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="233"/>
+        <source>EP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="404"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="206"/>
+        <source>VS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="406"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="211"/>
+        <source>VS2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="407"/>
+        <source>RERA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="408"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2078"/>
+        <source>PP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="409"/>
+        <source>P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="410"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="202"/>
+        <source>RE</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="411"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="228"/>
+        <source>NR</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="412"/>
+        <source>NRI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="413"/>
+        <source>O2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="414"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="283"/>
+        <source>PC</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="243"/>
+        <source>UF1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="416"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="248"/>
+        <source>UF2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="417"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="253"/>
+        <source>UF3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="419"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1070"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1073"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1077"/>
+        <source>PS</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="421"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>RDI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="422"/>
+        <source>AI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="423"/>
+        <source>HI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="424"/>
+        <source>UAI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="425"/>
+        <source>CAI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="426"/>
+        <source>FLI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="428"/>
+        <source>REI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="429"/>
+        <source>EPI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="430"/>
+        <source>ÇSR</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="431"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="169"/>
+        <source>PB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="435"/>
+        <source>IE</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="371"/>
+        <source>Insp. Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="437"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="367"/>
+        <source>Exp. Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="438"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>Resp. Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="439"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="195"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="379"/>
+        <source>Flow Limitation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="440"/>
+        <source>Flow Limit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="441"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="236"/>
+        <source>SensAwake</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="442"/>
+        <source>Pat. Trig. Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="443"/>
+        <source>Tgt. Min. Vent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="444"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Vent.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="445"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Minute Vent.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="446"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="329"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Tidal Volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="447"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Resp. Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="448"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="334"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Snore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="449"/>
+        <source>Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="450"/>
+        <source>Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="451"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="221"/>
+        <source>Large Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="452"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="223"/>
+        <source>LL</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="453"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Total Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="454"/>
+        <source>Unintentional Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="455"/>
+        <source>MaskPressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="456"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="314"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Flow Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="457"/>
+        <source>Sleep Stage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="458"/>
+        <source>Usage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="459"/>
+        <source>Sessions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="460"/>
+        <source>Pr. Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="351"/>
+        <source>No Data Available</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="462"/>
+        <source>Bookmarks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="463"/>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="465"/>
+        <source>Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="466"/>
+        <source>Model</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="467"/>
+        <source>Brand</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="468"/>
+        <source>Serial</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="469"/>
+        <source>Series</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="470"/>
+        <source>Machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="471"/>
+        <source>Channel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="472"/>
+        <source>Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="474"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Inclination</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="475"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Orientation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="477"/>
+        <source>Name</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="478"/>
+        <source>DOB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="479"/>
+        <source>Phone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="480"/>
+        <source>Address</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="481"/>
+        <source>Email</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="482"/>
+        <source>Patient ID</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="483"/>
+        <source>Date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="485"/>
+        <source>Bedtime</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="486"/>
+        <source>Wake-up</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="487"/>
+        <source>Mask Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="488"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="124"/>
+        <source>Unknown</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="489"/>
+        <source>None</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="490"/>
+        <source>Ready</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="492"/>
+        <source>First</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="493"/>
+        <source>Last</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="494"/>
+        <source>Start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="495"/>
+        <source>End</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="496"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="86"/>
+        <source>On</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="497"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="87"/>
+        <source>Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="498"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2124"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="499"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2125"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="501"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1062"/>
+        <source>Min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="502"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1063"/>
+        <source>Max</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="503"/>
+        <source>Med</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="505"/>
+        <source>Average</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="506"/>
+        <source>Median</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="507"/>
+        <source>Avg</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="508"/>
+        <source>W-Avg</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="262"/>
+        <source>Import Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="263"/>
+        <source>This Machine Record cannot be imported in this profile.
+The Day records overlap with already existing content.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="384"/>
+        <source>Non Data Capable Machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="385"/>
+        <source>Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="386"/>
+        <source>I'm sorry to report that SleepyHead can only track hours of use for this machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2169"/>
+        <source>15mm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2168"/>
+        <source>22mm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2082"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2084"/>
+        <source>Flex Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2083"/>
+        <source>PRS1 pressure relief mode.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2089"/>
+        <source>C-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2090"/>
+        <source>C-Flex+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2091"/>
+        <source>A-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2092"/>
+        <source>Rise Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2093"/>
+        <source>Bi-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2097"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2099"/>
+        <source>Flex Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2098"/>
+        <source>PRS1 pressure relief setting.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2103"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2134"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2156"/>
+        <source>x1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2104"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2135"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2157"/>
+        <source>x2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2105"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2136"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2158"/>
+        <source>x3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2106"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2137"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2159"/>
+        <source>x4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2107"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2138"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2160"/>
+        <source>x5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2111"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2113"/>
+        <source>Humidifier Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2112"/>
+        <source>PRS1 humidifier connected?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2115"/>
+        <source>Disconnected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2116"/>
+        <source>Connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2120"/>
+        <source>Heated Tubing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2121"/>
+        <source>Heated Tubing Connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2122"/>
+        <source>Headed Tubing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2129"/>
+        <source>Humidification Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2130"/>
+        <source>PRS1 Humidification level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2131"/>
+        <source>Humid. Lvl.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2142"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2143"/>
+        <source>System One Resistance Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2144"/>
+        <source>Sys1 Resist. Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2151"/>
+        <source>System One Resistance Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2152"/>
+        <source>System One Mask Resistance Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2153"/>
+        <source>Sys1 Resist. Set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2164"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2166"/>
+        <source>Hose Diameter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2165"/>
+        <source>Diameter of primary CPAP hose</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2173"/>
+        <source>System One Resistance Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2174"/>
+        <source>Whether System One resistance settings are available to you.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2175"/>
+        <source>Sys1 Resist. Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2182"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2184"/>
+        <source>Auto On</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2183"/>
+        <source>A few breaths automatically starts machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2191"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2193"/>
+        <source>Auto Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2192"/>
+        <source>Machine automatically switches off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2200"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2202"/>
+        <source>Mask Alert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2201"/>
+        <source>Whether or not machine allows Mask checking.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2209"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2211"/>
+        <source>Show AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2210"/>
+        <source>Whether or not machine shows AHI via LCD panel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2223"/>
+        <source>Unknown PRS1 Code %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2224"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2225"/>
+        <source>PRS1_%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2290"/>
+        <source>Timed Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2291"/>
+        <source>Machine Initiated Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2292"/>
+        <source>TB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/preferences.cpp" line="33"/>
+        <source>Windows User</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="308"/>
+        <source>SleepyHead (%1) needs to upgrade its database for %2 %3 %4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="321"/>
+        <source><b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="322"/>
+        <source><i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="256"/>
+        <source>Launching Windows Explorer failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="257"/>
+        <source>Could not find explorer.exe in path to launch Windows Explorer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="325"/>
+        <source>SleepyHead does not yet have any automatic card backups stored for this device.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="326"/>
+        <source>This means you will need to import this machine data again afterwards from your own backups or data card.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Important:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="330"/>
+        <source>If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="331"/>
+        <source>Are you ready to upgrade, so you can run the new version of SleepyHead?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="334"/>
+        <source>Machine Database Changes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="345"/>
+        <source>Sorry, the purge operation failed, which means this version of SleepyHead can't start.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="346"/>
+        <source>The machine data folder needs to be removed manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="347"/>
+        <source>This folder currently resides at the following location:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="353"/>
+        <source>Rebuilding from %1 Backup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="358"/>
+        <source>Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="365"/>
+        <source>SleepyHead will now start the import wizard so you can reinstall your %1 data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="375"/>
+        <source>SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="377"/>
+        <source>Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="92"/>
+        <source>Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="104"/>
+        <source>Therapy Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="108"/>
+        <source>Inspiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="112"/>
+        <source>Lower Inspiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="116"/>
+        <source>Higher Inspiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="120"/>
+        <source>Expiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="124"/>
+        <source>Lower Expiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="128"/>
+        <source>Higher Expiratory Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="132"/>
+        <source>Pressure Support</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="137"/>
+        <source>PS Min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <source>Pressure Support Minimum</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="141"/>
+        <source>PS Max</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <source>Pressure Support Maximum</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Min Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Minimum Therapy Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Max Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Maximum Therapy Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="153"/>
+        <source>Ramp Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <source>Ramp Delay Period</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="157"/>
+        <source>Ramp Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <source>Starting Ramp Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="161"/>
+        <source>Ramp Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="162"/>
+        <source>Ramp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="167"/>
+        <source>Periodic Breathing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="168"/>
+        <source>A period of periodic breathing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="209"/>
+        <source>Vibratory Snore (VS2) </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="425"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Mask On Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Time started according to str.edf</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="430"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>Summary Only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="332"/>
+        <source>%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="173"/>
+        <source>Clear Airway Apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="174"/>
+        <source>An apnea where the airway is open</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="179"/>
+        <source>Obstructive Apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="180"/>
+        <source>An apnea caused by airway obstruction</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="185"/>
+        <source>Hypopnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="186"/>
+        <source>A partially obstructed airway</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="190"/>
+        <source>Unclassified Apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="191"/>
+        <source>An apnea that could not fit into a category</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="192"/>
+        <source>UA</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="196"/>
+        <source>An restriction in breathing from normal, causing a flattening of the flow waveform.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="200"/>
+        <source>Respiratory Effort Related Arousal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="201"/>
+        <source>An restriction in breathing that causes an either an awakening or sleep disturbance.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>Vibratory Snore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>A vibratory snore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="210"/>
+        <source>A vibratory snore as detcted by a System One machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2076"/>
+        <source>Pressure Pulse</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2077"/>
+        <source>A pulse of pressure 'pinged' to detect a closed airway.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="216"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="222"/>
+        <source>A large mask leak affecting machine performance.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="226"/>
+        <source>Non Responding Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="227"/>
+        <source>A type of respiratory event that won't respond to a pressure increase.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="231"/>
+        <source>Expiratory Puff</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="232"/>
+        <source>Intellipap event where you breathe out your mouth.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="237"/>
+        <source>SensAwake feature will reduce pressure when waking is detected.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="241"/>
+        <source>User Flag #1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="242"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="252"/>
+        <source>A user definable event detected by SleepyHead's flow waveform processor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="246"/>
+        <source>User Flag #2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="251"/>
+        <source>User Flag #3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <source>Heart rate in beats per minute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>SpO2 %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>Blood-oxygen saturation percentage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="271"/>
+        <source>Plethysomogram</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="272"/>
+        <source>An optical Photo-plethysomogram showing heart rhythm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="281"/>
+        <source>Pulse Change</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="282"/>
+        <source>A sudden (user definable) change in heart rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="286"/>
+        <source>SpO2 Drop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="287"/>
+        <source>A sudden (user definable) drop in blood oxygen saturation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="288"/>
+        <source>SD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Breathing flow rate waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="335"/>
+        <source>L/min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="319"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="320"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="324"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure (High resolution)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Amount of air displaced per breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Graph displaying snore volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="339"/>
+        <source>Minute Ventilation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Amount of air displaced per minute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="344"/>
+        <source>Respiratory Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Rate of breaths per minute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="349"/>
+        <source>Patient Triggered Breaths</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Percentage of breaths triggered by patient</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Pat. Trig. Breaths</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="354"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Leak Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Rate of detected mask leakage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="361"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>I:E Ratio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>Ratio between Inspiratory and Expiratory time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="340"/>
+        <source>ratio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="145"/>
+        <source>Pressure Min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="149"/>
+        <source>Pressure Max</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="215"/>
+        <source>Leak Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="217"/>
+        <source>LF</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="276"/>
+        <source>Perfusion Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="277"/>
+        <source>A relative assessment of the pulse strength at the monitoring site</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="278"/>
+        <source>Perf. Index %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Expiratory Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Time taken to breathe out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Inspiratory Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Time taken to breathe in</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="374"/>
+        <source>Respiratory Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>A ResMed data source showing Respiratory Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Graph showing severity of flow limitations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Flow Limit.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="384"/>
+        <source>Target Minute Ventilation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Minute Ventilation?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="389"/>
+        <source>Maximum Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>The maximum rate of mask leakage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>Max Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="394"/>
+        <source>Apnea Hypopnea Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>Graph showing running AHI for the past hour</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="399"/>
+        <source>Total Leak Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Detected mask leakage including natural Mask leakages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="404"/>
+        <source>Median Leak Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median rate of detected mask leakage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="409"/>
+        <source>Respiratory Disturbance Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>Graph showing running RDI for the past hour</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Sleep position in degrees</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Upright angle in degrees</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>CPAP Session contains summary data only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="438"/>
+        <source>PAP Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="437"/>
+        <source>PAP Device Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="443"/>
+        <source>APAP (Variable)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="447"/>
+        <source>ASV (Fixed EPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="448"/>
+        <source>ASV (Variable EPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="922"/>
+        <source>Zero</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="925"/>
+        <source>Upper Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="928"/>
+        <source>Lower Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="81"/>
+        <source>Release Notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="92"/>
+        <source>&Ok, get on with it..</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="164"/>
+        <source>Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="171"/>
+        <source>A faster build of SleepyHead may be available</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="172"/>
+        <source>You will not be bothered with this message again.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="173"/>
+        <source>This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="178"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="189"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="191"/>
+        <source>If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="201"/>
+        <source>Incompatible Graphics Hardware</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="202"/>
+        <source>This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="203"/>
+        <source>You may need to update your computers graphics drivers from the GPU makers website. %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="204"/>
+        <source>(<a href='http://intel.com/support'>Intel's support site</a>)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="205"/>
+        <source>Because graphs will not render correctly, and it may cause crashes, this build will now exit.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="206"/>
+        <source>Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>No SleepyHead data folder was found.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>Would you like SleepyHead to use the default location for storing its data?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>As you did not select a data folder, SleepyHead will exit.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>Next time you run, you will be asked again.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>You did not select a directory.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>SleepyHead will now start with your old one.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="344"/>
+        <source>Question</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="245"/>
+        <source>Choose or create new folder for SleepyHead data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="250"/>
+        <source>Exiting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="266"/>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="267"/>
+        <source>Are you sure you want to use this folder?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1393"/>
+        <source>About SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1409"/>
+        <source>&Close</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1413"/>
+        <source>&Donate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="40"/>
+        <source>Unspecified</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="41"/>
+        <source>Nasal Pillows</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="42"/>
+        <source>Hybrid F/F Mask</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="43"/>
+        <source>Nasal Interface</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="44"/>
+        <source>Full-Face Mask</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1132"/>
+        <source>Are you sure you want to reset all your channel colors and settings to defaults?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="39"/>
+        <source>There are no graphs visible to print</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="56"/>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="96"/>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="97"/>
+        <source>Printing %1 Report</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="130"/>
+        <source>%1 Report</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="180"/>
+        <source>: %1 hours, %2 minutes, %3 seconds
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Range</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Fixed %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="270"/>
+        <source>RDI	%1
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="272"/>
+        <source>AHI	%1
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="306"/>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="310"/>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="314"/>
+        <source>UAI=%1 </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="316"/>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="384"/>
+        <source>Reporting from %1 to %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="451"/>
+        <source>Entire Day's Flow Waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="457"/>
+        <source>Current Selection</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="467"/>
+        <source>Entire Day</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="586"/>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="592"/>
+        <source>Page %1 of %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="659"/>
+        <source>SleepyHead has finished sending the job to the printer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="112"/>
+        <source>Name: %1, %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="114"/>
+        <source>DOB: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="117"/>
+        <source>Phone: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="120"/>
+        <source>Email: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="123"/>
+        <source>Address:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="165"/>
+        <source>Usage Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="179"/>
+        <source>This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="181"/>
+        <source>SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1039"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1041"/>
+        <source>Auto Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1045"/>
+        <source>ASV Auto EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1029"/>
+        <source>Days: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1033"/>
+        <source>Low Usage Days: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1034"/>
+        <source>(%1% compliant, defined as > %2 hours)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1148"/>
+        <source>(Sess: %1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1156"/>
+        <source>Bedtime: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1158"/>
+        <source>Waketime: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1198"/>
+        <source>90%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1270"/>
+        <source>(Summary Only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="315"/>
+        <source>There is a lockfile already present for profile '%1'.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="316"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="326"/>
+        <source>You can only work with one instance of an individual SleepyHead profile at a time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="317"/>
+        <source>Please close any other instances of SleepyHead running with this profile before proceeding.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="318"/>
+        <source>If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="325"/>
+        <source>There is a lockfile already present for this profile '%1', claimed on '%2'.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="327"/>
+        <source>If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>Peak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="142"/>
+        <source>%1% %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1241"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1060"/>
+        <source>Fixed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1243"/>
+        <source>Auto</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1245"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="444"/>
+        <source>Fixed Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="445"/>
+        <source>Auto Bi-Level (Fixed PS)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1249"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="446"/>
+        <source>Auto Bi-Level (Variable PS)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1251"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1043"/>
+        <source>ASV Fixed EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1253"/>
+        <source>ASV Variable EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1274"/>
+        <source>%1%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1294"/>
+        <source>Fixed %1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1296"/>
+        <source>Min %1 Max %2 (%3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1298"/>
+        <source>EPAP %1 IPAP %2 (%3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1300"/>
+        <source>PS %1 over %2-%3 (%4)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1302"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1306"/>
+        <source>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1304"/>
+        <source>EPAP %1 PS %2-%3 (%6)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="129"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="131"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="133"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>%1 %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="90"/>
+        <source>Welcome to SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>What would you like to do?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>Please Import Some Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="104"/>
+        <source>CPAP<br/>Importer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="109"/>
+        <source>Oximetery<br/>Wizard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="113"/>
+        <source>or</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="116"/>
+        <source>View<br/>Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="122"/>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="123"/>
+        <source>First import can take a few minutes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="139"/>
+        <source>Click this box to see this in daily view.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="141"/>
+        <source>The last time you used your %1...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="145"/>
+        <source>last night</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="146"/>
+        <source>yesterday</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="147"/>
+        <source>%2 days ago</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="149"/>
+        <source>was %1 (on %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="157"/>
+        <source>perfect :)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="158"/>
+        <source>pretty darn good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="159"/>
+        <source>reasonably good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="160"/>
+        <source>technically "treated"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="161"/>
+        <source>not very good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="162"/>
+        <source>horrible, please consult your doctor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="241"/>
+        <source><p><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="242"/>
+        <source><p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="169"/>
+        <source>%1 hours, %2 minutes and %3 seconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="172"/>
+        <source><font color = red>You only had the mask on for %1.</font></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="179"/>
+        <source>You had no <i>major</i> mask leaks (maximum was %1 %2).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="180"/>
+        <source>You had a small but acceptable amount of <i>major</i> mask leakage.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="181"/>
+        <source>You had significant periods of <i>major</i> mask leakage.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="182"/>
+        <source>Your mask is leaking way too much.. Talk to your CPAP advisor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="190"/>
+        <source>Your CPAP machine blasted you with a constant %1%2 of air</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="193"/>
+        <source>Your pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="197"/>
+        <source>Your machine blasted you with a constant %1-%2 %3 of air.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="201"/>
+        <source>Your machine was under %1-%2 %3 for %4% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="206"/>
+        <source>Your EPAP pressure fixed at %1%2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="212"/>
+        <source>Your EPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="207"/>
+        <location filename="../sleepyhead/welcome.cpp" line="213"/>
+        <source>Your IPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="164"/>
+        <source>You had an AHI of %1, which is considered %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="171"/>
+        <source>You machine was on for %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="220"/>
+        <source>No CPAP data has been imported yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="226"/>
+        <source>Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="227"/>
+        <source>(last night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="228"/>
+        <source>(yesterday)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="229"/>
+        <source>(%2 day ago)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="232"/>
+        <source>No oximetery data has been imported yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="238"/>
+        <source>Very Important Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="240"/>
+        <source><p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>Contec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <source>CMS50</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>Fisher & Paykel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>ICON</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>DeVilbiss</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>Intellipap</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="81"/>
+        <source>SmartFlex Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>ChoiceMMed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>MD300</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>Respironics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>M-Series</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>Philips Respironics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>System One</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>ResMed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>S9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="395"/>
+        <source>EPR: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose Software</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Zeo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Personal Sleep Coach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/MinutesAtPressure.cpp" line="234"/>
+        <source>(% of time)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gFlagsLine.cpp" line="195"/>
+        <source>Database Outdated
+Please Rebuild CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1271"/>
+        <source>SleepyHead is proudly brought to you by JediMark.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1394"/>
+        <source>d MMM [ %1 - %2 ]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1930"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1983"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2058"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2075"/>
+        <source>%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2038"/>
+        <source>Hide All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2039"/>
+        <source>Show All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2363"/>
+        <source>Unpin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2438"/>
+        <source>Pin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1066"/>
+        <source>Plots Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1148"/>
+        <source>Duration %1:%2:%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1149"/>
+        <source>AHI %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="107"/>
+        <source>%1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="150"/>
+        <source>Relief: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="156"/>
+        <source>Hours: %1h, %2m, %3s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="259"/>
+        <source>Machine Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>Journal Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="43"/>
+        <source>SleepyHead found an old Journal folder, but it looks like it's been renamed:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="45"/>
+        <source>SleepyHead will not touch this folder, and will create a new one instead.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="46"/>
+        <source>Please be careful when playing in SleepyHead's profile folders :-P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="53"/>
+        <source>For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="54"/>
+        <source>SleepyHead picked only the first one of these, and will use it in future:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="56"/>
+        <source>If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F3.7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="587"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="589"/>
+        <source>SmartFlex Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="588"/>
+        <source>Intellipap pressure relief mode.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="594"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2639"/>
+        <source>Ramp Only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="595"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2640"/>
+        <source>Full Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="598"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="600"/>
+        <source>SmartFlex Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="599"/>
+        <source>Intellipap pressure relief level.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1034"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1586"/>
+        <source>VPAP Adapt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2632"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2634"/>
+        <source>EPR</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2633"/>
+        <source>ResMed Exhale Pressure Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2641"/>
+        <source>Patient???</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2644"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2646"/>
+        <source>EPR Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2645"/>
+        <source>Exhale Pressure Relief Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2649"/>
+        <source>0cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2650"/>
+        <source>1cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2651"/>
+        <source>2cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2652"/>
+        <source>3cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>Weinmann</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>SOMNOsoft2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/machine.cpp" line="404"/>
+        <source>Loading %1 data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/progressdialog.cpp" line="14"/>
+        <source>PLease Wait...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>By Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>Statistics at Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="923"/>
+        <source>%1 Session #%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="334"/>
+        <source>Snapshot %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QuaZipFilePrivate</name>
+    <message>
+        <location filename="../3rdparty/quazip/quazip/quazipfile.cpp" line="217"/>
+        <source>ZIP/UNZIP API error %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Report</name>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="14"/>
+        <source>Form</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="27"/>
+        <source>about:blank</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>SessionBar</name>
+    <message>
+        <location filename="../sleepyhead/sessionbar.cpp" line="282"/>
+        <source>No Sessions Present</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>Statistics</name>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="30"/>
+        <source>CPAP Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="33"/>
+        <source>CPAP Usage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="34"/>
+        <source>Average Hours per Night</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Compliancy</source>
+        <translation type="obsolete">Compliance</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="35"/>
+        <source>Compliance</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="37"/>
+        <source>Therapy Efficiacy</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="47"/>
+        <source>Leak Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="52"/>
+        <source>Pressure Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="65"/>
+        <source>Oximeter Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="69"/>
+        <source>Blood Oxygen Saturation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="74"/>
+        <source>Pulse Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="82"/>
+        <source>%1 Median</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="83"/>
+        <location filename="../sleepyhead/statistics.cpp" line="84"/>
+        <source>Average %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="85"/>
+        <source>90% %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="86"/>
+        <source>Min %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="87"/>
+        <source>Max %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="88"/>
+        <source>%1 Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="89"/>
+        <source>% of time in %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="90"/>
+        <source>% of time above %1 threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="91"/>
+        <source>% of time below %1 threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="550"/>
+        <source>I can haz data?!?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="551"/>
+        <source>This lonely sleepy sheep has no data :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="607"/>
+        <source>Most Recent</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="608"/>
+        <source>Last Week</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="609"/>
+        <source>Last 30 Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="610"/>
+        <source>Last 6 Months</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="611"/>
+        <source>Last Year</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="615"/>
+        <source>Last Session</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="667"/>
+        <source>Details</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="681"/>
+        <source>No %1 data available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="684"/>
+        <source>%1 day of %2 Data on %3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="690"/>
+        <source>%1 days of %2 Data, between %3 and %4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="963"/>
+        <source>Usage Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="964"/>
+        <source>Total Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="968"/>
+        <source>Compliant Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="980"/>
+        <source>Days AHI &gt;5.0</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="985"/>
+        <source>Best&nbsp;%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="998"/>
+        <source>Worst&nbsp;%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1024"/>
+        <source>Best RX Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1025"/>
+        <source>Worst RX Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1095"/>
+        <source>Changes to Prescription Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1103"/>
+        <source>Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1110"/>
+        <source>Pressure Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1112"/>
+        <source>Pressure Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1123"/>
+        <source>Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1243"/>
+        <source>Machine Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1250"/>
+        <source>First Use</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1251"/>
+        <source>Last Use</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>UpdaterWindow</name>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="14"/>
+        <source>SleepyHead Updater</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="51"/>
+        <source>A new version of $APP is available</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="97"/>
+        <source>Version Information</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="108"/>
+        <source>Release Notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="121"/>
+        <source>about:blank</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="130"/>
+        <source>Build Notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="174"/>
+        <source>Maybe &Later</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="194"/>
+        <source>&Upgrade Now</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="220"/>
+        <source>Please wait while updates are downloaded and installed...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="234"/>
+        <source>Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="265"/>
+        <source>Component</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="270"/>
+        <source>Version</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="275"/>
+        <source>Size</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="280"/>
+        <source>Progress</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="289"/>
+        <source>Log</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="317"/>
+        <source>Downloading & Installing Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="337"/>
+        <source>&Finished</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="94"/>
+        <source>Checking for SleepyHead Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="109"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="171"/>
+        <source>Requesting </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="178"/>
+        <source>Saving as </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="256"/>
+        <source>XML update structure parsed cleanly</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <source>No updates were found for your platform.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="322"/>
+        <source>SleepyHead Updates</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="321"/>
+        <source>No new updates were found for your platform.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="339"/>
+        <source>SleepyHead v%1, codename "%2"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="342"/>
+        <source>platform notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="347"/>
+        <source>A new version of SleepyHead is available!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="348"/>
+        <source>Shiny new <b>v%1</b> is available. You're running old and busted v%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="352"/>
+        <source>An update for SleepyHead is available.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="353"/>
+        <source>Version <b>%1</b> is available. You're currently running v%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="366"/>
+        <source>SleepyHead v%1 build notes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="369"/>
+        <source>Update to QtLibs (v%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="379"/>
+        <source>There was an error parsing the XML Update file.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="400"/>
+        <source>%1 bytes received</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="430"/>
+        <source>Redirected to </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="444"/>
+        <source>File size mismatch for %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="455"/>
+        <source>File integrity check failed for %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="485"/>
+        <source>Extracting </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="546"/>
+        <source>You might need to reinstall manually. Sorry :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="547"/>
+        <source>Ugh.. Something went wrong with unzipping.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="560"/>
+        <source>Failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="580"/>
+        <source>Download Complete</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="584"/>
+        <source>There was an error completing a network request:
+
+(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="629"/>
+        <source>Update Complete!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="632"/>
+        <source>Updates Complete. SleepyHead needs to restart now, click Finished to do so.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="635"/>
+        <source>Update Failed :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="637"/>
+        <source>Download Error. Sorry, try again later.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="654"/>
+        <source>Downloading & Installing Updates...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="655"/>
+        <source>Please wait while downloading and installing updates.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraph</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="694"/>
+        <source>Snapshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraphView</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="361"/>
+        <source>100% zoom level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="362"/>
+        <source>Restore X-axis zoom too 100% to view entire days data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="364"/>
+        <source>Reset Graph Layout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="365"/>
+        <source>Resets all graphs to a uniform height and default order.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="368"/>
+        <source>Y-Axis</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="369"/>
+        <source>Plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="374"/>
+        <source>CPAP Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="377"/>
+        <source>Oximeter Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="380"/>
+        <source>Dotted Lines</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1854"/>
+        <source>Remove Clone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1858"/>
+        <source>Clone %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/Translations/Espaniol.es.ts b/Translations/Espaniol.es.ts
new file mode 100644
index 0000000..f71196b
--- /dev/null
+++ b/Translations/Espaniol.es.ts
@@ -0,0 +1,8398 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="es">
+<context>
+    <name>CMS50Loader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Could not get data transmission from oximeter.</source>
+        <translation>No se recibió transmisión de datos alguna desde el oxímetro.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Please ensure you select 'upload' from the oximeter devices menu.</source>
+        <translatorcomment>Need to know how is 'upload' translated</translatorcomment>
+        <translation>Por favor asegúrese de seleccionar 'upload' o 'descargar' desde el menú de Dispositivos de Oximetría.</translation>
+    </message>
+</context>
+<context>
+    <name>Daily</name>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="435"/>
+        <source>Form</source>
+        <translation>Formulario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="506"/>
+        <source>Go to the previous day</source>
+        <translation>Ir al día anterior</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="525"/>
+        <source>Prev</source>
+        <translatorcomment>or previo</translatorcomment>
+        <translation>Anterior</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="551"/>
+        <source>Show or hide the calender</source>
+        <translation>Mostrar u ocultar el calendario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="574"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="614"/>
+        <source>Go to the next day</source>
+        <translation>Ir al día siguiente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="636"/>
+        <source>Next</source>
+        <translatorcomment>or próximo</translatorcomment>
+        <translation>Siguiente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="674"/>
+        <source>Go to the most recent day with data records</source>
+        <translation>Ir al día más reciente con datos registrados</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="852"/>
+        <source>Events</source>
+        <translation>Eventos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="914"/>
+        <source>View Size</source>
+        <translation>Ver tamaño</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="959"/>
+        <location filename="../sleepyhead/daily.ui" line="1374"/>
+        <source>Notes</source>
+        <translation>Notas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1013"/>
+        <source>Journal</source>
+        <translatorcomment>or agenda</translatorcomment>
+        <translation>Diario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1099"/>
+        <source>Small</source>
+        <translation>Pequeño</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1104"/>
+        <source>Medium</source>
+        <translation>Mediano</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1109"/>
+        <source>Big</source>
+        <translation>Grande</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1475"/>
+        <source>Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1527"/>
+        <source>Graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1079"/>
+        <source>Color</source>
+        <translation>Color</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1038"/>
+        <source> i </source>
+        <translation>i</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1041"/>
+        <source>Ctrl+I</source>
+        <translation>Ctrl+I</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1069"/>
+        <source>u</source>
+        <translation>u</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1054"/>
+        <source>B</source>
+        <translation>B</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1057"/>
+        <source>Ctrl+B</source>
+        <translation>Ctrl+B</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1168"/>
+        <source>Zombie</source>
+        <translation>Zombi</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1181"/>
+        <source>I'm feeling...</source>
+        <translation>Me siento...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1197"/>
+        <source>Weight</source>
+        <translation>Peso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1271"/>
+        <source>Awesome</source>
+        <translation>Increíble</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1309"/>
+        <source>B.M.I.</source>
+        <translatorcomment>Índice de masa corporal</translatorcomment>
+        <translation>I.M.C.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1325"/>
+        <source>Bookmarks</source>
+        <translation>Marcadores</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1346"/>
+        <source>Add Bookmark</source>
+        <translation>Añadir Marcador</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1369"/>
+        <source>Starts</source>
+        <translatorcomment>¿inicios?</translatorcomment>
+        <translation>Inicia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1382"/>
+        <source>Remove Bookmark</source>
+        <translation>Eliminar Marcador</translation>
+    </message>
+    <message>
+        <source>Zoom fully out</source>
+        <translation type="vanished">Zoom completamente alejado</translation>
+    </message>
+    <message>
+        <source>100%</source>
+        <translation type="vanished">100%</translation>
+    </message>
+    <message>
+        <source>Reset the graph heights to uniform sizes</source>
+        <translatorcomment>mmm</translatorcomment>
+        <translation type="vanished">Reajustar las alturas en la gráfica a tamaños uniformes</translation>
+    </message>
+    <message>
+        <source>Reset</source>
+        <translatorcomment>reajustar,recomponer</translatorcomment>
+        <translation type="vanished">Reinicializar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1552"/>
+        <source>Drop down this list to show/hide available graphs.</source>
+        <translation>Expanda esta lista para mostrar u ocultar los gráficos disponibles.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>Breakdown</source>
+        <translatorcomment>desarrollo, descomponer, desarrollar, DESGLOSAR</translatorcomment>
+        <translation>Desglose</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>events</source>
+        <translation>eventos</translation>
+    </message>
+    <message>
+        <source>Selection AHI</source>
+        <translatorcomment>Índice de Apnea/Hipoapnea | ¿selección?</translatorcomment>
+        <translation type="vanished">Selección IAH</translation>
+    </message>
+    <message>
+        <source>U1</source>
+        <translatorcomment>¿?</translatorcomment>
+        <translation type="vanished">U1</translation>
+    </message>
+    <message>
+        <source>U2</source>
+        <translatorcomment>¿?</translatorcomment>
+        <translation type="vanished">U2</translation>
+    </message>
+    <message>
+        <source>U3</source>
+        <translatorcomment>¿?</translatorcomment>
+        <translation type="vanished">U3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="517"/>
+        <source>No %1 events are recorded this day</source>
+        <translatorcomment>. al final</translatorcomment>
+        <translation>No hay eventos %1 registrados este día</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="615"/>
+        <source>%1 event</source>
+        <translation>Evento %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="616"/>
+        <source>%1 events</source>
+        <translation>Eventos %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1093"/>
+        <source>PAP Mode: %1<br/></source>
+        <translation>Modo de PAP: %1<br/></translation>
+    </message>
+    <message>
+        <source>Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked.</source>
+        <translation type="vanished">Existen datos de oximetría para este día pero sus marcas de tiempo no coinciden, por lo que los gráficos no serán enlazados.</translation>
+    </message>
+    <message>
+        <source>No Graphs :(</source>
+        <translation type="vanished">No hay gráficos :(</translation>
+    </message>
+    <message>
+        <source>Int. Pulse</source>
+        <translatorcomment>mmm?</translatorcomment>
+        <translation type="vanished">Int. Pulso</translation>
+    </message>
+    <message>
+        <source>Int. SpO2</source>
+        <translation type="vanished">Int. SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="212"/>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="213"/>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="651"/>
+        <source>Session Start Times</source>
+        <translation>Hora de inicio de sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="652"/>
+        <source>Session End Times</source>
+        <translation>Hora de fin de sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="892"/>
+        <source>Duration</source>
+        <translation>Duración</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="872"/>
+        <source>Oximetery Sessions</source>
+        <translation>Sesiones de Oximetría</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="878"/>
+        <source>Position Sensor Sessions</source>
+        <translation>Sesiones del sensor de posición</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="883"/>
+        <source>Unknown Session</source>
+        <translation>Sesión Desconocida</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="949"/>
+        <source>Machine Settings Unavailable</source>
+        <translation>Ajustes de la máquina no disponibles</translation>
+    </message>
+    <message>
+        <source>EPR:%1 EPR_LEVEL:%2</source>
+        <translation type="vanished">EPR:%1 NIVEL_EPR:%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1098"/>
+        <source>This day has missing pressure, mode and settings data.</source>
+        <translation>Este día carece de datos de presión, modo y ajustes.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1140"/>
+        <source>%1%2</source>
+        <translation>%1%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1206"/>
+        <source>This day just contains summary data, only limited information is available .</source>
+        <translation>Este día contiene información de resumen, sólo está disponibe información limitada.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1226"/>
+        <source>Time over leak redline</source>
+        <translatorcomment>mmm</translatorcomment>
+        <translation>Límite de tiempo sobre fuga</translation>
+    </message>
+    <message>
+        <source>Time spent in ramp</source>
+        <translation type="vanished">Tiempo pasado en rampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Sleep</source>
+        <translation>Sueño</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Wake</source>
+        <translation>Vigilia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1523"/>
+        <source>Event Breakdown</source>
+        <translation>Desglose de eventos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1558"/>
+        <source>Sessions all off!</source>
+        <translation>¡Todas las sesionos deshabilitadas!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1560"/>
+        <source>Sessions exist for this day but are switched off.</source>
+        <translation>Existen sesiones para este día pero fueron deshabilitadas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1563"/>
+        <source>Impossibly short session</source>
+        <translation>Sesión imposiblemente corta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1564"/>
+        <source>Zero hours??</source>
+        <translation>¿Cero horas?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1567"/>
+        <source>BRICK :(</source>
+        <translation>Ladrillo :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1569"/>
+        <source>Complain to your Equipment Provider!</source>
+        <translation>¡Quéjesete con el proveedor de su equipo!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1135"/>
+        <source>Statistics</source>
+        <translation>Estadísticas</translation>
+    </message>
+    <message>
+        <source>No data available</source>
+        <translation type="vanished">No hay datos disponibles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1057"/>
+        <source>Oximeter Information</source>
+        <translation>Información del Oxímetro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1061"/>
+        <source>SpO2 Desaturations</source>
+        <translation>Desaturaciones SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1062"/>
+        <source>Pulse Change events</source>
+        <translation>Eventos de cambio de pulso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1063"/>
+        <source>SpO2 Baseline Used</source>
+        <translation>Línea basal de SpO2 usada</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="945"/>
+        <source>Machine Settings</source>
+        <translation>Ajustes de la máquina</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="837"/>
+        <source>Session Information</source>
+        <translation>Información de sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="869"/>
+        <source>CPAP Sessions</source>
+        <translation>Sesiones CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="875"/>
+        <source>Sleep Stage Sessions</source>
+        <translation>Sesiones de Etapas del Sueño</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="933"/>
+        <source>One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.</source>
+        <translation>Uno o más de los registros de forma de onda para esta sesión tenía datos fuente defectuosos. Algunos de los puntos superpuestos de la forma de onda podrían no encajar correctamente.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1216"/>
+        <source>Total time in apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1232"/>
+        <source>Total ramp time</source>
+        <translation>Tiempo total en rampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1236"/>
+        <source>Time outside of ramp</source>
+        <translation>Tiempo fuera de la dampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1246"/>
+        <source>AHI excluding ramp</source>
+        <translation>IAH fuera de rampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1568"/>
+        <source>Sorry, your machine only provides compliance data.</source>
+        <translation>Lo siento, su máquina sólo proporciona información de cumplimiento.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1587"/>
+        <source>"Nothing's here!"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1590"/>
+        <source>Bob is bored with this days lack of data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1869"/>
+        <source>Pick a Colour</source>
+        <translation>Escoja un color</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2131"/>
+        <source>This bookmarked is in a currently disabled area..</source>
+        <translation>Este marcador está en un área actualmente deshabilitada.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2174"/>
+        <source>Bookmark at %1</source>
+        <translation>Marcador en %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2365"/>
+        <source>Show all graphs</source>
+        <translation>Mostrar todos los gráficos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Hide all events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Show all events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">¡Ningún gráfico mostrado!</translation>
+    </message>
+    <message>
+        <source>Summary Only :(</source>
+        <translation type="vanished">Únicamente resumen :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2385"/>
+        <source>Hide all graphs</source>
+        <translation>Ocultar todos los gráficos</translation>
+    </message>
+</context>
+<context>
+    <name>ExportCSV</name>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="14"/>
+        <source>Export as CSV</source>
+        <translation>Exportar como CSV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="24"/>
+        <source>Dates:</source>
+        <translation>Fechas:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="37"/>
+        <source>Resolution:</source>
+        <translation>Resolución:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="46"/>
+        <source>Details</source>
+        <translation>Detallado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="53"/>
+        <source>Sessions</source>
+        <translation>Sesiones</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="60"/>
+        <source>Daily</source>
+        <translation>Diario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="85"/>
+        <source>Filename:</source>
+        <translation>Nombre del archivo:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="107"/>
+        <source>Cancel</source>
+        <translation>Cancelar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="114"/>
+        <source>Export</source>
+        <translation>Exportar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="131"/>
+        <source>Start:</source>
+        <translation>Inicio:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="154"/>
+        <source>End:</source>
+        <translation>Fin:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="192"/>
+        <source>Quick Range:</source>
+        <translation>Intérvalo rápido:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="60"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="122"/>
+        <source>Most Recent Day</source>
+        <translation>Último Día</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="205"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="125"/>
+        <source>Last Week</source>
+        <translation>Última Semana</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="210"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="128"/>
+        <source>Last Fortnight</source>
+        <translation>Última Quincena</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="215"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="131"/>
+        <source>Last Month</source>
+        <translation>Último Mes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="220"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="134"/>
+        <source>Last 6 Months</source>
+        <translation>Último Semestre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="225"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="137"/>
+        <source>Last Year</source>
+        <translation>Último Año</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="230"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="119"/>
+        <source>Everything</source>
+        <translation>Todo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="235"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="108"/>
+        <source>Custom</source>
+        <translation>Personalizado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="248"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="73"/>
+        <source>SleepyHead_</source>
+        <translation>SleepyHead_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="76"/>
+        <source>Details_</source>
+        <translation>Detalles_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="78"/>
+        <source>Sessions_</source>
+        <translation>Sesiones_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="80"/>
+        <source>Summary_</source>
+        <translation>Resumen_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="87"/>
+        <source>Select file to export to</source>
+        <translation>Seleccione archivo a exportar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="88"/>
+        <source>CSV Files (*.csv)</source>
+        <translation>Archivos CSV (*.csv)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>DateTime</source>
+        <translation>FechaHora</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Session</source>
+        <translation>Sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Event</source>
+        <translation>Evento</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Data/Duration</source>
+        <translation>Datos/Duración</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Date</source>
+        <translation>Fecha</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <source>Session Count</source>
+        <translatorcomment>¿conteo de sesiones?</translatorcomment>
+        <translation>Conteo de sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Start</source>
+        <translation>Inicio</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>End</source>
+        <translation>Fin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>Total Time</source>
+        <translation>Tiempo total</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>AHI</source>
+        <translation>IAH</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="207"/>
+        <source> Count</source>
+        <translation>Conteo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="211"/>
+        <source> Avg</source>
+        <translation>Media</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="215"/>
+        <source> %1%</source>
+        <translation> %1%</translation>
+    </message>
+</context>
+<context>
+    <name>FPIconLoader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="128"/>
+        <source>Import Error</source>
+        <translation>Error de Importación</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>This Machine Record cannot be imported in this profile.</source>
+        <translation>Este registro de máquina no puede ser importado a este perfi.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>The Day records overlap with already existing content.</source>
+        <translation>Estos registros diarios se traslapan con contenido previamente existente.</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="441"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1007"/>
+        <source>&Statistics</source>
+        <translation>E&stadísticas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="981"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html></source>
+        <translation><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Este es software de pre-lanzamiento, algunas partes de este programa podrían no funcionar como se pretende.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="998"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1035"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3050"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3107"/>
+        <source>about:blank</source>
+        <translation>about:blank</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1073"/>
+        <source>Report Mode</source>
+        <translation>Modo de reporte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1080"/>
+        <source>Standard</source>
+        <translation>Estándar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1090"/>
+        <source>Monthly</source>
+        <translation>Mensual</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1097"/>
+        <source>Date Range</source>
+        <translation>Intérvalo de fechas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1141"/>
+        <source>&Help Browser</source>
+        <translation>Navegador de A&yuda</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1204"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1224"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1244"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="2932"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1317"/>
+        <source>qrc:/docs/index.html</source>
+        <translation>qrc:/docs/index.html</translation>
+    </message>
+    <message>
+        <source>&Navigation</source>
+        <translation type="vanished">&Navegación</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1633"/>
+        <source>Statistics</source>
+        <translation>Estadísticas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1683"/>
+        <source>Daily</source>
+        <translatorcomment>mmm</translatorcomment>
+        <translation>Vista por día</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1727"/>
+        <source>Overview</source>
+        <translation>Vista general</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1771"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1096"/>
+        <source>Oximetry</source>
+        <translation>Oximetría</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1821"/>
+        <source>Import</source>
+        <translation>Importar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1871"/>
+        <source>Help</source>
+        <translation>Ayuda</translation>
+    </message>
+    <message>
+        <source>&Bookmarks</source>
+        <translation type="vanished">&Marcadores</translation>
+    </message>
+    <message>
+        <source>&Records</source>
+        <translation type="vanished">&Registros</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3136"/>
+        <source>&File</source>
+        <translation>&Archivo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3154"/>
+        <source>&View</source>
+        <translation>&Vista</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3172"/>
+        <source>&Help</source>
+        <translation>A&yuda</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3188"/>
+        <source>&Data</source>
+        <translation>&Datos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3192"/>
+        <source>&Advanced</source>
+        <translation>&Avanzado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3196"/>
+        <source>Purge Oximetery Data</source>
+        <translation>Purgar datos de oxímetro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3212"/>
+        <source>Rebuild CPAP Data</source>
+        <translation>Restablecer Datos de  CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3250"/>
+        <source>&Import Data</source>
+        <translation>&Importar datos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3253"/>
+        <source>Shift+F2</source>
+        <translation>Shift+F2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3258"/>
+        <source>&Preferences</source>
+        <translation>&Preferencias</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3263"/>
+        <source>&Profiles</source>
+        <translation>&Perfiles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="276"/>
+        <source>E&xit</source>
+        <translation>&Salir</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3268"/>
+        <source>Exit</source>
+        <translation>Salir</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3273"/>
+        <source>View &Daily</source>
+        <translation>Ver Vista por &Día</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3276"/>
+        <source>F5</source>
+        <translation>F5</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3281"/>
+        <source>View &Overview</source>
+        <translation>Ver Vista &General</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3284"/>
+        <source>F6</source>
+        <translation>F6</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3289"/>
+        <source>View &Welcome</source>
+        <translation>Ver &Bienvenida</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3292"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3439"/>
+        <source>F4</source>
+        <translation>F4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3297"/>
+        <source>-</source>
+        <translation>-</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3300"/>
+        <source>Ctrl+Tab</source>
+        <translation>Ctrl+Tab</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3308"/>
+        <source>Use &AntiAliasing</source>
+        <translation>Usar &AntiAliasing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3313"/>
+        <source>&About SleepyHead</source>
+        <translation>&Acerca de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3321"/>
+        <source>&Fullscreen Toggle</source>
+        <translation>Cambiar a &Pantalla Completa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3324"/>
+        <source>F11</source>
+        <translation>F11</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3332"/>
+        <source>Show Debug Pane</source>
+        <translation>Mostrar panel de depuración</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3337"/>
+        <source>&Reset Graph Layout</source>
+        <translation>&Reinicializar Gráfico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3342"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="273"/>
+        <source>Check for &Updates</source>
+        <translation>B&uscar Actualizaciones</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3347"/>
+        <source>Take &Screenshot</source>
+        <translation>&Capturar Pantalla</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3350"/>
+        <source>F12</source>
+        <translation>F12</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3355"/>
+        <source>O&ximetry Wizard</source>
+        <translation>Asistente de O&ximetría</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3358"/>
+        <source>F7</source>
+        <translation>F7</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3363"/>
+        <source>Print &Report</source>
+        <translation>Imprimir &Reporte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3368"/>
+        <source>&Edit Profile</source>
+        <translation>&Editar perfil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3376"/>
+        <source>&Link Graph Groups</source>
+        <translation>&Enlazar Grupos de Gráficos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3520"/>
+        <source>Daily Calendar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3523"/>
+        <source>F9</source>
+        <translation type="unfinished">F9</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3528"/>
+        <source>Backup &Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Exp&ort</source>
+        <translation type="vanished">Exp&ortar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3386"/>
+        <source>Online Users &Guide</source>
+        <translation>&Guía del Usuario (en línea)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3391"/>
+        <source>&Frequently Asked Questions</source>
+        <translation>Preguntas &Frecuentes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3396"/>
+        <source>&Automatic Oximetry Cleanup</source>
+        <translation>&Limpieza Automática de Oximetría</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3487"/>
+        <source>Toggle &Line Cursor</source>
+        <translation>Activar Cursor de &Línea</translation>
+    </message>
+    <message>
+        <source>Ctrl+S</source>
+        <translation type="vanished">Ctrl+S</translation>
+    </message>
+    <message>
+        <source>Foo</source>
+        <translation type="vanished">Foo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3401"/>
+        <source>Change &User</source>
+        <translation>Cambiar &Usuario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3406"/>
+        <source>Purge &Current Selected Day</source>
+        <translation>&Purgar día actualmente seleccionado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3411"/>
+        <source>All data for current CPAP machine</source>
+        <translation>Todos los datos para la máquina de CPAP actual</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3422"/>
+        <source>Right &Sidebar</source>
+        <translation>Acti&var panel derecho</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3490"/>
+        <source>Ctrl+L</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3506"/>
+        <source>Daily Sidebar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3509"/>
+        <source>F8</source>
+        <translation>F8</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3430"/>
+        <source>View S&tatistics</source>
+        <translation>Ver Es&tadísticas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1606"/>
+        <source>Navigation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1993"/>
+        <source>Bookmarks</source>
+        <translation type="unfinished">Marcadores</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3077"/>
+        <source>Records</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3202"/>
+        <source>Purge ALL CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3381"/>
+        <source>Exp&ort Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3425"/>
+        <source>F10</source>
+        <translation type="unfinished">F10</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3433"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3436"/>
+        <source>View Statistics</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3444"/>
+        <source>Import &ZEO Data</source>
+        <translation>Importar Datos de &ZEO</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3449"/>
+        <source>Import RemStar &MSeries Data</source>
+        <translation>Importar Datos de REMstar y Serie &M</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3454"/>
+        <source>&Support SleepyHead Development</source>
+        <translation>Apoyar el De&sarrollo de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3459"/>
+        <source>Sleep Disorder Terms &Glossary</source>
+        <translation>Glosario de &Términos de Transtornos del Sueño</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3464"/>
+        <source>Change &Language</source>
+        <translation>Cambiar &Idioma</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3469"/>
+        <source>Change &Data Folder</source>
+        <translation>Cambiar &Directorio de Datos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3474"/>
+        <source>Import &Somnopose Data</source>
+        <translation>Importar Datos de &Somnopose</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3479"/>
+        <source>Current Days</source>
+        <translation>Días Actuales</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="151"/>
+        <source>Profile</source>
+        <translation>Perfil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="942"/>
+        <source>Welcome</source>
+        <translation>Bienvenida</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="272"/>
+        <source>&About</source>
+        <translation>&Acerca de</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="300"/>
+        <source>Loading...</source>
+        <translation>Cargando...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="609"/>
+        <source>Loading Data</source>
+        <translation>Cargando Datos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="866"/>
+        <source>Access to Import has been blocked while recalculations are in progress.</source>
+        <translation>Se ha bloqueado el acceso a Importar mientras hay recalculaciones en progreso.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1017"/>
+        <source>Importing Data</source>
+        <translation>Importando Datos</translation>
+    </message>
+    <message>
+        <source>Import Problem
+
+Couldn't find any new Machine Data at the locations given</source>
+        <translation type="vanished">Problema de Importación
+
+No se pudieron encontrar nuevos datos de máquina en las ubicaciones proporcionadas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1293"/>
+        <source>Loading</source>
+        <translation>Cargando</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1332"/>
+        <source>Copyright</source>
+        <translation>Copyright</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1337"/>
+        <source>SleepyHead Project Page</source>
+        <translation>Página del Proyecto SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1340"/>
+        <source>SleepyHead Wiki</source>
+        <translation>Wiki de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1333"/>
+        <source>This software is released under the GNU Public License v3.0<br/></source>
+        <translation>Este software fue liberado bajo una Licencia Pública GNU v3.0<br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1376"/>
+        <source>This software comes with absolutely no warranty, either express of implied.</source>
+        <translation>Este software no viene con absolutamente ninguna garantía ya sea de manera expresa o implicada.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1377"/>
+        <source>It comes with no guarantee of fitness for any particular purpose.</source>
+        <translation>No viene con ninguna garantía de capacidad para ningún propósito en particular.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1378"/>
+        <source>No guarantees are made regarding the accuracy of any data this program displays.</source>
+        <translation>No se ha dado ninguna garantía con respecto a la exactitud de dato alguno mostrado por este programa.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1380"/>
+        <source>This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.</source>
+        <translation>Este no es un software médico, sino meramente una herramienta de investigación que proporciona una interpretación visual de los datos registrados por los dispositivos soportados.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1344"/>
+        <source>Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</source>
+        <translation>No olvide darle Like ó +1 a Sleepyhead en <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> o <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</translation>
+    </message>
+    <message>
+        <source>Please wait, SleepyHead is importing data...</source>
+        <translation type="vanished">Por favor espere, SleepyHead está importando datos...</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations
+
+</source>
+        <translation type="vanished">Datos exitosamente importados desde las siguientes ubicaciones
+
+</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum.</source>
+        <translation type="vanished"><b>Advertencia:</b>Esta versión de prelanzamiento es únicamente para evaluadores beta. Favor de <b>NO</b> compartir fuera del Foro de Pruebas de SleepyHead.</translation>
+    </message>
+    <message>
+        <source>Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version.</source>
+        <translation type="vanished">Favor de reportar errores para esta versión en el Foro de Pruebas de SleepyHead, pero primero revise el hilo de lanzamientos para asegurarse de que está ejecutando la última versión.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="318"/>
+        <source>When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.</source>
+        <translation>Cuando reporte errores, por favor asegúrese de proporcionar el número de versión de SleepyHead y los detalles de su sistema operativo así como el modelo de su dispositivo de CPAP.</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes.</source>
+        <translation type="vanished"><b>Advertencia:</b> Los reportes que este software genera no son aptos como prueba de apego ni para diagnóstico médico.</translation>
+    </message>
+    <message>
+        <source>These messages are only a temporary feature. Some people thought they were an error.</source>
+        <translation type="vanished">Estos mensajes son sólo una característica temporal. Algunas personas pensaron que se trataba de un error.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="720"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2062"/>
+        <source>Please wait, importing from backup folder(s)...</source>
+        <translation>Por favor espere, importando desde el(los) directorio(s) de respaldo...</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations:</source>
+        <translation type="vanished">Datos exitosamente importados desde las siguientes ubicaciones:</translation>
+    </message>
+    <message>
+        <source>Couldn't find any new Machine Data at the locations given.</source>
+        <translation type="vanished">No se pudieron encontrar nuevos datos de máquina en las ubicaciones proporcionadas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Import Problem</source>
+        <translation>Problema de Importación</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Couldn't find any valid Machine Data at
+
+%1</source>
+        <translation>No se pudieron encontrar datos de máquina válidos en 
+
+%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="814"/>
+        <source>Please insert your CPAP data card...</source>
+        <translation>Por favor inserte la tarjeta de datos de CPAP...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="878"/>
+        <source>Please wait, scanning for CPAP data cards...</source>
+        <translation>Por favor espere, detectando tarjetas de datos de CPAP...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="899"/>
+        <source>CPAP Data Located</source>
+        <translation>Datos de CPAP encontrados</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="916"/>
+        <source>Please wait, launching file dialog...</source>
+        <translation>Por favor espere, lanzando diálogo de archivo...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="922"/>
+        <source>No CPAP data card detected, launching file dialog...</source>
+        <translation>No se detectó tarjeta de datos de CPAP, lanzando diálogo de archivo...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="928"/>
+        <source>Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder.</source>
+        <translation>Por favor recuerde señalar al importador directorio raíz o letra de unidad de la tarjeta de datos y no a un subdirectorio.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="929"/>
+        <source>Import Reminder</source>
+        <translation>Importar Recordatorio</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1079"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Bienvenido a SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1082"/>
+        <source>About SleepyHead</source>
+        <translation>Acerca de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1083"/>
+        <source>This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.</source>
+        <translation>Este software ha sido creado para asisitirlo a revisar los datos producidos por las máquinas de CPAP que son utilizadas para el tratamiento de varios transtornos del sueño.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1085"/>
+        <source>SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.</source>
+        <translation>SleepyHead ha sido diseñado por un desarrollador de software con experiencia personal en transtornos del sueño, y ha sido moldeado a su vez por la retroalimentación de muchos evaluadores entusiastas que lidian con padecimientos similares.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1087"/>
+        <source>This is a beta release, some features may not yet behave as expected.</source>
+        <translation>Este es un lanzamiento beta, algunas características podrían aún no comportarse como se espera.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1088"/>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation>Favor de reportar cualquie error que encuentre en la página de SourceForge de SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1090"/>
+        <source>Currenly supported machines:</source>
+        <translation>Máquinas actualmente soportadas:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1091"/>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1093"/>
+        <source>ResMed S9 models (CPAP, Auto, VPAP)</source>
+        <translation>ResMed S9 (modelos CPAP, Auto, VPAP)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1094"/>
+        <source>DeVilbiss Intellipap (Auto)</source>
+        <translation>DeVilbiss Intellipap (Auto)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1095"/>
+        <source>Fisher & Paykel ICON (CPAP, Auto)</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1097"/>
+        <source>Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters</source>
+        <translation>Oxímetros Contec CMS50D+, CMS50E y CMS50F (no 50FW) </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1098"/>
+        <source>ResMed S9 Oximeter Attachment</source>
+        <translation>Accesorio de Oxímetro ResMed S9</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1099"/>
+        <source>Online Help Resources</source>
+        <translation>Recursos de Ayuda en Línea</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1100"/>
+        <source>Note:</source>
+        <translation>Nota:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1101"/>
+        <source>I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.</source>
+        <translation>No se recomienda usar este navegador integrado para explorar intensivamente la red. Funcionará, aunque fue ideado sólo como navegador para temas de ayuda.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1103"/>
+        <source>(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)</source>
+        <translation>(No se soporta encriptación SSL, así que no es buena idea anotar tus contraseñas o detalles personales en cualquier parte.)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1114"/>
+        <source>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/></source>
+        <translation><a href='http://www.sourceforge.net/projects/sleepyhead'>Sitio Web</a> del proyecto SleepyHead en SourceForge<br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1116"/>
+        <source>Further Information</source>
+        <translation>Más Información</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1118"/>
+        <source>Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version.</source>
+        <translation>Aquí están las<a href='qrc:/docs/release_notes.html'>Notas de la Versión</a>actuales.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1120"/>
+        <source>Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users.</source>
+        <translation>Además de unas pocas <a href='qrc:/docs/usage.html'>Notas de Uso</a>, y alguna información importante para usuarios de Mac.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1122"/>
+        <source>About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia</source>
+        <translation>Acerca de la<a href='http://es.wikipedia.org/wiki/Apnea_del_sue%C3%B1o'>Apnea del Sueño</a> en Wikipedia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1125"/>
+        <source>Friendly forums to talk and learn about Sleep Apnea:</source>
+        <translation>Foros amigables para hablar y aprender sobre Apnea del Sueño:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1126"/>
+        <source><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</source>
+        <translation><a href='http://www.cpaptalk.com'>Foro CPAPTalk (en inglés)</a></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>Copyright:</source>
+        <translation>Copyright:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>&copy;2011-2014</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1137"/>
+        <source>License:</source>
+        <translation>Licencia:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1138"/>
+        <source>This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>.</source>
+        <translation>Este software fue liberado bajo una <a href="qrc:/COPYING">Licencia Pública GNU</a>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1141"/>
+        <source>DISCLAIMER:</source>
+        <translation>RENUNCIA DE RESPONSABILIDAD:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1143"/>
+        <source>This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.</source>
+        <translation>Este <font color='red'><u>NO</u></font> es un software médico. Esta aplicación es meramente un visualizador de datos, y no se proporciona ninguna garantía en cuanto a la exactitud o corrección de cualquiera de los cálculos o datos mostrados.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1145"/>
+        <source>The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.</source>
+        <translation>El autor no será considerado responsable por quienquiera que se dañe a sí mismo o a otros por el uso o mal uso de este software.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1147"/>
+        <source>Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.</source>
+        <translation>Su médico debe ser siempre su primera y mejor fuente de orientación en cuanto a la importante tarea de administrar su salud.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1149"/>
+        <source>*** <u>Use at your own risk</u> ***</source>
+        <translation>*** <u>Úsese bajo su propio riesgo</u> ***</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>Revision:</source>
+        <translation>Revisión:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>branch</source>
+        <translatorcomment>rama</translatorcomment>
+        <translation>ramal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1327"/>
+        <source>Build Date: %1 %2</source>
+        <translation>Fecha de compilación: %1 %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1329"/>
+        <source>Graphics Engine: %1</source>
+        <translation>Motor Gráfico: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2649"/>
+        <source>%1's Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>Choose where to save journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>XML Files (*.xml)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Data Folder Location: %1</source>
+        <translation type="vanished">Ubicación del Directorio de Datos: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1349"/>
+        <source>SleepyHead, brought to you by Jedimark</source>
+        <translation>Sleepyhead, traído a usted por Jedimark</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1353"/>
+        <source>Kudos & Credits</source>
+        <translation>Agradecimientos y Créditos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1354"/>
+        <source>Bugfixes, Patches and Platform Help:</source>
+        <translation>Correcciones,Parches y Ayuda de Plataforma:</translation>
+    </message>
+    <message>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone.</source>
+        <translation type="vanished">James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl y Roy Stone.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Translators:</source>
+        <translation>Traductores:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1361"/>
+        <source>3rd Party Libaries:</source>
+        <translation>Librerías de terceros:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1362"/>
+        <source>SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>.</source>
+        <translation>SleepyHead fue realizado usando el <a href="http://qt-project.org">Marco de Aplicación Qt</a>.</translation>
+    </message>
+    <message>
+        <source>It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module.</source>
+        <translation type="vanished">Se usa la librería<a href="http://code.google.com/p/qextserialport">QExtSerialPort</a>para acceso al puerto serie en el Módulo de Oximetría.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1364"/>
+        <source>In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.</source>
+        <translation>En el código del actualizador, SleepyHead utiliza <a href="http://sourceforge.net/projects/quazip">QuaZip</a> creado por Sergey A. Tachenov, el cual es una referencia de contenido en C++ del paquete ZIP/UNZIP de Gilles Vollant.</translation>
+    </message>
+    <message>
+        <source>Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="vanished">Un agradecimiento especial a Pugsy del foro <a href='http://cpaptalk.com'>CPAPTalk</a>por su ayuda con la documentación y tutoriales, así como a todos los que ayudaron al probar y compartir sus datos de CPAP.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1371"/>
+        <source>Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.</source>
+        <translation>Gracias por usar SleepyHead. Si lo considera dentro de sus posibilidades, por favor apoye el futuro desarrollo haciendo una donación a través de Paypal.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1382"/>
+        <source>This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.</source>
+        <translation>Este software NO es apto para su uso en diagnóstico médico, ni para reportar apego al del tratamiento así como tampoco CUALQUIER otro uso médico.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1385"/>
+        <source>The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation>Tanto el autor así como cualquier otro asociado con él NO aceptan responsabilidad por daños, consecuencia resultante o no del uso o mal uso de este software.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1387"/>
+        <source>Use this software entirely at your own risk.</source>
+        <translation>Use este software completamente bajo su propio riesgo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1456"/>
+        <source>Access to Preferences has been blocked until recalculation completes.</source>
+        <translation>El acceso a Preferencias ha sido bloqueado hasta que se complete la recalculación.</translation>
+    </message>
+    <message>
+        <source>Please wait, importing...</source>
+        <translation type="vanished">Por favor espere, importando...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2587"/>
+        <source>Are you sure you want to delete oximetry data for %1</source>
+        <translation>Está usted seguro de borrar los datos de oximetría para %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2589"/>
+        <source><b>Please be aware you can not undo this operation!</b></source>
+        <translation><b>¡Por favor esté consciente de que esta operación no puede ser deshecha!</b></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2609"/>
+        <source>Select the day with valid oximetry data in daily view first.</source>
+        <translation>Seleccione primero un día con datos de oximetría válidos en la Vista por Día.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1092"/>
+        <source>Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)</source>
+        <translation>Philips Respironics System One (modelos CPAP Pro, Auto, BiPAP y ASV)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Imported %1 CPAP session(s) from
+
+%2</source>
+        <translation>Se importó(aron) %1 sesión(es) de CPAP desde
+
+%2
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Import Success</source>
+        <translation>Importación Exitosa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Already up to date with CPAP data at
+
+%1</source>
+        <translation>Datos de CPAP al corriente en
+
+%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Up to date</source>
+        <translation>Al corriente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="821"/>
+        <source>Choose a folder</source>
+        <translation>Elija un directorio</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="892"/>
+        <source>A %1 file structure for a %2 was located at:</source>
+        <translation>Una estructura de archivo %1 para un %2 fue encontrada en:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="894"/>
+        <source>A %1 file structure was located at:</source>
+        <translation>Una estructura de archivo %1 fue encontrada en:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="901"/>
+        <source>Would you like to import from this location?</source>
+        <translation>¿Desea usted importar desde esta ubicación?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="905"/>
+        <source>Specify</source>
+        <translation>Especifique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1106"/>
+        <source>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Guía de Usuario</a><br/>en línea de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1108"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Preguntas Frecuentes</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1110"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glosario de Términos de Transtornos del Sueño</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1112"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">Wiki de SleepyHead</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1127"/>
+        <source><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here.</source>
+        <translatorcomment>:D <3</translatorcomment>
+        <translation type="vanished">Arie Klerk (Holandés), Steffen Reitz (Alemán), Chen Hao (Chino), Lars-Erik Söderström (Sueco), Damien Vigneron (Francés), António Jorge Costa (Portugués), Judith Guzmán (Español) y otros aún pendientes de añadir.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1545"/>
+        <source>There was an error saving screenshot to file "%1"</source>
+        <translation>Hubo un error al guardar la captura de pantalla en el archivo "%1"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1547"/>
+        <source>Screenshot saved to file "%1"</source>
+        <translation>Captura de pantalla guardada en el archivo "%1"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1567"/>
+        <source>Printing Disabled</source>
+        <translation>Impresión deshabilitada</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1568"/>
+        <source>Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt</source>
+        <translation>Por favor recompile SleepyHead con Qt 4.8.5 o superior, ya que al imprimir se causa una falla con esta versión de Qt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>Gah!</source>
+        <translation>¡Gah!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>If you can read this, the restart command didn't work. Your going to have to do it yourself manually.</source>
+        <translation>Si puede leer esto, el comando reiniciar no funcionó. Tendrá usted que hacerlo manualmente.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2037"/>
+        <source>Are you sure you want to rebuild all CPAP data for the following machine:</source>
+        <translation>¿Está usted seguro de que quiere reestablecer todos los datos de CPAP para la siguiente máquina?:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2040"/>
+        <source>Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way.</source>
+        <translation>Por favor considere que esto podría resultar en la pérdida de datos del gráfico si los respaldos internos de SleepyHead son deshabilitados o interferidos de algún modo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2048"/>
+        <source>For some reason, SleepyHead does not have internal backups for the following machine:</source>
+        <translation>Por algún motivo SleepyHead no tiene respaldos internos para la siguiente máquina:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2051"/>
+        <source>Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.</source>
+        <translation>Suponiendo que usted ha hecho <i>sus <b>propios</b> respaldos para TODOS sus datos de CPAP</i>, aún puede completar esta operación pero tendrá que restaurar desde sus respaldos manualmente.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2052"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation>¿Está en verdad seguro de querer realizar esto?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2124"/>
+        <source>A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:</source>
+        <translation>Un error de permiso de archivo o similar arruinó el proceso de purgado, tendrá usted que eliminar el siguiente directorio manualmente:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2065"/>
+        <source>Because there are no internal backups to rebuild from, you will have to restore from your own.</source>
+        <translation>Debido a que no hay respaldos internos desde donde reestablecer, tendrá que restaurar usted mismo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="314"/>
+        <source><b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="315"/>
+        <source>If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="316"/>
+        <source>Make sure your keep your SleepyHead data folder backed up when trying testing versions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="317"/>
+        <source>Please ensure you are running the latest version before reporting any bugs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="319"/>
+        <source>Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="320"/>
+        <source>Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="321"/>
+        <source>This red message line is intentional, and will not be a feature in the final version...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1331"/>
+        <source>Data Folder Location: <a href="file://%1">%2</a></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1355"/>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1366"/>
+        <source>Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2066"/>
+        <source>Would you like to import from your own backups now? (you will have no data visible for this machine until you do)</source>
+        <translation>¿Le gustaría importar desde sus propios respaldos ahora? (No habrá datos visibles para esta máquina hasta que así lo haga)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2097"/>
+        <source>You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2100"/>
+        <source>Note as a precaution, the backup folder will be left in place.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2101"/>
+        <source>Are you <b>absolutely sure</b> you want to proceed?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2287"/>
+        <source>Performance will be degraded during these recalculations.</source>
+        <translation>El desempeño se reducirá durante estas recalculaciones.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2288"/>
+        <source>Recalculating Indices</source>
+        <translation>Recalculando Índices</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2300"/>
+        <source>Loading Event Data</source>
+        <translation>Cargando Datos de Eventos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2302"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2362"/>
+        <source>Recalculating Summaries</source>
+        <translation>Recalculando Resúmenes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2374"/>
+        <source>Restart Required</source>
+        <translation>Reinicio Requerido</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2375"/>
+        <source>Recalculations are complete, the application now needs to restart to display the changes.</source>
+        <translation>Las recalculaciones están completas, se requiere reiniciar la aplicación para reflejar los cambios.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Recalculations are now complete.</source>
+        <translation>Las recalculaciones están ahora completas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Task Completed</source>
+        <translation>Tarea Completada</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2404"/>
+        <source>There was a problem opening ZEO File: </source>
+        <translation>Hubo un problema abriendo el Archivo ZEO: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2408"/>
+        <source>Zeo CSV Import complete</source>
+        <translation>Importación de CSV Zeo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2430"/>
+        <source>There was a problem opening MSeries block File: </source>
+        <translation>Hubo un problema abriendo el Archivo de Bloques del SerieM: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2434"/>
+        <source>MSeries Import complete</source>
+        <translation>Importación de SerieM completa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2492"/>
+        <source>There was a problem opening Somnopose Data File: </source>
+        <translation>Hubo un problema abriendo el Archivo de Datos Somnopose: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2496"/>
+        <source>Somnopause Data Import complete</source>
+        <translation>Importación de Datos de Somnopause completada</translation>
+    </message>
+</context>
+<context>
+    <name>MinMaxWidget</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1773"/>
+        <source>Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1774"/>
+        <source>Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1775"/>
+        <source>Override</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1776"/>
+        <source>The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1782"/>
+        <source>The Minimum Y-Axis value.. Note this can be a negative number if you wish.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1783"/>
+        <source>The Maximum Y-Axis value.. Must be greater than Minimum to work.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1818"/>
+        <source>Scaling Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1840"/>
+        <source>This button resets the Min and Max to match the Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>NewProfile</name>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="14"/>
+        <source>Edit User Profile</source>
+        <translation>Editar Perfil de Usuario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="70"/>
+        <source>I agree to all the conditions above.</source>
+        <translation>Acepto todas las condiciones arriba mencionadas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="111"/>
+        <source>User Information</source>
+        <translation>Información de Usuario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="137"/>
+        <source>User Name</source>
+        <translation>Nombre de Usuario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="152"/>
+        <source>Keep the kids out.. Nothing more.. This isn't meant to be uber security.</source>
+        <translation>Mantenga a los niños lejos nada más. Esto no se supone que sea máxima seguridad.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="155"/>
+        <source>Password Protect Profile</source>
+        <translation>Perfil Protegido por Contraseña</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="182"/>
+        <source>Password</source>
+        <translation>Contraseña</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="196"/>
+        <source>...twice...</source>
+        <translation>...otra vez...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="213"/>
+        <source>Locale Settings</source>
+        <translation>Configuración Local</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="285"/>
+        <source>Country</source>
+        <translation>País</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="253"/>
+        <source>TimeZone</source>
+        <translation>Zona Horaria</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="54"/>
+        <source>about:blank</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="240"/>
+        <source>DST Zone</source>
+        <translation>Zona de Horario de Verano</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="320"/>
+        <source>Personal Information (for reports)</source>
+        <translation>Información Personal (para los reportes)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="344"/>
+        <source>First Name</source>
+        <translation>Nombre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="354"/>
+        <source>Last Name</source>
+        <translation>Apellidos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="364"/>
+        <source>D.O.B.</source>
+        <translation>Fecha de Nacimiento</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="380"/>
+        <source>Gender</source>
+        <translation>Sexo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="393"/>
+        <source>Male</source>
+        <translation>Masculino</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="398"/>
+        <source>Female</source>
+        <translation>Femenino</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="414"/>
+        <source>Height</source>
+        <translation>Altura</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="453"/>
+        <source>metric</source>
+        <translation>Métrico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="458"/>
+        <source>archiac</source>
+        <translation>Arcaico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="471"/>
+        <source>Contact Information</source>
+        <translation>Información de Contacto</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="498"/>
+        <location filename="../sleepyhead/newprofile.ui" line="773"/>
+        <source>Address</source>
+        <translation>Domicilio</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="515"/>
+        <location filename="../sleepyhead/newprofile.ui" line="804"/>
+        <source>Email</source>
+        <translation>Correo Electrónico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="525"/>
+        <location filename="../sleepyhead/newprofile.ui" line="794"/>
+        <source>Phone</source>
+        <translation>Teléfono</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="570"/>
+        <source>CPAP Treatment Information</source>
+        <translation>Información del Tratamiento CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="597"/>
+        <source>Date Diagnosed</source>
+        <translation>Fecha de Diagnóstico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="611"/>
+        <source>Untreated AHI</source>
+        <translation>IAH sin tratar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="625"/>
+        <source>CPAP Mode</source>
+        <translation>Modo de CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="633"/>
+        <source>CPAP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="638"/>
+        <source>APAP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="643"/>
+        <source>Bi-Level</source>
+        <translation>Bi-Nivel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="648"/>
+        <source>ASV</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="656"/>
+        <source>RX Pressure</source>
+        <translation>Presión Diagnosticada</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="702"/>
+        <source>Doctors / Clinic Information</source>
+        <translation>Información del Médico/Clínica</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="729"/>
+        <source>Doctors Name</source>
+        <translation>Nombre del Médico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="746"/>
+        <source>Practice Name</source>
+        <translation>Especialidad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="756"/>
+        <source>Patient ID</source>
+        <translation>ID de paciente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="852"/>
+        <source>SleepyHead</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="867"/>
+        <source>TextLabel</source>
+        <translation>Etiqueta de Texto</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="943"/>
+        <source>&Cancel</source>
+        <translation>&Cancelar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="959"/>
+        <source>&Back</source>
+        <translation>&Anterior</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="975"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="275"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="284"/>
+        <source>&Next</source>
+        <translation>&Siguiente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="59"/>
+        <source>Select Country</source>
+        <translation>Seleccione País</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="109"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Bienvenido a SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="111"/>
+        <source>This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</source>
+        <translation>Este software ha sido creado para asisitirlo a revisar los datos producidos por las máquinas de CPAP y otros equipos relacionados.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="114"/>
+        <source>SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</source>
+        <translation>Este software fue liberado bajo una <a href="qrc:/COPYING">Licencia Pública GNU</a>. y no viene con ninguna garantía o afirmación de capacidad para propósito alguno.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="116"/>
+        <source>PLEASE READ CAREFULLY</source>
+        <translation>POR FAVOR LEA CUIDADOSAMENTE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="117"/>
+        <source>SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.</source>
+        <translation>SleepyHead ha sido concebido únicamente como un visor de datos, y definitivamente no como un sucedáneo de la orientación médica competente por parte de su médico tratatante.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="120"/>
+        <source>Accuracy of any data displayed is not and can not be guaranteed.</source>
+        <translation>La exactitud de los datos mostrados no está y no puede ser garantizada.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="122"/>
+        <source>Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.</source>
+        <translation>Cualquier reporte generado es EXCLUSIVAMENTE PARA USO PERSONAL y no es adecuado DE NINGÚN MODO para fines de apego al tratamiento o diagnóstico médico.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="125"/>
+        <source>The author will not be held liable for <u>anything</u> related to the use or misuse of this software.</source>
+        <translation>El autor no será considerado responsable por <u> absolutamente nada</u>relacionado con el uso o mal uso de este software.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="129"/>
+        <source>Use of this software is entirely at your own risk.</source>
+        <translation>El uso de este software es completamente bajo su propio riesgo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="132"/>
+        <source>SleepyHead is copyright &copy;2011-2014 Mark Watkins</source>
+        <translation>SleepyHead tiene copyright &copy;2011-2014 Mark Watkins</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="157"/>
+        <source>Please provide a username for this profile</source>
+        <translation>Por favor proporcione un nombre de usuario para este perfiĺ</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="167"/>
+        <source>Passwords don't match</source>
+        <translation>Las contraseñas no coinciden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Profile Changes</source>
+        <translation>Cambios al Perfil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Accept and save this information?</source>
+        <translation>¿Aceptar y guardar esta información?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="273"/>
+        <source>&Finish</source>
+        <translation>&Finalizar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="449"/>
+        <source>&Close this window</source>
+        <translation>&Cerrar esta Ventana</translation>
+    </message>
+</context>
+<context>
+    <name>Overview</name>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="68"/>
+        <source>Range:</source>
+        <translation>Intérvalo:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="82"/>
+        <source>Last Week</source>
+        <translation>Última Semana</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="87"/>
+        <source>Last Two Weeks</source>
+        <translation>Última Quincena</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="92"/>
+        <source>Last Month</source>
+        <translation>Último Mes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="97"/>
+        <source>Last Two Months</source>
+        <translation>Último Bimestre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="102"/>
+        <source>Last Three Months</source>
+        <translation>Último Trimestre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="107"/>
+        <source>Last 6 Months</source>
+        <translation>Último Semestre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="112"/>
+        <source>Last Year</source>
+        <translation>Último Año</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="117"/>
+        <source>Everything</source>
+        <translation>Todo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="122"/>
+        <source>Custom</source>
+        <translation>Personalizado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="130"/>
+        <source>Start:</source>
+        <translation>Inicio:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="153"/>
+        <source>End:</source>
+        <translation>Fin:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="176"/>
+        <source>Reset view to selected date range</source>
+        <translation>Reinicializar vista al intérvalo seleccionado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="195"/>
+        <location filename="../sleepyhead/overview.ui" line="244"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="225"/>
+        <source>Toggle Graph Visibility</source>
+        <translation>Activar Visibilidad del Gráfico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="260"/>
+        <source>Drop down to see list of graphs to switch on/off.</source>
+        <translation>Expanda esta lista para mostrar u ocultar los gráficos disponibles.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="264"/>
+        <source>Graphs</source>
+        <translation>Gráficos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="121"/>
+        <source>Respiratory
+Disturbance
+Index</source>
+        <translation>Índice de
+Perturbación
+Respiratoria</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="123"/>
+        <source>Apnea
+Hypopnea
+Index</source>
+        <translation>Índice de
+Apnea-
+Hipoapnea</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage</source>
+        <translation>Uso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage
+(hours)</source>
+        <translation>Uso
+(horas)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times</source>
+        <translation>Horarios de la sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times
+(hours)</source>
+        <translation>Tiempo de la sesión
+(horas)</translation>
+    </message>
+    <message>
+        <source>% in PB</source>
+        <translatorcomment>Respiración Periódica</translatorcomment>
+        <translation type="vanished">% en RP</translation>
+    </message>
+    <message>
+        <source>Periodic
+Breathing
+(% of night)</source>
+        <translation type="vanished">Respiración
+Periódica
+(% de la noche)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>% in %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <source>%1
+(% of night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>Large Leaks
+(% of night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI</source>
+        <translatorcomment>Índice de Perturbación Respiratoria</translatorcomment>
+        <translation>IPR Pico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI
+Shows RDI Clusters
+(RDI/hr)</source>
+        <translation>IPR Pico
+Se muestran Grupos de IPR
+(IPR/hora)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI</source>
+        <translation>IAH Pico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI
+Shows AHI Clusters
+(AHI/hr)</source>
+        <translation>IAH Pico
+Se muestran Grupos de IAH
+(IAH/hora)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="157"/>
+        <source>Tidal
+Volume
+(ml)</source>
+        <translation>Volumen
+Corriente
+(mL)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="158"/>
+        <source>Minute
+Ventilation
+(L/min)</source>
+        <translation>Ventilación
+Minuto
+(L/min)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="159"/>
+        <source>Target
+Ventilation
+(L/min)</source>
+        <translation>Ventilación
+Objetivo
+(L/min)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="160"/>
+        <source>Patient
+Triggered
+Breaths
+(%)</source>
+        <translatorcomment>No estoy segura</translatorcomment>
+        <translation>Inpiraciones
+iniciadas por el
+paciente
+(%)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="161"/>
+        <source>
+(count)</source>
+        <translation>
+(conteo)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="163"/>
+        <source>Oxygen Saturation
+(%)</source>
+        <translation>Saturación de Oxígeno
+(%)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="164"/>
+        <source>SensAwake
+(count)</source>
+        <translation>SensAwake
+(conteo)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="167"/>
+        <source>Body
+Mass
+Index</source>
+        <translation>Índice de
+Masa
+Corporaĺ</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="168"/>
+        <source>How you felt
+(0-10)</source>
+        <translation>¿Cómo se sintió?
+(0-10)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="185"/>
+        <source>Zombie Meter</source>
+        <translation>Zombímetro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="254"/>
+        <source>breaths/min</source>
+        <translation>inpiraciones/minuto</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="262"/>
+        <source>L/b</source>
+        <translation>L/inspiración</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="284"/>
+        <source>%PTB</source>
+        <translatorcomment>Inspiraciones Iniciadas por el Paciente</translatorcomment>
+        <translation>%IIP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="311"/>
+        <source>% PB</source>
+        <translatorcomment>Respiración Periódica</translatorcomment>
+        <translation>%RP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="314"/>
+        <source>% %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="670"/>
+        <source>Show all graphs</source>
+        <translation>Mostrar todos los gráficos</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">¡Ningún gráfico mostrado!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="683"/>
+        <source>Hide all graphs</source>
+        <translation>Ocultar todos los gráficos</translation>
+    </message>
+</context>
+<context>
+    <name>OximeterImport</name>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="14"/>
+        <source>Dialog</source>
+        <translation>Diálogo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="39"/>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="35"/>
+        <source>Oximeter Import Wizard</source>
+        <translation>Asistente para la Importación de Datos desde el Oxímetro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></source>
+        <translatorcomment>No lo tocaré aún o.O</translatorcomment>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="749"/>
+        <source>Skip this page next time.</source>
+        <translation>Saltar esta pantalla la próxima vez.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="789"/>
+        <source><html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html></source>
+        <translation><html><head/><body><p>SleepyHead soporta completamente los oxímetros en serie Contec CMS50D+/E/F , <br/>así como los archivos de datos creados por el software de los oxímetros ChoiceMMed MD300W1.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="823"/>
+        <source>Where would you like to import from?</source>
+        <translation>¿Desde dónde le gustaría importar?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="846"/>
+        <source><html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html></source>
+        <translation><html><head/><body><p>Esta opción le permititirá importar (mediante un cable) los registros internos de su oxímetro.</p><p>Es posible que después de seleccionar esta opción deba realizar alguna acción en el menú del dispositivo para iniciar la descarga en algunos dispositivos.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="852"/>
+        <source>Directly from a recording on a device</source>
+        <translation>Directamente desde un registro en el dispositivo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="872"/>
+        <source><html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html></source>
+        <translation><html><head/><body><p>Si no le molesta estar delante de una computadora funcionando toda la noche, esta opción le proporcionará una útil gráfica de pletismografía, la cual indica el ritmo cardiaco además de las lecturas normales de oximetría.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="878"/>
+        <source>Record attached to computer overnight (provides plethysomogram)</source>
+        <translation>Desde un registro procesado de un día para otro (proporciona pletismografía)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="895"/>
+        <source><html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html></source>
+        <translation><html><head/><body><p>Esta opción le permitirá importar datos desde archivos creados por el software de acompañamiento del oxímetro de pulso, tales como SpO2Review.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="901"/>
+        <source>Import from a datafile saved by another program, like SpO2Review</source>
+        <translation>Desde un archivo de datos guardado por otro programa, como SpO2Review</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="942"/>
+        <source><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p>& [...]
+        <translation><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Recordatorio para usuarios de CPAP: </span><span style=" color:#fb0000;">¿Ha importado sus sesiones de CPAP primero?</span></p><p>De no ser así no tendrá una línea de tiempo válida con la cual sincronizar esta sesión de oximetría.<br/><br/>Para asegurar una buena sincronización entre dispositivos, siempre [...]
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="964"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1000"/>
+        <source>Please connect your oximeter device</source>
+        <translation>Por favor conecte su oxímetro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1026"/>
+        <source>Press Start to commence recording</source>
+        <translation>Presione Inicio para comenzar el registro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1072"/>
+        <source>Show Live Graphs</source>
+        <translation>Mostrar Gráficos en Vivo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1103"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1357"/>
+        <source>Duration</source>
+        <translation>Duración</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1139"/>
+        <source>SpO2 %</source>
+        <translation>% SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1221"/>
+        <source>Pulse Rate</source>
+        <translation>Frecuencia de Pulso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1313"/>
+        <source>Multiple Sessions Detected</source>
+        <translation>Múltiples sesiones detectadas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1329"/>
+        <source>Please choose which one you want to import into SleepyHead</source>
+        <translation>Por favor elija cuál desea importar a SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1352"/>
+        <source>Start Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Import Time</source>
+        <translation type="vanished">Hora de Importación</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1362"/>
+        <source>Details</source>
+        <translation>Detalles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1379"/>
+        <source>Import Completed. When did the recording start?</source>
+        <translation>Importación Completada. ¿Cuándó comenzó la grabación?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1403"/>
+        <source>Day recording (normally would of) started</source>
+        <translatorcomment>ding (normally would of) ??
+</translatorcomment>
+        <translation>Regitro diario comenzado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1449"/>
+        <source>Oximeter Starting time</source>
+        <translation>Hora de inicio del oxímetro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1461"/>
+        <source>I want to use the time reported by my oximeter's built in clock.</source>
+        <translation>Quiero usar la hora registrada por el reloj interno de mi oxímetro.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1477"/>
+        <source>I started this oximeter recording at (or near) the same time as a session on my CPAP machine.</source>
+        <translation>Inicié esta grabación del oxímetro al mismo (o casi) tiempo de una sesión de mi máquina CPAP.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1506"/>
+        <source><html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html></source>
+        <translation><html><head/><body><p>SleepyHead necesita un tiempo inicial para saber dónde guardar esta sesión de oximetría.</p><p>Elija una de las opciones siguientes:</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1538"/>
+        <source><html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html></source>
+        <translation><html><head/><body><p>Nota: Sincronizar con el inicio de una sesión CPAP será siempre más preciso.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1559"/>
+        <source>Choose CPAP session to sync to:</source>
+        <translation>Elija con cuál sesión CPAP sincronizar:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1598"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1637"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1679"/>
+        <source>You can manually adjust the time here if required:</source>
+        <translation>Puede ajustar manualmente la hora si es necesario:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1700"/>
+        <source>HH:mm:ssap</source>
+        <translatorcomment>ap?</translatorcomment>
+        <translation>HH:mm:ssap</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1753"/>
+        <source>&Cancel</source>
+        <translation>&Cancelar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1760"/>
+        <source>&Information Page</source>
+        <translation>&Hoja de información</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1780"/>
+        <source>&Retry</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1787"/>
+        <source>&Choose Session</source>
+        <translation>&Escoger Sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1794"/>
+        <source>&End Recording</source>
+        <translation>&Finalizar Registro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1801"/>
+        <source>&Sync and Save</source>
+        <translation>&Sincronizar y Guardar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1808"/>
+        <source>&Save and Finish</source>
+        <translation>&Guardar y Terminar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1815"/>
+        <source>&Start</source>
+        <translation>&Iniciar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="170"/>
+        <source>Scanning for compatible oximeters</source>
+        <translation>Buscanda oxímetros compatibles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="202"/>
+        <source>Could not detect any connected oximeter devices.</source>
+        <translation>No se pudieron detectar oxímetros conectados.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="209"/>
+        <source>Connecting to %1 Oximeter</source>
+        <translation>Conectando al oxímetro %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="269"/>
+        <source>"%1", session %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="288"/>
+        <source>Waiting for %1 to start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="289"/>
+        <source>Waiting for the device to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="291"/>
+        <source>Select upload option on %1</source>
+        <translation>Seleccione ĺa opción adecuada para realizar la descarga en %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="292"/>
+        <source>Waiting for you to start the upload process...</source>
+        <translation>Empezando a que usted inicie el proceso de descarga...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="323"/>
+        <source>%1 device is uploading data...</source>
+        <translation>El dispositivo %1 está descargando información...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="324"/>
+        <source>Please wait until oximeter upload process completes. Do not unplug your oximeter.</source>
+        <translation>Por favor espere hasta que la descarga desde el oxímetro finalice. No lo desconecte.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="341"/>
+        <source>Oximeter import completed..</source>
+        <translation>Importación desde el oxímetro completada.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Select a valid oximetry data file</source>
+        <translation>Seleccione un archivo válido con datos de oximetría</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Oximetry Files (*.spo *.spor *.spo2 *.dat)</source>
+        <translation>Archivos de Qximetría (*.spo *.spor *.spo2 *.dat)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="391"/>
+        <source>No Oximetery module could parse the given file:</source>
+        <translation>Ninguno de los módulos de oximetría puede interpretar el archivo proporcionado:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="413"/>
+        <source>Oximeter not detected</source>
+        <translation>Oxímetro no detectado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="420"/>
+        <source>Couldn't access oximeter</source>
+        <translation>No se pudo acceder al oxímetro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="431"/>
+        <source>Live Oximetery Mode</source>
+        <translation>Modo de oximetría en vivo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="434"/>
+        <source>Starting up...</source>
+        <translation>Iniciando...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="435"/>
+        <source>If you can still read this after a few seconds, cancel and try again</source>
+        <translation>Si aún puede leer esto después de asgunos segundos, cancele e inténtelo de nuevo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="478"/>
+        <source>Live Import Stopped</source>
+        <translation>Importación en vivo detenida</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="479"/>
+        <source>Live Oximetery Stopped</source>
+        <translation>Oximetría en vivo detenida</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="480"/>
+        <source>Live Oximetery import has been stopped</source>
+        <translation>La importación de oximetría en vivo ha sido detenida</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="527"/>
+        <source>%1 session(s) on %2, starting at %3</source>
+        <translation>%1 sesión(es) en %2, comenzando en %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="531"/>
+        <source>No CPAP data available on %1</source>
+        <translation>No hay datos de CPAP disponibles en %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="537"/>
+        <source>%1</source>
+        <translation>%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="650"/>
+        <source>Recording...</source>
+        <translation>Registrando...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="657"/>
+        <source>Finger not detected</source>
+        <translation>Dedo no detectado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="750"/>
+        <source>I want to use the time my computer recorded for this live oximetry session.</source>
+        <translation>Quiero usar la hora registrada por mi computadora para esta sesión de oximetría en vivo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="753"/>
+        <source>I need to set the time manually, because my oximeter doesn't have an internal clock.</source>
+        <translation>Necesito configurar la hora manualmente porque mi oxímetro no tiene reloj interno.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="764"/>
+        <source>Something went wrong getting session data</source>
+        <translation>Algo salió mal al obtener los datos de la sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="993"/>
+        <source>CMS50 Session %1</source>
+        <translation>Sesión CMS50 %1</translation>
+    </message>
+</context>
+<context>
+    <name>Oximetry</name>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="89"/>
+        <source>Date</source>
+        <translation>Fecha</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="102"/>
+        <source>d/MM/yy h:mm:ss AP</source>
+        <translatorcomment>¿ap?</translatorcomment>
+        <translation>d/MM/aa h:mm:ss AP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="131"/>
+        <source>R&eset</source>
+        <translation>R&einicializar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="160"/>
+        <source>SpO2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="245"/>
+        <source>Pulse</source>
+        <translation>Pulso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="346"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="366"/>
+        <source>&Open .spo/R File</source>
+        <translation>&Abrir archivo .spo/R</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="385"/>
+        <source>Serial &Import</source>
+        <translation>&Importación 
+en serie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="398"/>
+        <source>&Start Live</source>
+        <translation>Iniciar en &vivo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="421"/>
+        <source>Serial Port</source>
+        <translation>Puerto Serie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="450"/>
+        <source>&Rescan Ports</source>
+        <translation>Volver a
+&buscar puertos</translation>
+    </message>
+</context>
+<context>
+    <name>PreferencesDialog</name>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="23"/>
+        <source>Preferences</source>
+        <translation>Preferencias</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="58"/>
+        <source>&Import</source>
+        <translation>&Importar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="79"/>
+        <source>Session Settings</source>
+        <translation>Configuración de la sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="102"/>
+        <source>Combine Close Sessions </source>
+        <translation>Combinar Sesiones Cerradas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="112"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="197"/>
+        <source>Minutes</source>
+        <translation>Minutos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="132"/>
+        <source>Multiple sessions closer together than this value will be kept on the same day.
+</source>
+        <translation>Sesiones múltiples más cercanas que este valor serán mantenidas en el mimsmo día.
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="187"/>
+        <source>Ignore Short Sessions</source>
+        <translation>Ignorar sesiones cortas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="211"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sesiones de duración menor a esta no serán mostradas<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="252"/>
+        <source>Day Split Time</source>
+        <translation>Hora de cambio de día</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="262"/>
+        <source>Sessions starting before this time will go to the previous calendar day.</source>
+        <translation>Sesiones comenzadas antes de esta hora van al día calendario previo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="282"/>
+        <source>Keep session data in memory to speed up revisiting days.</source>
+        <translation>Mantener los datos de sesión en la memoria para agilizar la revisión de los días.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="285"/>
+        <source>Cache Session Data (uses more system memory)</source>
+        <translation>Almacenar datos de sesión en caché (se usa más memoria del sistema)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="361"/>
+        <source>Summary only data is more accurate for ResMed users if this is left on.</source>
+        <translation>Los datos de sólo resumen son más precisos para  usuarion de ResMed si se marca esta opción.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="364"/>
+        <source>Don't Split Summary Days</source>
+        <translation>No separar días de resumen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="395"/>
+        <source>Session Storage Options</source>
+        <translation>Opciones de almacenamiento de sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="419"/>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+SleepyHead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translation>Esto mantiene un respaldo de los datos de la tarjeta SD para las máquinas ResMed.
+
+Las máquinas ResMed eliminan los datos de alta resolución más viejos de 7 días, y los datos de gráficos más viejos de 30.
+
+SleepyHead puede almacenar una copia de dichos datos por si usted alguna vez requiere reinstalar (altamente recomendado,a menos que tenga poco espacio en disco y no le importe la información de gráficos).
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="428"/>
+        <source>Create SD Card Backups during Import (Turn this off at your own peril!)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="435"/>
+        <source>This makes SleepyHead's data take around half as much space.
+But it makes import and day changing take longer.. 
+If you've got a new computer with a small solid state disk, this is a good option.</source>
+        <translation>Esto hace que SleepyHead ocupe la mitad de espacio, pero la importación y el cambio entre días demorará más.
+
+Si tiene una computadora nueva con un pequeño disco de estado sólido, esta es una buena opción.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="440"/>
+        <source>Compress Session Data (makes SleepyHead data smaller, but day changing slower.)</source>
+        <translation>Comprimir datos de sesión (vuelve más pequeños los datos de SH, pero el cambio entre días se ralentiza)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="447"/>
+        <source>Compress ResMed (EDF) backups to save disk space.
+Backed up EDF files are stored in the .gz format, 
+which is common on Mac & Linux platforms.. 
+
+SleepyHead can import from this compressed backup directory natively.. 
+To use with ResScan will require the .gz files to be uncompressed first..</source>
+        <translation>Comprime los respaldos de ResMed (EDF) para ahorrar espacio en disco. 
+Los archivos EDF respaldados son almacenados en formato .gz,
+el cual es común en plataformas Mac y Linux.
+
+SleepyHead puede importar desde este directorio comprimido de respaldo 
+de manera nativa. Para usarse con ResScan se requerirá descomprimir los 
+archivos .gz primero.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="455"/>
+        <source>Compress SD Card Backups (slower first import, but makes backups smaller)</source>
+        <translation>Comprimir Respaldos de tarjeta SD (primera importación más lenta, respaldos más pequeños)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="467"/>
+        <source>The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes.</source>
+        <translation>Las siguientes opciones afectan la cantidad de espacio en disco usada por SleepyHead, y todas afectan el tiempo que toman las importaciones en realizarse.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="477"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data.  </span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Cambiar las opciones de compresión de los respaldos de la tarjeta SD no recomprimen automáticamente los datos de respaldo.</span></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="508"/>
+        <source>&CPAP</source>
+        <translation>&CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="535"/>
+        <source>CPAP Mask Information</source>
+        <translation>Información de máscara para CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="562"/>
+        <source>Mask Type</source>
+        <translation>Tipo de mascarilla</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="569"/>
+        <source>Generic mask type. Select the one that's closest to your mask.</source>
+        <translation>Tipo genérico de mascarilla. Seleccione el que sea más cercano a la suya.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="587"/>
+        <source>Description</source>
+        <translation>Descripción</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="594"/>
+        <source>The name of your mask, or at least the name you call it.</source>
+        <translation>El nombre de su mascarilla, o al menos como usted la llama.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="607"/>
+        <source>Method of unintentional leaks calculation if not provided by your machine.
+Note: Statistical Model is experimental.</source>
+        <translation>Método para el cálculo de fugas accidentales si es que no es proporcionado por su máquina.
+Nota: La de modelo estadístico es experimental.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="612"/>
+        <source>Mask Profile</source>
+        <translation>Perfil de mascarilla</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="617"/>
+        <source>Statistical Model</source>
+        <translation>Modelo Estadístico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="631"/>
+        <source>Leak calcs</source>
+        <translation>Cálculos de fuga</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="644"/>
+        <source>Started Using</source>
+        <translation>Inicio de uso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="657"/>
+        <source>The date you started using this mask</source>
+        <translation>El día en que comenzó a usar esta mascarilla</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="673"/>
+        <source>Leak Profile</source>
+        <translation>Perfil de fuga</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="687"/>
+        <source>Pressure</source>
+        <translation>Presión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="692"/>
+        <source>Leak</source>
+        <translation>Fuga</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html></source>
+        <translation>!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Nota: </span>Los perfiles de fuga no funcionan aún.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1153"/>
+        <source>Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA)</source>
+        <translation>Muestra el índice de Perturbación Respiratoria en vez del índice de Apnea-Hipoapnea (IPR=IAH+RERA)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1156"/>
+        <source>Use RDI instead of AHI (PRS1 only)</source>
+        <translation>Usar IPR en vez de IAH (sólo PRS1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1069"/>
+        <source>Don't show any compliance information</source>
+        <translation>No mostrar información de cumplimiento (apego)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1072"/>
+        <source>Show Compliance</source>
+        <translation>Mostrar cumplimiento</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1105"/>
+        <source>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</source>
+        <translation>Considerar días con menos uso que este como incumplidos. Cuatro horas son generalmente consideradas como en cumplimiento.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1108"/>
+        <source> hours</source>
+        <translation> horas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1130"/>
+        <source>as over</source>
+        <translation>Más de</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1137"/>
+        <source>of usage per night</source>
+        <translation>de uso por noche</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="728"/>
+        <source>Enable/disable experimental event flagging enhancements. 
+It allows detecting borderline events, and some the machine missed.
+This option must be enabled before import, otherwise a purge is required.</source>
+        <translation>Habilitar/deshabilitar mejoras experimentales de detección de eventos.
+Esto permite detectar eventos limítrofes, y algunos que la máquina pasó por alto.
+Esta opción debe habilitarse antes de importar, de otro modo es requerida una purga.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="733"/>
+        <source>Custom User Event Flagging</source>
+        <translation>Detección de eventos personalizada por el usuario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="797"/>
+        <source>Flow Restriction</source>
+        <translation>Restricción de 
+flujo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="843"/>
+        <source>Percentage of restriction in airflow from the median value. 
+A value of 20% works well for detecting apneas. </source>
+        <translation>Porcentaje de restricción de fluje respecto al valor medio.
+Un valor de 20% funciona bien para detectar apneas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="760"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="847"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1432"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1487"/>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="875"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La deteccióon personalizada es un método experimental para detectar eventos errados por la máquina. Estos <span style=" text-decoration: underline;">no</span> están incluidos en el IAH.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="821"/>
+        <source>Duration of airflow restriction</source>
+        <translation>Duración de la restricción de flujo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="804"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="824"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1377"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1406"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1477"/>
+        <source>s</source>
+        <translation>s</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="814"/>
+        <source>Event Duration</source>
+        <translation>Duración del 
+evento</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="857"/>
+        <source>Allow duplicates near machine events.</source>
+        <translation>Permitir duplicados cercanos a eventos de la máquina.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="947"/>
+        <source>AHI/Hour Graph Settings</source>
+        <translation>Configuración del Gráfico IAH/hora</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="983"/>
+        <source>Window</source>
+        <translation>Ventana</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="990"/>
+        <source>Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.</source>
+        <translation>Ajusta la cantidad de datos considerados para cada punto en el gráfico IAH/hora.
+60 minutos por defecto. Se recomienda dejar este valor.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="994"/>
+        <source> minutes</source>
+        <translation> minutos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1010"/>
+        <source>Reset the counter to zero at beginning of each (time) window.</source>
+        <translation>Reinicializa el contador a cero al inicio de cada ventana de tiempo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1013"/>
+        <source>Zero Reset</source>
+        <translation>Reinicializar a cero</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1029"/>
+        <source>CPAP Clock Drift</source>
+        <translation>Deriva del reloj del CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="318"/>
+        <source>Do not import sessions older than:</source>
+        <translation>No importar sesiones más antiguas que:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="325"/>
+        <source>Sessions older than this date will not be imported</source>
+        <translation>Las sesiones más antiguas que esta fecha no serán importadas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="351"/>
+        <source>dd MMMM yyyy</source>
+        <translation>dd MMMM aaaa</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON)</source>
+        <translation type="vanished">Crear respaldos de la tarjeta SD durante la importación (Esto es muy importante para ResMed y FP ICON)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1036"/>
+        <source>Don't touch this unless you know your CPAP clock is out.
+Try to sync it to your PC's clock (which should be synced to a timeserver)</source>
+        <translation>No modificar a menos que el reloj del CPAP esté errado.
+Trate de sincronizarlo con el reloj de su computadora (que debe estar sincronizado a un servidor)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1040"/>
+        <source> seconds</source>
+        <translation> segundos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="770"/>
+        <source>Show in Event Breakdown Piechart</source>
+        <translation>Mostra gráfico de pastel con el desglose de eventos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="777"/>
+        <source>#1</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="784"/>
+        <source>#2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="905"/>
+        <source>This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.</source>
+        <translation>Esta opción experimental trata de usar el sistema de detección de eventos de SleepyHead para mejorar el posicionamiento de los eventos detectados por la máquina.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="908"/>
+        <source>Resync Machine Detected Events (Experimental)</source>
+        <translation>Resincronizar los eventos detectados por la máquina (EXPERIMENTAL)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="934"/>
+        <source>User definable threshold considered large leak</source>
+        <translation>Umbral definible por el usuario para la consideración de fugas grandes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="937"/>
+        <source> L/min</source>
+        <translation> L/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="924"/>
+        <source>Whether to show the leak redline in the leak graph</source>
+        <translation>Mostrar/Ocultar la línea roja en el gráfico de fugas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="927"/>
+        <source>Show Leak Redline</source>
+        <translation>Mostrar línea roja de fugas</translation>
+    </message>
+    <message>
+        <source>&Events</source>
+        <translation type="vanished">&Eventos</translation>
+    </message>
+    <message>
+        <source>Not entirely sure if this will get to live or not..</source>
+        <translation type="vanished">No es seguro si esto sobrevivirá o no.</translation>
+    </message>
+    <message>
+        <source>Show</source>
+        <translation type="vanished">Mostrar</translation>
+    </message>
+    <message>
+        <source>Colour</source>
+        <translation type="vanished">Color</translation>
+    </message>
+    <message>
+        <source>Event</source>
+        <translation type="vanished">Evento</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation type="vanished">G&ráficos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1189"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1261"/>
+        <source>Search</source>
+        <translation>Buscar</translation>
+    </message>
+    <message>
+        <source>Filters the graph list. Simply start typing the name of the graph your looking for.</source>
+        <translation type="vanished">Filtra la lista de gráficos. Sólo empiece a teclear el nombre del gráfico buscado.</translation>
+    </message>
+    <message>
+        <source>&Defaults</source>
+        <translation type="vanished">Por &Defecto</translation>
+    </message>
+    <message>
+        <source>Double click on the (Y-axis) min/max values to edit them</source>
+        <translation type="vanished">Doble clic en los valores min/máx (Eje Y) para editarlos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1310"/>
+        <source>&Oximetry</source>
+        <translation>&Oximetría</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1537"/>
+        <source>Type</source>
+        <translation>Tipo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1550"/>
+        <source>Tries to forces the oximetry data to link with CPAP when possible.</source>
+        <translation>Intenta forzar los datos de oximetría a enlazarse con es CPAP cuando sea posible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1553"/>
+        <source>Link Oximetry and CPAP graphs</source>
+        <translation>Enlazar gráficos de CPAP y oximetría</translation>
+    </message>
+    <message>
+        <source>Flag changes in oximetry stats</source>
+        <translation type="vanished">Señalar cambios en las estadísticas de oximetría</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1367"/>
+        <source>SPO2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1429"/>
+        <source>Percentage drop in oxygen saturation</source>
+        <translation>Porcentaje de caída en la saturación de oxígeno</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1422"/>
+        <source>Pulse</source>
+        <translation>Pulso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1387"/>
+        <source>Sudden change in Pulse Rate of at least this amount</source>
+        <translation>Cambio repentino en el pulso de al menos esta cantidad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1390"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1514"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1521"/>
+        <source> bpm</source>
+        <translation> ppm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1374"/>
+        <source>Minimum duration of drop in oxygen saturation</source>
+        <translation>Duración mínima de la caída en la saturación de oxígeno</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1403"/>
+        <source>Minimum duration of pulse change event.</source>
+        <translation>Duración mínima del evento de cambio en el pulso.</translation>
+    </message>
+    <message>
+        <source>Discard chunks under</source>
+        <translation type="vanished">Descartar fragmentos menores a</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1474"/>
+        <source>Small chunks of oximetry data under this amount will be discarded.</source>
+        <translation>Fragmentos pequeños de datos de oximetría menores a esta cantidad serán descartados.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1649"/>
+        <source>&General</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1798"/>
+        <source>General Settings</source>
+        <translation>Configuración General</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1850"/>
+        <source>Daily view navigation buttons will skip over days without data records</source>
+        <translation>Los botones de navegación en la vista diaria se saltarán los días sin datos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1853"/>
+        <source>Skip over Empty Days</source>
+        <translation>Saltar días vacíos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1839"/>
+        <source>Allow use of multiple CPU cores where available to improve performance. 
+Mainly affects the importer.</source>
+        <translation>Permitir el uso de núcleos múltiples del CPU de ser posible para mejorar el desempeño.
+Afecta principalmente al importador.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1843"/>
+        <source>Enable Multithreading</source>
+        <translation>Habilitar Multithreading</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1829"/>
+        <source>Bypass the login screen and load the most recent User Profile</source>
+        <translation>Saltar la pantalla de inicio de sesión y cargar el perfil de usuario más reciente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1832"/>
+        <source>Skip Login Screen</source>
+        <translation>Saltar pantalla de inicio de sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2476"/>
+        <source><html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html></source>
+        <translation><html><head/><body><p>Estas características han sido podadas. Volverán después.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1679"/>
+        <source>Changes to the following settings needs a restart, but not a recalc.</source>
+        <translation>Cambios a los siguientes ajustes requieren un reinicio pero no una recalculación.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1331"/>
+        <source>Oximetery Settings</source>
+        <translation>Ajustes de oximetría</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1682"/>
+        <source>Preferred Calculation Methods</source>
+        <translation>Métodos de cálculo preferidos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1709"/>
+        <source>Middle Calculations</source>
+        <translatorcomment>¡?</translatorcomment>
+        <translation>Cálculo del centro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1716"/>
+        <source>Upper Percentile</source>
+        <translation>Percentil superior</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1723"/>
+        <source>For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.</source>
+        <translation>Para consistencia, los usuarios de ResMed deben usar 95% aquí,
+ya que es el único valor disponible en los días de sólo resumen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1737"/>
+        <source>Median is recommended for ResMed users.</source>
+        <translation>Se recomienda Mediana para los usuarios de ResMed.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1741"/>
+        <source>Median</source>
+        <translation>Mediana</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1746"/>
+        <source>Weighted Average</source>
+        <translation>Promedio Ponderado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1751"/>
+        <source>Normal Average</source>
+        <translation>Promedio</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1771"/>
+        <source>ResMed users probably should use 99th Percentile for visual consistency.</source>
+        <translation>Los usuarios de ResMed deberían usad percentil 99 para consistencia visual.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1775"/>
+        <source>True Maximum</source>
+        <translation>Máximo Verdadero</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1780"/>
+        <source>99% Percentile</source>
+        <translation>Percentil 99%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1788"/>
+        <source>Maximum Calcs</source>
+        <translation>Cálculo de máximo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1892"/>
+        <source>Automatically Check For Updates</source>
+        <translation>Buscar actualizaciones automáticamente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1909"/>
+        <source>Check for new version every</source>
+        <translation>Buscar por una nueva versión cada</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1916"/>
+        <source>Sourceforge hosts this project for free.. Please be considerate of their resources..</source>
+        <translation>SourceForge hospeda este proyecto de manera gratuita. Por favor sea considerado con sus recursos.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1932"/>
+        <source>days.</source>
+        <translation>días.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1997"/>
+        <source>&Check for Updates now</source>
+        <translation>&Buscar actualizaciones ahora</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2020"/>
+        <source>Last Checked For Updates: </source>
+        <translation>Ultima búsqueda de actualizaciones: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2033"/>
+        <source>TextLabel</source>
+        <translation>Etiqueta de Texto</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2055"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si está interesado en ayudar a evaluar nuevas características y correcciones anticipadamente, haga clic aquí.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Pero considere que eso podría involucrar código inestable en algunas ocasiones.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2064"/>
+        <source>I want to try experimental and test builds (Advanced users only please.)</source>
+        <translation>Quiero probar versiones experimentales y de evaluación. (Sólo usuarios avanzados por favor.)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2088"/>
+        <source>&Appearance</source>
+        <translation>A&pariencia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2120"/>
+        <source>Graph Settings</source>
+        <translation>Ajustes de gráficos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2127"/>
+        <source>Bar Tops</source>
+        <translatorcomment>?</translatorcomment>
+        <translation>Barras</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2132"/>
+        <source>Line Chart</source>
+        <translation>Líneas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2140"/>
+        <source>Overview Linecharts</source>
+        <translation>Gráficos de vista general</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2165"/>
+        <source><html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html></source>
+        <translation><html><head/><body><p>Esto hace que el deplazamiento mientras se hace zoom sea más fácil en Touchpads bidireccionales sensibles.</p><p>El valor recomendado son 50 ms.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2193"/>
+        <source>milliseconds</source>
+        <translation>milisegundos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2259"/>
+        <source>Scroll Dampening</source>
+        <translation>Atenuación del desplazamiento</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2351"/>
+        <source>Overlay Flags</source>
+        <translation>Sobreponer indicadores</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2361"/>
+        <source>Line Thickness</source>
+        <translation>Grosor de línea</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2373"/>
+        <source>The pixel thickness of line plots</source>
+        <translation>Grosor del pixel en gráficos de línea</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2466"/>
+        <source>Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</source>
+        <translation>El caché Pixmap es una técnica de aceleración de gráficos. Puede causar problemas con el uso de fuentes durante el despliegue de gráficos en tu plataforma.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2317"/>
+        <source>The visual method of displaying waveform overlay flags.
+</source>
+        <translation>Método visual para mostrar los indicadores sobrepuestos de la forma de onda.
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2322"/>
+        <source>Standard Bars</source>
+        <translation>Barras estándar</translation>
+    </message>
+    <message>
+        <source>Top & Bottom Markers</source>
+        <translation type="vanished">Marcas arriba y abajo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2335"/>
+        <source>Graph Height</source>
+        <translation>Altura del gráfico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2285"/>
+        <source>Default display height of graphs in pixels</source>
+        <translation>Altura por defecto para el despliegue de gráficos en pixeles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2213"/>
+        <source>How long you want the tooltips to stay visible.</source>
+        <translation>Que tanto tiempo permanece visible la ventana de ayuda contextual.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1629"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style= [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">t [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Sincronizando datos de oximetría y CPAP</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;"> Datos CMS50 importados desde SpO2Review (de archivos .spoR) o el método de importación serie </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">no</span><span s [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">El modo de visualización en vivo (usando un cable serie) es la única manera de obtener una sincronización precisa con las oxímetros CMS50, pero no compensa la deriva del reloj del CPAP.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Si inicia el modo de grabación de los oxímetros </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactamente </span><span style=" font-family:'Sans'; font-size:10pt;&quot [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">El proceso de importación serie toma la hora de inicio de la último sesión CPAP. (¡Recuerde importar los datos del CPAP primero!)</span></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1166"/>
+        <source>Events</source>
+        <translation type="unfinished">Eventos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1212"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1284"/>
+        <source>Reset &Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1225"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1297"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1238"/>
+        <source>Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1355"/>
+        <source>Flag rapid changes in oximetry stats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1448"/>
+        <source>Other oximetry options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1454"/>
+        <source>Flag SPO2 Desaturations Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1464"/>
+        <source>Discard segments under</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1494"/>
+        <source>Flag Pulse Rate Above</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1504"/>
+        <source>Flag Pulse Rate Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1574"/>
+        <source>Contec CMS50D+/E/F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1579"/>
+        <source>Contec CMS50F v3.7+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1584"/>
+        <source>ChoiceMMed MD300W1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1589"/>
+        <source>ResMed S9 Oximeter Module</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1610"/>
+        <source>If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1613"/>
+        <source>Update Oximeter Clock during import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1819"/>
+        <source>Show flags for machine detected events that haven't been identified yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1822"/>
+        <source>Show Unknown Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1860"/>
+        <source>Import without nagging</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2269"/>
+        <source>Tooltip Timeout</source>
+        <translation>Visibilidad del menú 
+de ayuda contextual</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2304"/>
+        <source>Graph Tooltips</source>
+        <translation>Ayuda contextual del gráfico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2327"/>
+        <source>Top Markers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2422"/>
+        <source>Other Visual Settings</source>
+        <translation>Otras configuraciones visuales</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2428"/>
+        <source>Anti-Aliasing applies smoothing to graph plots.. 
+Certain plots look more attractive with this on. 
+This also affects printed reports.
+
+Try it and see if you like it.</source>
+        <translation>El Anti-Aliasing suaviza la líneas en los gráficos.
+Algunos gráficos lucen más atractivos con esta opción activada.
+También afectará a los reportes impresos.
+
+Pruébela y vea si le agrada.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2435"/>
+        <source>Use Anti-Aliasing</source>
+        <translation>Usar Anti-Aliasing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2442"/>
+        <source>Makes certain plots look more "square waved".</source>
+        <translation>Hace que algunos gráficos luzcan más "cuadrados".</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2445"/>
+        <source>Square Wave Plots</source>
+        <translation>Gráficos de onda cuadrada</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2452"/>
+        <source>Allows graphs to be "screenshotted" for display purposes.
+The Event Breakdown PIE chart uses this method, as does
+the printing code.
+Unfortunately some older computers/versions of Qt can cause
+this application to be unstable with this feature enabled.</source>
+        <translation>Permite que se puedan hacer capturas de pantalla de los gráficos.
+Tanto el gráfico de pastel con el desglose de eventos como el código 
+de impresión usan este método.
+Desafortunadamente algunas computadoras o versiones de Qt viejas
+pueden volver inestable esta aplicación si se activa esta opción.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2459"/>
+        <source>Show event breakdown pie chart</source>
+        <translation>Mostrar gráfico de pastel con el desglose de eventos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2469"/>
+        <source>Use Pixmap Caching</source>
+        <translation>Usar caché Pixmap</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2479"/>
+        <source>Animations && Fancy Stuff</source>
+        <translatorcomment>elegantes, no coquetas</translatorcomment>
+        <translation>Animaciones y cosas coquetas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2486"/>
+        <source>Whether to allow changing yAxis scales by double clicking on yAxis labels</source>
+        <translation>Permitir cambiar la escala del eje Y haciendo dobli clic en sus etiquetas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2489"/>
+        <source>Allow YAxis Scaling</source>
+        <translation>Permitir escalado del eje Y</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2508"/>
+        <source>Application Fonts</source>
+        <translation>Fuentes de la aplicación</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2543"/>
+        <source>Font</source>
+        <translation>Fuente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2562"/>
+        <source>Size</source>
+        <translation>Tamaño</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2581"/>
+        <source>Bold  </source>
+        <translation>Negritas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2603"/>
+        <source>Italic</source>
+        <translation>Itálica</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2616"/>
+        <source>Application</source>
+        <translation>Aplicación</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2680"/>
+        <source>Graph Text</source>
+        <translation>Texto del Gráfico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2741"/>
+        <source>Graph Titles</source>
+        <translation>Títulos del gráfico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2802"/>
+        <source>Big  Text</source>
+        <translation>Texto grande</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2863"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="410"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="530"/>
+        <source>Details</source>
+        <translation>Detalles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2920"/>
+        <source>&Cancel</source>
+        <translation>&Cancelar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2927"/>
+        <source>&Ok</source>
+        <translation>&Aceptar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="61"/>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="62"/>
+        <source>Minor Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="63"/>
+        <source>Span</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="64"/>
+        <source>Always Minor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="68"/>
+        <source>Nasal Pillows</source>
+        <translation>Almohadillas nasales</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="406"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="525"/>
+        <source>Name</source>
+        <translation type="unfinished">Nombre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="407"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="526"/>
+        <source>Color</source>
+        <translation type="unfinished">Color</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="408"/>
+        <source>Flag Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="409"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="529"/>
+        <source>Label</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="425"/>
+        <source>CPAP Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="426"/>
+        <source>Oximeter Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="427"/>
+        <source>Positional Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="428"/>
+        <source>Sleep Stage Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="429"/>
+        <source>Unknown Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="468"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="589"/>
+        <source>Double click to change the descriptive name this channel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="476"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="596"/>
+        <source>Double click to change the default color for this channel plot/flag/data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="484"/>
+        <source>Here you can change the type of flag shown for this event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="489"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="612"/>
+        <source>This is the short-form label to indicate this channel on screen.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="495"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="618"/>
+        <source>This is a description of what this channel does.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="527"/>
+        <source>Lower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="528"/>
+        <source>Upper</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="546"/>
+        <source>CPAP Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="547"/>
+        <source>Oximeter Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="548"/>
+        <source>Positional Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="549"/>
+        <source>Sleep Stage Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="602"/>
+        <source>Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="607"/>
+        <source>Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="709"/>
+        <source>Data Reindex Required</source>
+        <translation>Se requiere reindizar datos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="710"/>
+        <source>A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.
+
+Are you sure you want to make these changes?</source>
+        <translation>Se requiere reindizar los datos para aplicar estos cambios. Esta operación tomará un par de minutos para completarse.
+
+¿Está seguro que quiere realizar estos cambios?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="716"/>
+        <source>Restart Required</source>
+        <translation>Reinicio Requerido</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="717"/>
+        <source>One or more of the changes you have made will require this application to be restarted,
+in order for these changes to come into effect.
+
+Would you like do this now?</source>
+        <translation>Uno o más de los cambios realizados requieren que esta aplicación sea reiniciada
+para que surtan efecto.
+
+¿Le gustaría hacer esto ahora?</translation>
+    </message>
+    <message>
+        <source>Daily Graphs</source>
+        <translation type="vanished">Gráficos por día</translation>
+    </message>
+    <message>
+        <source>Overview Graphs</source>
+        <translation type="vanished">Gráficos generales</translation>
+    </message>
+    <message>
+        <source>Graph</source>
+        <translation type="vanished">Gráfico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1141"/>
+        <source>Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.</source>
+        <translation>Desactivar los respaldos automáticos no es una buena idea, porque SleepyHead los necesita para restaurar la base de datos si se producen errores.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1142"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation>¿Está verdaderamente seguro de querer realizar esto?</translation>
+    </message>
+    <message>
+        <source>Confirmation</source>
+        <translation type="vanished">Confirmación</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to reset your graph preferences to the defaults?</source>
+        <translation type="vanished">¿Está seguro de que quiere reinicializar los ajustes de gráficos a sus valores por defecto?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1095"/>
+        <source>This may not be a good idea</source>
+        <translation>Esto podría no ser una buena idea</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1096"/>
+        <source>ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).</source>
+        <translation>Las máquinas ResMed S9 rutinariamente eliminan ciertos datos de la tarjeta SD si son anteriores a 7 y 30 días (depende de la resolución).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1097"/>
+        <source>If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.</source>
+        <translation>Si alguna vez requiere reimportar estos datos nuevamente, tanto en SleepyHead como en ResScan, estos no estarán disponibles.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1098"/>
+        <source>If you need to conserve disk space, please remember to carry out manual backups.</source>
+        <translation>Si requiere conservar espacio en disco, por favor recuerde realizar respaldos manuales.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1099"/>
+        <source>Are you sure you want to disable these backups?</source>
+        <translation>¿Está seguro de que quiere deshabilitar estos respaldos?</translation>
+    </message>
+</context>
+<context>
+    <name>ProfileSelect</name>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="14"/>
+        <source>Select Profile</source>
+        <translation>Seleccione perfil de usuario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="115"/>
+        <source>Search:</source>
+        <translation>Buscar:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="188"/>
+        <source>Start with the selected user profile.</source>
+        <translation>Iniciar con el perfil de usuario seleccionado.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="212"/>
+        <source>Create a new user profile.</source>
+        <translation>Crear un nuevo perfil de usuario.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="232"/>
+        <source>Choose a different SleepyHead data folder.</source>
+        <translation>Elegir un directorio de datos distinto para SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="238"/>
+        <source>&Different Folder</source>
+        <translation>&Directorio distinto</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="271"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="284"/>
+        <source>[version]</source>
+        <translation>[versión]</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="307"/>
+        <source>Click here if you didn't want to start SleepyHead.</source>
+        <translation>Haga clic aquí si no quería isiciar SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="310"/>
+        <source>&Quit</source>
+        <translation>&Salir</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="367"/>
+        <source>Folder:</source>
+        <translation>Directorio:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="380"/>
+        <source>The current location of SleepyHead data store.</source>
+        <translation>Ubicación actual del almacenamiento de datos de SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="386"/>
+        <source>[data directory]</source>
+        <translation>[directorio de datos]</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="215"/>
+        <source>New Profile</source>
+        <translation>Nuevo perfil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="191"/>
+        <source>&Select User</source>
+        <translation>&Seleccionar Usuario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="94"/>
+        <source>Open Profile</source>
+        <translation>Abrir perfil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="95"/>
+        <source>Edit Profile</source>
+        <translation>Editar perfil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="97"/>
+        <source>Delete Profile</source>
+        <translation>Eliminar perfil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="144"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="224"/>
+        <source>Enter Password for %1</source>
+        <translation>Ingrese contraseña para %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="163"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="373"/>
+        <source>Incorrect Password</source>
+        <translation>Contraseña incorrecta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="165"/>
+        <source>You entered the password wrong too many times.</source>
+        <translation>Ha ingresado una contraseña equivocada demasiadas veces.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>Enter the word DELETE below to confirm.</source>
+        <translatorcomment>I don know if changing here changes the string comparison also, so let DELETE as it is</translatorcomment>
+        <translation>Escriba DELETE debajo para confirmar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>You are about to destroy profile '%1'.</source>
+        <translation>Está a punto de destruir el perfil '%1'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>Sorry</source>
+        <translation>Lo sentimos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>You need to enter DELETE in capital letters.</source>
+        <translation>Necesita escribir DELETE en mayúsculas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="214"/>
+        <source>Could not open profile.. You will need to delete this profile directory manually</source>
+        <translation>No se pudo abrir el perfil. Necesitará eliminar el directorio de este perfil manualmente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="215"/>
+        <source>You will find it under the following location:</source>
+        <translation>Lo encontrará en esta ubicación:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="243"/>
+        <source>You entered an incorrect password</source>
+        <translation>Ha ingresado una contraseña incorrecta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="246"/>
+        <source>If you're trying to delete because you forgot the password, you need to delete it manually.</source>
+        <translation>Si está tratando de eliminarlo porque olvidó la contraseña, tendrá que hacerlo manualmente.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="259"/>
+        <source>There was an error deleting the profile directory, you need to manually remove it.</source>
+        <translation>Hubo un error al eliminar el directorio con el perfil, necesitará removerlo manualmente.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="263"/>
+        <source>Profile '%1' was succesfully deleted</source>
+        <translation>El perfil '%1' fue eliminado con éxito</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="292"/>
+        <source>Create new profile</source>
+        <translation>Crear nuevo perfil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="357"/>
+        <source>Enter Password</source>
+        <translation>Ingrese contraseña</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="376"/>
+        <source>You entered an Incorrect Password too many times. Exiting!</source>
+        <translation>Ha ingresado una contraseña incorrecta demasiadas veces. ¡Saliendo!</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1276"/>
+        <source>No Data</source>
+        <translation>Sin datos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="496"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="86"/>
+        <source>On</source>
+        <translation>Activado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="497"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="87"/>
+        <source>Off</source>
+        <translation>Desactivado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="321"/>
+        <source>cm</source>
+        <translation>cm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="322"/>
+        <source>"</source>
+        <translation>"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="323"/>
+        <source>ft</source>
+        <translation>pie(s)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="324"/>
+        <source>lb</source>
+        <translation>libra(s)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="325"/>
+        <source>oz</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="326"/>
+        <source>Kg</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="327"/>
+        <source>cmH2O</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="328"/>
+        <source>Hours</source>
+        <translation>Horas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="334"/>
+        <source>bpm</source>
+        <translatorcomment>pulsaciones por minuto/ ¿latidos por minuto?</translatorcomment>
+        <translation>ppm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="339"/>
+        <source>?</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="341"/>
+        <source>Severity (0-1)</source>
+        <translation>Severidad (0-1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="345"/>
+        <source>Error</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="346"/>
+        <source>Warning</source>
+        <translation>Advertencia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="349"/>
+        <source>Please Note</source>
+        <translation>Por favor considere</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="352"/>
+        <source>Compliance Only :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="353"/>
+        <source>Graphs Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="354"/>
+        <source>Summary Only :(</source>
+        <translation type="unfinished">Únicamente resumen :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="355"/>
+        <source>Sessions Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="359"/>
+        <source>&Yes</source>
+        <translation>&Sí</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="360"/>
+        <source>&No</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="361"/>
+        <source>&Cancel</source>
+        <translation>&Cancelar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="362"/>
+        <source>&Destroy</source>
+        <translation>&Destruir</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="363"/>
+        <source>&Save</source>
+        <translation>&Guardad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="365"/>
+        <source>BMI</source>
+        <translatorcomment>índice de masa corporal</translatorcomment>
+        <translation>IMC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="366"/>
+        <source>Weight</source>
+        <translation>Peso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="367"/>
+        <source>Zombie</source>
+        <translation>Zombi</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="368"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="259"/>
+        <source>Pulse Rate</source>
+        <translation>Frecuencia de Pulso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="369"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="266"/>
+        <source>SpO2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="370"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="273"/>
+        <source>Plethy</source>
+        <translation>Pleti</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="371"/>
+        <source>Pressure</source>
+        <translation>Presión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="373"/>
+        <source>Daily</source>
+        <translation>Vista por día</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="374"/>
+        <source>Overview</source>
+        <translation>Vista general</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="375"/>
+        <source>Oximetry</source>
+        <translation>Oximetría</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="377"/>
+        <source>Oximeter</source>
+        <translation>Oxímetro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="378"/>
+        <source>Event Flags</source>
+        <translation>Indicadores de eventos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="381"/>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="382"/>
+        <source>BiPAP</source>
+        <translation>BiPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="383"/>
+        <source>Bi-Level</source>
+        <translation>Bi-Nivel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="384"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1065"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1072"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1076"/>
+        <source>EPAP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="385"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1068"/>
+        <source>Min EPAP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="386"/>
+        <source>Max EPAP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="387"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1066"/>
+        <source>IPAP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="390"/>
+        <source>APAP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="391"/>
+        <source>ASV</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="392"/>
+        <source>ST/ASV</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="394"/>
+        <source>Humidifier</source>
+        <translation>Humidificador</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="396"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="187"/>
+        <source>H</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="397"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="181"/>
+        <source>OA</source>
+        <translation>AO</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="398"/>
+        <source>A</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="399"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="175"/>
+        <source>CA</source>
+        <translation>AC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="400"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="197"/>
+        <source>FL</source>
+        <translation>LF</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="402"/>
+        <source>LE</source>
+        <translatorcomment>evento de fuga</translatorcomment>
+        <translation>EF</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="403"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="233"/>
+        <source>EP</source>
+        <translatorcomment>Resoplido</translatorcomment>
+        <translation>RS</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="404"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="206"/>
+        <source>VS</source>
+        <translatorcomment>ronquido vibratorio</translatorcomment>
+        <translation>RV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="406"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="211"/>
+        <source>VS2</source>
+        <translation>RV2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="407"/>
+        <source>RERA</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="408"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2078"/>
+        <source>PP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="409"/>
+        <source>P</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="410"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="202"/>
+        <source>RE</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="411"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="228"/>
+        <source>NR</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="412"/>
+        <source>NRI</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="413"/>
+        <source>O2</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="414"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="283"/>
+        <source>PC</source>
+        <translation>CP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="243"/>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="416"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="248"/>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="417"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="253"/>
+        <source>UF3</source>
+        <translation>UF3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="419"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1070"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1073"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1077"/>
+        <source>PS</source>
+        <translation>SP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>AHI</source>
+        <translation>IAH</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="421"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>RDI</source>
+        <translation>IPR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="422"/>
+        <source>AI</source>
+        <translation>IA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="423"/>
+        <source>HI</source>
+        <translation>IH</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="424"/>
+        <source>UAI</source>
+        <translation>IANC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="425"/>
+        <source>CAI</source>
+        <translatorcomment>Índice de vía aérea despejada</translatorcomment>
+        <translation>IVAD</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="426"/>
+        <source>FLI</source>
+        <translation>ILF</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="428"/>
+        <source>REI</source>
+        <translation>IRE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="429"/>
+        <source>EPI</source>
+        <translation>IRS</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="388"/>
+        <source>Min IPAP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="329"/>
+        <source>Minutes</source>
+        <translation>Minutos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="330"/>
+        <source>Seconds</source>
+        <translation>Segundos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="331"/>
+        <source>Events/hr</source>
+        <translation>Eventos/hora</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="333"/>
+        <source>Hz</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="336"/>
+        <source>Litres</source>
+        <translation>Litros</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="337"/>
+        <source>ml</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="338"/>
+        <source>Breaths/min</source>
+        <translation>Inspiraciones/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="342"/>
+        <source>Degrees</source>
+        <translation>Grados</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="347"/>
+        <source>Information</source>
+        <translation>Información</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="348"/>
+        <source>Busy</source>
+        <translation>Ocupado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="389"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1069"/>
+        <source>Max IPAP</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="401"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="238"/>
+        <source>SA</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="430"/>
+        <source>ÇSR</source>
+        <translation>RÇS</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="431"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="169"/>
+        <source>PB</source>
+        <translation>RP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="435"/>
+        <source>IE</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="371"/>
+        <source>Insp. Time</source>
+        <translation>Tiempo Insp.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="437"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="367"/>
+        <source>Exp. Time</source>
+        <translation>Tiempo Exp.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="438"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>Resp. Event</source>
+        <translation>Evento Resp.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="439"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="195"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="379"/>
+        <source>Flow Limitation</source>
+        <translation>Limitación de flujo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="440"/>
+        <source>Flow Limit</source>
+        <translation>Límite de flujo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="441"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="236"/>
+        <source>SensAwake</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="442"/>
+        <source>Pat. Trig. Breath</source>
+        <translation>Insp. Inic. p/el U.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="443"/>
+        <source>Tgt. Min. Vent</source>
+        <translation>Vent. Min. Objetivo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="444"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Vent.</source>
+        <translation>Vent. Objetivo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="445"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Minute Vent.</source>
+        <translation>Vent. Minuto</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="446"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="329"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Tidal Volume</source>
+        <translation>Volumen corriente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="447"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Resp. Rate</source>
+        <translation>Frec. Resp.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="448"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="334"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Snore</source>
+        <translation>Ronquido</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="449"/>
+        <source>Leak</source>
+        <translation>Fuga</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="450"/>
+        <source>Leaks</source>
+        <translation>Fugas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="453"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Total Leaks</source>
+        <translation>Fugas totales</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="454"/>
+        <source>Unintentional Leaks</source>
+        <translation>Fugas accidentales</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="455"/>
+        <source>MaskPressure</source>
+        <translation>PresiónMascarilla</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="456"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="314"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Flow Rate</source>
+        <translation>Tasa de flujo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="457"/>
+        <source>Sleep Stage</source>
+        <translation>Estado del sueño</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="458"/>
+        <source>Usage</source>
+        <translation>Uso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="459"/>
+        <source>Sessions</source>
+        <translation>Sesiones</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="460"/>
+        <source>Pr. Relief</source>
+        <translation>Alivio de Presión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="351"/>
+        <source>No Data Available</source>
+        <translation>Sin información disponible</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="462"/>
+        <source>Bookmarks</source>
+        <translation>Marcadores</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="463"/>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="465"/>
+        <source>Mode</source>
+        <translation>Modo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="466"/>
+        <source>Model</source>
+        <translation>Modelo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="467"/>
+        <source>Brand</source>
+        <translation>Marca</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="468"/>
+        <source>Serial</source>
+        <translation># de Serie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="469"/>
+        <source>Series</source>
+        <translation>Serie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="470"/>
+        <source>Machine</source>
+        <translation>Máquina</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="471"/>
+        <source>Channel</source>
+        <translation>Canal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="472"/>
+        <source>Settings</source>
+        <translation>Ajustes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="477"/>
+        <source>Name</source>
+        <translation>Nombre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="478"/>
+        <source>DOB</source>
+        <translation>Fecha de Nacimiento</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="479"/>
+        <source>Phone</source>
+        <translation>Teléfono</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="480"/>
+        <source>Address</source>
+        <translation>Domicilio</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="481"/>
+        <source>Email</source>
+        <translation>Correo Electrónico</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="482"/>
+        <source>Patient ID</source>
+        <translation>ID de paciente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="483"/>
+        <source>Date</source>
+        <translation>Fecha</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="485"/>
+        <source>Bedtime</source>
+        <translation>Hora de dormir</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="486"/>
+        <source>Wake-up</source>
+        <translation>Hora de levantarse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="487"/>
+        <source>Mask Time</source>
+        <translation>Tiempo de mascarilla</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="488"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="124"/>
+        <source>Unknown</source>
+        <translation>Desconocido</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="489"/>
+        <source>None</source>
+        <translation>Ninguno</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="490"/>
+        <source>Ready</source>
+        <translation>Listo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="492"/>
+        <source>First</source>
+        <translation>Primero</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="493"/>
+        <source>Last</source>
+        <translation>Último</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="494"/>
+        <source>Start</source>
+        <translation>Inicio</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="495"/>
+        <source>End</source>
+        <translation>Fin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="498"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2124"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="499"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2125"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="501"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1062"/>
+        <source>Min</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="502"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1063"/>
+        <source>Max</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="503"/>
+        <source>Med</source>
+        <translation>Mediana</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="505"/>
+        <source>Average</source>
+        <translation>Promedio</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="506"/>
+        <source>Median</source>
+        <translation>Mediana</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="507"/>
+        <source>Avg</source>
+        <translation>Prom.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="508"/>
+        <source>W-Avg</source>
+        <translation>Prom. Pond.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="262"/>
+        <source>Import Error</source>
+        <translation>Error de Importación</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="263"/>
+        <source>This Machine Record cannot be imported in this profile.
+The Day records overlap with already existing content.</source>
+        <translation>Este registro de máquina no puede ser importado a este perfiĺ.
+Los datos se traslapan con contenido previo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="384"/>
+        <source>Non Data Capable Machine</source>
+        <translation>Máquina sin capacidad de registro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="385"/>
+        <source>Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.</source>
+        <translation>Desafortunadamente el modelo de su CPAP Philips Respironics (Modelo %1) no tiene capacidad para el registro de datos.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="386"/>
+        <source>I'm sorry to report that SleepyHead can only track hours of use for this machine.</source>
+        <translation>Lamentamos informarle que SleepyHead sólo puede dar seguimiento a las horas de uso de esta máquina.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2169"/>
+        <source>15mm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2168"/>
+        <source>22mm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2082"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2084"/>
+        <source>Flex Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2083"/>
+        <source>PRS1 pressure relief mode.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2089"/>
+        <source>C-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2090"/>
+        <source>C-Flex+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2091"/>
+        <source>A-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2092"/>
+        <source>Rise Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2093"/>
+        <source>Bi-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2097"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2099"/>
+        <source>Flex Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2098"/>
+        <source>PRS1 pressure relief setting.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2103"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2134"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2156"/>
+        <source>x1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2104"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2135"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2157"/>
+        <source>x2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2105"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2136"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2158"/>
+        <source>x3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2106"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2137"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2159"/>
+        <source>x4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2107"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2138"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2160"/>
+        <source>x5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2111"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2113"/>
+        <source>Humidifier Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2112"/>
+        <source>PRS1 humidifier connected?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2115"/>
+        <source>Disconnected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2116"/>
+        <source>Connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2120"/>
+        <source>Heated Tubing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2121"/>
+        <source>Heated Tubing Connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2122"/>
+        <source>Headed Tubing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2129"/>
+        <source>Humidification Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2130"/>
+        <source>PRS1 Humidification level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2131"/>
+        <source>Humid. Lvl.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2142"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2143"/>
+        <source>System One Resistance Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2144"/>
+        <source>Sys1 Resist. Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2151"/>
+        <source>System One Resistance Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2152"/>
+        <source>System One Mask Resistance Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2153"/>
+        <source>Sys1 Resist. Set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2164"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2166"/>
+        <source>Hose Diameter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2165"/>
+        <source>Diameter of primary CPAP hose</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2173"/>
+        <source>System One Resistance Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2174"/>
+        <source>Whether System One resistance settings are available to you.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2175"/>
+        <source>Sys1 Resist. Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2182"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2184"/>
+        <source>Auto On</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2183"/>
+        <source>A few breaths automatically starts machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2191"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2193"/>
+        <source>Auto Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2192"/>
+        <source>Machine automatically switches off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2200"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2202"/>
+        <source>Mask Alert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2201"/>
+        <source>Whether or not machine allows Mask checking.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2209"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2211"/>
+        <source>Show AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2210"/>
+        <source>Whether or not machine shows AHI via LCD panel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2223"/>
+        <source>Unknown PRS1 Code %1</source>
+        <translation>Código %1 de PRS1, desconocido</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2224"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2225"/>
+        <source>PRS1_%1</source>
+        <translation>PRS1_%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2290"/>
+        <source>Timed Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2291"/>
+        <source>Machine Initiated Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2292"/>
+        <source>TB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/preferences.cpp" line="33"/>
+        <source>Windows User</source>
+        <translation>Usuario de Windows</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="308"/>
+        <source>SleepyHead (%1) needs to upgrade its database for %2 %3 %4</source>
+        <translation>SleepyHead (%1) requiere actualizar su base de datos para %2 %3 %4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="321"/>
+        <source><b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b></source>
+        <translation><b>SleepyHead mantiene un respaldo de la tarjeta de datos de sus dispositivos que se usa para este propósito.</b></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="322"/>
+        <source><i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i></source>
+        <translation><i>Los datos antiguos de su máquina deben ser regenerados, suponienda que esta característica no haya sido deshabilitada en Preferencias durante una importación de datos previa.</i></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="256"/>
+        <source>Launching Windows Explorer failed</source>
+        <translation>Falló el lanzamiento del Explorador de Windows</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="257"/>
+        <source>Could not find explorer.exe in path to launch Windows Explorer.</source>
+        <translation>No se halló explorer.exe en el 'path' para lanzar el Explorador de Windows.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="325"/>
+        <source>SleepyHead does not yet have any automatic card backups stored for this device.</source>
+        <translation>SleepyHead aún no tiene almacenado ningún respaldo automático de tarjeta para este dispositivo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="326"/>
+        <source>This means you will need to import this machine data again afterwards from your own backups or data card.</source>
+        <translation>Esto significa que tendrá que importar los datos de esta máquina nuevamente después, desde sus propios respaldos de sa tarjeta de datos.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Important:</source>
+        <translation>Importante:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore.</source>
+        <translation>Una vez que actualice, <font size=+1>no podrá</font> usar este perfil con las versiones previas nunca más.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="330"/>
+        <source>If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.</source>
+        <translation>Si esta preocupado, haga clic en No para salir, y respalde manualmente su perfil antes de iniciar nuevamente SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="331"/>
+        <source>Are you ready to upgrade, so you can run the new version of SleepyHead?</source>
+        <translation>¿Esta seguro de actualizar para correr la nueva versión de SleepyHead?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="334"/>
+        <source>Machine Database Changes</source>
+        <translation>Cambios a la base de datos de la máquina</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="345"/>
+        <source>Sorry, the purge operation failed, which means this version of SleepyHead can't start.</source>
+        <translation>Lo sentimos, la operación de purga ha fallado. Esto significa que esta versión de SleepyHead no puede iniciar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="346"/>
+        <source>The machine data folder needs to be removed manually.</source>
+        <translation>El directorio de datos de la máquina debe ser removido manualmente.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="347"/>
+        <source>This folder currently resides at the following location:</source>
+        <translation>Este directorio reside actualmente en la siguiente ubicación:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="353"/>
+        <source>Rebuilding from %1 Backup</source>
+        <translation>Reconstruyendo desde el respaldo de %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="358"/>
+        <source>Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?</source>
+        <translation>¿Le gustaría activar los respaldos automáticos para que en caso de que una nueva versión de SleepyHead lo requiera, pueda reconstruir desde ellos?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="365"/>
+        <source>SleepyHead will now start the import wizard so you can reinstall your %1 data.</source>
+        <translation>SleepyHead iniciará ahora el asistente de importación para que pueda reinstalar sus datos de %1.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="375"/>
+        <source>SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:</source>
+        <translation>Ahora SleepyHead cerrará y tratará entonces de abrir el administrador de archivos de su computadora para que usted pueda respaldar manualmente su perfil:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="377"/>
+        <source>Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.</source>
+        <translation>Use su administrador de archivos para hacer una copia del directorio de su perfil. Después reinicie SleepyHead para terminar el proceso de actualización.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="81"/>
+        <source>Release Notes</source>
+        <translation>Notas de la Versión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="92"/>
+        <source>&Ok, get on with it..</source>
+        <translation>&Entendido, adelante.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="164"/>
+        <source>Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.</source>
+        <translation>Busque esta versión en <a href='%1'> los archivos de SleepyHead hospedados en SourceForge</a>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="171"/>
+        <source>A faster build of SleepyHead may be available</source>
+        <translation>Una versión más rápida de SleepyHead podría estar disponible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="172"/>
+        <source>You will not be bothered with this message again.</source>
+        <translation>No será molestado nuevamente con este mensaje.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="173"/>
+        <source>This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer.</source>
+        <translation>Esta versión correrá bien, pero una versión compilada con etiqueta "<b>%1</b>" probablemente correrá más suavemente en su computadora.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="178"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.</source>
+        <translation>Esta versión de SleepyHead fue diseñada para trabajar con computadoras viejas sin soporte para OpenGL2.0. Pero su computadora lo soporta completamente al parecer.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="189"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.</source>
+        <translation>Esta versión de SleepyHead fue diseñada para trabajar con computadoras viejas sin soporte para OpenGL2.0. del cual su computadora carece. Pero aún así podría haber disponibé una mejor versión para su computadora.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="191"/>
+        <source>If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.</source>
+        <translation>Si está corriendo esto en una máquina virtual como VirtualBox o VMware, por favor ignore este mensaje, ya que no hay mejor versión disponible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="201"/>
+        <source>Incompatible Graphics Hardware</source>
+        <translation>Hardware Gráfico Incompatible</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="202"/>
+        <source>This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.</source>
+        <translation>Esta versión de SleepyHead requiere soporte de OpenGL2.0 para su correcto funcionamiento y desafortunadamente su computadora carece de esta característica.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="203"/>
+        <source>You may need to update your computers graphics drivers from the GPU makers website. %1</source>
+        <translation>Es posible que deba actualizar los drivers gráficos de su computadora desde el sitio del fabricante del GPU.%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="204"/>
+        <source>(<a href='http://intel.com/support'>Intel's support site</a>)</source>
+        <translation>(<a href='http://www.intel.com/p/es_XL/support/'>Sitio de soporte de Intel</a>)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="205"/>
+        <source>Because graphs will not render correctly, and it may cause crashes, this build will now exit.</source>
+        <translation>Debido a que los gráficos no se pueden generar correctamente, se podrían producir fallos. Esta versión cerrará automaáticamente.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="206"/>
+        <source>Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer.</source>
+        <translation>No se desanime, hay otra versión etiquetada "<b>BrokenGL</b>" que debería funcionar en su computadora.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>No SleepyHead data folder was found.</source>
+        <translation>No se encontró ningún directorio de datos de SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>Would you like SleepyHead to use the default location for storing its data?</source>
+        <translation>¿Le gustaría que SleepyHead use la ubicación por defecto para almacenar sus datos?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>As you did not select a data folder, SleepyHead will exit.</source>
+        <translation>Ya que no seleccionó ningún directorio de datos, SleepyHead cerrará.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>Next time you run, you will be asked again.</source>
+        <translation>Se le preguntará de nuevo la próxima vez.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>You did not select a directory.</source>
+        <translation>No seleccionó ningún directorio.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>SleepyHead will now start with your old one.</source>
+        <translation>SleepyHead ahora iniciará con el antiguo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="344"/>
+        <source>Question</source>
+        <translation>Pregunta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="245"/>
+        <source>Choose or create new folder for SleepyHead data</source>
+        <translation>Elegir o crear un nuevo directorio para los datos de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="250"/>
+        <source>Exiting</source>
+        <translation>Saliendo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="266"/>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.</source>
+        <translation>El directorio que eligió no está vacío, ni contiene datos válidos de SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="267"/>
+        <source>Are you sure you want to use this folder?</source>
+        <translation>¿Está seguro que quiere usar este directorio?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1393"/>
+        <source>About SleepyHead</source>
+        <translation>Acerca de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1409"/>
+        <source>&Close</source>
+        <translation>&Cerrar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1413"/>
+        <source>&Donate</source>
+        <translation>&Donar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="40"/>
+        <source>Unspecified</source>
+        <translation>No especificado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="41"/>
+        <source>Nasal Pillows</source>
+        <translation>Almohadillas nasales</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="42"/>
+        <source>Hybrid F/F Mask</source>
+        <translation>Mascarilla Híbrida C/C</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="43"/>
+        <source>Nasal Interface</source>
+        <translation>Interfaz Nasal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="44"/>
+        <source>Full-Face Mask</source>
+        <translation>Mascarilla de cara completa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1132"/>
+        <source>Are you sure you want to reset all your channel colors and settings to defaults?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="39"/>
+        <source>There are no graphs visible to print</source>
+        <translation>No hay graficos visibles para imprimir</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="56"/>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation>¿Le gustaría mostrar las áreas con marcadores en este reporte?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="96"/>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation>Esto podría tomar algo de tiempo en completarse.
+Por favor no toque nada hasta que finalize.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="97"/>
+        <source>Printing %1 Report</source>
+        <translation>Imprimiendo reporte %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="130"/>
+        <source>%1 Report</source>
+        <translation>Reporte %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="180"/>
+        <source>: %1 hours, %2 minutes, %3 seconds
+</source>
+        <translation>: %1 horas, %2 minutos, %3 segundos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Range</source>
+        <translation>Intérvalo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Fixed %1</source>
+        <translation>Fijo %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="270"/>
+        <source>RDI	%1
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="272"/>
+        <source>AHI	%1
+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="306"/>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="310"/>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="314"/>
+        <source>UAI=%1 </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="316"/>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="384"/>
+        <source>Reporting from %1 to %2</source>
+        <translation>Reportando desde %1 hasta %2</translation>
+    </message>
+    <message>
+        <source>Reporting data goes here</source>
+        <translation type="vanished">Aqui va la fecha a reportar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="451"/>
+        <source>Entire Day's Flow Waveform</source>
+        <translation>Forma de onda del día completo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="457"/>
+        <source>Current Selection</source>
+        <translation>Selección actual</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="467"/>
+        <source>Entire Day</source>
+        <translation>Día completo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="586"/>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation>SleeepyHead v%! - ttp://sleepyhead.sourceforge.net</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="592"/>
+        <source>Page %1 of %2</source>
+        <translation>Página %1 de %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="659"/>
+        <source>SleepyHead has finished sending the job to the printer.</source>
+        <translation>SleepyHead ha enviado el trabajo a la impresora.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jan</source>
+        <translation>Ene</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Feb</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Mar</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Apr</source>
+        <translation>Abr</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>May</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jun</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Jul</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Aug</source>
+        <translation>Ago</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Sep</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Oct</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Nov</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Dec</source>
+        <translation>Dic</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="404"/>
+        <source>Events</source>
+        <translation>Eventos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="402"/>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="405"/>
+        <source>Duration</source>
+        <translation>Duración</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="419"/>
+        <source>(% %1 in events)</source>
+        <translation>(%-%1 en eventos)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="92"/>
+        <source>Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
+        <translation>No se puede leer Channels.xml, esta compilación está gravemente dañada ¡no queda mas que abortar!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="104"/>
+        <source>Therapy Pressure</source>
+        <translation>Presión Terapéutica</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="108"/>
+        <source>Inspiratory Pressure</source>
+        <translation>Presión Inspiratoria</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="112"/>
+        <source>Lower Inspiratory Pressure</source>
+        <translation>Presión inspiratoria inferior</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="116"/>
+        <source>Higher Inspiratory Pressure</source>
+        <translation>Presión inspiratoria superior</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="120"/>
+        <source>Expiratory Pressure</source>
+        <translation>Presión Expiratoria</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="124"/>
+        <source>Lower Expiratory Pressure</source>
+        <translation>Presión expiratoria inferior</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="128"/>
+        <source>Higher Expiratory Pressure</source>
+        <translation>Presión expiratoria superior</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="132"/>
+        <source>Pressure Support</source>
+        <translation>Soporte de presión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="137"/>
+        <source>PS Min</source>
+        <translation>SP Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <source>Pressure Support Minimum</source>
+        <translation>Soporte de presión mínimo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="141"/>
+        <source>PS Max</source>
+        <translation>SP Máx</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <source>Pressure Support Maximum</source>
+        <translation>Soporte de presión máximo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Min Pressure</source>
+        <translation>Presión Mín</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Minimum Therapy Pressure</source>
+        <translation>Presión de terapia mínima</translation>
+    </message>
+    <message>
+        <source>Pr. Min</source>
+        <translation type="vanished">P Mín</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Max Pressure</source>
+        <translation>Presión Máxima</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Maximum Therapy Pressure</source>
+        <translation>Máxima terapia de presión</translation>
+    </message>
+    <message>
+        <source>Pr. Max</source>
+        <translation type="vanished">P Máx</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="153"/>
+        <source>Ramp Time</source>
+        <translation>Tiempo de rampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <source>Ramp Delay Period</source>
+        <translation>Periodo de retraso de rampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="157"/>
+        <source>Ramp Pressure</source>
+        <translation>Presión de rampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <source>Starting Ramp Pressure</source>
+        <translation>Presión inicial de rampa</translation>
+    </message>
+    <message>
+        <source>Ramp Pr.</source>
+        <translation type="vanished">P. Rampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="161"/>
+        <source>Ramp Event</source>
+        <translation>Evento de Rampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="162"/>
+        <source>Ramp</source>
+        <translation>Rampa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="167"/>
+        <source>Periodic Breathing</source>
+        <translation>Respiración periódica</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="168"/>
+        <source>A period of periodic breathing</source>
+        <translation>Un periodo de respiración periódca</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="209"/>
+        <source>Vibratory Snore (VS2) </source>
+        <translation>Ronquido vibratorio (VS2)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="425"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Mask On Time</source>
+        <translation>Mascarilla a tiempo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Time started according to str.edf</source>
+        <translation>Hora de inicio según str.edf</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="430"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>Summary Only</source>
+        <translation>Sólo resumen</translation>
+    </message>
+    <message>
+        <source>CPAP Session contains summary data onlyf</source>
+        <translation type="vanished">La sesión de CPAP sólo contiene un resumen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="332"/>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="173"/>
+        <source>Clear Airway Apnea</source>
+        <translation>Apnea Central</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="174"/>
+        <source>An apnea where the airway is open</source>
+        <translation>Una apnea mientras la vía aérea se encuentra abierta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="179"/>
+        <source>Obstructive Apnea</source>
+        <translation>Apnea Obtructiva</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="180"/>
+        <source>An apnea caused by airway obstruction</source>
+        <translation>Una apnea provocada por obstrucción de la vía aérea</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="185"/>
+        <source>Hypopnea</source>
+        <translation>Hipoapnea</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="186"/>
+        <source>A partially obstructed airway</source>
+        <translation>Una vía aérea parcialmente obstruida</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="190"/>
+        <source>Unclassified Apnea</source>
+        <translation>Apnea no clasificada</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="191"/>
+        <source>An apnea that could not fit into a category</source>
+        <translation>Una apnea que no se pudo categorizar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="192"/>
+        <source>UA</source>
+        <translation>ANC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="196"/>
+        <source>An restriction in breathing from normal, causing a flattening of the flow waveform.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="200"/>
+        <source>Respiratory Effort Related Arousal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="201"/>
+        <source>An restriction in breathing that causes an either an awakening or sleep disturbance.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>Vibratory Snore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>A vibratory snore</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="210"/>
+        <source>A vibratory snore as detcted by a System One machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2076"/>
+        <source>Pressure Pulse</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2077"/>
+        <source>A pulse of pressure 'pinged' to detect a closed airway.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="451"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="221"/>
+        <source>Large Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="216"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="222"/>
+        <source>A large mask leak affecting machine performance.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="452"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="223"/>
+        <source>LL</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="226"/>
+        <source>Non Responding Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="227"/>
+        <source>A type of respiratory event that won't respond to a pressure increase.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="231"/>
+        <source>Expiratory Puff</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="232"/>
+        <source>Intellipap event where you breathe out your mouth.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="237"/>
+        <source>SensAwake feature will reduce pressure when waking is detected.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="241"/>
+        <source>User Flag #1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="242"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="252"/>
+        <source>A user definable event detected by SleepyHead's flow waveform processor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="246"/>
+        <source>User Flag #2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="251"/>
+        <source>User Flag #3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <source>Heart rate in beats per minute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>Blood-oxygen saturation percentage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>SpO2 %</source>
+        <translation type="unfinished">% SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="271"/>
+        <source>Plethysomogram</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="272"/>
+        <source>An optical Photo-plethysomogram showing heart rhythm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="281"/>
+        <source>Pulse Change</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="282"/>
+        <source>A sudden (user definable) change in heart rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="286"/>
+        <source>SpO2 Drop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="287"/>
+        <source>A sudden (user definable) drop in blood oxygen saturation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="288"/>
+        <source>SD</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Breathing flow rate waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="335"/>
+        <source>L/min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="319"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="320"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="324"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure (High resolution)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Amount of air displaced per breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Graph displaying snore volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="339"/>
+        <source>Minute Ventilation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Amount of air displaced per minute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="344"/>
+        <source>Respiratory Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Rate of breaths per minute</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="349"/>
+        <source>Patient Triggered Breaths</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Percentage of breaths triggered by patient</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Pat. Trig. Breaths</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="354"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Leak Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Rate of detected mask leakage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="361"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>I:E Ratio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>Ratio between Inspiratory and Expiratory time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="340"/>
+        <source>ratio</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="145"/>
+        <source>Pressure Min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="149"/>
+        <source>Pressure Max</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="215"/>
+        <source>Leak Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="217"/>
+        <source>LF</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="276"/>
+        <source>Perfusion Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="277"/>
+        <source>A relative assessment of the pulse strength at the monitoring site</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="278"/>
+        <source>Perf. Index %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Expiratory Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Time taken to breathe out</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Inspiratory Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Time taken to breathe in</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="374"/>
+        <source>Respiratory Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>A ResMed data source showing Respiratory Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Graph showing severity of flow limitations</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Flow Limit.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="384"/>
+        <source>Target Minute Ventilation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Minute Ventilation?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="389"/>
+        <source>Maximum Leak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>The maximum rate of mask leakage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>Max Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="394"/>
+        <source>Apnea Hypopnea Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>Graph showing running AHI for the past hour</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="399"/>
+        <source>Total Leak Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Detected mask leakage including natural Mask leakages</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="404"/>
+        <source>Median Leak Rate</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median rate of detected mask leakage</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median Leaks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="409"/>
+        <source>Respiratory Disturbance Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>Graph showing running RDI for the past hour</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>CPAP Session contains summary data only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="438"/>
+        <source>PAP Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="437"/>
+        <source>PAP Device Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="443"/>
+        <source>APAP (Variable)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="447"/>
+        <source>ASV (Fixed EPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="448"/>
+        <source>ASV (Variable EPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="922"/>
+        <source>Zero</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="925"/>
+        <source>Upper Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="928"/>
+        <source>Lower Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="475"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Orientation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Sleep position in degrees</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="474"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Inclination</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Upright angle in degrees</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="112"/>
+        <source>Name: %1, %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="114"/>
+        <source>DOB: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="117"/>
+        <source>Phone: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="120"/>
+        <source>Email: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="123"/>
+        <source>Address:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="165"/>
+        <source>Usage Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="179"/>
+        <source>This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="181"/>
+        <source>SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1039"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1041"/>
+        <source>Auto Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1045"/>
+        <source>ASV Auto EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1029"/>
+        <source>Days: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1033"/>
+        <source>Low Usage Days: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1034"/>
+        <source>(%1% compliant, defined as > %2 hours)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1148"/>
+        <source>(Sess: %1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1156"/>
+        <source>Bedtime: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1158"/>
+        <source>Waketime: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1198"/>
+        <source>90%</source>
+        <translation type="unfinished">100% {90%?}</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1270"/>
+        <source>(Summary Only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="315"/>
+        <source>There is a lockfile already present for profile '%1'.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="316"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="326"/>
+        <source>You can only work with one instance of an individual SleepyHead profile at a time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="317"/>
+        <source>Please close any other instances of SleepyHead running with this profile before proceeding.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="318"/>
+        <source>If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="325"/>
+        <source>There is a lockfile already present for this profile '%1', claimed on '%2'.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="327"/>
+        <source>If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>Peak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="142"/>
+        <source>%1% %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1241"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1060"/>
+        <source>Fixed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1243"/>
+        <source>Auto</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1245"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="444"/>
+        <source>Fixed Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="445"/>
+        <source>Auto Bi-Level (Fixed PS)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1249"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="446"/>
+        <source>Auto Bi-Level (Variable PS)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1251"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1043"/>
+        <source>ASV Fixed EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1253"/>
+        <source>ASV Variable EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1274"/>
+        <source>%1%2</source>
+        <translation type="unfinished">%1%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1294"/>
+        <source>Fixed %1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1296"/>
+        <source>Min %1 Max %2 (%3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1298"/>
+        <source>EPAP %1 IPAP %2 (%3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1300"/>
+        <source>PS %1 over %2-%3 (%4)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1302"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1306"/>
+        <source>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1304"/>
+        <source>EPAP %1 PS %2-%3 (%6)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="129"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="131"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="133"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>%1 %2</source>
+        <translation type="unfinished">%1 %2</translation>
+    </message>
+    <message>
+        <source>%1-%2 %3</source>
+        <translation type="obsolete">%1-%2 %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="90"/>
+        <source>Welcome to SleepyHead</source>
+        <translation type="unfinished">Bienvenido a SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>What would you like to do?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>Please Import Some Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="104"/>
+        <source>CPAP<br/>Importer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="109"/>
+        <source>Oximetery<br/>Wizard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="113"/>
+        <source>or</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="116"/>
+        <source>View<br/>Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="122"/>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="123"/>
+        <source>First import can take a few minutes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="139"/>
+        <source>Click this box to see this in daily view.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="141"/>
+        <source>The last time you used your %1...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="145"/>
+        <source>last night</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="146"/>
+        <source>yesterday</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="147"/>
+        <source>%2 days ago</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="149"/>
+        <source>was %1 (on %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="157"/>
+        <source>perfect :)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="158"/>
+        <source>pretty darn good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="159"/>
+        <source>reasonably good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="160"/>
+        <source>technically "treated"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="161"/>
+        <source>not very good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="162"/>
+        <source>horrible, please consult your doctor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="164"/>
+        <source>You had an AHI of %1, which is considered %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="169"/>
+        <source>%1 hours, %2 minutes and %3 seconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="171"/>
+        <source>You machine was on for %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="241"/>
+        <source><p><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="242"/>
+        <source><p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="172"/>
+        <source><font color = red>You only had the mask on for %1.</font></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="179"/>
+        <source>You had no <i>major</i> mask leaks (maximum was %1 %2).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="180"/>
+        <source>You had a small but acceptable amount of <i>major</i> mask leakage.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="181"/>
+        <source>You had significant periods of <i>major</i> mask leakage.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="182"/>
+        <source>Your mask is leaking way too much.. Talk to your CPAP advisor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="190"/>
+        <source>Your CPAP machine blasted you with a constant %1%2 of air</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="193"/>
+        <source>Your pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="197"/>
+        <source>Your machine blasted you with a constant %1-%2 %3 of air.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="201"/>
+        <source>Your machine was under %1-%2 %3 for %4% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="206"/>
+        <source>Your EPAP pressure fixed at %1%2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="212"/>
+        <source>Your EPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="207"/>
+        <location filename="../sleepyhead/welcome.cpp" line="213"/>
+        <source>Your IPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="220"/>
+        <source>No CPAP data has been imported yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="226"/>
+        <source>Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="227"/>
+        <source>(last night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="228"/>
+        <source>(yesterday)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="229"/>
+        <source>(%2 day ago)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="232"/>
+        <source>No oximetery data has been imported yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="238"/>
+        <source>Very Important Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="240"/>
+        <source><p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>Contec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <source>CMS50</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>Fisher & Paykel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>ICON</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>DeVilbiss</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>Intellipap</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="81"/>
+        <source>SmartFlex Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>ChoiceMMed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>MD300</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>Respironics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>M-Series</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>Philips Respironics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>System One</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>ResMed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>S9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="395"/>
+        <source>EPR: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose Software</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Zeo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Personal Sleep Coach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1034"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1586"/>
+        <source>VPAP Adapt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2632"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2634"/>
+        <source>EPR</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2633"/>
+        <source>ResMed Exhale Pressure Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2641"/>
+        <source>Patient???</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2644"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2646"/>
+        <source>EPR Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2645"/>
+        <source>Exhale Pressure Relief Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2649"/>
+        <source>0cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2650"/>
+        <source>1cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2651"/>
+        <source>2cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2652"/>
+        <source>3cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/MinutesAtPressure.cpp" line="234"/>
+        <source>(% of time)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gFlagsLine.cpp" line="195"/>
+        <source>Database Outdated
+Please Rebuild CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="334"/>
+        <source>Snapshot %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1271"/>
+        <source>SleepyHead is proudly brought to you by JediMark.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1394"/>
+        <source>d MMM [ %1 - %2 ]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1930"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1983"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2058"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2075"/>
+        <source>%1</source>
+        <translation type="unfinished">%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2038"/>
+        <source>Hide All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2039"/>
+        <source>Show All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2363"/>
+        <source>Unpin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2438"/>
+        <source>Pin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1066"/>
+        <source>Plots Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1148"/>
+        <source>Duration %1:%2:%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1149"/>
+        <source>AHI %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="107"/>
+        <source>%1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="150"/>
+        <source>Relief: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="156"/>
+        <source>Hours: %1h, %2m, %3s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="259"/>
+        <source>Machine Information</source>
+        <translation type="unfinished">Información de la máquina</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>Journal Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="43"/>
+        <source>SleepyHead found an old Journal folder, but it looks like it's been renamed:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="45"/>
+        <source>SleepyHead will not touch this folder, and will create a new one instead.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="46"/>
+        <source>Please be careful when playing in SleepyHead's profile folders :-P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="53"/>
+        <source>For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="54"/>
+        <source>SleepyHead picked only the first one of these, and will use it in future:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="56"/>
+        <source>If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F3.7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="587"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="589"/>
+        <source>SmartFlex Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="588"/>
+        <source>Intellipap pressure relief mode.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="594"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2639"/>
+        <source>Ramp Only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="595"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2640"/>
+        <source>Full Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="598"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="600"/>
+        <source>SmartFlex Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="599"/>
+        <source>Intellipap pressure relief level.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>Weinmann</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>SOMNOsoft2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/machine.cpp" line="404"/>
+        <source>Loading %1 data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/progressdialog.cpp" line="14"/>
+        <source>PLease Wait...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>By Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>Statistics at Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="923"/>
+        <source>%1 Session #%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QuaZipFilePrivate</name>
+    <message>
+        <location filename="../3rdparty/quazip/quazip/quazipfile.cpp" line="217"/>
+        <source>ZIP/UNZIP API error %1</source>
+        <translation>Error de la API ZIP/UNZIP %1</translation>
+    </message>
+</context>
+<context>
+    <name>Report</name>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulario</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="27"/>
+        <source>about:blank</source>
+        <translation>about:blank</translation>
+    </message>
+</context>
+<context>
+    <name>SessionBar</name>
+    <message>
+        <location filename="../sleepyhead/sessionbar.cpp" line="282"/>
+        <source>No Sessions Present</source>
+        <translation>No hay sesiones presentes</translation>
+    </message>
+</context>
+<context>
+    <name>Statistics</name>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="667"/>
+        <source>Details</source>
+        <translation variants="yes">
+            <lengthvariant>Detallado</lengthvariant>
+            <lengthvariant>Detalles</lengthvariant>
+        </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="607"/>
+        <source>Most Recent</source>
+        <translation variants="yes">
+            <lengthvariant>Más reciente</lengthvariant>
+            <lengthvariant>Más recientes</lengthvariant>
+        </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="35"/>
+        <source>Compliance</source>
+        <translation variants="yes">
+            <lengthvariant>Cumplimiento</lengthvariant>
+            <lengthvariant>Apego</lengthvariant>
+        </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="609"/>
+        <source>Last 30 Days</source>
+        <translation variants="yes">
+            <lengthvariant>Último Mes</lengthvariant>
+            <lengthvariant>Últimos 30 días</lengthvariant>
+        </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="611"/>
+        <source>Last Year</source>
+        <translation>Último Año</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="83"/>
+        <location filename="../sleepyhead/statistics.cpp" line="84"/>
+        <source>Average %1</source>
+        <translation>Promedio %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="30"/>
+        <source>CPAP Statistics</source>
+        <translation>Estadísticas de CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="33"/>
+        <source>CPAP Usage</source>
+        <translation>Uso de CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="34"/>
+        <source>Average Hours per Night</source>
+        <translation>Promedio de horas por noche</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="37"/>
+        <source>Therapy Efficiacy</source>
+        <translation>Eficacia de la terapia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="47"/>
+        <source>Leak Statistics</source>
+        <translation>Estadísticas de fuga</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="52"/>
+        <source>Pressure Statistics</source>
+        <translation>Estadísticas de presión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="65"/>
+        <source>Oximeter Statistics</source>
+        <translation>Estadísticas del oxímetro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="69"/>
+        <source>Blood Oxygen Saturation</source>
+        <translation>Saturación de oxígeno en sangre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="74"/>
+        <source>Pulse Rate</source>
+        <translation>Frecuencia de Pulso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="82"/>
+        <source>%1 Median</source>
+        <translation>%1 Mediana</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="85"/>
+        <source>90% %1</source>
+        <translation>90% %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="86"/>
+        <source>Min %1</source>
+        <translation>Mín %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="87"/>
+        <source>Max %1</source>
+        <translation>Max %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="88"/>
+        <source>%1 Index</source>
+        <translation>Índice %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="89"/>
+        <source>% of time in %1</source>
+        <translation>% del tiempo en %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="90"/>
+        <source>% of time above %1 threshold</source>
+        <translation>% del tiempo por encima del umbral de %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="91"/>
+        <source>% of time below %1 threshold</source>
+        <translation>% del tiempo por debajo del umbral de %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="550"/>
+        <source>I can haz data?!?</source>
+        <translation>¿Puedes proporcionarme datos?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="551"/>
+        <source>This lonely sleepy sheep has no data :(</source>
+        <translation>Esta solitaria ovejita somnolienta no tiene datos :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="608"/>
+        <source>Last Week</source>
+        <translation>Última Semana</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="610"/>
+        <source>Last 6 Months</source>
+        <translation variants="yes">
+            <lengthvariant>Último Semestre</lengthvariant>
+            <lengthvariant>últimos 6 meses</lengthvariant>
+        </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="615"/>
+        <source>Last Session</source>
+        <translation>Última sesión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="681"/>
+        <source>No %1 data available.</source>
+        <translation>No hay datos %1 disponibles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="684"/>
+        <source>%1 day of %2 Data on %3</source>
+        <translation>%1 día(s) de datos %2 en %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="690"/>
+        <source>%1 days of %2 Data, between %3 and %4</source>
+        <translation>%1 día(s) de datos %2 entre %3 y %4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="963"/>
+        <source>Usage Information</source>
+        <translation>Información de uso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="964"/>
+        <source>Total Days</source>
+        <translation>Días totales</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="968"/>
+        <source>Compliant Days</source>
+        <translation variants="yes">
+            <lengthvariant>Días cumplidos</lengthvariant>
+            <lengthvariant>días con cumplimiento</lengthvariant>
+        </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="980"/>
+        <source>Days AHI &gt;5.0</source>
+        <translation>Días IAH &gt;5.0</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="985"/>
+        <source>Best&nbsp;%1</source>
+        <translation>Mejor&nbsp;%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="998"/>
+        <source>Worst&nbsp;%1</source>
+        <translation>Peor&nbsp;%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1024"/>
+        <source>Best RX Setting</source>
+        <translation>Mejor Prescripción</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1025"/>
+        <source>Worst RX Setting</source>
+        <translation>Peor Prescripción</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1095"/>
+        <source>Changes to Prescription Settings</source>
+        <translation>Cambios a la prescripción</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1103"/>
+        <source>Days</source>
+        <translation>Días</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1110"/>
+        <source>Pressure Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="vanished">Al. Pres.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1112"/>
+        <source>Pressure Settings</source>
+        <translation>Ajustes de presión</translation>
+    </message>
+    <message>
+        <source>Fixed %1 %2</source>
+        <translation type="vanished">Fijo %1 %2</translation>
+    </message>
+    <message>
+        <source>%1 - %2 %3</source>
+        <translation type="vanished">%1 - %2 %3</translation>
+    </message>
+    <message>
+        <source>EPAP %1 %3 IPAP %2 %3</source>
+        <translation type="vanished">EPAP %1 %3 IPAP %2 %3</translation>
+    </message>
+    <message>
+        <source>PS %4 over %1 - %2 %3</source>
+        <translation type="vanished">PS %4 sobre %1 - %2 %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1123"/>
+        <source>Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.</source>
+        <translation>El resaltado de eficacia ignora las prescripciones con menos de %1 día(s) de datos registrados.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1243"/>
+        <source>Machine Information</source>
+        <translation>Información de la máquina</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1250"/>
+        <source>First Use</source>
+        <translation>Primer Uso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1251"/>
+        <source>Last Use</source>
+        <translation>Último Uso</translation>
+    </message>
+</context>
+<context>
+    <name>UpdaterWindow</name>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="14"/>
+        <source>SleepyHead Updater</source>
+        <translation>Actualizador de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="51"/>
+        <source>A new version of $APP is available</source>
+        <translation>Una nueva versión de $APP está disponible</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="97"/>
+        <source>Version Information</source>
+        <translation>Información de la versión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="108"/>
+        <source>Release Notes</source>
+        <translation>Notas de la Versión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="121"/>
+        <source>about:blank</source>
+        <translation>about:blank</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="130"/>
+        <source>Build Notes</source>
+        <translation>Notas de Compilación</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="174"/>
+        <source>Maybe &Later</source>
+        <translation>Quizás &Después</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="194"/>
+        <source>&Upgrade Now</source>
+        <translation>&Actualizar Ahora</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="220"/>
+        <source>Please wait while updates are downloaded and installed...</source>
+        <translation>Por favor espere mientras se descargan e instalan las actualizaciones...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="234"/>
+        <source>Updates</source>
+        <translation>Actualizaciones</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="265"/>
+        <source>Component</source>
+        <translation>Componente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="270"/>
+        <source>Version</source>
+        <translation>Versión</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="275"/>
+        <source>Size</source>
+        <translation>Tamaño</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="280"/>
+        <source>Progress</source>
+        <translation>Progreso</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="289"/>
+        <source>Log</source>
+        <translation>Bitácora</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="317"/>
+        <source>Downloading & Installing Updates</source>
+        <translation>Descargando e instalando actualizaciones</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="337"/>
+        <source>&Finished</source>
+        <translation>&Finalizado</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="94"/>
+        <source>Checking for SleepyHead Updates</source>
+        <translation>Verificando actualizaciones de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="109"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="171"/>
+        <source>Requesting </source>
+        <translation>Solicitando</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="178"/>
+        <source>Saving as </source>
+        <translation>Guardando como</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="256"/>
+        <source>XML update structure parsed cleanly</source>
+        <translation>La actualización de estructura XML se realizó limpiamente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <source>No updates were found for your platform.</source>
+        <translation>No se encontraron actualizaciones para su plataforma.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="322"/>
+        <source>SleepyHead Updates</source>
+        <translation>Actualizaciones de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="321"/>
+        <source>No new updates were found for your platform.</source>
+        <translation>No se encontraron nuevas actualizaciones para su plataforma.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="339"/>
+        <source>SleepyHead v%1, codename "%2"</source>
+        <translation>SleepyHead v%1, nombre clave "%2"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="342"/>
+        <source>platform notes</source>
+        <translation>Notas de la Plataforma</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="347"/>
+        <source>A new version of SleepyHead is available!</source>
+        <translation>¡Una nueva versión de SleepyHead está disponible!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="348"/>
+        <source>Shiny new <b>v%1</b> is available. You're running old and busted v%2</source>
+        <translation>La nueva y brillante versión <b>v%1</b> está disponible. Usted está corriendo la vieja y gastada v%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="352"/>
+        <source>An update for SleepyHead is available.</source>
+        <translation>Una actualización para SleepyHead está disponible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="353"/>
+        <source>Version <b>%1</b> is available. You're currently running v%1</source>
+        <translation>La versión <b>%1</b> está disponible. Usted está usando la v%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="366"/>
+        <source>SleepyHead v%1 build notes</source>
+        <translation>Notas de compilación de SleepyHead v%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="369"/>
+        <source>Update to QtLibs (v%1)</source>
+        <translation>Actualización de QtLibs (v%1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="379"/>
+        <source>There was an error parsing the XML Update file.</source>
+        <translation>Hubo un error interpretando el archivo de actualización XML.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="400"/>
+        <source>%1 bytes received</source>
+        <translation>%1 bytes recibidos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="430"/>
+        <source>Redirected to </source>
+        <translation>Redirigido a</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="444"/>
+        <source>File size mismatch for %1</source>
+        <translation>Tamaño del archivo %1 no coincide</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="455"/>
+        <source>File integrity check failed for %1</source>
+        <translation>Falló la comprobación de integridad para %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="485"/>
+        <source>Extracting </source>
+        <translation>Extrayendo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="546"/>
+        <source>You might need to reinstall manually. Sorry :(</source>
+        <translation>Lo sentimos :( Es posible que requiera reinstalar manualmente</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="547"/>
+        <source>Ugh.. Something went wrong with unzipping.</source>
+        <translation>Ups... Algo salió mal al descomprimir.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="560"/>
+        <source>Failed</source>
+        <translation>Fallido</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="580"/>
+        <source>Download Complete</source>
+        <translation>Descarga Completada</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="584"/>
+        <source>There was an error completing a network request:
+
+(</source>
+        <translation>Hubo un error completando una petición de red:(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="629"/>
+        <source>Update Complete!</source>
+        <translation>Actualización Completada</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="632"/>
+        <source>Updates Complete. SleepyHead needs to restart now, click Finished to do so.</source>
+        <translation>Actualizaciones completas. SleepyHead requiere reiniciar ahora, haga clic en Finalizado para hacerlo.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="635"/>
+        <source>Update Failed :(</source>
+        <translation>Actualización Fallida :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="637"/>
+        <source>Download Error. Sorry, try again later.</source>
+        <translation>Error de descarga. Lo sentimos, intente nuevamente más tarde.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="654"/>
+        <source>Downloading & Installing Updates...</source>
+        <translation>Descargando e instalando actualizaciones...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="655"/>
+        <source>Please wait while downloading and installing updates.</source>
+        <translation>Por favor espere mientras se descargan e instalan las actualizaciones.</translation>
+    </message>
+</context>
+<context>
+    <name>gGraph</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="694"/>
+        <source>Snapshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraphView</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="361"/>
+        <source>100% zoom level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="362"/>
+        <source>Restore X-axis zoom too 100% to view entire days data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="364"/>
+        <source>Reset Graph Layout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="365"/>
+        <source>Resets all graphs to a uniform height and default order.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="368"/>
+        <source>Y-Axis</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="369"/>
+        <source>Plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="374"/>
+        <source>CPAP Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="377"/>
+        <source>Oximeter Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="380"/>
+        <source>Dotted Lines</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1854"/>
+        <source>Remove Clone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1858"/>
+        <source>Clone %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/Translations/Francais.fr.ts b/Translations/Francais.fr.ts
new file mode 100644
index 0000000..b1ad36b
--- /dev/null
+++ b/Translations/Francais.fr.ts
@@ -0,0 +1,9758 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="fr_FR" sourcelanguage="en">
+<context>
+    <name>CMS50Loader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Could not get data transmission from oximeter.</source>
+        <translation>impossible d'obtenir des données de l'oxymètre.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Please ensure you select 'upload' from the oximeter devices menu.</source>
+        <translation>Merci de vérifier que vous avez selectionné 'upload' dans les menus de votre oxymetre.</translation>
+    </message>
+</context>
+<context>
+    <name>CMS50Serial</name>
+    <message>
+        <source>Question</source>
+        <translation type="obsolete">Question</translation>
+    </message>
+</context>
+<context>
+    <name>Daily</name>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="435"/>
+        <source>Form</source>
+        <translation>Formulaire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="506"/>
+        <source>Go to the previous day</source>
+        <translation>Aller au jour précédent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="525"/>
+        <source>Prev</source>
+        <translation>Prec</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="551"/>
+        <source>Show or hide the calender</source>
+        <translation>affiche ou cache le calendrier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="574"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="614"/>
+        <source>Go to the next day</source>
+        <translation>Aller au jour suivant</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="636"/>
+        <source>Next</source>
+        <translation>Suivant</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="674"/>
+        <source>Go to the most recent day with data records</source>
+        <translation>Aller au plus récent jour avec des données</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation type="vanished">Détails</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation type="vanished">ausujet:blanc</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="852"/>
+        <source>Events</source>
+        <translation>Evènements</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="914"/>
+        <source>View Size</source>
+        <translation>Taille de la vue</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="959"/>
+        <location filename="../sleepyhead/daily.ui" line="1374"/>
+        <source>Notes</source>
+        <translation>Notes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1013"/>
+        <source>Journal</source>
+        <translation>Journal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1099"/>
+        <source>Small</source>
+        <translation>Petit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1104"/>
+        <source>Medium</source>
+        <translation>Moyen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1109"/>
+        <source>Big</source>
+        <translation>Grand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1079"/>
+        <source>Color</source>
+        <translation>Couleur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1038"/>
+        <source> i </source>
+        <translation> italique </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1041"/>
+        <source>Ctrl+I</source>
+        <translation>Ctrl+I</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1069"/>
+        <source>u</source>
+        <translation>Souligné</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1054"/>
+        <source>B</source>
+        <translation>Gras</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1057"/>
+        <source>Ctrl+B</source>
+        <translation>Ctrl+B</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1168"/>
+        <source>Zombie</source>
+        <translation>Zombie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1181"/>
+        <source>I'm feeling...</source>
+        <translation>Je me sens...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1197"/>
+        <source>Weight</source>
+        <translation>Poids</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1271"/>
+        <source>Awesome</source>
+        <translation>Beau</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1309"/>
+        <source>B.M.I.</source>
+        <translation>B.M.I.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1325"/>
+        <source>Bookmarks</source>
+        <translation>Favoris</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1346"/>
+        <source>Add Bookmark</source>
+        <translation>Ajouter un Favoris</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1369"/>
+        <source>Starts</source>
+        <translation>Début</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1382"/>
+        <source>Remove Bookmark</source>
+        <translation>Enlever le Favoris</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1475"/>
+        <source>Flags</source>
+        <translation type="unfinished">Marque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1527"/>
+        <source>Graphs</source>
+        <translation type="unfinished">Graphique</translation>
+    </message>
+    <message>
+        <source>Zoom fully out</source>
+        <translation type="vanished">Zoom maximum</translation>
+    </message>
+    <message>
+        <source>100%</source>
+        <translation type="vanished">100%</translation>
+    </message>
+    <message>
+        <source>Reset the graph heights to uniform sizes</source>
+        <translation type="vanished">Uniformiser la taille des graphiques</translation>
+    </message>
+    <message>
+        <source>Reset</source>
+        <translation type="vanished">Remettre a zéro</translation>
+    </message>
+    <message>
+        <source>Flags:</source>
+        <translation type="vanished">Balises:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1552"/>
+        <source>Drop down this list to show/hide available graphs.</source>
+        <translation>Liste déroulante pour montrer/cacher les graphiques. </translation>
+    </message>
+    <message>
+        <source>Flow Rate</source>
+        <translation type="vanished">Débit</translation>
+    </message>
+    <message>
+        <source>RDI</source>
+        <translation type="vanished">IDR</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation type="vanished">IAH</translation>
+    </message>
+    <message>
+        <source>Mask Pressure</source>
+        <translation type="vanished">Pression du masque</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation type="vanished">Pression</translation>
+    </message>
+    <message>
+        <source>Leak</source>
+        <translation type="vanished">Fuite</translation>
+    </message>
+    <message>
+        <source>Snore</source>
+        <translation type="vanished">Ronflement</translation>
+    </message>
+    <message>
+        <source>Resp. Rate</source>
+        <translation type="vanished">Taux de respiration</translation>
+    </message>
+    <message>
+        <source>Tidal Volume</source>
+        <translation type="vanished">Tidal Volume</translation>
+    </message>
+    <message>
+        <source>Minute Vent.</source>
+        <translation type="vanished">Minute Vent.</translation>
+    </message>
+    <message>
+        <source>Flow Limitation</source>
+        <translation type="vanished">Limitation du débit</translation>
+    </message>
+    <message>
+        <source>Pat. Trig. Breath</source>
+        <translation type="vanished">Pat Trig Breath</translation>
+    </message>
+    <message>
+        <source>Resp. Event</source>
+        <translation type="vanished">Evenement Respiratoire</translation>
+    </message>
+    <message>
+        <source>Insp. Time</source>
+        <translation type="vanished">Durée inspiration</translation>
+    </message>
+    <message>
+        <source>Exp. Time</source>
+        <translation type="vanished">Durée expiration</translation>
+    </message>
+    <message>
+        <source>IE</source>
+        <translation type="vanished">IE</translation>
+    </message>
+    <message>
+        <source>Sleep Stage</source>
+        <translation type="vanished">Période du sommeil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>Breakdown</source>
+        <translation>arret</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>events</source>
+        <translation>évènements</translation>
+    </message>
+    <message>
+        <source>H</source>
+        <translation type="vanished">H</translation>
+    </message>
+    <message>
+        <source>A</source>
+        <translation type="vanished">A</translation>
+    </message>
+    <message>
+        <source>OA</source>
+        <translation type="vanished">AO</translation>
+    </message>
+    <message>
+        <source>CA</source>
+        <translation type="vanished">CA</translation>
+    </message>
+    <message>
+        <source>RE</source>
+        <translation type="vanished">RE</translation>
+    </message>
+    <message>
+        <source>NR</source>
+        <translation type="vanished">NR</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation type="vanished">FL</translation>
+    </message>
+    <message>
+        <source>PB</source>
+        <translation type="vanished">PB</translation>
+    </message>
+    <message>
+        <source>E</source>
+        <translation type="vanished">E</translation>
+    </message>
+    <message>
+        <source>L</source>
+        <translation type="vanished">L</translation>
+    </message>
+    <message>
+        <source>NRI</source>
+        <translation type="vanished">NRI</translation>
+    </message>
+    <message>
+        <source>VS</source>
+        <translation type="vanished">VS</translation>
+    </message>
+    <message>
+        <source>VS2</source>
+        <translation type="vanished">VS2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="212"/>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="213"/>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <source>UF3</source>
+        <translation type="vanished">UF3</translation>
+    </message>
+    <message>
+        <source>Selection AHI</source>
+        <translation type="vanished">Choix IAH </translation>
+    </message>
+    <message>
+        <source>CSR</source>
+        <translation type="vanished">CSR</translation>
+    </message>
+    <message>
+        <source>PR</source>
+        <translation type="vanished">PR</translation>
+    </message>
+    <message>
+        <source>U1</source>
+        <translation type="vanished">U1</translation>
+    </message>
+    <message>
+        <source>U2</source>
+        <translation type="vanished">U2</translation>
+    </message>
+    <message>
+        <source>U3</source>
+        <translation type="vanished">U3</translation>
+    </message>
+    <message>
+        <source>O2</source>
+        <translation type="vanished">O2</translation>
+    </message>
+    <message>
+        <source>Events/hour</source>
+        <translation type="vanished">Evènement/Heure</translation>
+    </message>
+    <message>
+        <source>PD</source>
+        <translation type="vanished">PD</translation>
+    </message>
+    <message>
+        <source>No Data</source>
+        <translation type="vanished">Pas de donée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="517"/>
+        <source>No %1 events are recorded this day</source>
+        <translation>Aucun evenement  %1 disponible pour ce jour </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="615"/>
+        <source>%1 event</source>
+        <translation>Evenement %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="616"/>
+        <source>%1 events</source>
+        <translation>Evenements %1</translation>
+    </message>
+    <message>
+        <source>Oximetry data exists for this day, however it's timestamps are too different, so the Graphs will not be linked.</source>
+        <translation type="vanished">Il y a des données d'Oximetrie pour ce jour, mais les date sont trop différente et donc les graphiques ne seront pas liés.</translation>
+    </message>
+    <message>
+        <source>No Graphs :(</source>
+        <translation type="vanished">Pas de Graphiques :(</translation>
+    </message>
+    <message>
+        <source>CPAP</source>
+        <translation type="vanished">PPC</translation>
+    </message>
+    <message>
+        <source>APAP</source>
+        <translation type="vanished">APAP</translation>
+    </message>
+    <message>
+        <source>Bi-Level</source>
+        <translation type="vanished">Bi-Level</translation>
+    </message>
+    <message>
+        <source>ASV</source>
+        <translation type="vanished">ASV</translation>
+    </message>
+    <message>
+        <source>Unknown</source>
+        <translation type="vanished">Inconnue</translation>
+    </message>
+    <message>
+        <source>Date</source>
+        <translation type="vanished">Date</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Sleep</source>
+        <translation>Sommeil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Wake</source>
+        <translation>Eveil</translation>
+    </message>
+    <message>
+        <source>Hypopnea</source>
+        <translation type="vanished">Hypopnée</translation>
+    </message>
+    <message>
+        <source>Apnea</source>
+        <translation type="vanished">Apnée</translation>
+    </message>
+    <message>
+        <source>Obstructive</source>
+        <translation type="vanished">Obstructive</translation>
+    </message>
+    <message>
+        <source>Flow Limit</source>
+        <translation type="vanished">Limitation du Flux</translation>
+    </message>
+    <message>
+        <source>User Flags</source>
+        <translation type="vanished">Balise utilisateur</translation>
+    </message>
+    <message>
+        <source>RERA</source>
+        <translation type="vanished">RERA</translation>
+    </message>
+    <message>
+        <source>VSnore</source>
+        <translation type="vanished">VRonflement</translation>
+    </message>
+    <message>
+        <source>VSnore2</source>
+        <translation type="vanished">VRonflement2</translation>
+    </message>
+    <message>
+        <source>PB/CSR</source>
+        <translation type="vanished">PB/CSR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1523"/>
+        <source>Event Breakdown</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1558"/>
+        <source>Sessions all off!</source>
+        <translation>Toutes les Sessions sont off!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1560"/>
+        <source>Sessions exist for this day but are switched off.</source>
+        <translation>Des sessions existent pour ce jour mais sont éteintes.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1563"/>
+        <source>Impossibly short session</source>
+        <translation>Session trop courtes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1564"/>
+        <source>Zero hours??</source>
+        <translation>Zero heures ?!?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1567"/>
+        <source>BRICK :(</source>
+        <translation>PLANTAGE :(</translation>
+    </message>
+    <message>
+        <source>Sorry, your machine does not record data.</source>
+        <translation type="vanished">Désolé votre machine n'enregistre rien.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1569"/>
+        <source>Complain to your Equipment Provider!</source>
+        <translation>Plaignez vous a votre fournisseur d'équipement!</translation>
+    </message>
+    <message>
+        <source>Avg</source>
+        <translation type="vanished">Moyenne</translation>
+    </message>
+    <message>
+        <source>Med</source>
+        <translation type="vanished">Med</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1135"/>
+        <source>Statistics</source>
+        <translation>Statistiques</translation>
+    </message>
+    <message>
+        <source>Channel</source>
+        <translation type="vanished">Chaine</translation>
+    </message>
+    <message>
+        <source>Min</source>
+        <translation type="vanished">Min</translation>
+    </message>
+    <message>
+        <source>%1%</source>
+        <translation type="vanished">%1%</translation>
+    </message>
+    <message>
+        <source>Max</source>
+        <translation type="vanished">Max</translation>
+    </message>
+    <message>
+        <source><b>Please Note:</b> This day just contains summary data, only limited information is available .</source>
+        <translation type="vanished"><b>Notification:</b>Ce jour ne contient que des données résumés, seul des informations restreintes sont disponibles.</translation>
+    </message>
+    <message>
+        <source>No data available</source>
+        <translation type="vanished">Pas de donnée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1057"/>
+        <source>Oximeter Information</source>
+        <translation>Informations de l'Oxymètre</translation>
+    </message>
+    <message>
+        <source>Int. Pulse</source>
+        <translation type="vanished">Poul Int.</translation>
+    </message>
+    <message>
+        <source>Int. SpO2</source>
+        <translation type="vanished">SpO2 Int.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="651"/>
+        <source>Session Start Times</source>
+        <translation>Début de Session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="652"/>
+        <source>Session End Times</source>
+        <translation>Fin de Session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="892"/>
+        <source>Duration</source>
+        <translation>Durée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="872"/>
+        <source>Oximetery Sessions</source>
+        <translation>Sessions d'Oxymetrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="878"/>
+        <source>Position Sensor Sessions</source>
+        <translation>Session des capteurs de position</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="883"/>
+        <source>Unknown Session</source>
+        <translation>Session inconnue</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1061"/>
+        <source>SpO2 Desaturations</source>
+        <translation>Désaturation de SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1062"/>
+        <source>Pulse Change events</source>
+        <translation>Changement de pulsation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1063"/>
+        <source>SpO2 Baseline Used</source>
+        <translation>Ligne de base du SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1232"/>
+        <source>Total ramp time</source>
+        <translation>Durée total de la rampe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1236"/>
+        <source>Time outside of ramp</source>
+        <translation>Durée hors rampe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1246"/>
+        <source>AHI excluding ramp</source>
+        <translation>IAH hors rampe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1587"/>
+        <source>"Nothing's here!"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1590"/>
+        <source>Bob is bored with this days lack of data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Hide all events</source>
+        <translation>Cacher les évènements</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Show all events</source>
+        <translation>Afficher les évènements</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="945"/>
+        <source>Machine Settings</source>
+        <translation>Réglages de la machine</translation>
+    </message>
+    <message>
+        <source>Pr. Relief</source>
+        <translation type="vanished">Restants de Pressions</translation>
+    </message>
+    <message>
+        <source>Humidifier</source>
+        <translation type="vanished">Humidifieur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="837"/>
+        <source>Session Information</source>
+        <translation>Information de Session</translation>
+    </message>
+    <message>
+        <source>SessionID</source>
+        <translation type="vanished">ID de Session</translation>
+    </message>
+    <message>
+        <source>On</source>
+        <translation type="vanished">On</translation>
+    </message>
+    <message>
+        <source>Start</source>
+        <translation type="vanished">Début</translation>
+    </message>
+    <message>
+        <source>End</source>
+        <translation type="vanished">Fin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="869"/>
+        <source>CPAP Sessions</source>
+        <translation>Session CPAP</translation>
+    </message>
+    <message>
+        <source>Oximetry Sessions</source>
+        <translation type="vanished">Sessions d'Oxymetrie</translation>
+    </message>
+    <message>
+        <source>Oximeter</source>
+        <translation type="vanished">Oximètre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="875"/>
+        <source>Sleep Stage Sessions</source>
+        <translation>Sessions du sommeil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="933"/>
+        <source>One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.</source>
+        <translation>Un ou plusieurs enregistrement de cette session a des données corompues. Certains points des graphiques peuvent ne pas coincider correctement.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="949"/>
+        <source>Machine Settings Unavailable</source>
+        <translation>Réglages de la machine indisponibles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1093"/>
+        <source>PAP Mode: %1<br/></source>
+        <translation>Mode PAP :%1<br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1098"/>
+        <source>This day has missing pressure, mode and settings data.</source>
+        <translation>Jours sans pression,mode et réglages</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1140"/>
+        <source>%1%2</source>
+        <translation>%1%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1206"/>
+        <source>This day just contains summary data, only limited information is available .</source>
+        <translation>Jour avec informations limité, seulement le résumé.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1216"/>
+        <source>Total time in apnea</source>
+        <translation>Temps total en apnée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1226"/>
+        <source>Time over leak redline</source>
+        <translation>Durée audessus de la ligne rouge de fuite</translation>
+    </message>
+    <message>
+        <source>Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked.</source>
+        <translation type="vanished">Il y a des données d'Oximetrie pour ce jour, mais les date sont trop différente et donc les graphiques ne seront pas liés.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1568"/>
+        <source>Sorry, your machine only provides compliance data.</source>
+        <translation>Désolé votre machine ne fournit que des donées de confotmité.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1869"/>
+        <source>Pick a Colour</source>
+        <translation>Choisir une couleur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2131"/>
+        <source>This bookmarked is in a currently disabled area..</source>
+        <translation>Ce favoris pointe vers une zone inactive..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2174"/>
+        <source>Bookmark at %1</source>
+        <translation>Favoris a %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2365"/>
+        <source>Show all graphs</source>
+        <translation>Afficher les Graphiques</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">Aucun Graphique !</translation>
+    </message>
+    <message>
+        <source>Summary Only :(</source>
+        <translation type="vanished">Résumé seulement :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2385"/>
+        <source>Hide all graphs</source>
+        <translation>Cacher les Graphiques</translation>
+    </message>
+</context>
+<context>
+    <name>ExportCSV</name>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="14"/>
+        <source>Export as CSV</source>
+        <translation>Export en CSV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="24"/>
+        <source>Dates:</source>
+        <translation>Dates:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="37"/>
+        <source>Resolution:</source>
+        <translation>Résolution:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="46"/>
+        <source>Details</source>
+        <translation>Détails</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="53"/>
+        <source>Sessions</source>
+        <translation>Sessions</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="60"/>
+        <source>Daily</source>
+        <translation>Quotidien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="85"/>
+        <source>Filename:</source>
+        <translation>Nom de Fichier:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="107"/>
+        <source>Cancel</source>
+        <translation>Annuler</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="114"/>
+        <source>Export</source>
+        <translation>Exporter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="131"/>
+        <source>Start:</source>
+        <translation>Début:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="154"/>
+        <source>End:</source>
+        <translation>Fin:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="192"/>
+        <source>Quick Range:</source>
+        <translation>Choix Rapide :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="60"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="122"/>
+        <source>Most Recent Day</source>
+        <translation>Jour le plus récent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="205"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="125"/>
+        <source>Last Week</source>
+        <translation>Semaine dernière</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="210"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="128"/>
+        <source>Last Fortnight</source>
+        <translation>Quatres deniers Jours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="215"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="131"/>
+        <source>Last Month</source>
+        <translation>Dernier mois</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="220"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="134"/>
+        <source>Last 6 Months</source>
+        <translation>Dernier 6 mois</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="225"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="137"/>
+        <source>Last Year</source>
+        <translation>Dernière année</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="230"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="119"/>
+        <source>Everything</source>
+        <translation>Tout</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="235"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="108"/>
+        <source>Custom</source>
+        <translation>Personalisé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="248"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="73"/>
+        <source>SleepyHead_</source>
+        <translation>SleepyHead_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="76"/>
+        <source>Details_</source>
+        <translation>Détails_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="78"/>
+        <source>Sessions_</source>
+        <translation>Sessions_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="80"/>
+        <source>Summary_</source>
+        <translation>Résumé_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="87"/>
+        <source>Select file to export to</source>
+        <translation>Choisir le fichier pour export</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="88"/>
+        <source>CSV Files (*.csv)</source>
+        <translation>Fichiers CSV (*.csv)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>DateTime</source>
+        <translation>Date et Heure</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Session</source>
+        <translation>Session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Event</source>
+        <translation>Evenement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Data/Duration</source>
+        <translation>Date/Durée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Date</source>
+        <translation>Date</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <source>Session Count</source>
+        <translation>Nb Session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Start</source>
+        <translation>Début</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>End</source>
+        <translation>Fin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>Total Time</source>
+        <translation>Temps Total</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>AHI</source>
+        <translation>IAH</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="207"/>
+        <source> Count</source>
+        <translation> Occurence</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="211"/>
+        <source> Avg</source>
+        <translation> Moy</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="215"/>
+        <source> %1%</source>
+        <translation>%1%</translation>
+    </message>
+</context>
+<context>
+    <name>FPIconLoader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="128"/>
+        <source>Import Error</source>
+        <translation>Erreur d'import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>This Machine Record cannot be imported in this profile.</source>
+        <translation>Import impossible des données de cette machined dans ce profil.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>The Day records overlap with already existing content.</source>
+        <translation>Les enregistrements du jour se chevauchent avec le contenu déjà existant.</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="441"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1007"/>
+        <source>&Statistics</source>
+        <translation>&Statistiques</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="981"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html></source>
+        <translation><html><head/><body><p><span style=" font-weight:600;">Attention: </span>Ceci est une  pré-version, certaines parties de ce programme peuvent ne pas fonctionner comme prévu.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="998"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1035"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3050"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3107"/>
+        <source>about:blank</source>
+        <translation>ausujet:blanc</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1073"/>
+        <source>Report Mode</source>
+        <translation>Type de Rapport</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1080"/>
+        <source>Standard</source>
+        <translation>Standard</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1090"/>
+        <source>Monthly</source>
+        <translation>Mensuel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1097"/>
+        <source>Date Range</source>
+        <translation>Période</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1141"/>
+        <source>&Help Browser</source>
+        <translation>&Aide</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1204"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1224"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1244"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="2932"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1317"/>
+        <source>qrc:/docs/index.html</source>
+        <translation>qrc:/docs/index.html</translation>
+    </message>
+    <message>
+        <source>&Navigation</source>
+        <translation type="vanished">&Navigation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1633"/>
+        <source>Statistics</source>
+        <translation>Statistiques</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1683"/>
+        <source>Daily</source>
+        <translation>Quotidien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1727"/>
+        <source>Overview</source>
+        <translation>Aperçus</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1771"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1096"/>
+        <source>Oximetry</source>
+        <translation>Oximètrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1821"/>
+        <source>Import</source>
+        <translation>Import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1871"/>
+        <source>Help</source>
+        <translation>Aide</translation>
+    </message>
+    <message>
+        <source>&Bookmarks</source>
+        <translation type="vanished">&Favoris</translation>
+    </message>
+    <message>
+        <source>&Records</source>
+        <translation type="vanished">&Enregistrer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3136"/>
+        <source>&File</source>
+        <translation>&Fichier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3154"/>
+        <source>&View</source>
+        <translation>&Vues</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3172"/>
+        <source>&Help</source>
+        <translation>&Aide</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3188"/>
+        <source>&Data</source>
+        <translation>&Données</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3192"/>
+        <source>&Advanced</source>
+        <translation>&Avancé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3396"/>
+        <source>&Automatic Oximetry Cleanup</source>
+        <translation>Nettoyage &Automatique de l'Oximétrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3487"/>
+        <source>Toggle &Line Cursor</source>
+        <translation>Activer le curseur type &Ligne</translation>
+    </message>
+    <message>
+        <source>Foo</source>
+        <translatorcomment>https://fr.wikipedia.org/wiki/Variable_m%C3%A9tasyntaxique</translatorcomment>
+        <translation type="vanished">cassé</translation>
+    </message>
+    <message>
+        <source>&Purge CPAP Data</source>
+        <translation type="vanished">&Purger les données de la PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3196"/>
+        <source>Purge Oximetery Data</source>
+        <translation>Purger les données de l'Oximetrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3212"/>
+        <source>Rebuild CPAP Data</source>
+        <translation>Reconstruire les données PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3250"/>
+        <source>&Import Data</source>
+        <translation>&Import de donnée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3253"/>
+        <source>Shift+F2</source>
+        <translation>Shift+F2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3258"/>
+        <source>&Preferences</source>
+        <translation>&Préférences</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3263"/>
+        <source>&Profiles</source>
+        <translation>&Profils Utilisateurs</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3268"/>
+        <source>Exit</source>
+        <translation>Quitter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="276"/>
+        <source>E&xit</source>
+        <translation>&Quitter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3273"/>
+        <source>View &Daily</source>
+        <translation>Vue &Quotidienne</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3276"/>
+        <source>F5</source>
+        <translation>F5</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3281"/>
+        <source>View &Overview</source>
+        <translation>Vue &Globale</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3284"/>
+        <source>F6</source>
+        <translation>F6</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3289"/>
+        <source>View &Welcome</source>
+        <translation>Vue &Bienvenue</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3292"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3439"/>
+        <source>F4</source>
+        <translation>F4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3297"/>
+        <source>-</source>
+        <translation>-</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3300"/>
+        <source>Ctrl+Tab</source>
+        <translation>Ctrl+Tab</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3308"/>
+        <source>Use &AntiAliasing</source>
+        <translation>Utiliser l'&AntiAliasing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3313"/>
+        <source>&About SleepyHead</source>
+        <translation>&Au sujet de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3321"/>
+        <source>&Fullscreen Toggle</source>
+        <translation>&Passer en plein écran</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3324"/>
+        <source>F11</source>
+        <translation>F11</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3332"/>
+        <source>Show Debug Pane</source>
+        <translation>Afficher le paneau de debug</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3337"/>
+        <source>&Reset Graph Layout</source>
+        <translation>&Réinitialiser la disposition des graphiques</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3342"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="273"/>
+        <source>Check for &Updates</source>
+        <translation>&Vérifier les mises à jour</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3347"/>
+        <source>Take &Screenshot</source>
+        <translation>&Faire une copie d'écran</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3350"/>
+        <source>F12</source>
+        <translation>F12</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3355"/>
+        <source>O&ximetry Wizard</source>
+        <translation>Assistant d'O&ximetrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3381"/>
+        <source>Exp&ort Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3520"/>
+        <source>Daily Calendar</source>
+        <translation>Calendrier Quotidien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3523"/>
+        <source>F9</source>
+        <translation>F9</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3528"/>
+        <source>Backup &Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>View O&ximetry</source>
+        <translation type="vanished">Vue O&xymetrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3358"/>
+        <source>F7</source>
+        <translation>F7</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3363"/>
+        <source>Print &Report</source>
+        <translation>Imprimer &Raport</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3368"/>
+        <source>&Edit Profile</source>
+        <translation>&Modifier le profil utilisateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3376"/>
+        <source>&Link Graph Groups</source>
+        <translation>&Lier les Goupe de Graphiquess</translation>
+    </message>
+    <message>
+        <source>Exp&ort</source>
+        <translation type="vanished">Exp&orter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3386"/>
+        <source>Online Users &Guide</source>
+        <translation>&Guide utilisateur en ligne</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3391"/>
+        <source>&Frequently Asked Questions</source>
+        <translation>Question &Fréquentes </translation>
+    </message>
+    <message>
+        <source>&Rebuild Oximetry Indices</source>
+        <translation type="vanished">&Reconstruire les indices d'Oximétrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3401"/>
+        <source>Change &User</source>
+        <translation>&Changer de profil utilisateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3406"/>
+        <source>Purge &Current Selected Day</source>
+        <translation>Purger le jour &Courant sélectionné</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3479"/>
+        <source>Current Days</source>
+        <translation>Jours courants</translation>
+    </message>
+    <message>
+        <source>&Current Selected Day</source>
+        <translation type="vanished">&Jour actuel </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3411"/>
+        <source>All data for current CPAP machine</source>
+        <translation>Toute les donnée pour la machine a PPC courante</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3422"/>
+        <source>Right &Sidebar</source>
+        <translation>&Barre latérale droite</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3490"/>
+        <source>Ctrl+L</source>
+        <translation>Ctrl+L</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3506"/>
+        <source>Daily Sidebar</source>
+        <translation>Barre latérale Quotidiènne</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3509"/>
+        <source>F8</source>
+        <translation>F8</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3430"/>
+        <source>View S&tatistics</source>
+        <translation>Voir les S&tatistiques</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1606"/>
+        <source>Navigation</source>
+        <translation>Navigation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3077"/>
+        <source>Records</source>
+        <translation>Enregistrements</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3202"/>
+        <source>Purge ALL CPAP Data</source>
+        <translation>Purger toutes les données de la PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3425"/>
+        <source>F10</source>
+        <translation>F10</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3433"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3436"/>
+        <source>View Statistics</source>
+        <translation>Voir les Statistiques</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3454"/>
+        <source>&Support SleepyHead Development</source>
+        <translation>Aider au développement de &SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3464"/>
+        <source>Change &Language</source>
+        <translation>Changer de &Langue</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3469"/>
+        <source>Change &Data Folder</source>
+        <translation>Changer de Répertoire des &Données</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3474"/>
+        <source>Import &Somnopose Data</source>
+        <translation>Importer des données &Somnopose</translation>
+    </message>
+    <message>
+        <source>View S&ummary</source>
+        <translation type="vanished">Vue &Résumée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3444"/>
+        <source>Import &ZEO Data</source>
+        <translation>Importer des données &ZEO</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3449"/>
+        <source>Import RemStar &MSeries Data</source>
+        <translation>Importer des données RemStar &MSeries</translation>
+    </message>
+    <message>
+        <source>&Support Sleepyhead Development</source>
+        <translation type="vanished">&Aider au développement de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3459"/>
+        <source>Sleep Disorder Terms &Glossary</source>
+        <translation>&Glossaire des termes de désordre du sommeil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="609"/>
+        <source>Loading Data</source>
+        <translation>Chargement en cours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1017"/>
+        <source>Importing Data</source>
+        <translation>Import en cours</translation>
+    </message>
+    <message>
+        <source>RDI</source>
+        <translation type="vanished">RDI</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation type="vanished">AHI</translation>
+    </message>
+    <message>
+        <source>No CPAP data available.</source>
+        <translation type="vanished">pas de donnée disponibles.</translation>
+    </message>
+    <message>
+        <source>%1 day of CPAP Data, on %2.</source>
+        <translation type="vanished">%1 jour de donnée , sur %2.</translation>
+    </message>
+    <message>
+        <source>%1 days of CPAP Data, between %2 and %3</source>
+        <translation type="vanished">%1 jours de donnée , entre  %2 et %3</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation type="vanished">Détails</translation>
+    </message>
+    <message>
+        <source>Most Recent</source>
+        <translation type="vanished">le plus récent</translation>
+    </message>
+    <message>
+        <source>Last 7 Days</source>
+        <translation type="vanished">Semaine dernière</translation>
+    </message>
+    <message>
+        <source>Last 30 Days</source>
+        <translation type="vanished">Dernier mois</translation>
+    </message>
+    <message>
+        <source>Last 6 months</source>
+        <translation type="vanished">Dernier 6 mois</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation type="vanished">Dernière année</translation>
+    </message>
+    <message>
+        <source>RERA Index</source>
+        <translation type="vanished">Indexe RERA</translation>
+    </message>
+    <message>
+        <source>Flow Limit Index</source>
+        <translation type="vanished">Index de Limitation du Flux</translation>
+    </message>
+    <message>
+        <source>Hours per Night</source>
+        <translation type="vanished">Heures par Nuit</translation>
+    </message>
+    <message>
+        <source>Min EPAP</source>
+        <translation type="vanished">EPAP Min</translation>
+    </message>
+    <message>
+        <source>%1% EPAP</source>
+        <translation type="vanished">%1% EPAP</translation>
+    </message>
+    <message>
+        <source>Max IPAP</source>
+        <translation type="vanished">IPAP Max</translation>
+    </message>
+    <message>
+        <source>%1% IPAP</source>
+        <translation type="vanished">%1% IPAP</translation>
+    </message>
+    <message>
+        <source>Average Pressure</source>
+        <translation type="vanished">Pression Moyenne</translation>
+    </message>
+    <message>
+        <source>%1% Pressure</source>
+        <translation type="vanished">Pression %1% </translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation type="vanished">Pression</translation>
+    </message>
+    <message>
+        <source>Average %1</source>
+        <translation type="vanished">%1 Moyenne </translation>
+    </message>
+    <message>
+        <source>%1% %2</source>
+        <translation type="vanished">%1% %2</translation>
+    </message>
+    <message>
+        <source>Oximetry Summary</source>
+        <translation type="vanished">Résumé d'Oximétrie</translation>
+    </message>
+    <message>
+        <source>%1 day of Oximetry Data, on %2.</source>
+        <translation type="vanished">%1 jour de donnée d'Oxymetrie , sur %2.</translation>
+    </message>
+    <message>
+        <source>%1 days of Oximetry Data, between %2 and %3</source>
+        <translation type="vanished">%1 jours de donnée d'Oxymetire, entre  %2 et %3</translation>
+    </message>
+    <message>
+        <source>Average SpO2</source>
+        <translation type="vanished">SpO2  Moyenne </translation>
+    </message>
+    <message>
+        <source>Minimum SpO2</source>
+        <translation type="vanished">SpO2  Minimum </translation>
+    </message>
+    <message>
+        <source>SpO2 Events / Hour</source>
+        <translation type="vanished">Evènement SpO2 /Heure</translation>
+    </message>
+    <message>
+        <source>% of time in SpO2 Events</source>
+        <translation type="vanished">% du temps en evènement SpO2</translation>
+    </message>
+    <message>
+        <source>Average Pulse Rate</source>
+        <translation type="vanished">Fréquence Pulsation Moyenne</translation>
+    </message>
+    <message>
+        <source>Minimum Pulse Rate</source>
+        <translation type="vanished">Fréquence Pulsation Mini</translation>
+    </message>
+    <message>
+        <source>Maximum Pulse Rate</source>
+        <translation type="vanished">Fréquence Pulsation Maxi</translation>
+    </message>
+    <message>
+        <source>Pulse Change Events / Hour</source>
+        <translation type="vanished">Changement de pulsation Nb/Heure</translation>
+    </message>
+    <message>
+        <source>Usage Information</source>
+        <translation type="vanished">Information d'utlisations</translation>
+    </message>
+    <message>
+        <source>Total Days</source>
+        <translation type="vanished">Jours Total</translation>
+    </message>
+    <message>
+        <source>Compliant Days</source>
+        <translation type="vanished">Jours Corrects</translation>
+    </message>
+    <message>
+        <source>Days AHI &gt;5.0</source>
+        <translation type="vanished">Jours AHI > 5.0</translation>
+    </message>
+    <message>
+        <source>Best&nbsp;%1</source>
+        <translation type="vanished">Meilleur &bnsp; %1</translation>
+    </message>
+    <message>
+        <source>Worst&nbsp;%1</source>
+        <translation type="vanished">Pire&nbsp;%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1091"/>
+        <source>CPAP</source>
+        <translation>PPC</translation>
+    </message>
+    <message>
+        <source>APAP</source>
+        <translation type="vanished">APAP</translation>
+    </message>
+    <message>
+        <source>Bi-Level</source>
+        <translation type="vanished">Bi-Level</translation>
+    </message>
+    <message>
+        <source>ST/ASV</source>
+        <translation type="vanished">ST/ASV</translation>
+    </message>
+    <message>
+        <source>Best RX Setting</source>
+        <translation type="vanished">Meilleur Réglages RX</translation>
+    </message>
+    <message>
+        <source>Mode</source>
+        <translation type="vanished">Mode</translation>
+    </message>
+    <message>
+        <source>Worst RX Setting</source>
+        <translation type="vanished">Pires Réglages RX</translation>
+    </message>
+    <message>
+        <source>EPAP</source>
+        <translation type="vanished">EPAP</translation>
+    </message>
+    <message>
+        <source>IPAPLo</source>
+        <translation type="vanished">IPAP bas</translation>
+    </message>
+    <message>
+        <source>IPAPHi</source>
+        <translation type="vanished">IPAP haut</translation>
+    </message>
+    <message>
+        <source>PS Min</source>
+        <translation type="vanished">PS Min</translation>
+    </message>
+    <message>
+        <source>PS Max</source>
+        <translation type="vanished">PS Max</translation>
+    </message>
+    <message>
+        <source>IPAP</source>
+        <translation type="vanished">IPAP</translation>
+    </message>
+    <message>
+        <source>PS</source>
+        <translation type="vanished">PS</translation>
+    </message>
+    <message>
+        <source>Min Pres.</source>
+        <translation type="vanished">Press. Min.</translation>
+    </message>
+    <message>
+        <source>Max Pres.</source>
+        <translation type="vanished">Pres. Max.</translation>
+    </message>
+    <message>
+        <source>First</source>
+        <translation type="vanished">Premier</translation>
+    </message>
+    <message>
+        <source>Last</source>
+        <translation type="vanished">Dernier</translation>
+    </message>
+    <message>
+        <source>Days</source>
+        <translation type="vanished">Jours</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation type="vanished">FL</translation>
+    </message>
+    <message>
+        <source>Machine</source>
+        <translation type="vanished">Machine</translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="vanished">Restants de Pressions.</translation>
+    </message>
+    <message>
+        <source>%5 %1% EPAP=%2<br/>%3% IPAP=%4</source>
+        <translation type="vanished">%5 %1% EPAP=%2<br/>%3% IPAP=%4</translation>
+    </message>
+    <message>
+        <source>%3 %1% Pressure=%2</source>
+        <translation type="vanished">%3 %1% Pression=%2</translation>
+    </message>
+    <message>
+        <source>Brand</source>
+        <translation type="vanished">Marque</translation>
+    </message>
+    <message>
+        <source>Model</source>
+        <translation type="vanished">Modele</translation>
+    </message>
+    <message>
+        <source>Serial</source>
+        <translation type="vanished">Numéro de série</translation>
+    </message>
+    <message>
+        <source>First Use</source>
+        <translation type="vanished">Première Utilisation</translation>
+    </message>
+    <message>
+        <source>Last Use</source>
+        <translation type="vanished">Dernière Utilisation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1293"/>
+        <source>Loading</source>
+        <translation>Chargement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1082"/>
+        <source>About SleepyHead</source>
+        <translation>Au sujet de SleepyHead</translation>
+    </message>
+    <message>
+        <source>There are no graphs visible to print</source>
+        <translation type="vanished">Pas de graphiques a imprimmer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1993"/>
+        <source>Bookmarks</source>
+        <translation>Favoris</translation>
+    </message>
+    <message>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation type="vanished">voulez vous afficher les zones favorites dans ce rapport?</translation>
+    </message>
+    <message>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation type="vanished">C'est long, ne touchez a rien en attendant.</translation>
+    </message>
+    <message>
+        <source>Printing %1 Report</source>
+        <translation type="vanished">Impression du rapport %1</translation>
+    </message>
+    <message>
+        <source>%1 Report</source>
+        <translation type="vanished">rapport %1</translation>
+    </message>
+    <message>
+        <source>Name:	 %1, %2
+</source>
+        <translation type="vanished">Nom: %1,%2</translation>
+    </message>
+    <message>
+        <source>DOB:	%1
+</source>
+        <translation type="vanished">Né le: %1</translation>
+    </message>
+    <message>
+        <source>Patient ID:	%1
+</source>
+        <translation type="vanished">Patient N°: %1</translation>
+    </message>
+    <message>
+        <source>Phone:	%1
+</source>
+        <translation type="vanished">Téléphone: %1</translation>
+    </message>
+    <message>
+        <source>Email:	%1
+</source>
+        <translation type="vanished">Courriel: %1</translation>
+    </message>
+    <message>
+        <source>
+Address:
+%1</source>
+        <translation type="vanished">
+Adresse:
+%1</translation>
+    </message>
+    <message>
+        <source>Mask Time: </source>
+        <translation type="vanished">Utilisation du masque: </translation>
+    </message>
+    <message>
+        <source>Bedtime: </source>
+        <translation type="vanished">Sommeil: </translation>
+    </message>
+    <message>
+        <source>Wake-up: </source>
+        <translation type="vanished">Réveil: </translation>
+    </message>
+    <message>
+        <source>Machine: </source>
+        <translation type="vanished">Machine: </translation>
+    </message>
+    <message>
+        <source>
+Mode: </source>
+        <translation type="vanished">Mode: </translation>
+    </message>
+    <message>
+        <source>ASV</source>
+        <translation type="vanished">ASV</translation>
+    </message>
+    <message>
+        <source>Unknown</source>
+        <translation type="vanished">Inconnue</translation>
+    </message>
+    <message>
+        <source>RDI	%1
+</source>
+        <translation type="vanished">RDI: %1</translation>
+    </message>
+    <message>
+        <source>AHI	%1
+</source>
+        <translation type="vanished">AHI: %1</translation>
+    </message>
+    <message>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation type="vanished">AI=%1 HI=%2 CAI=%3 </translation>
+    </message>
+    <message>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%</source>
+        <translation type="vanished">REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%</translation>
+    </message>
+    <message>
+        <source>UAI=%1 </source>
+        <translation type="vanished">UAI= %1</translation>
+    </message>
+    <message>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation type="vanished">NRI=%1 LKI=%2 EPI=%3</translation>
+    </message>
+    <message>
+        <source>Weight %1 </source>
+        <translation type="vanished">Poids %1 </translation>
+    </message>
+    <message>
+        <source>BMI %1 </source>
+        <translation type="vanished">BMI %1 </translation>
+    </message>
+    <message>
+        <source>Zombie %1/10 </source>
+        <translation type="vanished">Zombie %1/10 </translation>
+    </message>
+    <message>
+        <source>Reporting from %1 to %2</source>
+        <translation type="vanished">Rapport du %1 au %2</translation>
+    </message>
+    <message>
+        <source>Reporting data goes here</source>
+        <translation type="vanished">Localisation des donées des  rapports</translation>
+    </message>
+    <message>
+        <source>Entire Day's Flow Waveform</source>
+        <translation type="vanished">Flux du jour entier</translation>
+    </message>
+    <message>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation type="vanished">SleepyHead v%1 - http://sleepyhead.sourceforge.net</translation>
+    </message>
+    <message>
+        <source>Page %1 of %2</source>
+        <translation type="vanished">Page %1 sur %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="151"/>
+        <source>Profile</source>
+        <translation>Profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="942"/>
+        <source>Welcome</source>
+        <translation>Bienvenue</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="272"/>
+        <source>&About</source>
+        <translation>&Au sujet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="300"/>
+        <source>Loading...</source>
+        <translation>Chargement en cours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="866"/>
+        <source>Access to Import has been blocked while recalculations are in progress.</source>
+        <translation>Accès à l'importation bloqué pendant les recalculs en cours.</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="obsolete">Annuler</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="720"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2062"/>
+        <source>Please wait, importing from backup folder(s)...</source>
+        <translation>Patientez, importation de(s) dossier(s) de sauvegarde ...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="878"/>
+        <source>Please wait, scanning for CPAP data cards...</source>
+        <translation>Patientez,scan de la carte de donnée PPC...</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum.</source>
+        <translation type="vanished"><b> Attention: </ b> Cette pré-version est destinée aux bêta-testeurs uniquement. S'il vous plaît ne <b> PAS </ b> la diffuser à l'extérieur du Forum de test SLEEPYHEAD</translation>
+    </message>
+    <message>
+        <source>Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version.</source>
+        <translation type="vanished">S'il vous plaît rapportez les bugs au Forum Test SLEEPYHEAD, mais d'abord, vérifier le fil de discussion BUILD pour vou assurer que vous utilisez la dernière version.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="318"/>
+        <source>When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.</source>
+        <translation>Quand vous rapportez un bug, s'il vous plaît assurez-vous de fournir le numéro de version SleepyHead, les détails du système d'exploitation et de la machine PPC.</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes.</source>
+        <translation type="vanished"><b> Attention: </ b> Ce rapport généré par ce logiciel ne doit pas etre utilisé à des fins de vérification de conformité ou de diagnostic médical.</translation>
+    </message>
+    <message>
+        <source>These messages are only a temporary feature. Some people thought they were an error.</source>
+        <translation type="vanished">Ces messages sont temporaires. Certaines personnes pensaient q'il étaient une erreur.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Import Problem</source>
+        <translation>Problème d'import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Couldn't find any valid Machine Data at
+
+%1</source>
+        <translation>Impossible de trouver des données de la machine valident a
+
+%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="814"/>
+        <source>Please insert your CPAP data card...</source>
+        <translation>Insérez la carte de donnée PPC svp...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="899"/>
+        <source>CPAP Data Located</source>
+        <translation>Données PPC trouvés</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="916"/>
+        <source>Please wait, launching file dialog...</source>
+        <translation>Patientez, lancement du sélecteur de fichier..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="922"/>
+        <source>No CPAP data card detected, launching file dialog...</source>
+        <translation>Pas de carte détecté, lancement du sélecteur de fichier...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="928"/>
+        <source>Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder.</source>
+        <translation>S'il vous plaît choisissez le dossier racine ou la lettre de lecteur de votre carte de données, et non pas un sous-dossier.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="929"/>
+        <source>Import Reminder</source>
+        <translation>Rappel d'Import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1079"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Bienvenue dans SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1083"/>
+        <source>This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.</source>
+        <translation>Ce logiciel a été crée pour vous aider à visualiser les données de votre machine a PPC.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1085"/>
+        <source>SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.</source>
+        <translation>SleepyHead a été conçus par un développeur ayant l'expérience des troubles du sommeil et adapté selon les retours de nombreux testeurs également souffrant des mêmes troubles.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1087"/>
+        <source>This is a beta release, some features may not yet behave as expected.</source>
+        <translation>e logiciel est une version Beta (de test) et certaines fonctions peuvent se comporter de façons inattendues.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1088"/>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation>Merci de rapporter les erreurs sur la page web Sourceforge de SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1090"/>
+        <source>Currenly supported machines:</source>
+        <translation>Machine supportées :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1093"/>
+        <source>ResMed S9 models (CPAP, Auto, VPAP)</source>
+        <translation>ResMed S9 models (CPAP, Auto, VPAP)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1094"/>
+        <source>DeVilbiss Intellipap (Auto)</source>
+        <translation>DeVilbiss Intellipap (Auto)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1095"/>
+        <source>Fisher & Paykel ICON (CPAP, Auto)</source>
+        <translation>Fisher & Paykel ICON (CPAP, Auto)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1097"/>
+        <source>Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters</source>
+        <translation>les Oximetres Contec CMS50D+, CMS50E et CMS50F (pas 50FW) </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1098"/>
+        <source>ResMed S9 Oximeter Attachment</source>
+        <translation>ResMed S9 Oximeter Attachment</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1099"/>
+        <source>Online Help Resources</source>
+        <translation>Aide en ligne</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1100"/>
+        <source>Note:</source>
+        <translation>Note:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1101"/>
+        <source>I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.</source>
+        <translation>Ce navigateur web est conçus pour afficher l'aide de ce logiciel, il n'est pas recommandé de l'utiliser pour une utilisation intensive.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1103"/>
+        <source>(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)</source>
+        <translation>(Il ne propose par l'ncrytion de donnée SSL, donc ce ne serait pas une bonne idée de saisir des informations confidentiels avec ce navigateur)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1114"/>
+        <source>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/></source>
+        <translation>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Site Web du projet</a> chez SourceForge<br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1116"/>
+        <source>Further Information</source>
+        <translation>Plus d'information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1118"/>
+        <source>Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version.</source>
+        <translation>Voici la  <a href='qrc:/docs/release_notes.html'>note de publication</a> pour cette version.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1120"/>
+        <source>Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users.</source>
+        <translation>Plus quelques:  <a href='qrc:/docs/usage.html'>documentations d'utilisation</a>, et quelques informations importantes pour les utilisateurs de Mac.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1122"/>
+        <source>About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia</source>
+        <translation>Au sujet <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Des apnées du sommeil </a> sur Wikipedia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1125"/>
+        <source>Friendly forums to talk and learn about Sleep Apnea:</source>
+        <translation>Forum sur le sujet des apnées du Sommeil :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1126"/>
+        <source><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</source>
+        <translation><a href='http://www.cpaptalk.com'>Forum CPAPTalk</a>,</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>Copyright:</source>
+        <translation>Copyright:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>&copy;2011-2014</source>
+        <translation>&copy;2011-2014</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1137"/>
+        <source>License:</source>
+        <translation>Licence:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1138"/>
+        <source>This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>.</source>
+        <translation>Ce logiciel est publié sous licence <a href="qr:/COPYING">GNU License Publique</a>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1141"/>
+        <source>DISCLAIMER:</source>
+        <translation>ATTENTION:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1143"/>
+        <source>This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.</source>
+        <translation>Ce n'est <font color='red'><u>PAS</u></font> un logiciel médical. Cette application est tout juste un visualiseur de données, et en aucune manière ne garantie la précision ni l'exactitude des calculs ou des données affichées.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1145"/>
+        <source>The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.</source>
+        <translation>L'auteur ne sera PAS tenu responsable si qui que ce soit se blesse ou blesse un tiers en utilisant correctement ou non ce logiciel.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1147"/>
+        <source>Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.</source>
+        <translation>Votre médecin doit toujours votre première et principale source de conseils en ce qui concerne la gestion de votre santé.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1149"/>
+        <source>*** <u>Use at your own risk</u> ***</source>
+        <translation>***.<u>Utilisez le à vos risques et péril</u>.***</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>Revision:</source>
+        <translation>Révision:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>branch</source>
+        <translation>branche</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1331"/>
+        <source>Data Folder Location: <a href="file://%1">%2</a></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1355"/>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1366"/>
+        <source>Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2037"/>
+        <source>Are you sure you want to rebuild all CPAP data for the following machine:</source>
+        <translation>Etes-vous sûr de vouloir reconstruire toutes les données de PPC pour la machine suivante:  </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2040"/>
+        <source>Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way.</source>
+        <translation>S'il vous plaît notez que cela pourrait entraîner la perte de données graphiques si les sauvegardes internes de Sleepyhead ont été désactivées ou entravé.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2048"/>
+        <source>For some reason, SleepyHead does not have internal backups for the following machine:</source>
+        <translation>Pour une raison quelconque, Sleepyhead n'a pas sauvegardes internes pour la machine suivante:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2051"/>
+        <source>Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.</source>
+        <translation>Vu que vous avez fait vos <i> <b>  propre </b> sauvegardes pour l'ensemble de vos données PPC </i>, vous pouvez toujours effectuer cette opération, mais vous aurez à restaurer manuellement à partir de vos sauvegardes.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2052"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation>Etes-vous vraiement sur de vouloir faire cela ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2097"/>
+        <source>You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine:</source>
+        <translation>Vous êtes sur le point de <font size=+2>détruire</font> les données pour la machines suivante:  </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2100"/>
+        <source>Note as a precaution, the backup folder will be left in place.</source>
+        <translation>Par mesure de précaution, le dossier de sauvegarde sera laissé en place.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2101"/>
+        <source>Are you <b>absolutely sure</b> you want to proceed?</source>
+        <translation>Êtes-vous <b> absolument sûr</b> de vouloir continuer ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2124"/>
+        <source>A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:</source>
+        <translation>Une erreur d'autorisation de fichier à planté le processus de purge, vous devrez supprimer manuellement le dossier suivant :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2649"/>
+        <source>%1's Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>Choose where to save journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>XML Files (*.xml)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2065"/>
+        <source>Because there are no internal backups to rebuild from, you will have to restore from your own.</source>
+        <translation>Comme il n'y a pas de sauvegardes internes,vous devrez restaurer à partir de votre propre sauvegarde.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2066"/>
+        <source>Would you like to import from your own backups now? (you will have no data visible for this machine until you do)</source>
+        <translation>Voulez-vous importer vos propres sauvegardes maintenant? (vous n'aurez pas de données visibles pour cette machine jusqu'à ce que vous le fassiez)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2587"/>
+        <source>Are you sure you want to delete oximetry data for %1</source>
+        <translation>Voulez-vous effacer les données de l'oximètre pour %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2589"/>
+        <source><b>Please be aware you can not undo this operation!</b></source>
+        <translation><b>Attention cette opération ne peut etre annulée !</b></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2609"/>
+        <source>Select the day with valid oximetry data in daily view first.</source>
+        <translation>Séléctionez d'abord un jour avec des données valides dans la vue journalière.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1332"/>
+        <source>Copyright</source>
+        <translation>Copyright:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="314"/>
+        <source><b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="315"/>
+        <source>If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="316"/>
+        <source>Make sure your keep your SleepyHead data folder backed up when trying testing versions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="317"/>
+        <source>Please ensure you are running the latest version before reporting any bugs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="319"/>
+        <source>Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="320"/>
+        <source>Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="321"/>
+        <source>This red message line is intentional, and will not be a feature in the final version...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Imported %1 CPAP session(s) from
+
+%2</source>
+        <translation>%1 Session(s) importée(s) de 
+
+%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Import Success</source>
+        <translation>Import réussi</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Already up to date with CPAP data at
+
+%1</source>
+        <translation>déja a jour avec les donnée ici : 
+
+%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Up to date</source>
+        <translation>A jour</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="821"/>
+        <source>Choose a folder</source>
+        <translation>Choisissez un répertoire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="892"/>
+        <source>A %1 file structure for a %2 was located at:</source>
+        <translation>une structure de fichier %1 pour un %2 a été situé à:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="894"/>
+        <source>A %1 file structure was located at:</source>
+        <translation>une structure de fichier %1 a été trouvé a:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="901"/>
+        <source>Would you like to import from this location?</source>
+        <translation>Voulez-vous importer de cet emplacement ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="905"/>
+        <source>Specify</source>
+        <translation>Parcourir</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1106"/>
+        <source>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_User_Guide">Guide d'utilisation en ligne</a> de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1108"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Questions Fréquentes</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1110"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossaires des Termes des troubles du sommeil</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1112"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">Wiki de SleepyHead</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1127"/>
+        <source><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></source>
+        <translation><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1333"/>
+        <source>This software is released under the GNU Public License v3.0<br/></source>
+        <translation>Ce logiciel est distribué sous la licence Publique GNU V3.0</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1337"/>
+        <source>SleepyHead Project Page</source>
+        <translation>Site web du projet SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1340"/>
+        <source>SleepyHead Wiki</source>
+        <translation>Wiki de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1344"/>
+        <source>Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</source>
+        <translation>N'oubliez pas d'apprécier SleepyHead sur <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> ou <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1349"/>
+        <source>SleepyHead, brought to you by Jedimark</source>
+        <translation>SleepyHead, vous est proposé par Jedimark</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1353"/>
+        <source>Kudos & Credits</source>
+        <translation>Remerciements</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1354"/>
+        <source>Bugfixes, Patches and Platform Help:</source>
+        <translation>Débbugage, Correctifs et Aides :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Translators:</source>
+        <translation>Traducteurs:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1361"/>
+        <source>3rd Party Libaries:</source>
+        <translation>Librairies logiciel externes utilisées:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1362"/>
+        <source>SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>.</source>
+        <translation>SleepyHead utilise le <a href="http://qt-project.org">Framework QT</a>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1364"/>
+        <source>In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.</source>
+        <translation>Dans le module de mise à jour, SleepyHead utilise la librairie  <a href="http://sourceforge.net/projects/quazip">QuaZip</a> de Sergey A. Tachenov, qui encapsule le package ZIP/UNZIP de Gilles Vollant.</translation>
+    </message>
+    <message>
+        <source>Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="vanished">Un grand merci a Pugsy de <a href='http://cpaptalk.com'>CPAPTalk</a> pour son aide avec la documentation and les tutoriaux, ainsi qu'a tout ceux qui m'on aidé a tester et qui qui ont partagés leur données de PPC.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1371"/>
+        <source>Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.</source>
+        <translation>Merci d'utiliser SleepyHead. S'il vous est utile, merci d'aider au developement en faisant un don via Paypal.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1376"/>
+        <source>This software comes with absolutely no warranty, either express of implied.</source>
+        <translation>Ce logiciel est fournis sans aucune garantie explicte ou implicite.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1377"/>
+        <source>It comes with no guarantee of fitness for any particular purpose.</source>
+        <translation>Il n'est pas garantie de convenir à quelques usage que ce soit.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1378"/>
+        <source>No guarantees are made regarding the accuracy of any data this program displays.</source>
+        <translation>La précision des données affichées par ce programme n'est absoluement pas garantie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1380"/>
+        <source>This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.</source>
+        <translation>Ce n'est pas un logiciel médical, ce n'est qu'un logiciel de recherche qui fournit une représenation visuelle des données enregistrée par les appareils supportés.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1382"/>
+        <source>This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.</source>
+        <translation>Ce logiciel n'est pas adapté pour effectuer un quelconque diagnostique ou rapport de conformité , ou autre usage médical quelconque.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1385"/>
+        <source>The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation>The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1387"/>
+        <source>Use this software entirely at your own risk.</source>
+        <translation>Utilisez ce logiciel à vos risques et périls.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1456"/>
+        <source>Access to Preferences has been blocked until recalculation completes.</source>
+        <translation>Les Préférence sont bloquée pendant le recalcul.</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="obsolete">Question</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1092"/>
+        <source>Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)</source>
+        <translation>Philips Respironics System On (CPAP Pro, Auto, BiPAP et ASV)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1327"/>
+        <source>Build Date: %1 %2</source>
+        <translation>Date de compilation : %1 %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1329"/>
+        <source>Graphics Engine: %1</source>
+        <translation>Moteur Graphique: %1</translation>
+    </message>
+    <message>
+        <source>Data Folder Location: %1</source>
+        <translation type="vanished">Répertoire des données : %1</translation>
+    </message>
+    <message>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone.</source>
+        <translation type="vanished">James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl et Roy Stone.</translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here.</source>
+        <translation type="vanished">Arie Klerk (Hollandais), Steffen Reitz (Allemeand), Hao Chen (Chinois), Lars-Erik Söderström (Suédois,) Damien Vigneron (Français), et d'autre qu'il faut que je rajoute ici.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1545"/>
+        <source>There was an error saving screenshot to file "%1"</source>
+        <translation>Erreur en enregistrant la copie d'écran "%1"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1547"/>
+        <source>Screenshot saved to file "%1"</source>
+        <translation>Copie d'écran "%1" enregistrée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1567"/>
+        <source>Printing Disabled</source>
+        <translation>Impression déscativée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1568"/>
+        <source>Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt</source>
+        <translation>Merci de recompiler SleepyHead avec QT 4.8.5 ou plus, imprimer cause des plantages avec cette version de QT</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>Gah!</source>
+        <translation>Zut!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>If you can read this, the restart command didn't work. Your going to have to do it yourself manually.</source>
+        <translation>Veuillez redémmarer manuellement.</translation>
+    </message>
+    <message>
+        <source>Are you sure?</source>
+        <translation type="vanished">Etes vous sure ?</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:
+</source>
+        <translation type="vanished">Etes vous sur de vouloir purger tout les données pour la machine:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2287"/>
+        <source>Performance will be degraded during these recalculations.</source>
+        <translation>Les performances serons moindres pendant le recalcul.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2288"/>
+        <source>Recalculating Indices</source>
+        <translation>Recalcul des indices</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2300"/>
+        <source>Loading Event Data</source>
+        <translation>Chargement en cours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2302"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2362"/>
+        <source>Recalculating Summaries</source>
+        <translation>Recalcule des résumés</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2374"/>
+        <source>Restart Required</source>
+        <translation>Redémarage nécéssaire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2375"/>
+        <source>Recalculations are complete, the application now needs to restart to display the changes.</source>
+        <translation>Recalcul terminé, relancez l'application pour afficher les chagements.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Recalculations are now complete.</source>
+        <translation>Recalcul terminé.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Task Completed</source>
+        <translation>Tâche terminée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2404"/>
+        <source>There was a problem opening ZEO File: </source>
+        <translation>Problème à l'ouverture du fichier ZEO :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2408"/>
+        <source>Zeo CSV Import complete</source>
+        <translation>Import du Fichier CSV ZEO terminé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2430"/>
+        <source>There was a problem opening MSeries block File: </source>
+        <translation>Problème à l'ouverture du fichier MSeries :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2434"/>
+        <source>MSeries Import complete</source>
+        <translation>Import du Fichier terminé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2492"/>
+        <source>There was a problem opening Somnopose Data File: </source>
+        <translation>Problème à l'ouverture du fichier Somnopose :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2496"/>
+        <source>Somnopause Data Import complete</source>
+        <translation>Import du Fichier terminé</translation>
+    </message>
+</context>
+<context>
+    <name>MinMaxWidget</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1773"/>
+        <source>Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1774"/>
+        <source>Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1775"/>
+        <source>Override</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1776"/>
+        <source>The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1782"/>
+        <source>The Minimum Y-Axis value.. Note this can be a negative number if you wish.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1783"/>
+        <source>The Maximum Y-Axis value.. Must be greater than Minimum to work.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1818"/>
+        <source>Scaling Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1840"/>
+        <source>This button resets the Min and Max to match the Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>NewProfile</name>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="14"/>
+        <source>Edit User Profile</source>
+        <translation>Modifier le profil utilisateur</translation>
+    </message>
+    <message>
+        <source>Language</source>
+        <translation type="vanished">Langue</translation>
+    </message>
+    <message>
+        <source>English</source>
+        <translation type="vanished">Anglais</translation>
+    </message>
+    <message>
+        <source>Data Folder</source>
+        <translation type="vanished">Répertoire des données</translation>
+    </message>
+    <message>
+        <source>Shows the directory where SleepyHead data will be stored. </source>
+        <translation type="vanished">Affiche le répertoire où les données du logiciel seront sauvegardées.</translation>
+    </message>
+    <message>
+        <source>Click here to choose where to store SleepyHead data.</source>
+        <translation type="vanished">Cliquez ici pour choisir où mettre les données du logiciel.</translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation type="vanished">...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="70"/>
+        <source>I agree to all the conditions above.</source>
+        <translation>Je suis d'accord avec toutes ces conditions.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="111"/>
+        <source>User Information</source>
+        <translation>Information utlisateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="137"/>
+        <source>User Name</source>
+        <translation>Nom d'utilisateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="152"/>
+        <source>Keep the kids out.. Nothing more.. This isn't meant to be uber security.</source>
+        <translation>Eloigner les enfant. Rien de plus. Ce n'est pas non plus super sensible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="155"/>
+        <source>Password Protect Profile</source>
+        <translation>Profil protégé par mot de passe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="182"/>
+        <source>Password</source>
+        <translation>Mot de passe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="196"/>
+        <source>...twice...</source>
+        <translation>...et de deux...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="213"/>
+        <source>Locale Settings</source>
+        <translation>Réglage locaux </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="285"/>
+        <source>Country</source>
+        <translation>Pays</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="253"/>
+        <source>TimeZone</source>
+        <translation>Fuseau Horaire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="54"/>
+        <source>about:blank</source>
+        <translation>ausujet:blanc</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="240"/>
+        <source>DST Zone</source>
+        <translation>Zone heure d'été/Hiver</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="320"/>
+        <source>Personal Information (for reports)</source>
+        <translation>Information Personnel (pour les rapports)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="344"/>
+        <source>First Name</source>
+        <translation>Prénom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="354"/>
+        <source>Last Name</source>
+        <translation>Nom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="364"/>
+        <source>D.O.B.</source>
+        <translation>Né le. </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="380"/>
+        <source>Gender</source>
+        <translation>Sexe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="393"/>
+        <source>Male</source>
+        <translation>Homme</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="398"/>
+        <source>Female</source>
+        <translation>Femme</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="414"/>
+        <source>Height</source>
+        <translation>Taille</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="453"/>
+        <source>metric</source>
+        <translation>metre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="458"/>
+        <source>archiac</source>
+        <translation>archiac</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="471"/>
+        <source>Contact Information</source>
+        <translation>Coordonées</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="498"/>
+        <location filename="../sleepyhead/newprofile.ui" line="773"/>
+        <source>Address</source>
+        <translation>Adresse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="515"/>
+        <location filename="../sleepyhead/newprofile.ui" line="804"/>
+        <source>Email</source>
+        <translation>Courriel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="525"/>
+        <location filename="../sleepyhead/newprofile.ui" line="794"/>
+        <source>Phone</source>
+        <translation>Téléphone</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="570"/>
+        <source>CPAP Treatment Information</source>
+        <translation>Information sur le traitement PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="597"/>
+        <source>Date Diagnosed</source>
+        <translation>Date de diagnostic</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="611"/>
+        <source>Untreated AHI</source>
+        <translation>AHI non traité</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="625"/>
+        <source>CPAP Mode</source>
+        <translation>Mode de CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="633"/>
+        <source>CPAP</source>
+        <translation>PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="638"/>
+        <source>APAP</source>
+        <translation>APAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="643"/>
+        <source>Bi-Level</source>
+        <translation>Bi-Level</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="648"/>
+        <source>ASV</source>
+        <translation>ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="656"/>
+        <source>RX Pressure</source>
+        <translation>Pression RX</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="702"/>
+        <source>Doctors / Clinic Information</source>
+        <translation>Docteur / Informations sur la clinique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="729"/>
+        <source>Doctors Name</source>
+        <translation>Nom du médecin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="746"/>
+        <source>Practice Name</source>
+        <translation>Practice Name </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="756"/>
+        <source>Patient ID</source>
+        <translation>Identifiant du Patient</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="852"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="867"/>
+        <source>TextLabel</source>
+        <translation>TextLabel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="943"/>
+        <source>&Cancel</source>
+        <translation>&Annuler</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="959"/>
+        <source>&Back</source>
+        <translation>&Précédent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="975"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="275"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="284"/>
+        <source>&Next</source>
+        <translation>&Suivant</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="59"/>
+        <source>Select Country</source>
+        <translation>Choisissez le pays</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="109"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Bienvenue dans SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="111"/>
+        <source>This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</source>
+        <translation>Ce logiciel est conçus pour vous aider à visualiser les données de votre machine respiratoire à Pression continue (PPC) et équipement en rapport.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="114"/>
+        <source>SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</source>
+        <translation>SleepyHead est sous license <a href='qrc:/COPYING'>GNU Licence Publique</a> et vient sans aucune garantie et sans garantie de correspondre a un usage quelconque.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="116"/>
+        <source>PLEASE READ CAREFULLY</source>
+        <translation>MERCI DE LIRE ATTENTIVEMENT</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="117"/>
+        <source>SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.</source>
+        <translation>SleepyHead est un outil de visualisation de donnée et n'est pas un substitue à la compétence de votre médecin.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="120"/>
+        <source>Accuracy of any data displayed is not and can not be guaranteed.</source>
+        <translation>La précision des données n'est pas et ne peut pas etre garantie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="122"/>
+        <source>Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.</source>
+        <translation>Les rapports générés ne le sont QUE pour usage PERSONNEL et ne peuvent etre utilisé pour aucun diagnostique médical.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="125"/>
+        <source>The author will not be held liable for <u>anything</u> related to the use or misuse of this software.</source>
+        <translation>L'auteur n'est <u> en aucun cas </u> responsable de l' utilisation faites de ce logiciel.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="129"/>
+        <source>Use of this software is entirely at your own risk.</source>
+        <translation>Utilisez ce logiciel à vos risques et périls.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="132"/>
+        <source>SleepyHead is copyright &copy;2011-2014 Mark Watkins</source>
+        <translation>SleepyHeads (c) 2011-2014 par Mark Watkins</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="157"/>
+        <source>Please provide a username for this profile</source>
+        <translation>Merci de donner un nom à ce profil</translation>
+    </message>
+    <message>
+        <source>Empty Username</source>
+        <translation type="vanished">Nom d'utilisateur vide</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="167"/>
+        <source>Passwords don't match</source>
+        <translation>Non correspondance des mots de passe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Profile Changes</source>
+        <translation>Modifications du profile</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Accept and save this information?</source>
+        <translation>Accepter et sauvegarder ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="273"/>
+        <source>&Finish</source>
+        <translation>&Fin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="449"/>
+        <source>&Close this window</source>
+        <translation>&Fermer la fenetre</translation>
+    </message>
+</context>
+<context>
+    <name>Overview</name>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulaire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="68"/>
+        <source>Range:</source>
+        <translation>Durée:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="82"/>
+        <source>Last Week</source>
+        <translation>Semaine dernière</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="87"/>
+        <source>Last Two Weeks</source>
+        <translation>Dernières 2 semaines</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="92"/>
+        <source>Last Month</source>
+        <translation>Dernier mois</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="97"/>
+        <source>Last Two Months</source>
+        <translation>Dernier 2 mois</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="102"/>
+        <source>Last Three Months</source>
+        <translation>Dernier 3 mois</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="107"/>
+        <source>Last 6 Months</source>
+        <translation>Dernier 6 mois</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="112"/>
+        <source>Last Year</source>
+        <translation>Dernière année</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="117"/>
+        <source>Everything</source>
+        <translation>Tout</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="122"/>
+        <source>Custom</source>
+        <translation>Personalisé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="130"/>
+        <source>Start:</source>
+        <translation>Début:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="153"/>
+        <source>End:</source>
+        <translation>Fin:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="176"/>
+        <source>Reset view to selected date range</source>
+        <translation>Réinitialiser à la durée choisie </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="195"/>
+        <location filename="../sleepyhead/overview.ui" line="244"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="225"/>
+        <source>Toggle Graph Visibility</source>
+        <translation>Activer les Graphiques</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="260"/>
+        <source>Drop down to see list of graphs to switch on/off.</source>
+        <translation>Dérouler pour voir la liste des graphique a activer.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="264"/>
+        <source>Graphs</source>
+        <translation>Graphique</translation>
+    </message>
+    <message>
+        <source>RDI</source>
+        <translation type="vanished">IDR</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation type="vanished">IAH</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="123"/>
+        <source>Apnea
+Hypopnea
+Index</source>
+        <translation>Index des Apnée etHypopnée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage</source>
+        <translation>Utilisation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage
+(hours)</source>
+        <translation>Utilisation (heures)</translation>
+    </message>
+    <message>
+        <source>Flow Limit</source>
+        <translation type="vanished">Limitation du Flux</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times</source>
+        <translation>Durée Session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times
+(hours)</source>
+        <translation>Durée Session (Heures)s</translation>
+    </message>
+    <message>
+        <source>Pressure
+(cmH2O)</source>
+        <translation type="vanished">Pression 
+(cmH2O)s</translation>
+    </message>
+    <message>
+        <source>Settings</source>
+        <translation type="vanished">Réglages </translation>
+    </message>
+    <message>
+        <source>Leaks</source>
+        <translation type="vanished">Fuites</translation>
+    </message>
+    <message>
+        <source>Unintentional Leaks
+(L/min)</source>
+        <translation type="vanished">Fuites involontaires
+ (L/min)</translation>
+    </message>
+    <message>
+        <source>Total Leaks</source>
+        <translation type="vanished">Total Fuites</translation>
+    </message>
+    <message>
+        <source>Total Leaks
+(L/min)</source>
+        <translation type="vanished">Total Fuites 
+(L/min)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="121"/>
+        <source>Respiratory
+Disturbance
+Index</source>
+        <translation>Index des 
+désordres 
+respiratoires</translation>
+    </message>
+    <message>
+        <source>% in PB</source>
+        <translation type="vanished">% en RP</translation>
+    </message>
+    <message>
+        <source>Periodic
+Breathing
+(% of night)</source>
+        <translation type="vanished">Respiration
+Périodique
+(% de la nuit)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>% in %1</source>
+        <translation>% in %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <source>%1
+(% of night)</source>
+        <translation>%1
+(% de la nuit)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>Large Leaks
+(% of night)</source>
+        <translation>Fuites importantes
+(% de la nuit)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI</source>
+        <translation>IDR Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI
+Shows RDI Clusters
+(RDI/hr)</source>
+        <translation>IRD Max
+Affiche Regroupement
+(IDR/hr)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI</source>
+        <translation>IAH Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI
+Shows AHI Clusters
+(AHI/hr)</source>
+        <translation>IHA Max
+Affiche Regroupement
+(IHA/hr)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="161"/>
+        <source>
+(count)</source>
+        <translation>
+(occurence)</translation>
+    </message>
+    <message>
+        <source>Resp. Rate</source>
+        <translation type="vanished">Taux de respiration</translation>
+    </message>
+    <message>
+        <source>Respiratory
+Rate
+(breaths/min)</source>
+        <translation type="vanished">Taux de 
+respiration
+(resp.min)</translation>
+    </message>
+    <message>
+        <source>Tidal Volume</source>
+        <translation type="vanished">Volume normal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="157"/>
+        <source>Tidal
+Volume
+(ml)</source>
+        <translation>Tidal Volume (ml)</translation>
+    </message>
+    <message>
+        <source>Minute Vent.</source>
+        <translation type="vanished">Vent.Minute.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="158"/>
+        <source>Minute
+Ventilation
+(L/min)</source>
+        <translation>Vent.Minute.
+(L/min)</translation>
+    </message>
+    <message>
+        <source>Target Vent.</source>
+        <translation type="vanished">Vent.Cible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="159"/>
+        <source>Target
+Ventilation
+(L/min)</source>
+        <translation>Vent.Cible.
+(L/Min)</translation>
+    </message>
+    <message>
+        <source>Pat. Trig. Br.</source>
+        <translation type="vanished">Pat Trig Breath.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="160"/>
+        <source>Patient
+Triggered
+Breaths
+(%)</source>
+        <translation>Pat Trig Breath
+(%)</translation>
+    </message>
+    <message>
+        <source>Sessions</source>
+        <translation type="vanished">Sessions</translation>
+    </message>
+    <message>
+        <source>Sessions
+(count)</source>
+        <translation type="vanished">Nb Session</translation>
+    </message>
+    <message>
+        <source>Pulse Rate</source>
+        <translation type="vanished">Fréquence Pulsation</translation>
+    </message>
+    <message>
+        <source>Pulse Rate
+(bpm)</source>
+        <translation type="vanished">Fréquence Pulsation 
+(bpm)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="163"/>
+        <source>Oxygen Saturation
+(%)</source>
+        <translation>Saturation Oxygène
+(%)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="164"/>
+        <source>SensAwake
+(count)</source>
+        <translation>SensAwake
+(nombre)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="167"/>
+        <source>Body
+Mass
+Index</source>
+        <translation>Indice
+de Masse
+Corporel</translation>
+    </message>
+    <message>
+        <source>Zombie</source>
+        <translation type="vanished">Zombie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="168"/>
+        <source>How you felt
+(0-10)</source>
+        <translation>Sensation
+(0-10)</translation>
+    </message>
+    <message>
+        <source>Events/Hr</source>
+        <translation type="vanished">Evènement/Heure</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="185"/>
+        <source>Zombie Meter</source>
+        <translation>Zombie Metre</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation type="vanished">FL</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="254"/>
+        <source>breaths/min</source>
+        <translation>Resp./min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="262"/>
+        <source>L/b</source>
+        <translation>L/b</translation>
+    </message>
+    <message>
+        <source>L/m</source>
+        <translation type="vanished">L/m</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="284"/>
+        <source>%PTB</source>
+        <translation>%PTB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="311"/>
+        <source>% PB</source>
+        <translation>%PB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="314"/>
+        <source>% %1</source>
+        <translation>% %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="670"/>
+        <source>Show all graphs</source>
+        <translation>Afficher les Graphiques</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">Aucun Graphique !</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="683"/>
+        <source>Hide all graphs</source>
+        <translation>Cacher les Graphiques</translation>
+    </message>
+</context>
+<context>
+    <name>OximeterImport</name>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="14"/>
+        <source>Dialog</source>
+        <translation>Boite de dialogue</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="39"/>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="35"/>
+        <source>Oximeter Import Wizard</source>
+        <translation>Assistant d'import pour oximètre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="749"/>
+        <source>Skip this page next time.</source>
+        <translation>Ne plus voir cette page.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="789"/>
+        <source><html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html></source>
+        <translation><html><head><body><p>SleepyHead est compatible avec les oximètres Contec CMS50D+/E/F,<br/> tout comme avec les données du logiciel ChoiceMMed-MD300W1</p></body></htlm></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="823"/>
+        <source>Where would you like to import from?</source>
+        <translation>D'oû voulez-vous importer ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="846"/>
+        <source><html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html></source>
+        <translation><html><head/><body><p>cette option vous permet d'importer (via cable) les enregistrements internes de votre oximètre.</p><p>Après selection de cette option, certains oximètres peuvent nécéssiter une action dans leurs menu pour initialiser le téléversement.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="852"/>
+        <source>Directly from a recording on a device</source>
+        <translation>Directement à partir d'un enregistreur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="872"/>
+        <source><html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html></source>
+        <translation><html><head/><body><p>si cela ne vous gène pas d'etre relié à un ordinateur toute la nuit, cette option fournit un graphique plethysomogram , qui indique le rythme cardiaque, en complément des informations d'oxymétrie normales.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="878"/>
+        <source>Record attached to computer overnight (provides plethysomogram)</source>
+        <translation>Enregistrement rattaché à l'odinateur toute la nuit (fournit un plethysomograme)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="895"/>
+        <source><html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html></source>
+        <translation><html><head/><body><p>Cette option vous permet d'importer des données crées par le logiciel de votre oximètre, comme SpO2Review.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="901"/>
+        <source>Import from a datafile saved by another program, like SpO2Review</source>
+        <translation>Import d'un fichier de données externe, comme ceux de SpO2Review</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="942"/>
+        <source><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p>& [...]
+        <translation><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Rappel pour les utilisateur de PPC : </span><span style=" color:#fb0000;">avez vous pensé a importer votre session de PPC en premier ?</span></p><p>si vous l'oubliez,vous n'aurez pas une heure valide pour synchoniser la session d'oximetrie<br/><br/>Afin d'assurer une bonne synchronisat [...]
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="964"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1000"/>
+        <source>Please connect your oximeter device</source>
+        <translation>Connectez votre matériel d'Oximétrie SVP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1026"/>
+        <source>Press Start to commence recording</source>
+        <translation>Appuyez sur démarrer pour commencer à enregister</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1072"/>
+        <source>Show Live Graphs</source>
+        <translation>Afficher les graphiques en temps réel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1103"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1357"/>
+        <source>Duration</source>
+        <translation>Durée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1139"/>
+        <source>SpO2 %</source>
+        <translation>SpO2 %</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1221"/>
+        <source>Pulse Rate</source>
+        <translation>Fréquence Pulsation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1313"/>
+        <source>Multiple Sessions Detected</source>
+        <translation>Multiple Sessions Détectées</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1329"/>
+        <source>Please choose which one you want to import into SleepyHead</source>
+        <translation>Merci de séléctionner celle que vous voulez importer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1352"/>
+        <source>Start Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Import Time</source>
+        <translation type="vanished">Heure d'Import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1362"/>
+        <source>Details</source>
+        <translation>Détails</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1379"/>
+        <source>Import Completed. When did the recording start?</source>
+        <translation>Import terminé.Quand l'enregistrement a-t-il commencé ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1403"/>
+        <source>Day recording (normally would of) started</source>
+        <translation>Jour de début d'enregistrement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1449"/>
+        <source>Oximeter Starting time</source>
+        <translation>Heure de démarrage de l'Oximètre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1461"/>
+        <source>I want to use the time reported by my oximeter's built in clock.</source>
+        <translation>Utiliser l'heure de l'horloge interne de l'Oximètre.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1477"/>
+        <source>I started this oximeter recording at (or near) the same time as a session on my CPAP machine.</source>
+        <translation>J'ai démarré l'Oximètre Démarer en même temp que la session de la machine à Pression Continue.en même temp que la session de la machine à Pression Continue.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1506"/>
+        <source><html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html></source>
+        <translation><html><head/><body><p>SleepyHead nécéssite un horaire de départ pour savoir où sauver sa session d'oxymétrie.</p><p>Choisissez une des  options suivantes :</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1538"/>
+        <source><html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html></source>
+        <translation><html><head/><body><p>Note: Synchroniser avec l'horaire de démarrage de la session de PPC sera toujours plus précis.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1559"/>
+        <source>Choose CPAP session to sync to:</source>
+        <translation>Choisir la session PPC avec laquelle synchoniser :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1598"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1637"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1679"/>
+        <source>You can manually adjust the time here if required:</source>
+        <translation>Vous pouvez ajuster l'heure manuellement :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1700"/>
+        <source>HH:mm:ssap</source>
+        <translation>HH:mm:ssap</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1753"/>
+        <source>&Cancel</source>
+        <translation>&Annuler</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1760"/>
+        <source>&Information Page</source>
+        <translation>Page d'&Information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1780"/>
+        <source>&Retry</source>
+        <translation>&Recomencer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1787"/>
+        <source>&Choose Session</source>
+        <translation>&Choisir la Session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1794"/>
+        <source>&End Recording</source>
+        <translation>T&erminer l'Enregistrement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1801"/>
+        <source>&Sync and Save</source>
+        <translation>&Synchroniser et Sauvegarder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1808"/>
+        <source>&Save and Finish</source>
+        <translation>&Sauvegarder et Terminer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1815"/>
+        <source>&Start</source>
+        <translation>&Débuter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="170"/>
+        <source>Scanning for compatible oximeters</source>
+        <translation>Recherche d'un Oximètre compatible</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="202"/>
+        <source>Could not detect any connected oximeter devices.</source>
+        <translation>Aucun appareil détecté.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="209"/>
+        <source>Connecting to %1 Oximeter</source>
+        <translation>Connexion à l'Oximètre %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="269"/>
+        <source>"%1", session %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="288"/>
+        <source>Waiting for %1 to start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="289"/>
+        <source>Waiting for the device to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="291"/>
+        <source>Select upload option on %1</source>
+        <translation>Séléctionner l'option Transmettre sur %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="292"/>
+        <source>Waiting for you to start the upload process...</source>
+        <translation>En attente de démarrage de la transmission...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="323"/>
+        <source>%1 device is uploading data...</source>
+        <translation>%1 transmet des données...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="324"/>
+        <source>Please wait until oximeter upload process completes. Do not unplug your oximeter.</source>
+        <translation>Merci d'attendre la fin du transfert. Ne pas le débrancher pendant ce temps.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="341"/>
+        <source>Oximeter import completed..</source>
+        <translation>Import Terminé..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Select a valid oximetry data file</source>
+        <translation>Sélectionnez un fichier de donnée valide</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Oximetry Files (*.spo *.spor *.spo2 *.dat)</source>
+        <translation>Fichier d'Oximètre (*.spo *.spor *.spo2 *.dat)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="391"/>
+        <source>No Oximetery module could parse the given file:</source>
+        <translation>Impossible de traiter le fichier:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="413"/>
+        <source>Oximeter not detected</source>
+        <translation>Oximètre non détécté</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="420"/>
+        <source>Couldn't access oximeter</source>
+        <translation>Impossible d'accéder à l'Oximètre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="431"/>
+        <source>Live Oximetery Mode</source>
+        <translation>Mode Oximétrie temps réel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="434"/>
+        <source>Starting up...</source>
+        <translation>Démarrage...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="435"/>
+        <source>If you can still read this after a few seconds, cancel and try again</source>
+        <translation>Si vous pouvez lire ceci après quelques secondes, annulez et recomencez</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="478"/>
+        <source>Live Import Stopped</source>
+        <translation>Import temps-réel stoppé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="479"/>
+        <source>Live Oximetery Stopped</source>
+        <translation>Oximétrie temps-réel stoppé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="480"/>
+        <source>Live Oximetery import has been stopped</source>
+        <translation>Import temps-réel de l'Oximétrie stoppé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="527"/>
+        <source>%1 session(s) on %2, starting at %3</source>
+        <translation>%1 session(s) sur %2, démarrage a %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="531"/>
+        <source>No CPAP data available on %1</source>
+        <translation>Pas de données PPC disponible sur %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="537"/>
+        <source>%1</source>
+        <translation>%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="650"/>
+        <source>Recording...</source>
+        <translation>Enregistrement en cours...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="657"/>
+        <source>Finger not detected</source>
+        <translation>Doigt non détécté</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="750"/>
+        <source>I want to use the time my computer recorded for this live oximetry session.</source>
+        <translation>Utilisation de l'horaire d'enregistrement de l'ordinateur pour cette session d'oximétrie temps-réel.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="753"/>
+        <source>I need to set the time manually, because my oximeter doesn't have an internal clock.</source>
+        <translation>Réglage manuel du temps en l'absence d'horologe interne sur l'Oximètre.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="764"/>
+        <source>Something went wrong getting session data</source>
+        <translation>Erreur à la recupération des données de cette session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="993"/>
+        <source>CMS50 Session %1</source>
+        <translation>Session CMS50 %1</translation>
+    </message>
+</context>
+<context>
+    <name>Oximetry</name>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulaire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="89"/>
+        <source>Date</source>
+        <translation>Date</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="102"/>
+        <source>d/MM/yy h:mm:ss AP</source>
+        <translation>d/MM/yy h:mm:ss AP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="131"/>
+        <source>R&eset</source>
+        <translation>R&emettre a zéro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="160"/>
+        <source>SpO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="245"/>
+        <source>Pulse</source>
+        <translation>Pulsation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="346"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="366"/>
+        <source>&Open .spo/R File</source>
+        <translation>&Ouvrir Fic.spo/R</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="385"/>
+        <source>Serial &Import</source>
+        <translation>&Importer Série</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="398"/>
+        <source>&Start Live</source>
+        <translation>&Début Mesures</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="421"/>
+        <source>Serial Port</source>
+        <translation>Port série</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="450"/>
+        <source>&Rescan Ports</source>
+        <translation>&Rescanner les Ports</translation>
+    </message>
+    <message>
+        <source>Control</source>
+        <translation type="vanished">Controle</translation>
+    </message>
+    <message>
+        <source>No Oximetry Data</source>
+        <translation type="vanished">Pas de donnée</translation>
+    </message>
+    <message>
+        <source>Oximetry live recording has been terminated due to timeout.</source>
+        <translation type="vanished">L'enregistrement de l'oxymètrie a été terminé suite a un timeout.</translation>
+    </message>
+    <message>
+        <source>&Start</source>
+        <translation type="vanished">&Débuter</translation>
+    </message>
+    <message>
+        <source>Save Session?</source>
+        <translation type="vanished">Enregistrer la Sessions ?</translation>
+    </message>
+    <message>
+        <source>Creating a new oximetry session will destroy the old one.
+Would you like to save it first?</source>
+        <translation type="vanished">La création d'une nouvelle session d'oxymetrie va effacer la précédente.
+Voulez-vous l'enregistrer avant ? </translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation type="vanished">Enregistrer</translation>
+    </message>
+    <message>
+        <source>Destroy It</source>
+        <translation type="vanished">Détruire</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="vanished">Annuler</translation>
+    </message>
+    <message>
+        <source>Please Wait</source>
+        <translation type="vanished">Veuillez patienter</translation>
+    </message>
+    <message>
+        <source>Oximetry Error!
+
+Something is wrong with the device connection.</source>
+        <translation type="vanished">Erreur d'Oxymetrie
+
+Erreur de connexion au matériel.</translation>
+    </message>
+    <message>
+        <source>&Stop</source>
+        <translation type="vanished">&Stop</translation>
+    </message>
+    <message>
+        <source>Oximeter Error
+
+The device has not responded.. Make sure it's switched on.</source>
+        <translation type="vanished">Erreur d'Oxymetrie
+
+le matériel ne répond pas. Verifier qu'il est sous tension.</translation>
+    </message>
+    <message>
+        <source>Ready</source>
+        <translation type="vanished">Pret</translation>
+    </message>
+    <message>
+        <source>Oximeter Error
+
+The device did not respond.. Make sure it's switched on.</source>
+        <translation type="vanished">Erreur d'Oxymetrie
+
+le matériel ne répond pas. Verifier qu'il est sous tension.</translation>
+    </message>
+    <message>
+        <source>Please make sure your oximeter is switched on, and in the right mode to transmit data.</source>
+        <translation type="vanished">le matériel ne répond pas. Verifier qu'il est sous tension et dans le mode transmission de donée adéquat.</translation>
+    </message>
+    <message>
+        <source>Oximeter Error!</source>
+        <translation type="vanished">Erreur de l'Oximètre!</translation>
+    </message>
+</context>
+<context>
+    <name>PreferencesDialog</name>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="23"/>
+        <source>Preferences</source>
+        <translation>Préférences</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="58"/>
+        <source>&Import</source>
+        <translation>&Import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="79"/>
+        <source>Session Settings</source>
+        <translation>Réglage des sessions </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="102"/>
+        <source>Combine Close Sessions </source>
+        <translation>Fermeture combiné de Session (Combine Close Sessions)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="112"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="197"/>
+        <source>Minutes</source>
+        <translation>Minutes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="132"/>
+        <source>Multiple sessions closer together than this value will be kept on the same day.
+</source>
+        <translation>Les session plus rapprochées que cette valeur seront sur le même jour.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="187"/>
+        <source>Ignore Short Sessions</source>
+        <translation>Ignorer les session plus courte que </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="211"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></source>
+        <translation> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les Sessions plus courtes que cela ne serons pas affichées<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="252"/>
+        <source>Day Split Time</source>
+        <translation>Heure de séparation des jours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="262"/>
+        <source>Sessions starting before this time will go to the previous calendar day.</source>
+        <translation>Le sessions démarrée avant cette heure irons dans le jour précédent.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="282"/>
+        <source>Keep session data in memory to speed up revisiting days.</source>
+        <translation>Garder les données de session en mémoire pour accélérer l'utilisation quotidiene.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="285"/>
+        <source>Cache Session Data (uses more system memory)</source>
+        <translation>Mettre en cache les session </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="395"/>
+        <source>Session Storage Options</source>
+        <translation>Option de stockage des Sessions</translation>
+    </message>
+    <message>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+Sleepyhead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translation type="vanished">Ceci garde un copie de la carte SD des machines ResMes, 
+
+Les machines ResMed effacent les données précises après 7jours,
+et les graphique de plus de 30 jours..
+
+SleepyHead peut garder ces donnée si vous devez réinstaller.
+(Hautement recommandé, a moins que vous n'ayez pas de place disque ou que les graph ne vous intéressent pas) </translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (only for ResMed so far, highly recommended)</source>
+        <translation type="vanished">Créer une copie de la SD Card prendant l'Import (seulement pour les machines ResMed, hautement recommandé)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="435"/>
+        <source>This makes SleepyHead's data take around half as much space.
+But it makes import and day changing take longer.. 
+If you've got a new computer with a small solid state disk, this is a good option.</source>
+        <translation>Réduit de moitié l'occupation des donnée.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="440"/>
+        <source>Compress Session Data (makes SleepyHead data smaller, but day changing slower.)</source>
+        <translation>Compresser les donées de Session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="447"/>
+        <source>Compress ResMed (EDF) backups to save disk space.
+Backed up EDF files are stored in the .gz format, 
+which is common on Mac & Linux platforms.. 
+
+SleepyHead can import from this compressed backup directory natively.. 
+To use with ResScan will require the .gz files to be uncompressed first..</source>
+        <translation>Compresse la sauvegarde des machines ResMed (fichiers EDF en .gz).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="455"/>
+        <source>Compress SD Card Backups (slower first import, but makes backups smaller)</source>
+        <translation>Compression de la sauvegarde de la cate SD</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="467"/>
+        <source>The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes.</source>
+        <translation>Options affectant l'espace disque utilisé et la durée de l'import.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="477"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data.  </span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changer les option de compression ne recompresse pas automatiquement les données.</span></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="508"/>
+        <source>&CPAP</source>
+        <translation>&PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="535"/>
+        <source>CPAP Mask Information</source>
+        <translation>Information sur leMasque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="562"/>
+        <source>Mask Type</source>
+        <translation>Type du masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="569"/>
+        <source>Generic mask type. Select the one that's closest to your mask.</source>
+        <translation>Type de masque générique. Utilisez le plus ressemblant au votre.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="587"/>
+        <source>Description</source>
+        <translation>Description</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="594"/>
+        <source>The name of your mask, or at least the name you call it.</source>
+        <translation>Nom de votre masque.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="607"/>
+        <source>Method of unintentional leaks calculation if not provided by your machine.
+Note: Statistical Model is experimental.</source>
+        <translation>La méthode de caclul de fuite non volontaires n'est pas proposé par votre machine 
+Note : le modèle statistique est expérimental.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="612"/>
+        <source>Mask Profile</source>
+        <translation>Forme de masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="617"/>
+        <source>Statistical Model</source>
+        <translation>Modèle Statistique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="631"/>
+        <source>Leak calcs</source>
+        <translation>Calcul des Fuites</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="644"/>
+        <source>Started Using</source>
+        <translation>Début d'utilisation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="657"/>
+        <source>The date you started using this mask</source>
+        <translation>Date d'utilisation de ce masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="673"/>
+        <source>Leak Profile</source>
+        <translation>Suivi / fuite</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="687"/>
+        <source>Pressure</source>
+        <translation>Pression</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="692"/>
+        <source>Leak</source>
+        <translation>Fuite</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html></source>
+        <translation> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Le suivi des fuites ne fonctionne pas</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1153"/>
+        <source>Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA)</source>
+        <translation>Afficher le IDR (Index de Désordre Respiratoire) plutot que l'IAH Index Apnée/Hypopnée ( IDR=IAH + RERA)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1156"/>
+        <source>Use RDI instead of AHI (PRS1 only)</source>
+        <translation>Utiliser IDR plutôt que IAH (pour PRS1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1069"/>
+        <source>Don't show any compliance information</source>
+        <translation>Ne pas afficher les informations de conformité</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="318"/>
+        <source>Do not import sessions older than:</source>
+        <translation>Ne pas importer de session antérieures a :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="325"/>
+        <source>Sessions older than this date will not be imported</source>
+        <translation>Les sessions antérieures à cette date ne seront pas importées</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="351"/>
+        <source>dd MMMM yyyy</source>
+        <translation>dd MMMM yyyy</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1072"/>
+        <source>Show Compliance</source>
+        <translation>Afficher la conformité</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1105"/>
+        <source>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</source>
+        <translation>considérez les jours sous cette valeur comme non conforme. 4heures est considéré comme conforme.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1108"/>
+        <source> hours</source>
+        <translation>Heures</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1130"/>
+        <source>as over</source>
+        <translation>au plus (as over)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1137"/>
+        <source>of usage per night</source>
+        <translation>utilisation par nuit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="728"/>
+        <source>Enable/disable experimental event flagging enhancements. 
+It allows detecting borderline events, and some the machine missed.
+This option must be enabled before import, otherwise a purge is required.</source>
+        <translation>Activer/désactive le marquage amélioré expérimental 
+Permet de détécer le événements raté par certaines machines. 
+Option a activer avant import sinon une purge est nécéssaire. </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="733"/>
+        <source>Custom User Event Flagging</source>
+        <translation>Notifier les evénements Utilisateurs</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="797"/>
+        <source>Flow Restriction</source>
+        <translation>Restriction de Flux</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="843"/>
+        <source>Percentage of restriction in airflow from the median value. 
+A value of 20% works well for detecting apneas. </source>
+        <translation>% de restriction de flux a partir de la valeur médiane.
+Une valeur de 20% est adéquate pour détecter les apnées.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="760"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="847"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1432"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1487"/>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="875"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Le marquage personalisé est une méthode expérimentale de détection des evènement raté par la machine. Il ne sont <span style=" text-decoration: underline;">pas</span> pris en compte dans l' IAH (Index d'Apnée et Hypopnée). </span></p></body></html> </ [...]
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="821"/>
+        <source>Duration of airflow restriction</source>
+        <translation>Durée de restriction de flux d'air</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="804"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="824"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1377"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1406"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1477"/>
+        <source>s</source>
+        <translation>s</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="814"/>
+        <source>Event Duration</source>
+        <translation>Durée d'évènement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="857"/>
+        <source>Allow duplicates near machine events.</source>
+        <translation>Autoriser les évènement proche (allow duplicate near machine events).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="947"/>
+        <source>AHI/Hour Graph Settings</source>
+        <translation>Réglages du graphique AHI/Heure</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="983"/>
+        <source>Window</source>
+        <translation>Fenètre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="990"/>
+        <source>Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.</source>
+        <translation>Ajuste le nombre de donnée pour chaque poitn du graphique IAH/Heure.
+60 min par défaut. Il est hautement recommandé de le laisser à cette valeur.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="994"/>
+        <source> minutes</source>
+        <translation>Minutes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1010"/>
+        <source>Reset the counter to zero at beginning of each (time) window.</source>
+        <translation>RAZ du conteur a chaque début de fenêtre de temps.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1013"/>
+        <source>Zero Reset</source>
+        <translation>Remettre a zéro</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1029"/>
+        <source>CPAP Clock Drift</source>
+        <translation>Décalage d'horloge de PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1036"/>
+        <source>Don't touch this unless you know your CPAP clock is out.
+Try to sync it to your PC's clock (which should be synced to a timeserver)</source>
+        <translation>Ne pas modifier sauf si l'horloge PPC est déffecteuse.
+Essaye de la synchroniser avec l'Horloge du PC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1040"/>
+        <source> seconds</source>
+        <translation> secondes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="934"/>
+        <source>User definable threshold considered large leak</source>
+        <translation>Seuil de fuites importante personalisé </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="937"/>
+        <source> L/min</source>
+        <translation> L/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="924"/>
+        <source>Whether to show the leak redline in the leak graph</source>
+        <translation>Montrer la ligne rouge des fuites dans le graph</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="927"/>
+        <source>Show Leak Redline</source>
+        <translation>Afficher la ligne rouge des fuites</translation>
+    </message>
+    <message>
+        <source>&Events</source>
+        <translation type="vanished">&Evenements</translation>
+    </message>
+    <message>
+        <source>Not entirely sure if this will get to live or not..</source>
+        <translation type="vanished">Il n'est pas garantie que cela va fonctionner..</translation>
+    </message>
+    <message>
+        <source>Show</source>
+        <translation type="vanished">Affiche</translation>
+    </message>
+    <message>
+        <source>Colour</source>
+        <translation type="vanished">Couleur</translation>
+    </message>
+    <message>
+        <source>Event</source>
+        <translation type="vanished">Evenement</translation>
+    </message>
+    <message>
+        <source>ID</source>
+        <translation type="vanished">N°</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation type="vanished">Graphique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1189"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1261"/>
+        <source>Search</source>
+        <translation>Rechercher</translation>
+    </message>
+    <message>
+        <source>Filters the graph list. Simply start typing the name of the graph your looking for.</source>
+        <translation type="vanished">Filtre la liste des graphiques. Saisir le début du nom du graphique recherché.</translation>
+    </message>
+    <message>
+        <source>&Defaults</source>
+        <translation type="vanished">Par &Défaut</translation>
+    </message>
+    <message>
+        <source>Double click on the (Y-axis) min/max values to edit them</source>
+        <translation type="vanished">Double cliquez sur les valeur min/max pour les modifier (Axe Y)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1310"/>
+        <source>&Oximetry</source>
+        <translation>&Oximètrie</translation>
+    </message>
+    <message>
+        <source>Use Oximetry</source>
+        <translation type="vanished">Utiliser l'Oxymètrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1537"/>
+        <source>Type</source>
+        <translation>Oxymètre</translation>
+    </message>
+    <message>
+        <source>Contec CMS50</source>
+        <translation type="vanished">Contec CMS50</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2476"/>
+        <source><html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html></source>
+        <translation><htlm><head/><body><p>Fonctionnalités récement.désactivées. Elles reviendrons plus tard</p></body></html></translation>
+    </message>
+    <message>
+        <source>Overpriced ResMed S9 Oximeter</source>
+        <translation type="vanished">Oximètre ResMed S9 </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1550"/>
+        <source>Tries to forces the oximetry data to link with CPAP when possible.</source>
+        <translation>Essayer de forcer le lien entre les donnée oximetriques et de PPC si possible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1553"/>
+        <source>Link Oximetry and CPAP graphs</source>
+        <translation>Lier les graphiques d'Oxymétrire et PPC</translation>
+    </message>
+    <message>
+        <source>Flag changes in oximetry stats</source>
+        <translation type="vanished">mentioner les chagements de statistiques d'oximétrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1367"/>
+        <source>SPO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1429"/>
+        <source>Percentage drop in oxygen saturation</source>
+        <translation>% perdu lors de la saturation d'oxygène</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1422"/>
+        <source>Pulse</source>
+        <translation>Pulsation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1387"/>
+        <source>Sudden change in Pulse Rate of at least this amount</source>
+        <translation>Chagement soudain de fréquence pulsation d'au moins ce montant </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1390"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1514"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1521"/>
+        <source> bpm</source>
+        <translation> bpm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1374"/>
+        <source>Minimum duration of drop in oxygen saturation</source>
+        <translation>durée minimum de perte en saturation d'oxygène</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1403"/>
+        <source>Minimum duration of pulse change event.</source>
+        <translation>Durée minimum du chagement de pulsation.</translation>
+    </message>
+    <message>
+        <source>Discard chunks under</source>
+        <translation type="vanished">Passer les mesure inférieures à </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1474"/>
+        <source>Small chunks of oximetry data under this amount will be discarded.</source>
+        <translation>Les données d'oxymétrie sous cette valeur seront ignorées.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does <span style=" font-weight:600; text-decoration: underline;">not</span> have the correct timestamp needed to sync.</p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you start your Oximeters recording mode at <span style=" font-style:italic;">exactly </span>the same time you start your CPAP machine, you can now also achieve sync. </p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</p></body></html></source>
+        <translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Synchronisation des données d'Oxymétrie et de PPC</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Les donnée CMS50 importés de SpO2Review (des fichier .spoR) ou la méthode d'import en serie n'a pas</span> d'horodatage correct pour importer automatiquement</p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Le mode temps réel par cabel série est un façons de synchroniser les oxymètre CMS50, mais ne prend pas en compte la dérive de l'horloge des machines à PPC.</p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">si vous démarrer l'oxymètre<span style=" font-style:italic;"> exactement</span> en même temp que la machine a PPC vous pouvez réussir à les synchroniser. </p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">L'import par port série prend le temps de départ de la première session de PPC de la dernière nuit comme repère . (Pensez a importer les données de PPC auparavant !)</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1649"/>
+        <source>&General</source>
+        <translation>&Générale</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1798"/>
+        <source>General Settings</source>
+        <translation>Réglages Généraux </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1850"/>
+        <source>Daily view navigation buttons will skip over days without data records</source>
+        <translation>Le bouton Quotidien passe les jours sans données</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1853"/>
+        <source>Skip over Empty Days</source>
+        <translation>Ne pas prendre en compte les jours sans mesures</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1839"/>
+        <source>Allow use of multiple CPU cores where available to improve performance. 
+Mainly affects the importer.</source>
+        <translation>Autorise la parallélisation pour les processeurs multicoeurs pour améliorer les performance.
+Surtout pour l'import.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1843"/>
+        <source>Enable Multithreading</source>
+        <translation>Autoriser la parallélisation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1829"/>
+        <source>Bypass the login screen and load the most recent User Profile</source>
+        <translation>Pas de choix d'utilisateur, choisir le plus récent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1832"/>
+        <source>Skip Login Screen</source>
+        <translation>Pas d'écran de choix utilisateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1679"/>
+        <source>Changes to the following settings needs a restart, but not a recalc.</source>
+        <translation>Un chagement des réglages ci-dessous nécéssitera un redémarrage.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1166"/>
+        <source>Events</source>
+        <translation type="unfinished">Evènements</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1355"/>
+        <source>Flag rapid changes in oximetry stats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1448"/>
+        <source>Other oximetry options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1454"/>
+        <source>Flag SPO2 Desaturations Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1464"/>
+        <source>Discard segments under</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1494"/>
+        <source>Flag Pulse Rate Above</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1504"/>
+        <source>Flag Pulse Rate Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1574"/>
+        <source>Contec CMS50D+/E/F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1579"/>
+        <source>Contec CMS50F v3.7+</source>
+        <translation type="unfinished">Contec CMS50F v3.7+ {50F?}</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1584"/>
+        <source>ChoiceMMed MD300W1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1589"/>
+        <source>ResMed S9 Oximeter Module</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1610"/>
+        <source>If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1613"/>
+        <source>Update Oximeter Clock during import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1682"/>
+        <source>Preferred Calculation Methods</source>
+        <translation>Choix de la méthode de calcul</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1709"/>
+        <source>Middle Calculations</source>
+        <translation>Calcul du Milieu</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1716"/>
+        <source>Upper Percentile</source>
+        <translation>Pourcentage haut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1723"/>
+        <source>For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.</source>
+        <translation>Les utilisateurs de ResMed devrait utiliser le pourcentage 95 Ici pour une meilleur visualisation.
+Car c'est la seul valeur possible dans ce cas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1737"/>
+        <source>Median is recommended for ResMed users.</source>
+        <translation>Médian est recommande pour les machines ResMed.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1741"/>
+        <source>Median</source>
+        <translation>Médian</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1746"/>
+        <source>Weighted Average</source>
+        <translation>Moyenne pondérée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1751"/>
+        <source>Normal Average</source>
+        <translation>Moyenne simple</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1771"/>
+        <source>ResMed users probably should use 99th Percentile for visual consistency.</source>
+        <translation>Les utilisateurs de ResMed devrait utiliser le pourcentage 99 pour une meilleur visualisation.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1775"/>
+        <source>True Maximum</source>
+        <translation>Maximum réel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1780"/>
+        <source>99% Percentile</source>
+        <translation>99% Pourcent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1788"/>
+        <source>Maximum Calcs</source>
+        <translation>Calculs Maximum</translation>
+    </message>
+    <message>
+        <source>Import Locations</source>
+        <translation type="vanished">  Importer de</translation>
+    </message>
+    <message>
+        <source>Add</source>
+        <translation type="vanished">Ajouter</translation>
+    </message>
+    <message>
+        <source>Remove</source>
+        <translation type="vanished">Enlever</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1892"/>
+        <source>Automatically Check For Updates</source>
+        <translation>Vérifier les mises à jour automatiquement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1909"/>
+        <source>Check for new version every</source>
+        <translation>Verifier les nouvelles versions tout les</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1916"/>
+        <source>Sourceforge hosts this project for free.. Please be considerate of their resources..</source>
+        <translation>Sourceforge héberge gratuitement ce projet, soyez respectueux de leur bande passante.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1932"/>
+        <source>days.</source>
+        <translation>Jours.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1997"/>
+        <source>&Check for Updates now</source>
+        <translation>&Vérifier les mises à jour </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2020"/>
+        <source>Last Checked For Updates: </source>
+        <translation>Dernière Vérification de disponibilité de mise à jour: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2033"/>
+        <source>TextLabel</source>
+        <translation>TextLabel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2055"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></source>
+        <translation> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> Pour tester les nouveautés cliquez ici</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Attention sans garantie de bon fonctionnement</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2064"/>
+        <source>I want to try experimental and test builds (Advanced users only please.)</source>
+        <translation>Je veux essayer les versions expérimentales (Utilisateur confirmé seulement) </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2088"/>
+        <source>&Appearance</source>
+        <translation>&Apparence</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2120"/>
+        <source>Graph Settings</source>
+        <translation>Réglages du graphique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2127"/>
+        <source>Bar Tops</source>
+        <translation>Haut des bars</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2132"/>
+        <source>Line Chart</source>
+        <translation>Graphique en Ligne </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2140"/>
+        <source>Overview Linecharts</source>
+        <translation>Lignes résumé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2165"/>
+        <source><html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html></source>
+        <translation><html><head><body><p>Permet de défiler plus facilement avec les touchpad bidirectionels en mode zoom</p><p>50 ms est une valeur recommandée.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2193"/>
+        <source>milliseconds</source>
+        <translation>millisecondes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2259"/>
+        <source>Scroll Dampening</source>
+        <translation>Défilement adoucis</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2304"/>
+        <source>Graph Tooltips</source>
+        <translation>Bulle d'aide du graphique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2327"/>
+        <source>Top Markers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2351"/>
+        <source>Overlay Flags</source>
+        <translation>Marque de dépassement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2317"/>
+        <source>The visual method of displaying waveform overlay flags.
+</source>
+        <translation>Méthode visuelle d'affichage des marque de limite des courbes.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2322"/>
+        <source>Standard Bars</source>
+        <translation>Barres standards</translation>
+    </message>
+    <message>
+        <source>Top & Bottom Markers</source>
+        <translation type="vanished">Marque de plafond et de plancher</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2335"/>
+        <source>Graph Height</source>
+        <translation>Hauteur des graph</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2285"/>
+        <source>Default display height of graphs in pixels</source>
+        <translation>Afficher la hauteur des graph en pixels</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="361"/>
+        <source>Summary only data is more accurate for ResMed users if this is left on.</source>
+        <translation>Le résumé des donné est plus précis pour les utilisateurs de ResMed si ceci est activé.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="364"/>
+        <source>Don't Split Summary Days</source>
+        <translation>Ne pas séparer le jours résumé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="419"/>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+SleepyHead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translation>Ceci garde un copie de la carte SD des machines ResMes, 
+
+Les machines ResMed effacent les données précises après 7jours,
+et les graphique de plus de 30 jours..
+
+SleepyHead peut garder ces donnée si vous devez réinstaller.
+(Hautement recommandé, a moins que vous n'ayez pas de place disque ou que les graph ne vous intéressent pas) </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="428"/>
+        <source>Create SD Card Backups during Import (Turn this off at your own peril!)</source>
+        <translation>Créer des sauvegardes de la carte SD pendant l'importation (Désactivez cette option à vos risques et périls!)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="770"/>
+        <source>Show in Event Breakdown Piechart</source>
+        <translation>Montrer en la répartition des évènements en cammenbert</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="777"/>
+        <source>#1</source>
+        <translation>#1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="784"/>
+        <source>#2</source>
+        <translation>#2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="905"/>
+        <source>This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.</source>
+        <translation>Cette option expérimentale tente d'utiliser le système de repérage de SleepyHead pour améliorer la détection d'évènement de position.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="908"/>
+        <source>Resync Machine Detected Events (Experimental)</source>
+        <translation>Resynchro. des évènements detectés par la machine</translation>
+    </message>
+    <message>
+        <source>C&hannels</source>
+        <translation type="vanished">C&haine</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1212"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1284"/>
+        <source>Reset &Defaults</source>
+        <translation>Remettre aux valeurs par défaut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1225"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1297"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></source>
+        <translation><html><head/><body><p><span style=" font-weight:600;">Attention: </span>c'est n'est parceque c'est possible que c'est la bonne méthode</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1331"/>
+        <source>Oximetery Settings</source>
+        <translation>Réglages de l'oximétrie</translation>
+    </message>
+    <message>
+        <source>Contec CMS50D+</source>
+        <translation type="vanished">Contec CMS50+</translation>
+    </message>
+    <message>
+        <source>Contec CMS50E/F</source>
+        <translation type="vanished">Contec CMS50E/F</translation>
+    </message>
+    <message>
+        <source>Contec CMS50F v3.7</source>
+        <translation type="vanished">Contec CMS50F v3.7</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1629"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style= [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">t [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncrhonisation de données d'Oximetrie et de PPC</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Données de CMS50 importées de SpO2Review (de .spoR files) ou l'import par port série n'a </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">pas</span>< [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">L'affichage temps réel (avec le cable série) est une façons de synchroniser précisement un Oximètre CMS50, mais ne prend pas en compte le décalage de la machine à PPC.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">si vous démarrez votre enreigstreemnt d'oximétrie  a</span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactement </span><span style=" font-family:'Sans'; font-size:10 [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">L'import par port série prend l'horaire de départ de la première session de PPC de la dernière nuit. (Rappelez vous d'importer vos données PPC en premier !)</span></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1819"/>
+        <source>Show flags for machine detected events that haven't been identified yet.</source>
+        <translation>Afficher les marqueurs des évènement détectés mais non identifiés.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1822"/>
+        <source>Show Unknown Flags</source>
+        <translation>Affiche les marqueurs inconnues</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1860"/>
+        <source>Import without nagging</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2213"/>
+        <source>How long you want the tooltips to stay visible.</source>
+        <translation>Durée d'affichage des astuces.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2269"/>
+        <source>Tooltip Timeout</source>
+        <translation>Durée des Astuce</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2361"/>
+        <source>Line Thickness</source>
+        <translation>Epaisseur des lignes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2373"/>
+        <source>The pixel thickness of line plots</source>
+        <translation>Epaisseur de la ligne en pixel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2422"/>
+        <source>Other Visual Settings</source>
+        <translation>Autre réglages visuels</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2428"/>
+        <source>Anti-Aliasing applies smoothing to graph plots.. 
+Certain plots look more attractive with this on. 
+This also affects printed reports.
+
+Try it and see if you like it.</source>
+        <translation>Anti-Aliasing pour les graphiques
+Certains sont plus beau ainsi 
+Cela affecte aussi les impressions
+
+A essayer pour voir.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2435"/>
+        <source>Use Anti-Aliasing</source>
+        <translation>Utiliser l'AntiAliasing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2442"/>
+        <source>Makes certain plots look more "square waved".</source>
+        <translation>Rendre certain tacés plus "carré".</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2445"/>
+        <source>Square Wave Plots</source>
+        <translation>Points Carrés</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2452"/>
+        <source>Allows graphs to be "screenshotted" for display purposes.
+The Event Breakdown PIE chart uses this method, as does
+the printing code.
+Unfortunately some older computers/versions of Qt can cause
+this application to be unstable with this feature enabled.</source>
+        <translation>Autoriser les copie d'écran. 
+Peut causer des soucis avec les versions obsolete de QT.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2459"/>
+        <source>Show event breakdown pie chart</source>
+        <translation>Graphique des evenements de breakdown</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2466"/>
+        <source>Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</source>
+        <translation>Le cache des Pixels est une technique d'accéleration graphique qui peut poser des soucis à l'affichage des caractères sur votre plateforme.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2469"/>
+        <source>Use Pixmap Caching</source>
+        <translation>Utiliser le cache des pixel</translation>
+    </message>
+    <message>
+        <source>Turn on/off the spinning "context" cube.
+It really doesn't use that much resources.. :)</source>
+        <translation type="vanished">Active/Désactive le cube rotatif "contex"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2479"/>
+        <source>Animations && Fancy Stuff</source>
+        <translation>Animation et effets </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2486"/>
+        <source>Whether to allow changing yAxis scales by double clicking on yAxis labels</source>
+        <translation>Autoriser de changer l'axe des y en double cliquant sur l'intitulé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2489"/>
+        <source>Allow YAxis Scaling</source>
+        <translation>Autoriser la mise à l'échelle de l'axe Y</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2508"/>
+        <source>Application Fonts</source>
+        <translation>Fontes de l'application</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2543"/>
+        <source>Font</source>
+        <translation>Fontes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2562"/>
+        <source>Size</source>
+        <translation>Taille</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2581"/>
+        <source>Bold  </source>
+        <translation>Gras</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2603"/>
+        <source>Italic</source>
+        <translation>Italique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2616"/>
+        <source>Application</source>
+        <translation>Application</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2680"/>
+        <source>Graph Text</source>
+        <translation>Texte des Graphiques</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2741"/>
+        <source>Graph Titles</source>
+        <translation>Titres des Graphiques</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2802"/>
+        <source>Big  Text</source>
+        <translation>Grand Texte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2863"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="410"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="530"/>
+        <source>Details</source>
+        <translation>Détails</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2920"/>
+        <source>&Cancel</source>
+        <translation>&Annuler</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2927"/>
+        <source>&Ok</source>
+        <translation>&Ok</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="68"/>
+        <source>Nasal Pillows</source>
+        <translation>Coussin nasal</translation>
+    </message>
+    <message>
+        <source>Span Events</source>
+        <translation type="vanished">Envergure des evènements</translation>
+    </message>
+    <message>
+        <source>Flags</source>
+        <translation type="vanished">Marque</translation>
+    </message>
+    <message>
+        <source>Minor Flags</source>
+        <translation type="vanished">Maque mineur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1238"/>
+        <source>Waveforms</source>
+        <translation>Oscillation</translation>
+    </message>
+    <message>
+        <source>Data Channels</source>
+        <translation type="vanished">Chaine de donée</translation>
+    </message>
+    <message>
+        <source>Settings Channels</source>
+        <translation type="vanished">Réglage des chaines</translation>
+    </message>
+    <message>
+        <source>Unknown Channels</source>
+        <translation type="vanished">Chaine inconnue</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="406"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="525"/>
+        <source>Name</source>
+        <translation>Nom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="407"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="526"/>
+        <source>Color</source>
+        <translation>Couleur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="409"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="529"/>
+        <source>Label</source>
+        <translation>Libellé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="709"/>
+        <source>Data Reindex Required</source>
+        <translation>Réindexation des données nécéssaire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="710"/>
+        <source>A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.
+
+Are you sure you want to make these changes?</source>
+        <translation>Il faudra réindexer les données ce qui prendra quelques minutes
+
+Etes-vous sur de vouloir le faire ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="716"/>
+        <source>Restart Required</source>
+        <translation>Redémarage nécéssaire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="717"/>
+        <source>One or more of the changes you have made will require this application to be restarted,
+in order for these changes to come into effect.
+
+Would you like do this now?</source>
+        <translation>Ces modfications vont nécésiter un redémarrage de l'application pour etre effectives
+
+Voulez-vous le faire maintenant ?</translation>
+    </message>
+    <message>
+        <source>Add this Location to the Import List</source>
+        <translation type="vanished">Ajouter la localisation à la liste d'imporation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="61"/>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="62"/>
+        <source>Minor Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="63"/>
+        <source>Span</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="64"/>
+        <source>Always Minor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="408"/>
+        <source>Flag Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="425"/>
+        <source>CPAP Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="426"/>
+        <source>Oximeter Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="427"/>
+        <source>Positional Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="428"/>
+        <source>Sleep Stage Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="429"/>
+        <source>Unknown Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="468"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="589"/>
+        <source>Double click to change the descriptive name this channel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="476"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="596"/>
+        <source>Double click to change the default color for this channel plot/flag/data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="484"/>
+        <source>Here you can change the type of flag shown for this event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="489"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="612"/>
+        <source>This is the short-form label to indicate this channel on screen.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="495"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="618"/>
+        <source>This is a description of what this channel does.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="527"/>
+        <source>Lower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="528"/>
+        <source>Upper</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="546"/>
+        <source>CPAP Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="547"/>
+        <source>Oximeter Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="548"/>
+        <source>Positional Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="549"/>
+        <source>Sleep Stage Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="602"/>
+        <source>Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="607"/>
+        <source>Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Daily Graphs</source>
+        <translation type="vanished">Graphiques Quotidien</translation>
+    </message>
+    <message>
+        <source>Overview Graphs</source>
+        <translation type="vanished">Graphique généraux</translation>
+    </message>
+    <message>
+        <source>Graph</source>
+        <translation type="vanished">Graphique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1095"/>
+        <source>This may not be a good idea</source>
+        <translation>Cela n'est peut etre pas une bonne idée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1096"/>
+        <source>ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).</source>
+        <translation>Les machines ResMed S9 effacent régulièrement les données de plus de 7 ou 30 jours de la carte SD (selon la résolution).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1097"/>
+        <source>If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.</source>
+        <translation>Si vous avez besoin un jour de réimporter ces données (dans SleepyHead ou ResScan) ces données aurons disparues.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1098"/>
+        <source>If you need to conserve disk space, please remember to carry out manual backups.</source>
+        <translation>Si vous avez besoin de consever de l'espace disque, n'oubliez pas de faire des sauvegardes manuels.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1099"/>
+        <source>Are you sure you want to disable these backups?</source>
+        <translation>Etes-vous sur de vouloire désactiver ces sauvegardes ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1141"/>
+        <source>Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.</source>
+        <translation>Désactiver les sauvegardes automatiques n'est pas une bonne idée, car SleepyHead a besoin de reconstruire sa base de donnée si des erreurs apparaissent.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1142"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation>Etes-vous vraiement sur de vouloir faire cela ?</translation>
+    </message>
+    <message>
+        <source>Min</source>
+        <translation type="vanished">Min</translation>
+    </message>
+    <message>
+        <source>Max</source>
+        <translation type="vanished">Max</translation>
+    </message>
+    <message>
+        <source>N/A</source>
+        <translation type="vanished">N/A</translation>
+    </message>
+    <message>
+        <source>Oximetry Graphs</source>
+        <translation type="vanished">Graphiques d'Oxymétrie</translation>
+    </message>
+    <message>
+        <source>Confirmation</source>
+        <translation type="vanished">Confirmation</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to reset your graph preferences to the defaults?</source>
+        <translation type="vanished">Voulez vous vraiement réinitialiser les préférence des Graphiques aux valeurs par défaut ?</translation>
+    </message>
+</context>
+<context>
+    <name>ProfileSelect</name>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="14"/>
+        <source>Select Profile</source>
+        <translation>Séléctionez le profil utilisateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="115"/>
+        <source>Search:</source>
+        <translation>Rechercher:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="188"/>
+        <source>Start with the selected user profile.</source>
+        <translation>Démarrer avec le profil sélectionné.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="212"/>
+        <source>Create a new user profile.</source>
+        <translation>Créer un nouveau profil utilisateur.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="232"/>
+        <source>Choose a different SleepyHead data folder.</source>
+        <translation>Choisir un répertoire différent pour les données.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="238"/>
+        <source>&Different Folder</source>
+        <translation>Répertoire &Différent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="271"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="284"/>
+        <source>[version]</source>
+        <translation>[version]</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="307"/>
+        <source>Click here if you didn't want to start SleepyHead.</source>
+        <translation>Cliquer ici pour ne pas lancer SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="310"/>
+        <source>&Quit</source>
+        <translation>&Quitter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="367"/>
+        <source>Folder:</source>
+        <translation>Répertoire:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="380"/>
+        <source>The current location of SleepyHead data store.</source>
+        <translation>Localisation actuel des données de SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="386"/>
+        <source>[data directory]</source>
+        <translation>[répertoire]</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="215"/>
+        <source>New Profile</source>
+        <translation>Nouveau profil utilisateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="191"/>
+        <source>&Select User</source>
+        <translation>&Sélection du profil utilisateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="94"/>
+        <source>Open Profile</source>
+        <translation>Ouverture du profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="95"/>
+        <source>Edit Profile</source>
+        <translation>Modifier le profil utilisateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="97"/>
+        <source>Delete Profile</source>
+        <translation>Effacer le profile</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="144"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="224"/>
+        <source>Enter Password for %1</source>
+        <translation>Mot de passe pour %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="163"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="373"/>
+        <source>Incorrect Password</source>
+        <translation>Mot de passe incorrect</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="165"/>
+        <source>You entered the password wrong too many times.</source>
+        <translation>Trop d'erreur de mot de passe.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>Enter the word DELETE below to confirm.</source>
+        <translation>Entrez le mot DELETE ci-dessous pour confirmer.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>You are about to destroy profile '%1'.</source>
+        <translation>Vous allez detruire le profil '%1'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>Sorry</source>
+        <translation>Désolé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>You need to enter DELETE in capital letters.</source>
+        <translation>c'est DELETE en majuscule.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="214"/>
+        <source>Could not open profile.. You will need to delete this profile directory manually</source>
+        <translation>Impossible d'ouvrir ce profil. Effacez son répertoire manuellement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="215"/>
+        <source>You will find it under the following location:</source>
+        <translation>Vous le trouverez à cet endroit:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="243"/>
+        <source>You entered an incorrect password</source>
+        <translation>Mot de passe incorrect</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="246"/>
+        <source>If you're trying to delete because you forgot the password, you need to delete it manually.</source>
+        <translation>Sous vous tentez d'effacer car vous avez oublié le mot de passe, vous dvez l'effacer à la main.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="259"/>
+        <source>There was an error deleting the profile directory, you need to manually remove it.</source>
+        <translation>Erreur lors de l'effacement du répertoire du profil; Vous devez l'effacer à la main.</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">Question</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to trash the profile "%1"?</source>
+        <translation type="vanished">Etes vous sur de vouloir supprimer le profil utilisateur "%1" ?</translation>
+    </message>
+    <message>
+        <source>Double Checking:
+
+Do you really want "%1" profile to be obliterated?</source>
+        <translation type="vanished">Double vérification:
+
+Voulez-vous vraiement supprimer définitvement le profil utilisateur "%1" ?</translation>
+    </message>
+    <message>
+        <source>Okay, I am about to totally OBLITERATE the profile "%1" and all it's contained data..
+
+Don't say you weren't warned. :-p</source>
+        <translation type="vanished">ok, le profil "%1" et toutes ses données va etre définitivement supprimé.
+
+Ne dites pas qu'on ne vous à pas prévenu :-p</translation>
+    </message>
+    <message>
+        <source>WTH???</source>
+        <translation type="vanished">Erreur imprévue!</translation>
+    </message>
+    <message>
+        <source>If you can read this you need to delete this profile directory manually (It's under %1)</source>
+        <translation type="vanished">Veuillez supprimmer ce profil utilisateur manuellement ( localisation : %1)</translation>
+    </message>
+    <message>
+        <source>Meheh... If your trying to delete because you forgot the password, your going the wrong way about it. Read the docs.
+
+Signed: Nasty Programmer</source>
+        <translation type="vanished">Si vous effacer car vous avez oublié le mot de passe, ce n'est pas la bonne méthode. Lisez la documentation.
+
+Signé : Le méchant programmeur</translation>
+    </message>
+    <message>
+        <source>Whoops.</source>
+        <translation type="vanished">Zut.</translation>
+    </message>
+    <message>
+        <source>There was an error deleting the profile directory.. You need to manually remove %1</source>
+        <translation type="vanished">Il y a une erreur, veuillez supprimmer le profil utilisateur %1 manuellement </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="263"/>
+        <source>Profile '%1' was succesfully deleted</source>
+        <translation>Profil '%1' effacé avec succès</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="292"/>
+        <source>Create new profile</source>
+        <translation>Créer un nouveau profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="357"/>
+        <source>Enter Password</source>
+        <translation>Entrez le mot de passe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="376"/>
+        <source>You entered an Incorrect Password too many times. Exiting!</source>
+        <translation>Trop d'erreur de mot de passe.Au revoir !</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1276"/>
+        <source>No Data</source>
+        <translation>Pas de donée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="321"/>
+        <source>cm</source>
+        <translation>cm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="322"/>
+        <source>"</source>
+        <translation>"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="323"/>
+        <source>ft</source>
+        <translation>ft</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="324"/>
+        <source>lb</source>
+        <translation>lb</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="325"/>
+        <source>oz</source>
+        <translation>oz</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="326"/>
+        <source>Kg</source>
+        <translation>Kg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="327"/>
+        <source>cmH2O</source>
+        <translation>cmH2Os</translation>
+    </message>
+    <message>
+        <source>Sleep</source>
+        <translation type="vanished">Sommeil</translation>
+    </message>
+    <message>
+        <source>Wake</source>
+        <translation type="vanished">Eveil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="328"/>
+        <source>Hours</source>
+        <translation>Heures</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="329"/>
+        <source>Minutes</source>
+        <translation>Minutes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="330"/>
+        <source>Seconds</source>
+        <translation>Secondes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="331"/>
+        <source>Events/hr</source>
+        <translation>Evènement/Heure</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="333"/>
+        <source>Hz</source>
+        <translation>Hz</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="334"/>
+        <source>bpm</source>
+        <translation>bpm</translation>
+    </message>
+    <message>
+        <source>L/m</source>
+        <translation type="obsolete">L/m</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="345"/>
+        <source>Error</source>
+        <translation>Erreur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="346"/>
+        <source>Warning</source>
+        <translation>Alerte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="347"/>
+        <source>Information</source>
+        <translation>Information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="348"/>
+        <source>Busy</source>
+        <translation>Occupé</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="obsolete">Annuler</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="367"/>
+        <source>Zombie</source>
+        <translation>Zombie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="377"/>
+        <source>Oximeter</source>
+        <translation>Oximètre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="381"/>
+        <source>CPAP</source>
+        <translation>PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="382"/>
+        <source>BiPAP</source>
+        <translation>BiPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="383"/>
+        <source>Bi-Level</source>
+        <translation>Bi-Level</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="384"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1065"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1072"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1076"/>
+        <source>EPAP</source>
+        <translation>EPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="385"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1068"/>
+        <source>Min EPAP</source>
+        <translation>EPAP Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="386"/>
+        <source>Max EPAP</source>
+        <translation>EPAP Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="387"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1066"/>
+        <source>IPAP</source>
+        <translation>IPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="388"/>
+        <source>Min IPAP</source>
+        <translation>IPAP Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="389"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1069"/>
+        <source>Max IPAP</source>
+        <translation>IPAP Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="390"/>
+        <source>APAP</source>
+        <translation>APAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="391"/>
+        <source>ASV</source>
+        <translation>ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="392"/>
+        <source>ST/ASV</source>
+        <translation>ST/ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="394"/>
+        <source>Humidifier</source>
+        <translation>Humidifieur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="396"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="187"/>
+        <source>H</source>
+        <translation>H</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="397"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="181"/>
+        <source>OA</source>
+        <translation>AO</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="398"/>
+        <source>A</source>
+        <translation>A</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="399"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="175"/>
+        <source>CA</source>
+        <translation>CA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="400"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="197"/>
+        <source>FL</source>
+        <translation>FL</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="401"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="238"/>
+        <source>SA</source>
+        <translation>SA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="402"/>
+        <source>LE</source>
+        <translation>LE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="403"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="233"/>
+        <source>EP</source>
+        <translation>EP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="404"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="206"/>
+        <source>VS</source>
+        <translation>VS</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="406"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="211"/>
+        <source>VS2</source>
+        <translation>VS2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="407"/>
+        <source>RERA</source>
+        <translation>RERA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="408"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2078"/>
+        <source>PP</source>
+        <translation>PP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="409"/>
+        <source>P</source>
+        <translation>P</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="410"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="202"/>
+        <source>RE</source>
+        <translation>RE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="411"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="228"/>
+        <source>NR</source>
+        <translation>NR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="412"/>
+        <source>NRI</source>
+        <translation>NRI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="413"/>
+        <source>O2</source>
+        <translation>O2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="414"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="283"/>
+        <source>PC</source>
+        <translation>PC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="243"/>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="416"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="248"/>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="417"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="253"/>
+        <source>UF3</source>
+        <translation>UF3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="419"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1070"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1073"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1077"/>
+        <source>PS</source>
+        <translation>PS</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>AHI</source>
+        <translation>IAH</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="421"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>RDI</source>
+        <translation>IDR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="422"/>
+        <source>AI</source>
+        <translation>AI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="423"/>
+        <source>HI</source>
+        <translation>HI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="424"/>
+        <source>UAI</source>
+        <translation>UAI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="425"/>
+        <source>CAI</source>
+        <translation>CAI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="426"/>
+        <source>FLI</source>
+        <translation>FLI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="428"/>
+        <source>REI</source>
+        <translation>REI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="429"/>
+        <source>EPI</source>
+        <translation>EPI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="430"/>
+        <source>ÇSR</source>
+        <translation>ÇSR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="431"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="169"/>
+        <source>PB</source>
+        <translation>PB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="435"/>
+        <source>IE</source>
+        <translation>IE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="371"/>
+        <source>Insp. Time</source>
+        <translation>Durée inspiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="437"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="367"/>
+        <source>Exp. Time</source>
+        <translation>Durée expiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="438"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>Resp. Event</source>
+        <translation>Evenement Respiratoire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="439"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="195"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="379"/>
+        <source>Flow Limitation</source>
+        <translation>Limitation du débit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="440"/>
+        <source>Flow Limit</source>
+        <translation>Limitation du Flux</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="441"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="236"/>
+        <source>SensAwake</source>
+        <translation>SensAwake</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="442"/>
+        <source>Pat. Trig. Breath</source>
+        <translation>Resp. par Patient</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="443"/>
+        <source>Tgt. Min. Vent</source>
+        <translation>Vent. act. Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="444"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Vent.</source>
+        <translation>Vent.Cible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="445"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Minute Vent.</source>
+        <translation>Vent.Minute.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="446"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="329"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Tidal Volume</source>
+        <translatorcomment>Volume courant</translatorcomment>
+        <translation>Tidal Volume</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="447"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Resp. Rate</source>
+        <translation>Taux de respiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="448"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="334"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Snore</source>
+        <translation>Ronflement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="449"/>
+        <source>Leak</source>
+        <translation>Fuite</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="450"/>
+        <source>Leaks</source>
+        <translation>Fuites</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="453"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Total Leaks</source>
+        <translation>Total Fuites</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="454"/>
+        <source>Unintentional Leaks</source>
+        <translation>Fuite involontaires</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="455"/>
+        <source>MaskPressure</source>
+        <translation>Pression du masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="457"/>
+        <source>Sleep Stage</source>
+        <translation>Période du sommeil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="458"/>
+        <source>Usage</source>
+        <translation>Utilisation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="459"/>
+        <source>Sessions</source>
+        <translation>Sessions</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="460"/>
+        <source>Pr. Relief</source>
+        <translation>Restants de Pressions</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="351"/>
+        <source>No Data Available</source>
+        <translation>Aucune donnée disponible</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="352"/>
+        <source>Compliance Only :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="353"/>
+        <source>Graphs Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="354"/>
+        <source>Summary Only :(</source>
+        <translation type="unfinished">Résumé seulement :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="355"/>
+        <source>Sessions Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="462"/>
+        <source>Bookmarks</source>
+        <translation>Favoris</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="465"/>
+        <source>Mode</source>
+        <translation>Mode</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="466"/>
+        <source>Model</source>
+        <translation>Modele</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="467"/>
+        <source>Brand</source>
+        <translation>Marque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="468"/>
+        <source>Serial</source>
+        <translation>Numéro de série</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="469"/>
+        <source>Series</source>
+        <translation>Séries</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="470"/>
+        <source>Machine</source>
+        <translation>Machine</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="471"/>
+        <source>Channel</source>
+        <translation>Chaine</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="472"/>
+        <source>Settings</source>
+        <translation>Réglages </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="474"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Inclination</source>
+        <translation>Inclinaison</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="475"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Orientation</source>
+        <translation>Orientation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="477"/>
+        <source>Name</source>
+        <translation>Nom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="478"/>
+        <source>DOB</source>
+        <translation>DDN</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="479"/>
+        <source>Phone</source>
+        <translation>Téléphone</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="480"/>
+        <source>Address</source>
+        <translation>Adresse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="481"/>
+        <source>Email</source>
+        <translation>Courriel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="482"/>
+        <source>Patient ID</source>
+        <translation>Identifiant du Patient</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="483"/>
+        <source>Date</source>
+        <translation>Date</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="485"/>
+        <source>Bedtime</source>
+        <translation>heure du coucher</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="486"/>
+        <source>Wake-up</source>
+        <translation>Réveil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="487"/>
+        <source>Mask Time</source>
+        <translation>Utilisation du masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="488"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="124"/>
+        <source>Unknown</source>
+        <translation>Inconnue</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="489"/>
+        <source>None</source>
+        <translation>Aucun</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="490"/>
+        <source>Ready</source>
+        <translation>Pret</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="492"/>
+        <source>First</source>
+        <translation>Premier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="493"/>
+        <source>Last</source>
+        <translation>Dernier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="494"/>
+        <source>Start</source>
+        <translation>Début</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="495"/>
+        <source>End</source>
+        <translation>Fin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="496"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="86"/>
+        <source>On</source>
+        <translation>On</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="497"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="87"/>
+        <source>Off</source>
+        <translation>Off</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="498"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2124"/>
+        <source>Yes</source>
+        <translation>Oui</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="499"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2125"/>
+        <source>No</source>
+        <translation>Non</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="501"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1062"/>
+        <source>Min</source>
+        <translation>Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="502"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1063"/>
+        <source>Max</source>
+        <translation>Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="503"/>
+        <source>Med</source>
+        <translation>Mil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="505"/>
+        <source>Average</source>
+        <translation>Moyen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="506"/>
+        <source>Median</source>
+        <translation>Médian</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="507"/>
+        <source>Avg</source>
+        <translation>Moyen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="508"/>
+        <source>W-Avg</source>
+        <translation>Moyenne W</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="365"/>
+        <source>BMI</source>
+        <translation>BMI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="336"/>
+        <source>Litres</source>
+        <translation>Litres</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="337"/>
+        <source>ml</source>
+        <translation>ml</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="338"/>
+        <source>Breaths/min</source>
+        <translation>Resp./min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="342"/>
+        <source>Degrees</source>
+        <translation>Degrée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="349"/>
+        <source>Please Note</source>
+        <translation>Merci de noter que</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="359"/>
+        <source>&Yes</source>
+        <translation>&Oui</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="360"/>
+        <source>&No</source>
+        <translation>&Non</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="361"/>
+        <source>&Cancel</source>
+        <translation>&Annuler</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="362"/>
+        <source>&Destroy</source>
+        <translation>&Détruire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="363"/>
+        <source>&Save</source>
+        <translation>&Sauvegarder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="366"/>
+        <source>Weight</source>
+        <translation>Poids</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="368"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="259"/>
+        <source>Pulse Rate</source>
+        <translation>Fréquence Pulsation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="369"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="266"/>
+        <source>SpO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="370"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="273"/>
+        <source>Plethy</source>
+        <translation>Plethy</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="456"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="314"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Flow Rate</source>
+        <translation>Débit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="371"/>
+        <source>Pressure</source>
+        <translation>Pression</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="339"/>
+        <source>?</source>
+        <translation>?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="341"/>
+        <source>Severity (0-1)</source>
+        <translation>Gravité (0-1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="373"/>
+        <source>Daily</source>
+        <translation>Quotidien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="374"/>
+        <source>Overview</source>
+        <translation>Aperçus</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="375"/>
+        <source>Oximetry</source>
+        <translation>Oximètrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="378"/>
+        <source>Event Flags</source>
+        <translation>Evénement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/preferences.cpp" line="33"/>
+        <source>Windows User</source>
+        <translation>Utilisateur Windows</translation>
+    </message>
+    <message>
+        <source>Software changes have been made that require the reimporting of the following machines data:
+
+</source>
+        <translation type="vanished">Suite a des modifications logiciel est nécéssaire de réimporter les données de la machine a PPC:
+
+</translation>
+    </message>
+    <message>
+        <source>I can automatically purge this data for you, or you can cancel now and continue to run in a previous version.
+
+</source>
+        <translation type="vanished">Je peux effacer cette donée pour vous ou vous pouvez annuler et continuer a utiliser la version précédent.
+</translation>
+    </message>
+    <message>
+        <source>Would you like me to purge this data this for you so you can run the new version?</source>
+        <translation type="vanished">Souhaitez vous que j'efface cette donnée pour vous afin d'utiliser la nouvelle version ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="308"/>
+        <source>SleepyHead (%1) needs to upgrade its database for %2 %3 %4</source>
+        <translation>SleepyHead (%1) a besoin de mettre à jour sa base de donnée pour %2 %3 %4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="321"/>
+        <source><b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b></source>
+        <translation><b>SleepyHead maintien une copie de la carte qu'il utilise dans cette optique</b></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="322"/>
+        <source><i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i></source>
+        <translation><i>Vos anciennes données seront restaurées si la sauvegarde n'a pas été désactivée dans le préférences d'import des données<i></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="256"/>
+        <source>Launching Windows Explorer failed</source>
+        <translation>Echec au lancement de windows Explorer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="257"/>
+        <source>Could not find explorer.exe in path to launch Windows Explorer.</source>
+        <translation>Windows Explorer n'a pas été trouvé dans le chemin indiqué.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="325"/>
+        <source>SleepyHead does not yet have any automatic card backups stored for this device.</source>
+        <translation>SleepyHead ne fait pas de sauvegarde automatique de la carte SD pour ce matériel.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="326"/>
+        <source>This means you will need to import this machine data again afterwards from your own backups or data card.</source>
+        <translation>Ce qui signifie vous allez devoir réimporter les données par la suite a partir de vos propres sauvegardes.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Important:</source>
+        <translation>Important:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore.</source>
+        <translation>Une fois mis à jour, <font size=+1>ne pourrez plus</font> utiliser ce profil avec l'anciènne version.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="330"/>
+        <source>If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.</source>
+        <translation>Si cela vous pose une souci, cliquez sur Non pour sortir, sauvegardez le profil manuellement avant de relancer SleepyHead de nouveau.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="331"/>
+        <source>Are you ready to upgrade, so you can run the new version of SleepyHead?</source>
+        <translation>Etes-vous prêt pour upgrader afin d'utiliser la nouvelle version de SleepyHead ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="334"/>
+        <source>Machine Database Changes</source>
+        <translation>La base de de données de la machine a changé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="345"/>
+        <source>Sorry, the purge operation failed, which means this version of SleepyHead can't start.</source>
+        <translation>Désolé la purge à échoué. Cette version de SleepyHead ne peur démarrer.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="346"/>
+        <source>The machine data folder needs to be removed manually.</source>
+        <translation>Le répetroire de donnée de la machine doit etre effacé manuellement.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="347"/>
+        <source>This folder currently resides at the following location:</source>
+        <translation>emplacement actuel de ce répertoire :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="353"/>
+        <source>Rebuilding from %1 Backup</source>
+        <translation>Reconstruction de la sauvegarde de %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="358"/>
+        <source>Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?</source>
+        <translation>Voulez vous passer en sauvegarde automatique, ainsi la prochaine fois qu'une nouvelle version de SleepyHead doit le faire elle pourra s'en servir ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="365"/>
+        <source>SleepyHead will now start the import wizard so you can reinstall your %1 data.</source>
+        <translation>SleepyHead va lancer l'assistant d'import pour réinstaller les données de votre %1.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="375"/>
+        <source>SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:</source>
+        <translation>SleepyHead va quitter, ensuite lancez votre gestionnaire de fichier pour faire une copie de votre profile :</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="377"/>
+        <source>Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.</source>
+        <translation>Utilisez votre gestion de fichier pour faire uen copie de votre répertoire du profil puis relancez SleepyHead pour terminer la mise à jour.</translation>
+    </message>
+    <message>
+        <source>Purge Failed</source>
+        <translation type="vanished">Purge en échec</translation>
+    </message>
+    <message>
+        <source>Sorry, I could not purge this data, which means this version of SleepyHead can't start.. SleepyHead's Data folder needs to be removed manually
+
+This folder currently resides at the following location:
+</source>
+        <translation type="vanished">Erreur d'effacemet, pour fonctionner il faut effacer le répertoire de donnés manuellement
+
+Ce répertoire est situé la :</translation>
+    </message>
+    <message>
+        <source>SleepyHead Release Notes</source>
+        <translation type="vanished">SpleepyHead Notes de diffusion</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="81"/>
+        <source>Release Notes</source>
+        <translation>Note de publication</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="92"/>
+        <source>&Ok, get on with it..</source>
+        <translation>&Ok, continuons..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="164"/>
+        <source>Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.</source>
+        <translation>Cherchez cette version dans <a href='%1'> les fichiers SleepyHead hébergés sur SourceForge</a>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="171"/>
+        <source>A faster build of SleepyHead may be available</source>
+        <translation>Une version plus rapide de SleepyHead pourrait etre disponible</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="172"/>
+        <source>You will not be bothered with this message again.</source>
+        <translation>Vous ne serez plus jamais ennuyé avec ce message.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="173"/>
+        <source>This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer.</source>
+        <translation>Cettet version fonctionnera correctement, mais un version "<b>%1%<b>" fonctionnerait encore mieux sur votre ordinateur.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="178"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.</source>
+        <translation>Cette version de SleepyHead est conçue pour fonctionner sur les ordinateurs anciens qui ne supportent pas OpenGL 2.0 mais il semble que le votre le supporte parfaitement.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="189"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.</source>
+        <translation>Cette version de SleepyHead est conçue pour fonctionner sur les ordinateurs anciens qui ne supportent pas OpenGL 2.0, mai il se pourrait qu'il y ai une version plus adapté à votre ordinateur.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="191"/>
+        <source>If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.</source>
+        <translation>Si vous fonctionnez avec une machine virtuelle comme VirtualBox ou VMware, ce message ne vous concerne pas, aucune verision plus adéquate n'est disponible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="201"/>
+        <source>Incompatible Graphics Hardware</source>
+        <translation>Carte graphique incompatible</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="202"/>
+        <source>This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.</source>
+        <translation>Cette version de SleepyHead nécéssite le support d'OpenGL 2.0 pour fonctionner correctement et malheureusement votre ordinateur ne le supporte pas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="203"/>
+        <source>You may need to update your computers graphics drivers from the GPU makers website. %1</source>
+        <translation>Vous pourriez mettre à jour votre pilote graphique en téléchargeant une version plus récente du site web du fabriquant de votre carte graphique. %1 </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="204"/>
+        <source>(<a href='http://intel.com/support'>Intel's support site</a>)</source>
+        <translation>(<a href='http://intel.com/support'>Site de Support d'Intel<a>)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="205"/>
+        <source>Because graphs will not render correctly, and it may cause crashes, this build will now exit.</source>
+        <translation>Comme les graphique ne s'afficherons pas correctement et peuvent causer des crash, cette version va s'arreter.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="206"/>
+        <source>Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer.</source>
+        <translation>Ne soyez pas découragé, il y a une version disponible nommée "<b>BrokenGL</b>" qui devrait fonctionner sur votre ordinateur.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>No SleepyHead data folder was found.</source>
+        <translation>Pas de répertoire de donnée SleepyHead de trouvé.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>Would you like SleepyHead to use the default location for storing its data?</source>
+        <translation>Voulez-vous que SleepyHead utilise le répertoire par défaut pour stocker ses données ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>As you did not select a data folder, SleepyHead will exit.</source>
+        <translation>Comme vous n'avez pas sélectionné de répertoire SleepyHead va quitter.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>Next time you run, you will be asked again.</source>
+        <translation>Au prochain démarrage, la question vous sera posé de nouveau.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>You did not select a directory.</source>
+        <translation>Vous n'avez pas séléctioné de répertoire.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>SleepyHead will now start with your old one.</source>
+        <translation></translation>
+    </message>
+    <message>
+        <source>SleepyHead Update Notes</source>
+        <translation type="vanished">SpleepyHead Notes de Mise a jour</translation>
+    </message>
+    <message>
+        <source>Language</source>
+        <translation type="obsolete">Langue</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="344"/>
+        <source>Question</source>
+        <translation>Question</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="245"/>
+        <source>Choose or create new folder for SleepyHead data</source>
+        <translation>Choisissez ou créez un nouveau répertoire pour les données de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="250"/>
+        <source>Exiting</source>
+        <translation>Arret en cours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="266"/>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.</source>
+        <translation>Le répertoire n'est pas vide et ne contient pas de données SleepyHead valide.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="267"/>
+        <source>Are you sure you want to use this folder?</source>
+        <translation>Etes-vous sur que vous voulez utiliser ce répertoire ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="463"/>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="40"/>
+        <source>Unspecified</source>
+        <translation>Non spécifié</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="41"/>
+        <source>Nasal Pillows</source>
+        <translation>Coussin nasal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="42"/>
+        <source>Hybrid F/F Mask</source>
+        <translation>Masque Hybride (F/F)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="43"/>
+        <source>Nasal Interface</source>
+        <translation>Interface Nasale</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="44"/>
+        <source>Full-Face Mask</source>
+        <translation>Masque Facial complet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1132"/>
+        <source>Are you sure you want to reset all your channel colors and settings to defaults?</source>
+        <translation>Voulez vous vraiement réinitialiser les préférence des Graphiques (couleur des chaine et réglages) aux valeurs par défaut ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="404"/>
+        <source>Events</source>
+        <translation>Evènements</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="402"/>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="405"/>
+        <source>Duration</source>
+        <translation>Durée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="419"/>
+        <source>(% %1 in events)</source>
+        <translation>(% %1 en évènements)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jan</source>
+        <translation>Jan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Feb</source>
+        <translation>Fév</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Mar</source>
+        <translation>Mar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Apr</source>
+        <translation>Avr</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>May</source>
+        <translation>Mai</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jun</source>
+        <translation>Jun</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Jul</source>
+        <translation>Jui</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Aug</source>
+        <translation>Aou</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Sep</source>
+        <translation>Sep</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Oct</source>
+        <translation>Oct</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Nov</source>
+        <translation>Nov</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Dec</source>
+        <translation>Dec</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="262"/>
+        <source>Import Error</source>
+        <translation>Erreur d'import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="263"/>
+        <source>This Machine Record cannot be imported in this profile.
+The Day records overlap with already existing content.</source>
+        <translation>L'import des cette machine ne peut se faire dans ce profile.
+Les jours enregistré ecraseraient ceux existants.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="384"/>
+        <source>Non Data Capable Machine</source>
+        <translation>Machine sans donnée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="385"/>
+        <source>Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.</source>
+        <translation>Votre Philips Respironics (Model %1) n'est malheureusement pas un modèle produisant des données. </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="386"/>
+        <source>I'm sorry to report that SleepyHead can only track hours of use for this machine.</source>
+        <translation>Désolé mais SleepyHead peut seulement suivre la durée d'utilisation de cette machine.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2169"/>
+        <source>15mm</source>
+        <translation>15mm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2168"/>
+        <source>22mm</source>
+        <translation>22mm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2082"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2084"/>
+        <source>Flex Mode</source>
+        <translation>Mode Flex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2083"/>
+        <source>PRS1 pressure relief mode.</source>
+        <translation>Mode de dépression PRS1.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2089"/>
+        <source>C-Flex</source>
+        <translation>C-Flex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2090"/>
+        <source>C-Flex+</source>
+        <translation>C-Flex+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2091"/>
+        <source>A-Flex</source>
+        <translation>A-Flex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2092"/>
+        <source>Rise Time</source>
+        <translation>Monté temporisé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2093"/>
+        <source>Bi-Flex</source>
+        <translation>Bi-Flex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2097"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2099"/>
+        <source>Flex Level</source>
+        <translation>Niveau de Flex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2098"/>
+        <source>PRS1 pressure relief setting.</source>
+        <translation>Réglage de Dépression PRS1.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2103"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2134"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2156"/>
+        <source>x1</source>
+        <translation>x1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2104"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2135"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2157"/>
+        <source>x2</source>
+        <translation>x2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2105"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2136"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2158"/>
+        <source>x3</source>
+        <translation>x3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2106"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2137"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2159"/>
+        <source>x4</source>
+        <translation>x4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2107"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2138"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2160"/>
+        <source>x5</source>
+        <translation>x5</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2111"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2113"/>
+        <source>Humidifier Status</source>
+        <translation>Etat de l'Humidificateur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2112"/>
+        <source>PRS1 humidifier connected?</source>
+        <translation>Hudificateur PRS1 connecté ?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2115"/>
+        <source>Disconnected</source>
+        <translation>Déconnecté</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2116"/>
+        <source>Connected</source>
+        <translation>Connecté</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2120"/>
+        <source>Heated Tubing</source>
+        <translation>Tube Chauffé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2121"/>
+        <source>Heated Tubing Connected</source>
+        <translation>Tube Chauffé connecté</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2122"/>
+        <source>Headed Tubing</source>
+        <translatorcomment>mistake ? shoukd not been heated ?</translatorcomment>
+        <translation>Tube en tete</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2129"/>
+        <source>Humidification Level</source>
+        <translation>Niveau Humidification </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2130"/>
+        <source>PRS1 Humidification level</source>
+        <translation>Niveau Humidification PRS1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2131"/>
+        <source>Humid. Lvl.</source>
+        <translation>Niv. Humid.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2142"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2143"/>
+        <source>System One Resistance Status</source>
+        <translation>Etat Resistance System One</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2144"/>
+        <source>Sys1 Resist. Status</source>
+        <translation>Etat de la Resistance Sys1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2151"/>
+        <source>System One Resistance Setting</source>
+        <translation>Réglage de la Résistance System One</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2152"/>
+        <source>System One Mask Resistance Setting</source>
+        <translation>Réglage de Résistance du masque System One</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2153"/>
+        <source>Sys1 Resist. Set</source>
+        <translation>Réglages Res. Sys1 </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2164"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2166"/>
+        <source>Hose Diameter</source>
+        <translation>Diamètre du tuyau</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2165"/>
+        <source>Diameter of primary CPAP hose</source>
+        <translation>Diamètre du tuyau principal de PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2173"/>
+        <source>System One Resistance Lock</source>
+        <translation>Verrou de résistance System One</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2174"/>
+        <source>Whether System One resistance settings are available to you.</source>
+        <translation>Selon disponibilité des réglages de résistance System One.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2175"/>
+        <source>Sys1 Resist. Lock</source>
+        <translation>Verrou Resit. Sys1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2182"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2184"/>
+        <source>Auto On</source>
+        <translation>Auto On</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2183"/>
+        <source>A few breaths automatically starts machine</source>
+        <translation>Mise en marche par respiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2191"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2193"/>
+        <source>Auto Off</source>
+        <translation>Auto Off</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2192"/>
+        <source>Machine automatically switches off</source>
+        <translation>Arrêt automatique de la machine</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2200"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2202"/>
+        <source>Mask Alert</source>
+        <translation>Alert du Masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2201"/>
+        <source>Whether or not machine allows Mask checking.</source>
+        <translation>Selon que la machine permet la vérification du masque.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2209"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2211"/>
+        <source>Show AHI</source>
+        <translation>Affihce l'IAH</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2210"/>
+        <source>Whether or not machine shows AHI via LCD panel.</source>
+        <translation>Selon que la machine affiche ou pas les IAH sur l'affichage LCD</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2223"/>
+        <source>Unknown PRS1 Code %1</source>
+        <translation>Code PRS1 %1 inconnu</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2224"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2225"/>
+        <source>PRS1_%1</source>
+        <translation>PRS1_%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2290"/>
+        <source>Timed Breath</source>
+        <translation>Respiration chronometré</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2291"/>
+        <source>Machine Initiated Breath</source>
+        <translation>Respiration provoqué par la machine</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2292"/>
+        <source>TB</source>
+        <translation>TB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="92"/>
+        <source>Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
+        <translation>Impossible de traiter le fichier channels.xml, cette version est sévèrement cassé, pas d'autre choix que de quitter!!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="104"/>
+        <source>Therapy Pressure</source>
+        <translation>Pression de la Thérapie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="108"/>
+        <source>Inspiratory Pressure</source>
+        <translation>Pression d'Inspiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="112"/>
+        <source>Lower Inspiratory Pressure</source>
+        <translation>Pression d'Inspiration la plus basse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="116"/>
+        <source>Higher Inspiratory Pressure</source>
+        <translation>Pression d'Inspiration la plus haute</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="120"/>
+        <source>Expiratory Pressure</source>
+        <translation>Pression d'Expiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="124"/>
+        <source>Lower Expiratory Pressure</source>
+        <translation>Pression d'Expiration la plus basse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="128"/>
+        <source>Higher Expiratory Pressure</source>
+        <translation>Pression d'Expiration la plus haute</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="132"/>
+        <source>Pressure Support</source>
+        <translation>Pression supporté</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="137"/>
+        <source>PS Min</source>
+        <translation>PS Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <source>Pressure Support Minimum</source>
+        <translation>Pression supporté minimum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="141"/>
+        <source>PS Max</source>
+        <translation>PS Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <source>Pressure Support Maximum</source>
+        <translation>Pression supporté Maximum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Min Pressure</source>
+        <translation>Pression Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Minimum Therapy Pressure</source>
+        <translation>Pression de Thérapie Minimum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Max Pressure</source>
+        <translation>Pression Maximum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Maximum Therapy Pressure</source>
+        <translation>Pression de Thérapie Maximum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="153"/>
+        <source>Ramp Time</source>
+        <translation>Durée de la Rampe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <source>Ramp Delay Period</source>
+        <translation>Période de délais de la Rampe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="157"/>
+        <source>Ramp Pressure</source>
+        <translation>Pression de la Rampe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <source>Starting Ramp Pressure</source>
+        <translation>Préssion de départ de la Rampe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="161"/>
+        <source>Ramp Event</source>
+        <translation>Evènement de Rampe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="162"/>
+        <source>Ramp</source>
+        <translation>rampe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="167"/>
+        <source>Periodic Breathing</source>
+        <translation>Respiration Périodique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="168"/>
+        <source>A period of periodic breathing</source>
+        <translation>Un période de respiration périodique</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="209"/>
+        <source>Vibratory Snore (VS2) </source>
+        <translation>Ronflement Vibratoire (VS2)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="276"/>
+        <source>Perfusion Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="277"/>
+        <source>A relative assessment of the pulse strength at the monitoring site</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="278"/>
+        <source>Perf. Index %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="425"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Mask On Time</source>
+        <translation>Durée d'usage du Masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Time started according to str.edf</source>
+        <translation>Heure de départ selon str.edf</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="430"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>Summary Only</source>
+        <translation>Résumé seulement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="922"/>
+        <source>Zero</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="925"/>
+        <source>Upper Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="928"/>
+        <source>Lower Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="332"/>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="173"/>
+        <source>Clear Airway Apnea</source>
+        <translation>Apnée non obstructive</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="174"/>
+        <source>An apnea where the airway is open</source>
+        <translation>Une apnée ou le passage de l'air est ouvert</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="179"/>
+        <source>Obstructive Apnea</source>
+        <translation>Apnée Obstructive</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="180"/>
+        <source>An apnea caused by airway obstruction</source>
+        <translation>Apnée causé par une obstruction du passage de l'air</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="185"/>
+        <source>Hypopnea</source>
+        <translation>Hypopnée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="186"/>
+        <source>A partially obstructed airway</source>
+        <translation>Passage de l'air partiellement Obstrué</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="190"/>
+        <source>Unclassified Apnea</source>
+        <translation>Apnée non classifiée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="191"/>
+        <source>An apnea that could not fit into a category</source>
+        <translation>Un apnée ne rentrant dans aucune catégorie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="192"/>
+        <source>UA</source>
+        <translation>UA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="196"/>
+        <source>An restriction in breathing from normal, causing a flattening of the flow waveform.</source>
+        <translation>Une restriction respiratoire normale, causant un applatissement de l'onde de flux.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="200"/>
+        <source>Respiratory Effort Related Arousal</source>
+        <translation>Respiratory effort-related arousal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="201"/>
+        <source>An restriction in breathing that causes an either an awakening or sleep disturbance.</source>
+        <translation>une restriction dans la respiration qui cause un réveil ou un micro-réveil.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>Vibratory Snore</source>
+        <translation>Ronflement vibratoire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>A vibratory snore</source>
+        <translation>un roflement vibratoire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="210"/>
+        <source>A vibratory snore as detcted by a System One machine</source>
+        <translation>Un ronflement vibratoire comme détecté par une machine SystemOne</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2076"/>
+        <source>Pressure Pulse</source>
+        <translation>Pression d'impulsion</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2077"/>
+        <source>A pulse of pressure 'pinged' to detect a closed airway.</source>
+        <translation>Une impulsion de pression envoyée pour détecter une obstruction.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="451"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="221"/>
+        <source>Large Leak</source>
+        <translation>Grosse Fuite</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="216"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="222"/>
+        <source>A large mask leak affecting machine performance.</source>
+        <translation>Une grosse fuite affectant les performances de la machine.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="452"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="223"/>
+        <source>LL</source>
+        <translation>LL</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="145"/>
+        <source>Pressure Min</source>
+        <translation>Pression Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="149"/>
+        <source>Pressure Max</source>
+        <translation>Pression Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="215"/>
+        <source>Leak Flag</source>
+        <translation>Maqueur de fuite</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="217"/>
+        <source>LF</source>
+        <translation>LF</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="226"/>
+        <source>Non Responding Event</source>
+        <translation>Un évènement ne répondant pas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="227"/>
+        <source>A type of respiratory event that won't respond to a pressure increase.</source>
+        <translation>Un évènement resporatoire ne répondant pas a l'augmentation de la pression.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="231"/>
+        <source>Expiratory Puff</source>
+        <translation>Bouffé Expiratoire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="232"/>
+        <source>Intellipap event where you breathe out your mouth.</source>
+        <translation>Evènement correspondant a une expiration par la bouche.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="237"/>
+        <source>SensAwake feature will reduce pressure when waking is detected.</source>
+        <translation>La fonctionnalié SenAwake reduira la pression quand l'éveil est détecté.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="241"/>
+        <source>User Flag #1</source>
+        <translation>Evènement utilisateur #1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="242"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="252"/>
+        <source>A user definable event detected by SleepyHead's flow waveform processor.</source>
+        <translation>Un évènement défiissable par l'utilisateur détécté par le moteur d'analyse de flux de SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="246"/>
+        <source>User Flag #2</source>
+        <translation>Evènement utilisateur #2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="251"/>
+        <source>User Flag #3</source>
+        <translation>Evènement utilisateur #3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <source>Heart rate in beats per minute</source>
+        <translation>Pouls en battements par minute</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>SpO2 %</source>
+        <translation>SpO2 %</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>Blood-oxygen saturation percentage</source>
+        <translation>% de saturation du sang en oxygène</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="271"/>
+        <source>Plethysomogram</source>
+        <translation>Plethysomogram</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="272"/>
+        <source>An optical Photo-plethysomogram showing heart rhythm</source>
+        <translation>Une photo optique plethysomgram motrant le rythme cardiaque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="281"/>
+        <source>Pulse Change</source>
+        <translation>Changement de pulsation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="282"/>
+        <source>A sudden (user definable) change in heart rate</source>
+        <translation>Un changement soudain (définissable par l'utilisateur) de pouls</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="286"/>
+        <source>SpO2 Drop</source>
+        <translation>Baisse de SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="287"/>
+        <source>A sudden (user definable) drop in blood oxygen saturation</source>
+        <translation>Un baisse soudaine (definissable par l'utilisateur) d'oxygénation du sang</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="288"/>
+        <source>SD</source>
+        <translation>SD</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Breathing flow rate waveform</source>
+        <translation>Courbe du flux respiratoire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>CPAP Session contains summary data only</source>
+        <translation>La session PPC ne contient qu'un résumé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="438"/>
+        <source>PAP Mode</source>
+        <translation>Mode PAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="437"/>
+        <source>PAP Device Mode</source>
+        <translation>PAP Mode Matériel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="443"/>
+        <source>APAP (Variable)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="447"/>
+        <source>ASV (Fixed EPAP)</source>
+        <translation>ASV (EPAP Fixe)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="448"/>
+        <source>ASV (Variable EPAP)</source>
+        <translation>ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="335"/>
+        <source>L/min</source>
+        <translation>L/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="319"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="320"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="324"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure</source>
+        <translation>Pression du masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure (High resolution)</source>
+        <translation>Pression du masque (Haute Résolution)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Amount of air displaced per breath</source>
+        <translation>Quantité d'air déplacé par respiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Graph displaying snore volume</source>
+        <translation>Graphique affichant le volume du ronflement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="339"/>
+        <source>Minute Ventilation</source>
+        <translation>Ventilation par minute</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Amount of air displaced per minute</source>
+        <translation>Quantité d'air déplacé par minute</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="344"/>
+        <source>Respiratory Rate</source>
+        <translation>Vitesse respiratoire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Rate of breaths per minute</source>
+        <translation>Respiration par minute</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="349"/>
+        <source>Patient Triggered Breaths</source>
+        <translation>Respirations activées par le patient</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Percentage of breaths triggered by patient</source>
+        <translation>Pourcentage de respirations activées par le patient</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Pat. Trig. Breaths</source>
+        <translation>Reps. Act. Pat.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="354"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Leak Rate</source>
+        <translation>Vitesse de fuite</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Rate of detected mask leakage</source>
+        <translation>Vitesse de fuite du masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="361"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>I:E Ratio</source>
+        <translation>RAtion I:E</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>Ratio between Inspiratory and Expiratory time</source>
+        <translation>Ration entre temps d'inspiration et d'expiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="340"/>
+        <source>ratio</source>
+        <translation>ratio</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Expiratory Time</source>
+        <translation>Temps d'expiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Time taken to breathe out</source>
+        <translation>Temps pris pour expirer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Inspiratory Time</source>
+        <translation>Temps d'inspiration </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Time taken to breathe in</source>
+        <translation>Temps pris pour inspirer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="374"/>
+        <source>Respiratory Event</source>
+        <translation>Evènement respiratoire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>A ResMed data source showing Respiratory Events</source>
+        <translation>Source de donnée de ResMed montrant les évènement respiratoire</translation>
+    </message>
+    <message>
+        <source>events</source>
+        <translation type="obsolete">évènements</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Graph showing severity of flow limitations</source>
+        <translation>Graph de sévérité des limitations de flux</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Flow Limit.</source>
+        <translation>Limitation de Flux.</translation>
+    </message>
+    <message>
+        <source>0-1</source>
+        <translation type="obsolete">100% {0-1?}</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="384"/>
+        <source>Target Minute Ventilation</source>
+        <translation>Ventilation Cible par Minute</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Minute Ventilation?</source>
+        <translation>Ventilation Cible par Minute?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="389"/>
+        <source>Maximum Leak</source>
+        <translation>Fuite Maximum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>The maximum rate of mask leakage</source>
+        <translation>La vitesse maximum de fuite du masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>Max Leaks</source>
+        <translation>Fuites Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="394"/>
+        <source>Apnea Hypopnea Index</source>
+        <translation>Index Apnée Hypopnée</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>Graph showing running AHI for the past hour</source>
+        <translation>Graphique montrant l'IAH pour les heures précédantes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="399"/>
+        <source>Total Leak Rate</source>
+        <translation>Total des Fuites</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Detected mask leakage including natural Mask leakages</source>
+        <translation>Fuite détectée incluant les fuite naturel du masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="404"/>
+        <source>Median Leak Rate</source>
+        <translation>Vlume moyen de fuite</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median rate of detected mask leakage</source>
+        <translation>Volume moyen des fuites du masque</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median Leaks</source>
+        <translation>Fuites moyenne</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="409"/>
+        <source>Respiratory Disturbance Index</source>
+        <translation>Index des désorde respiratoires</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>Graph showing running RDI for the past hour</source>
+        <translation>Graph des Désordre Repiratoire pour les dernière heures</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Sleep position in degrees</source>
+        <translation>Position du someil en degré</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Upright angle in degrees</source>
+        <translation>Angle supérieur droit en degré</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1393"/>
+        <source>About SleepyHead</source>
+        <translation>Au sujet de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1409"/>
+        <source>&Close</source>
+        <translation>&Fermer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1413"/>
+        <source>&Donate</source>
+        <translation>&Donner</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="39"/>
+        <source>There are no graphs visible to print</source>
+        <translation>Pas de graphiques a imprimmer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="56"/>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation>voulez vous afficher les zones favorites dans ce rapport?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="96"/>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation>C'est long, ne touchez a rien en attendant.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="97"/>
+        <source>Printing %1 Report</source>
+        <translation>Impression du rapport %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="130"/>
+        <source>%1 Report</source>
+        <translation>rapport %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="180"/>
+        <source>: %1 hours, %2 minutes, %3 seconds
+</source>
+        <translation>: %1 Heures; %2 minutes, %3 secondes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Range</source>
+        <translation>porté</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Fixed %1</source>
+        <translation>%1 Fixe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="270"/>
+        <source>RDI	%1
+</source>
+        <translation>RDI: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="272"/>
+        <source>AHI	%1
+</source>
+        <translation>AHI: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="306"/>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation>AI=%1 HI=%2 CAI=%3 </translation>
+    </message>
+    <message>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%</source>
+        <translation type="obsolete">REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="310"/>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</source>
+        <translation>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="314"/>
+        <source>UAI=%1 </source>
+        <translation>UAI= %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="316"/>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation>NRI=%1 LKI=%2 EPI=%3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="384"/>
+        <source>Reporting from %1 to %2</source>
+        <translation>Rapport du %1 au %2</translation>
+    </message>
+    <message>
+        <source>Reporting data goes here</source>
+        <translation type="vanished">Localisation des donées des  rapports</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="451"/>
+        <source>Entire Day's Flow Waveform</source>
+        <translation>Flux du jour entier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="457"/>
+        <source>Current Selection</source>
+        <translation>Sélection courante</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="467"/>
+        <source>Entire Day</source>
+        <translation>Jour entier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="586"/>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation>SleepyHead v%1 - http://sleepyhead.sourceforge.net</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="592"/>
+        <source>Page %1 of %2</source>
+        <translation>Page %1 sur %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="659"/>
+        <source>SleepyHead has finished sending the job to the printer.</source>
+        <translation>SpleepyHead a terminé d'envoyer l'impression.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="112"/>
+        <source>Name: %1, %2</source>
+        <translation>Nom: %1, %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="114"/>
+        <source>DOB: %1</source>
+        <translation>Date de Naissane %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="117"/>
+        <source>Phone: %1</source>
+        <translation>Téléphone: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="120"/>
+        <source>Email: %1</source>
+        <translation>Email: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="123"/>
+        <source>Address:</source>
+        <translation>Adresse:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="165"/>
+        <source>Usage Statistics</source>
+        <translation>Statistiques d'Usage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="179"/>
+        <source>This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>.</source>
+        <translation>Ce rapport a été généré par une préversion de SleepyHead (%1),<b>et n'a pas été approuvé en aucune façons conforme ou permettant un diagnotique médical<b>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="181"/>
+        <source>SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead</source>
+        <translation>SleepyHead est un logiciel ouvert (Open Source) disponible sur http://sourceforge.net/projects/SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1039"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1041"/>
+        <source>Auto Bi-Level</source>
+        <translation>Auto Bi-niveau</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1045"/>
+        <source>ASV Auto EPAP</source>
+        <translation>ASV Auto EPAP</translation>
+    </message>
+    <message>
+        <source>%1 threshold</source>
+        <translation type="vanished">Seuil %1</translation>
+    </message>
+    <message>
+        <source>No Waveform Available</source>
+        <translation type="vanished">Pas de courbe disponible</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1066"/>
+        <source>Plots Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1148"/>
+        <source>Duration %1:%2:%3</source>
+        <translation>Durée%1:%2:%3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1149"/>
+        <source>AHI %1</source>
+        <translation>AHI: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1029"/>
+        <source>Days: %1</source>
+        <translation>Jour: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1033"/>
+        <source>Low Usage Days: %1</source>
+        <translation>Jours de faible usage: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1034"/>
+        <source>(%1% compliant, defined as > %2 hours)</source>
+        <translation>(%1% conforme, définie comme > %2 hours)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1148"/>
+        <source>(Sess: %1)</source>
+        <translation>(Sess: %1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1156"/>
+        <source>Bedtime: %1</source>
+        <translation>Coucher: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1158"/>
+        <source>Waketime: %1</source>
+        <translation>Réveil : %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1198"/>
+        <source>90%</source>
+        <translation>90%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1270"/>
+        <source>(Summary Only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Unknown.</source>
+        <translation type="vanished">Inconnus.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="315"/>
+        <source>There is a lockfile already present for profile '%1'.</source>
+        <translation>Il y a un fichier de verrouillage déjà présent pour le profil '%1'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="316"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="326"/>
+        <source>You can only work with one instance of an individual SleepyHead profile at a time.</source>
+        <translation>Vous ne pouvez travailler qu'avec un seul profil Sleepyhead à la fois.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="317"/>
+        <source>Please close any other instances of SleepyHead running with this profile before proceeding.</source>
+        <translation>S'il vous plaît fermez toutes les autres instances de Sleepyhead fonctionnant avec ce profil avant de poursuivre.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="318"/>
+        <source>If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message.</source>
+        <translation>Si aucun autre Sleepyhead ne fonctione (par exemple, il s'est crashé la dernière fois!), ignorez ce message.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="325"/>
+        <source>There is a lockfile already present for this profile '%1', claimed on '%2'.</source>
+        <translation>Il y à un fichier de verrouillage déjà présent pour ce profil '%1', demandé sur '%2'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="327"/>
+        <source>If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding.</source>
+        <translation>Si vous utilisez un stockage en cloud, assurez-vous Sleepyhead est fermé et la synchronisation est terminé sur l'autre ordinateur avant de poursuivre.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>Peak</source>
+        <translation>Pic</translation>
+    </message>
+    <message>
+        <source>Maximum</source>
+        <translation type="vanished">Maximum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="142"/>
+        <source>%1% %2</source>
+        <translation>%1% %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1241"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1060"/>
+        <source>Fixed</source>
+        <translation>Fixe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1243"/>
+        <source>Auto</source>
+        <translation>Auto</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1245"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="444"/>
+        <source>Fixed Bi-Level</source>
+        <translation>Bi-Niveau Fixe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="445"/>
+        <source>Auto Bi-Level (Fixed PS)</source>
+        <translation>Auto Bi-Niveau (PS Fixe)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1249"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="446"/>
+        <source>Auto Bi-Level (Variable PS)</source>
+        <translation>Bi-Niveau Auto (Pres. Variable)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1251"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1043"/>
+        <source>ASV Fixed EPAP</source>
+        <translation>EPAP a ASV Fixe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1253"/>
+        <source>ASV Variable EPAP</source>
+        <translation>EPAP a ASV Variable</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1274"/>
+        <source>%1%2</source>
+        <translation>%1%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1294"/>
+        <source>Fixed %1 (%2)</source>
+        <translation>%1 Fixe (%2)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1296"/>
+        <source>Min %1 Max %2 (%3)</source>
+        <translation>Min %1 Max %2 (%3)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1298"/>
+        <source>EPAP %1 IPAP %2 (%3)</source>
+        <translation>EPAP %1 IPAP %2 (%3)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1300"/>
+        <source>PS %1 over %2-%3 (%4)</source>
+        <translation>PS %1 sur %2-%3 (%4)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1302"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1306"/>
+        <source>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</source>
+        <translation>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1304"/>
+        <source>EPAP %1 PS %2-%3 (%6)</source>
+        <translation>EPAP %1 PS %2-%3 (%6)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="129"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="131"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="133"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>%1 %2</source>
+        <translation>%1 %2</translation>
+    </message>
+    <message>
+        <source>%1-%2 %3</source>
+        <translation type="obsolete">%1% {1-%2 %3?}</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="90"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Bienvenue dans SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>What would you like to do?</source>
+        <translation>Que souhaitez-vous faire?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>Please Import Some Data</source>
+        <translation>Merci d'importer des données</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="104"/>
+        <source>CPAP<br/>Importer</source>
+        <translation>Import de<br/>PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="109"/>
+        <source>Oximetery<br/>Wizard</source>
+        <translation>Assisstant <br/>d'Oximétrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="113"/>
+        <source>or</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="116"/>
+        <source>View<br/>Statistics</source>
+        <translation>Voir<br/>Les Statistiques</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="122"/>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation>Cela serait un bonne idée de vérifier les préférnces,</br>en effet il y a des options qui concernent l'import.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="123"/>
+        <source>First import can take a few minutes.</source>
+        <translation>Le premier import peut prendre quelques minutes.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="139"/>
+        <source>Click this box to see this in daily view.</source>
+        <translation>Cliquez sur cette case pour visaluser en vue quotidienne.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="141"/>
+        <source>The last time you used your %1...</source>
+        <translation>La dernière fois que vous avez utilisé votre %1 ...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="145"/>
+        <source>last night</source>
+        <translation>la nuit dernière</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="146"/>
+        <source>yesterday</source>
+        <translation>hier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="147"/>
+        <source>%2 days ago</source>
+        <translation>il y %2 jours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="149"/>
+        <source>was %1 (on %2)</source>
+        <translation>était %1 (le %2)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="157"/>
+        <source>perfect :)</source>
+        <translation>Parfait :)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="158"/>
+        <source>pretty darn good</source>
+        <translation>très bien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="159"/>
+        <source>reasonably good</source>
+        <translation>assez bien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="160"/>
+        <source>technically "treated"</source>
+        <translation>techniquement "traité"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="161"/>
+        <source>not very good</source>
+        <translation>pas très bien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="162"/>
+        <source>horrible, please consult your doctor</source>
+        <translation>horrible, consulter votre médecin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="169"/>
+        <source>%1 hours, %2 minutes and %3 seconds</source>
+        <translation>%1 heures, %2 minutes and %3 secondes</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="241"/>
+        <source><p><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="242"/>
+        <source><p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>You slept for %1.</source>
+        <translation type="vanished">Vous avez dormi pendant %1.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="172"/>
+        <source><font color = red>You only had the mask on for %1.</font></source>
+        <translation><font color = red> Vous n'avez porté le masque que %1.</font></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="179"/>
+        <source>You had no <i>major</i> mask leaks (maximum was %1 %2).</source>
+        <translation>Vous n'avez pas de fuites <i>majeur</i> du masque (maximum %1 %2).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="180"/>
+        <source>You had a small but acceptable amount of <i>major</i> mask leakage.</source>
+        <translation>Vous avez eu une petite, mais acceptable quantié de fuite <i>majeur</i>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="181"/>
+        <source>You had significant periods of <i>major</i> mask leakage.</source>
+        <translation>Vous avez des périodes significative de fuite <i>majeures</i>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="182"/>
+        <source>Your mask is leaking way too much.. Talk to your CPAP advisor.</source>
+        <translation>Votre masque fuit beaucoup trop .. Parlez-en à votre conseiller de PPC.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="190"/>
+        <source>Your CPAP machine blasted you with a constant %1%2 of air</source>
+        <translation>Votre appareil PPC vous explose avec une pression d'air constante de %1%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="193"/>
+        <source>Your pressure was under %1%2 for %3% of the time.</source>
+        <translation>Votre pression était en dessous de %1%2 pour %3% du temps.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="197"/>
+        <source>Your machine blasted you with a constant %1-%2 %3 of air.</source>
+        <translation>Votre appareil vous explose avec une pression d'air constante de %1-%2 %3 .</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="201"/>
+        <source>Your machine was under %1-%2 %3 for %4% of the time.</source>
+        <translation>Votre machine était en dessous de %1-%2 %3 pendant %4% du temps.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="206"/>
+        <source>Your EPAP pressure fixed at %1%2.</source>
+        <translation>Votre pression EPAP s'est fixé %1%2.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="212"/>
+        <source>Your EPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation>Votre pression EPAP était en dessous de %1%2 pendant %3% du temps.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="207"/>
+        <location filename="../sleepyhead/welcome.cpp" line="213"/>
+        <source>Your IPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation>Votre pression IPAP était en dessous de %1%2 pendant %3% du temps.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="164"/>
+        <source>You had an AHI of %1, which is considered %2</source>
+        <translation>Vous aviez un IAH de %1, qui est considéré %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="171"/>
+        <source>You machine was on for %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="220"/>
+        <source>No CPAP data has been imported yet.</source>
+        <translation>Pas de données de PPC importé pour le moment.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="226"/>
+        <source>Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> </source>
+        <translation>Données d'Oximétrie les plus récentes:<a onclick='alert("daily=%2");'>%1</a> </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="227"/>
+        <source>(last night)</source>
+        <translation>(la nuit dernière)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="228"/>
+        <source>(yesterday)</source>
+        <translation>(hier)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="229"/>
+        <source>(%2 day ago)</source>
+        <translation>(il y à %2 jours)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="232"/>
+        <source>No oximetery data has been imported yet.</source>
+        <translation>Pas de données d'Oximétrie importé pour le moment.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="238"/>
+        <source>Very Important Warning</source>
+        <translation>Avertissement Très Important</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="240"/>
+        <source><p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer.</source>
+        <translation><p>TOUJOURS<font size=+1 color=red><b> protéger en écriture </b></font> votre SDCards avant de l'insérer dans votre ordinateur.</translation>
+    </message>
+    <message>
+        <source><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="vanished"><span title="Mac OSX et Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> écrivent des fichiers d'index sur la carte sans demander, ce qui peut rendre votre carte illisible par votre machine PPC.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>Contec</source>
+        <translation>Contec</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <source>CMS50</source>
+        <translation>CMS50</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>Fisher & Paykel</source>
+        <translation>Fisher & Paykel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>ICON</source>
+        <translation>ICON</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>DeVilbiss</source>
+        <translation>DeVilbiss</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>Intellipap</source>
+        <translation>Intellipap></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="81"/>
+        <source>SmartFlex Settings</source>
+        <translation>Réglages SmartFelx</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>ChoiceMMed</source>
+        <translation>ChoiceMMed</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>MD300</source>
+        <translation>MD300</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>Respironics</source>
+        <translation>Respironics</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>M-Series</source>
+        <translation>M-Series</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>Philips Respironics</source>
+        <translation>Philips Respironics</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>System One</source>
+        <translation>System One</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>ResMed</source>
+        <translation>ResMed</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>S9</source>
+        <translation>S9</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="395"/>
+        <source>EPR: </source>
+        <translation>EPR:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose</source>
+        <translation>Somnopose</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose Software</source>
+        <translation>Somnopose Software</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Zeo</source>
+        <translation>Zeo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Personal Sleep Coach</source>
+        <translation>Personal Sleep Coach</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gFlagsLine.cpp" line="195"/>
+        <source>Database Outdated
+Please Rebuild CPAP Data</source>
+        <translation>Base de donnée périmée
+Merci de reconstruire les données de PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="587"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="589"/>
+        <source>SmartFlex Mode</source>
+        <translation>Mode SmartFelx</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="588"/>
+        <source>Intellipap pressure relief mode.</source>
+        <translation>Mode dépression Intellipap.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="594"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2639"/>
+        <source>Ramp Only</source>
+        <translation>Rampe seulement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="595"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2640"/>
+        <source>Full Time</source>
+        <translation>Temps complet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="598"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="600"/>
+        <source>SmartFlex Level</source>
+        <translation>Niveau de SmartFlex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="599"/>
+        <source>Intellipap pressure relief level.</source>
+        <translation>Niveau de dépression Intellipap.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1034"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1586"/>
+        <source>VPAP Adapt</source>
+        <translation>VPAP Adaptable</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2632"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2634"/>
+        <source>EPR</source>
+        <translation>EPR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2633"/>
+        <source>ResMed Exhale Pressure Relief</source>
+        <translation>Dépression d'expiration ResMed</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2641"/>
+        <source>Patient???</source>
+        <translation>Patient ???</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2644"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2646"/>
+        <source>EPR Level</source>
+        <translation>Niveau de l'EPR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2645"/>
+        <source>Exhale Pressure Relief Level</source>
+        <translation>Niveau de dépression d'expiration</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2649"/>
+        <source>0cmH2O</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2650"/>
+        <source>1cmH2O</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2651"/>
+        <source>2cmH2O</source>
+        <translation>2cmH2O</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2652"/>
+        <source>3cmH2O</source>
+        <translation>3CmH2O</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>Weinmann</source>
+        <translation>Weinman</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>SOMNOsoft2</source>
+        <translation>SOMNOsoft2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/MinutesAtPressure.cpp" line="234"/>
+        <source>(% of time)</source>
+        <translation>(% du temps)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>By Pressure</source>
+        <translation>Par Pression</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>Statistics at Pressure</source>
+        <translation>Statistique a la Pression</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="923"/>
+        <source>%1 Session #%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1271"/>
+        <source>SleepyHead is proudly brought to you by JediMark.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1394"/>
+        <source>d MMM [ %1 - %2 ]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1930"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1983"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2058"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2075"/>
+        <source>%1</source>
+        <translation type="unfinished">%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2038"/>
+        <source>Hide All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2039"/>
+        <source>Show All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2363"/>
+        <source>Unpin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2438"/>
+        <source>Pin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="107"/>
+        <source>%1: %2</source>
+        <translation type="unfinished">%1% %2 {1:?}</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="150"/>
+        <source>Relief: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="156"/>
+        <source>Hours: %1h, %2m, %3s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="259"/>
+        <source>Machine Information</source>
+        <translation type="unfinished">Information de la machine</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>Journal Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="43"/>
+        <source>SleepyHead found an old Journal folder, but it looks like it's been renamed:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="45"/>
+        <source>SleepyHead will not touch this folder, and will create a new one instead.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="46"/>
+        <source>Please be careful when playing in SleepyHead's profile folders :-P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="53"/>
+        <source>For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="54"/>
+        <source>SleepyHead picked only the first one of these, and will use it in future:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="56"/>
+        <source>If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F3.7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F</source>
+        <translation type="unfinished">CMS50F</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/machine.cpp" line="404"/>
+        <source>Loading %1 data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/progressdialog.cpp" line="14"/>
+        <source>PLease Wait...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="334"/>
+        <source>Snapshot %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QuaZipFilePrivate</name>
+    <message>
+        <location filename="../3rdparty/quazip/quazip/quazipfile.cpp" line="217"/>
+        <source>ZIP/UNZIP API error %1</source>
+        <translation>Erreur de l'API de ZIP/UNZIP : %1</translation>
+    </message>
+</context>
+<context>
+    <name>Report</name>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulaire</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="27"/>
+        <source>about:blank</source>
+        <translation>ausujet:blanc</translation>
+    </message>
+</context>
+<context>
+    <name>SessionBar</name>
+    <message>
+        <location filename="../sleepyhead/sessionbar.cpp" line="282"/>
+        <source>No Sessions Present</source>
+        <translation>Pas de session présente</translation>
+    </message>
+</context>
+<context>
+    <name>Statistics</name>
+    <message>
+        <source>No CPAP data available.</source>
+        <translation type="obsolete">pas de donnée disponibles.</translation>
+    </message>
+    <message>
+        <source>%1 day of CPAP Data, on %2.</source>
+        <translation type="obsolete">%1 jour de donnée , sur %2.</translation>
+    </message>
+    <message>
+        <source>%1 days of CPAP Data, between %2 and %3</source>
+        <translation type="obsolete">%1 jours de donnée , entre  %2 et %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="667"/>
+        <source>Details</source>
+        <translation>Détails</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="607"/>
+        <source>Most Recent</source>
+        <translation>le plus récent</translation>
+    </message>
+    <message>
+        <source>Last 7 Days</source>
+        <translation type="obsolete">Semaine dernière</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="609"/>
+        <source>Last 30 Days</source>
+        <translation>Dernier mois</translation>
+    </message>
+    <message>
+        <source>Last 6 months</source>
+        <translation type="obsolete">Dernier 6 mois</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="611"/>
+        <source>Last Year</source>
+        <translation>Dernière année</translation>
+    </message>
+    <message>
+        <source>RERA Index</source>
+        <translation type="obsolete">Indexe RERA</translation>
+    </message>
+    <message>
+        <source>Flow Limit Index</source>
+        <translation type="obsolete">Index de Limitation du Flux</translation>
+    </message>
+    <message>
+        <source>Hours per Night</source>
+        <translation type="obsolete">Heures par Nuit</translation>
+    </message>
+    <message>
+        <source>Min EPAP</source>
+        <translation type="obsolete">EPAP Min</translation>
+    </message>
+    <message>
+        <source>Max IPAP</source>
+        <translation type="obsolete">IPAP Max</translation>
+    </message>
+    <message>
+        <source>Average Pressure</source>
+        <translation type="obsolete">Pression Moyenne</translation>
+    </message>
+    <message>
+        <source>%1% Pressure</source>
+        <translation type="obsolete">Pression %1% </translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation type="obsolete">Pression</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="83"/>
+        <location filename="../sleepyhead/statistics.cpp" line="84"/>
+        <source>Average %1</source>
+        <translation>%1 Moyenne </translation>
+    </message>
+    <message>
+        <source>%1% %2</source>
+        <translation type="obsolete">%1% %2</translation>
+    </message>
+    <message>
+        <source>%1 day of Oximetry Data, on %2.</source>
+        <translation type="obsolete">%1 jour de donnée d'Oxymetrie , sur %2.</translation>
+    </message>
+    <message>
+        <source>%1 days of Oximetry Data, between %2 and %3</source>
+        <translation type="obsolete">%1 jours de donnée d'Oxymetire, entre  %2 et %3</translation>
+    </message>
+    <message>
+        <source>Average SpO2</source>
+        <translation type="obsolete">SpO2  Moyenne </translation>
+    </message>
+    <message>
+        <source>Minimum SpO2</source>
+        <translation type="obsolete">SpO2  Minimum </translation>
+    </message>
+    <message>
+        <source>SpO2 Events / Hour</source>
+        <translation type="obsolete">Evènement SpO2 /Heure</translation>
+    </message>
+    <message>
+        <source>% of time in SpO2 Events</source>
+        <translation type="obsolete">% du temps en evènement SpO2</translation>
+    </message>
+    <message>
+        <source>Average Pulse Rate</source>
+        <translation type="obsolete">Fréquence Pulsation Moyenne</translation>
+    </message>
+    <message>
+        <source>Minimum Pulse Rate</source>
+        <translation type="obsolete">Fréquence Pulsation Mini</translation>
+    </message>
+    <message>
+        <source>Maximum Pulse Rate</source>
+        <translation type="obsolete">Fréquence Pulsation Maxi</translation>
+    </message>
+    <message>
+        <source>Pulse Change Events / Hour</source>
+        <translation type="obsolete">Changement de pulsation Nb/Heure</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="30"/>
+        <source>CPAP Statistics</source>
+        <translation>Statistiques PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="33"/>
+        <source>CPAP Usage</source>
+        <translation>Usage de la PPC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="34"/>
+        <source>Average Hours per Night</source>
+        <translation>moyenne des Heures par Nuit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="35"/>
+        <source>Compliance</source>
+        <translation>Conformité</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="37"/>
+        <source>Therapy Efficiacy</source>
+        <translation>Efficacité de la Thérapie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="47"/>
+        <source>Leak Statistics</source>
+        <translation>Statistiques des fuites</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="52"/>
+        <source>Pressure Statistics</source>
+        <translation>Statistiques de Pression</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="65"/>
+        <source>Oximeter Statistics</source>
+        <translation>Statistique de l'Oximètre</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="69"/>
+        <source>Blood Oxygen Saturation</source>
+        <translation>Saturation en Oxygène du sang</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="74"/>
+        <source>Pulse Rate</source>
+        <translation>Fréquence Pulsation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="82"/>
+        <source>%1 Median</source>
+        <translation>%1 Median</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="85"/>
+        <source>90% %1</source>
+        <translation>90% %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="86"/>
+        <source>Min %1</source>
+        <translation>%1 Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="87"/>
+        <source>Max %1</source>
+        <translation>%1 Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="88"/>
+        <source>%1 Index</source>
+        <translation>Indexe %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="89"/>
+        <source>% of time in %1</source>
+        <translation>% du temp en %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="90"/>
+        <source>% of time above %1 threshold</source>
+        <translation>% du temps audessus de la limite de %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="91"/>
+        <source>% of time below %1 threshold</source>
+        <translation>% du temps en dessous de la limite de %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="550"/>
+        <source>I can haz data?!?</source>
+        <translation>Des données svp !?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="551"/>
+        <source>This lonely sleepy sheep has no data :(</source>
+        <translation>Pas de donées </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="608"/>
+        <source>Last Week</source>
+        <translation>Semaine dernière</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="610"/>
+        <source>Last 6 Months</source>
+        <translation>Dernier 6 mois</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="615"/>
+        <source>Last Session</source>
+        <translation>Dernière Session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="681"/>
+        <source>No %1 data available.</source>
+        <translation>Pas de donnée %1 disponible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="684"/>
+        <source>%1 day of %2 Data on %3</source>
+        <translation>%1 jour sur %2 de données sur %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="690"/>
+        <source>%1 days of %2 Data, between %3 and %4</source>
+        <translation>%1 jours de %2 , entre %3 et %4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="963"/>
+        <source>Usage Information</source>
+        <translation>Information d'utlisations</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="964"/>
+        <source>Total Days</source>
+        <translation>Jours Total</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="968"/>
+        <source>Compliant Days</source>
+        <translation>Jours Corrects</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="980"/>
+        <source>Days AHI &gt;5.0</source>
+        <translation>Jours AHI > 5.0</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="985"/>
+        <source>Best&nbsp;%1</source>
+        <translation>Meilleur &bnsp; %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="998"/>
+        <source>Worst&nbsp;%1</source>
+        <translation>Pire&nbsp;%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1024"/>
+        <source>Best RX Setting</source>
+        <translation>Meilleur Réglages RX</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1025"/>
+        <source>Worst RX Setting</source>
+        <translation>Pires Réglages RX</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1095"/>
+        <source>Changes to Prescription Settings</source>
+        <translation>Changement pas rapport aux réglages de la prescription</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1103"/>
+        <source>Days</source>
+        <translation>Jours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1110"/>
+        <source>Pressure Relief</source>
+        <translation>Allégement de la pression</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation type="obsolete">FL</translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="obsolete">Restants de Pressions.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1112"/>
+        <source>Pressure Settings</source>
+        <translation>Réglage de la pression</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1123"/>
+        <source>Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.</source>
+        <translation>Le résumé d'efficacité ignore les réglages avec moins de %1 jours de données enregistrées.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1243"/>
+        <source>Machine Information</source>
+        <translation>Information de la machine</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1250"/>
+        <source>First Use</source>
+        <translation>Première Utilisation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1251"/>
+        <source>Last Use</source>
+        <translation>Dernière Utilisation</translation>
+    </message>
+</context>
+<context>
+    <name>Summary</name>
+    <message>
+        <source>No CPAP data available.</source>
+        <translation type="obsolete">pas de donnée disponibles.</translation>
+    </message>
+    <message>
+        <source>%1 day of CPAP Data, on %2.</source>
+        <translation type="obsolete">%1 jour de donnée , sur %2.</translation>
+    </message>
+    <message>
+        <source>%1 days of CPAP Data, between %2 and %3</source>
+        <translation type="obsolete">%1 jours de donnée , entre  %2 et %3</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation type="obsolete">Détails</translation>
+    </message>
+    <message>
+        <source>Most Recent</source>
+        <translation type="obsolete">le plus récent</translation>
+    </message>
+    <message>
+        <source>Last 7 Days</source>
+        <translation type="obsolete">Semaine dernière</translation>
+    </message>
+    <message>
+        <source>Last 30 Days</source>
+        <translation type="obsolete">Dernier mois</translation>
+    </message>
+    <message>
+        <source>Last 6 months</source>
+        <translation type="obsolete">Dernier 6 mois</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation type="obsolete">Dernière année</translation>
+    </message>
+    <message>
+        <source>RERA Index</source>
+        <translation type="obsolete">Indexe RERA</translation>
+    </message>
+    <message>
+        <source>Flow Limit Index</source>
+        <translation type="obsolete">Index de Limitation du Flux</translation>
+    </message>
+    <message>
+        <source>Hours per Night</source>
+        <translation type="obsolete">Heures par Nuit</translation>
+    </message>
+    <message>
+        <source>Min EPAP</source>
+        <translation type="obsolete">EPAP Min</translation>
+    </message>
+    <message>
+        <source>Max IPAP</source>
+        <translation type="obsolete">IPAP Max</translation>
+    </message>
+    <message>
+        <source>Average Pressure</source>
+        <translation type="obsolete">Pression Moyenne</translation>
+    </message>
+    <message>
+        <source>%1% Pressure</source>
+        <translation type="obsolete">Pression %1% </translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation type="obsolete">Pression</translation>
+    </message>
+    <message>
+        <source>Average %1</source>
+        <translation type="obsolete">%1 Moyenne </translation>
+    </message>
+    <message>
+        <source>%1% %2</source>
+        <translation type="obsolete">%1% %2</translation>
+    </message>
+    <message>
+        <source>Oximetry Summary</source>
+        <translation type="obsolete">Résumé d'Oximétrie</translation>
+    </message>
+    <message>
+        <source>%1 day of Oximetry Data, on %2.</source>
+        <translation type="obsolete">%1 jour de donnée d'Oxymetrie , sur %2.</translation>
+    </message>
+    <message>
+        <source>%1 days of Oximetry Data, between %2 and %3</source>
+        <translation type="obsolete">%1 jours de donnée d'Oxymetire, entre  %2 et %3</translation>
+    </message>
+    <message>
+        <source>Average SpO2</source>
+        <translation type="obsolete">SpO2  Moyenne </translation>
+    </message>
+    <message>
+        <source>Minimum SpO2</source>
+        <translation type="obsolete">SpO2  Minimum </translation>
+    </message>
+    <message>
+        <source>SpO2 Events / Hour</source>
+        <translation type="obsolete">Evènement SpO2 /Heure</translation>
+    </message>
+    <message>
+        <source>% of time in SpO2 Events</source>
+        <translation type="obsolete">% du temps en evènement SpO2</translation>
+    </message>
+    <message>
+        <source>Average Pulse Rate</source>
+        <translation type="obsolete">Fréquence Pulsation Moyenne</translation>
+    </message>
+    <message>
+        <source>Minimum Pulse Rate</source>
+        <translation type="obsolete">Fréquence Pulsation Mini</translation>
+    </message>
+    <message>
+        <source>Maximum Pulse Rate</source>
+        <translation type="obsolete">Fréquence Pulsation Maxi</translation>
+    </message>
+    <message>
+        <source>Pulse Change Events / Hour</source>
+        <translation type="obsolete">Changement de pulsation Nb/Heure</translation>
+    </message>
+    <message>
+        <source>Usage Information</source>
+        <translation type="obsolete">Information d'utlisations</translation>
+    </message>
+    <message>
+        <source>Total Days</source>
+        <translation type="obsolete">Jours Total</translation>
+    </message>
+    <message>
+        <source>Compliant Days</source>
+        <translation type="obsolete">Jours Corrects</translation>
+    </message>
+    <message>
+        <source>Days AHI &gt;5.0</source>
+        <translation type="obsolete">Jours AHI > 5.0</translation>
+    </message>
+    <message>
+        <source>Best&nbsp;%1</source>
+        <translation type="obsolete">Meilleur &bnsp; %1</translation>
+    </message>
+    <message>
+        <source>Worst&nbsp;%1</source>
+        <translation type="obsolete">Pire&nbsp;%1</translation>
+    </message>
+    <message>
+        <source>Best RX Setting</source>
+        <translation type="obsolete">Meilleur Réglages RX</translation>
+    </message>
+    <message>
+        <source>Worst RX Setting</source>
+        <translation type="obsolete">Pires Réglages RX</translation>
+    </message>
+    <message>
+        <source>Days</source>
+        <translation type="obsolete">Jours</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation type="obsolete">FL</translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="obsolete">Restants de Pressions.</translation>
+    </message>
+    <message>
+        <source>First Use</source>
+        <translation type="obsolete">Première Utilisation</translation>
+    </message>
+    <message>
+        <source>Last Use</source>
+        <translation type="obsolete">Dernière Utilisation</translation>
+    </message>
+</context>
+<context>
+    <name>UpdaterWindow</name>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="14"/>
+        <source>SleepyHead Updater</source>
+        <translation>SpleepyHead Mise a jour</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="51"/>
+        <source>A new version of $APP is available</source>
+        <translation>Une nouvelle version de $APP est disponible</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="97"/>
+        <source>Version Information</source>
+        <translation>Informations de Version</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="108"/>
+        <source>Release Notes</source>
+        <translation>Note de publication</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="121"/>
+        <source>about:blank</source>
+        <translation>ausujet:blanc</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="130"/>
+        <source>Build Notes</source>
+        <translation>Note de compilation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="174"/>
+        <source>Maybe &Later</source>
+        <translation>&Plus tard</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="194"/>
+        <source>&Upgrade Now</source>
+        <translation>&Upgrader Maintenant</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="220"/>
+        <source>Please wait while updates are downloaded and installed...</source>
+        <translation>Merci d'attendre téléchargement et installation en cours...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="234"/>
+        <source>Updates</source>
+        <translation>Mises à jours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="265"/>
+        <source>Component</source>
+        <translation>Composant</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="270"/>
+        <source>Version</source>
+        <translation>Version</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="275"/>
+        <source>Size</source>
+        <translation>Taille</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="280"/>
+        <source>Progress</source>
+        <translation>Avancement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="289"/>
+        <source>Log</source>
+        <translation>Log</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="317"/>
+        <source>Downloading & Installing Updates</source>
+        <translation>Téléchargment et Installation en cours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="337"/>
+        <source>&Finished</source>
+        <translation>&Fin de mise à jour</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="94"/>
+        <source>Checking for SleepyHead Updates</source>
+        <translation>Vérification de disponibilité de mise à jour</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="109"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="171"/>
+        <source>Requesting </source>
+        <translation>Requete enn cours</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="178"/>
+        <source>Saving as </source>
+        <translation>Enregistrer comme</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="256"/>
+        <source>XML update structure parsed cleanly</source>
+        <translation>Structure XML de mise à jour analysée correctement</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <source>No updates were found for your platform.</source>
+        <translation>Aucune mise à jour disponible. </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="322"/>
+        <source>SleepyHead Updates</source>
+        <translation>Mise à jour de SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="321"/>
+        <source>No new updates were found for your platform.</source>
+        <translation>Aucune nouvelle mise à jour disponible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="339"/>
+        <source>SleepyHead v%1, codename "%2"</source>
+        <translation>SpleepyHead v%1, nom de code "%2"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="342"/>
+        <source>platform notes</source>
+        <translation>Note spécifiques à la plateforme</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="347"/>
+        <source>A new version of SleepyHead is available!</source>
+        <translation>Une nouvelle version est disponible !</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="348"/>
+        <source>Shiny new <b>v%1</b> is available. You're running old and busted v%2</source>
+        <translation>Une toute nouvelle version  <b>v%1</b> est disponible. Vous utilisez l'antique version v%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="352"/>
+        <source>An update for SleepyHead is available.</source>
+        <translation>Une mise à jour de SleepyHead est disponible.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="353"/>
+        <source>Version <b>%1</b> is available. You're currently running v%1</source>
+        <translation>La version  <b>v%1</b> est disponible. Vous utilisez la v%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="366"/>
+        <source>SleepyHead v%1 build notes</source>
+        <translation>Notes de compilation de la version %1 du logiciel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="369"/>
+        <source>Update to QtLibs (v%1)</source>
+        <translation>Mettez a jour la Librairie QtLibs en (v%1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="379"/>
+        <source>There was an error parsing the XML Update file.</source>
+        <translation>Structure XML de mise à jour analysée avec ERREUR!.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="400"/>
+        <source>%1 bytes received</source>
+        <translation>%1 octets reçus</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="430"/>
+        <source>Redirected to </source>
+        <translation>Redirigé vers </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="444"/>
+        <source>File size mismatch for %1</source>
+        <translation>Taille du fichier %1 incorrecte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="455"/>
+        <source>File integrity check failed for %1</source>
+        <translation>Erreur de vérification du fichier %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="485"/>
+        <source>Extracting </source>
+        <translation>Extraction </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="546"/>
+        <source>You might need to reinstall manually. Sorry :(</source>
+        <translation>Vous allez devoir reinstaller manuellement . Désolé :( </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="547"/>
+        <source>Ugh.. Something went wrong with unzipping.</source>
+        <translation>Erreur lors de la décompression.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="560"/>
+        <source>Failed</source>
+        <translation>Echec</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="580"/>
+        <source>Download Complete</source>
+        <translation>Téléchargement Terminé</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="584"/>
+        <source>There was an error completing a network request:
+
+(</source>
+        <translation>Erreur lors d'une requête réseau:
+
+(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="629"/>
+        <source>Update Complete!</source>
+        <translation>Mise à jour terminée !</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="632"/>
+        <source>Updates Complete. SleepyHead needs to restart now, click Finished to do so.</source>
+        <translation>Mise à jour terminé. Cliquez Fin pour relancer SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="635"/>
+        <source>Update Failed :(</source>
+        <translation>Echec de la mise à jour :( </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="637"/>
+        <source>Download Error. Sorry, try again later.</source>
+        <translation>Erreur de téléchargement. Désolé réessayez plus tard.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="654"/>
+        <source>Downloading & Installing Updates...</source>
+        <translation>Téléchargment et Installation en cours...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="655"/>
+        <source>Please wait while downloading and installing updates.</source>
+        <translation>Veuillez patienter pendant le téléchargement et l'installation des mises à jour.</translation>
+    </message>
+</context>
+<context>
+    <name>gGraph</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="694"/>
+        <source>Snapshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraphView</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="361"/>
+        <source>100% zoom level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="362"/>
+        <source>Restore X-axis zoom too 100% to view entire days data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="364"/>
+        <source>Reset Graph Layout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="365"/>
+        <source>Resets all graphs to a uniform height and default order.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="368"/>
+        <source>Y-Axis</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="369"/>
+        <source>Plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="374"/>
+        <source>CPAP Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="377"/>
+        <source>Oximeter Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="380"/>
+        <source>Dotted Lines</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1854"/>
+        <source>Remove Clone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1858"/>
+        <source>Clone %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/Translations/Nederlands.nl.ts b/Translations/Nederlands.nl.ts
new file mode 100644
index 0000000..6e963e5
--- /dev/null
+++ b/Translations/Nederlands.nl.ts
@@ -0,0 +1,10797 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="nl_NL">
+<context>
+    <name>CMS50Loader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Could not get data transmission from oximeter.</source>
+        <translation>Er kwam geen gegevensoverdracht van de oxymeter.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Please ensure you select 'upload' from the oximeter devices menu.</source>
+        <translation>Kies eerst 'upload' in het menu van de oxymeter.</translation>
+    </message>
+</context>
+<context>
+    <name>CMS50Serial</name>
+    <message>
+        <source>Processing...</source>
+        <translation type="vanished">Verwerken...</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">Vraag</translation>
+    </message>
+    <message>
+        <source>Did you remember to start your oximeter recording at exactly the same time you started your CPAP machine?</source>
+        <translation type="vanished">Heb je eraan gedacht om de oxymeter precies gelijk met je CPAP te starten?</translation>
+    </message>
+    <message>
+        <source>Information</source>
+        <translation type="vanished">Informatie</translation>
+    </message>
+    <message>
+        <source>The most recent CPAP Session time has been selected as the start of your oximetry session.
+If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter.</source>
+        <translation type="vanished">Het begin van de laatste CPAP sessie is gekozen als start voor je oxymetrie sessie.
+Als je bent vergeten om eerst de CPAP data te importeren, doe dat dan nu eerst en dan opnieuw de oxymeter.</translation>
+    </message>
+    <message>
+        <source>No valid start time was provided for this oximeter session. You will likely have to adjust your oximeter sessions start time before saving.</source>
+        <translation type="vanished">Er is geen geldige starttijd voor deze oxymetrie sessie. Pas de starttijd aan voordat je het opslaat.</translation>
+    </message>
+    <message>
+        <source>That's ok, I will use the time provided by your oximeter, however it will sync better next time if you start your oximeter recording at the same time your CPAP machine starts up.</source>
+        <translation type="vanished">Dat is OK, ik zal de tijd van de oxymeter gebruiken. Maar het synchroniseren zal beter gaan als je de oxymeter tegelijk start met je CPAP.</translation>
+    </message>
+    <message>
+        <source>If you haven't set your oximeter clock you will have to manually edit this time before saving this oximetry session.</source>
+        <translation type="vanished">Als je de klok van de oxymeter niet hebt ingesteld, moet je deze tijd aanpassen voordat je de sessie opslaat.</translation>
+    </message>
+    <message>
+        <source>It looks like your oximeter doesn't provide a valid start time, I'm going to set this oximetry session starting time to the CPAP starting time anyway.</source>
+        <translation type="vanished">Het ziet ernaar uit dat de oxymeter niet een goede starttijd aangeeft. Ik zet deze starttijd nu gelijk aan die van de CPAP.</translation>
+    </message>
+    <message>
+        <source>You may have to adjust it manually if you remember the real start time before saving this session.</source>
+        <translation type="vanished">Je kunt beter de tijd nu corrigeren, als je weet wat de echte starttijd was.</translation>
+    </message>
+    <message>
+        <source>(Also, did you remember to import todays CPAP data first?)</source>
+        <translation type="vanished">(Ben je niet vergeten om EERST de CPAP gegevens te importeren?)</translation>
+    </message>
+    <message>
+        <source>The most recent CPAP Session time has been selected as the start of your oximetry session.</source>
+        <translation type="vanished">Het tijdstip van de meest recente CPAP sessie wordt gebruikt als starttijd van de oxymetrie sessie.</translation>
+    </message>
+    <message>
+        <source>If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter.</source>
+        <translation type="vanished">Als je vergeten bent om eerst de CPAP gegevens te importeren, doe dat dan nu en importeer daarna opnieuw de gegevens van de oxymeter.</translation>
+    </message>
+    <message>
+        <source>No valid start time was provided for this oximeter session.</source>
+        <translation type="vanished">Er is geen geldige starttijd voor deze oxymetrie sessie opgegeven.</translation>
+    </message>
+    <message>
+        <source>You will likely have to adjust your oximeter sessions start time before saving.</source>
+        <translation type="vanished">Je kunt beter de klok van de oxymeter gelijkzetten voordat je dit opslaat.</translation>
+    </message>
+    <message>
+        <source>Please Wait, Importing...</source>
+        <translation type="vanished">Even wachten, import loopt...</translation>
+    </message>
+    <message>
+        <source>Import Failed. Wait for oximeter and try again.</source>
+        <translation type="vanished">Import mislukt, Wacht tot de oxymeter klaar is en probeer het opnieuw.</translation>
+    </message>
+    <message>
+        <source>Something went wrong with reading from the Oximeter.</source>
+        <translation type="vanished">Er ging iets fout bij het importeren vanaf de oxymeter.</translation>
+    </message>
+    <message>
+        <source>Please wait for oximeter to finish tranmitting than try restarting import again.</source>
+        <translation type="vanished">Wacht even tot de oxymeter klaar is met verzenden en start dan de import opnieuw.</translation>
+    </message>
+    <message>
+        <source>Import Failed</source>
+        <translation type="vanished">Import mislukt</translation>
+    </message>
+    <message>
+        <source>Set Oximeter to Upload</source>
+        <translation type="vanished">Start Upload op de oxymeter</translation>
+    </message>
+</context>
+<context>
+    <name>Daily</name>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="435"/>
+        <source>Form</source>
+        <translatorcomment>Staat bovenaan het venster hierboven</translatorcomment>
+        <translation>Formulier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="506"/>
+        <source>Go to the previous day</source>
+        <translation>Ga naar de vorige dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="525"/>
+        <source>Prev</source>
+        <translatorcomment>Niet gezien</translatorcomment>
+        <translation>Vorige</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="551"/>
+        <source>Show or hide the calender</source>
+        <translation>Kalender aan/uit zetten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="574"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="614"/>
+        <source>Go to the next day</source>
+        <translation>Ga naar de volgende dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="636"/>
+        <source>Next</source>
+        <translatorcomment>Niet gezien</translatorcomment>
+        <translation>Volgende</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="674"/>
+        <source>Go to the most recent day with data records</source>
+        <translatorcomment>WJG: compacter</translatorcomment>
+        <translation>Ga naar de laatste dag met gegevens</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation type="obsolete">Details</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translatorcomment>Niet gezien</translatorcomment>
+        <translation type="obsolete">about:blank</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="852"/>
+        <source>Events</source>
+        <translatorcomment>WJG: Zou 'Apneus' niet beter zijn dan Gebeurtenissen'? Want dat is wat hier geteld wordt en het past beter op de ruimte van het tabje.
+AK: Nee, er zijn ook andere gebeurtenissen: snurken, RERA, enz. Misschien 'evenementen' of 'incidenten'?</translatorcomment>
+        <translation>Incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="914"/>
+        <source>View Size</source>
+        <translatorcomment>Onder INCIDENTEN
+Misschien is 'Zoomniveau' beter?</translatorcomment>
+        <translation>Beeldgrootte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="959"/>
+        <location filename="../sleepyhead/daily.ui" line="1374"/>
+        <source>Notes</source>
+        <translatorcomment>WJG: Is compacter, past beter op tabje
+In verband met de koppeling met Bladwijzers, lijkt me 'Notities' beter.</translatorcomment>
+        <translation>Notities</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1013"/>
+        <source>Journal</source>
+        <translatorcomment>WJG: is gebruikelijker</translatorcomment>
+        <translation>Dagboek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1099"/>
+        <source>Small</source>
+        <translation>Klein</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1104"/>
+        <source>Medium</source>
+        <translation>Medium</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1109"/>
+        <source>Big</source>
+        <translation>Groot</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1079"/>
+        <source>Color</source>
+        <translation>Kleur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1038"/>
+        <source> i </source>
+        <translation> i </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1041"/>
+        <source>Ctrl+I</source>
+        <translatorcomment>Toetsenbord combinatie voor cursief</translatorcomment>
+        <translation>Ctrl+I</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1069"/>
+        <source>u</source>
+        <translation>u</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1054"/>
+        <source>B</source>
+        <translation>B</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1057"/>
+        <source>Ctrl+B</source>
+        <translatorcomment>Toetsenbord combinatie voor vet</translatorcomment>
+        <translation>Ctrl+B</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1168"/>
+        <source>Zombie</source>
+        <translation>Zombie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1181"/>
+        <source>I'm feeling...</source>
+        <translation>Ik voel me ...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1197"/>
+        <source>Weight</source>
+        <translation>Gewicht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1271"/>
+        <source>Awesome</source>
+        <translation>Fantastisch</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1309"/>
+        <source>B.M.I.</source>
+        <translatorcomment>zonder puntjes?</translatorcomment>
+        <translation>B.M.I.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1325"/>
+        <source>Bookmarks</source>
+        <translation>Bladwijzers</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1346"/>
+        <source>Add Bookmark</source>
+        <translation>Bladwijzer toevoegen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1369"/>
+        <source>Starts</source>
+        <translatorcomment>WJG: er wordt een punt in de tijd mee aangegeven vanaf wanneer je opmerkingen wilt plaatsen</translatorcomment>
+        <translation>Vanaf</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1382"/>
+        <source>Remove Bookmark</source>
+        <translation>Bladwijzer verwijderen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1475"/>
+        <source>Flags</source>
+        <translation>Markeringen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1527"/>
+        <source>Graphs</source>
+        <translation>Grafieken</translation>
+    </message>
+    <message>
+        <source>Zoom fully out</source>
+        <translation type="vanished">Volledig uitzoomen</translation>
+    </message>
+    <message>
+        <source>100%</source>
+        <translation type="vanished">100%</translation>
+    </message>
+    <message>
+        <source>Reset the graph heights to uniform sizes</source>
+        <translation type="vanished">Maak de grafiekhoogtes weer gelijk</translation>
+    </message>
+    <message>
+        <source>Reset</source>
+        <translation type="vanished">Reset hoogtes</translation>
+    </message>
+    <message>
+        <source>Flags:</source>
+        <translation type="vanished">Markeringen:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1552"/>
+        <source>Drop down this list to show/hide available graphs.</source>
+        <translatorcomment>WJG: In het Engels ook nogal omslachtig
+AK: Wellicht 'beschikbare' ook weglaten, is verwarrend, want de eerste is gelijk een (belangrijke) keuze</translatorcomment>
+        <translation>Toon/verberg grafieken.</translation>
+    </message>
+    <message>
+        <source>Flow Rate</source>
+        <translatorcomment>AK: Afgekort wegens ruimtegebrek</translatorcomment>
+        <translation type="obsolete">Stroomsnelh.</translation>
+    </message>
+    <message>
+        <source>RDI</source>
+        <translatorcomment>WJG: Wat is RDI?
+AK: Respiratory Disturbance Index, iets van Respironics</translatorcomment>
+        <translation type="obsolete">RDI</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation type="obsolete">AHI</translation>
+    </message>
+    <message>
+        <source>Mask Pressure</source>
+        <translation type="obsolete">Maskerdruk</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation type="obsolete">Druk</translation>
+    </message>
+    <message>
+        <source>Leak</source>
+        <translation type="obsolete">Lek</translation>
+    </message>
+    <message>
+        <source>Snore</source>
+        <translation type="obsolete">Snurken</translation>
+    </message>
+    <message>
+        <source>Resp. Rate</source>
+        <translatorcomment>Afgekort wegens ruimtegebrek</translatorcomment>
+        <translation type="obsolete">Ademtempo</translation>
+    </message>
+    <message>
+        <source>Tidal Volume</source>
+        <translation type="obsolete">Teugvolume</translation>
+    </message>
+    <message>
+        <source>Minute Vent.</source>
+        <translation type="obsolete">Minuutventilatie</translation>
+    </message>
+    <message>
+        <source>Flow Limitation</source>
+        <translatorcomment>Staat in: Instellingen-Grafieken</translatorcomment>
+        <translation type="obsolete">Stroombeperk.</translation>
+    </message>
+    <message>
+        <source>Pat. Trig. Breath</source>
+        <translatorcomment>WJG: te lang, past niet
+AK: Heeel moeilijk!</translatorcomment>
+        <translation type="obsolete">Pat. Veroorz. Ademh.</translation>
+    </message>
+    <message>
+        <source>Resp. Event</source>
+        <translatorcomment>WJG: Zie 'event'
+AK: zie mijn opmerking bij 'event'</translatorcomment>
+        <translation type="obsolete">Incident</translation>
+    </message>
+    <message>
+        <source>Insp. Time</source>
+        <translatorcomment>Staat in: Instellingen-Grafieken</translatorcomment>
+        <translation type="obsolete">Inademtijd</translation>
+    </message>
+    <message>
+        <source>Exp. Time</source>
+        <translatorcomment>Staat in: Instellingen-Grafieken</translatorcomment>
+        <translation type="obsolete">Uitademtijd</translation>
+    </message>
+    <message>
+        <source>IE</source>
+        <translatorcomment>WJG: wat is IE?
+AK: Bij een BIPAP Verhouding Inhalatie- Exhalatietijd, dus I/E</translatorcomment>
+        <translation type="obsolete">I/E</translation>
+    </message>
+    <message>
+        <source>Sleep Stage</source>
+        <translatorcomment>Staat in: Instellingen-Grafieken</translatorcomment>
+        <translation type="obsolete">Slaapfase</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>Breakdown</source>
+        <translatorcomment>Niet gezien</translatorcomment>
+        <translation>Verdeling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>events</source>
+        <translation>incidenten</translation>
+    </message>
+    <message>
+        <source>H</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">H</translation>
+    </message>
+    <message>
+        <source>A</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">A</translation>
+    </message>
+    <message>
+        <source>OA</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">OA</translation>
+    </message>
+    <message>
+        <source>CA</source>
+        <translatorcomment>Letters in de cirkelgrafiek
+CA is Clear Airway, wat gelijk staat met Centrale Apneu</translatorcomment>
+        <translation type="obsolete">CA</translation>
+    </message>
+    <message>
+        <source>RE</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">RE</translation>
+    </message>
+    <message>
+        <source>NR</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">NR</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">FL</translation>
+    </message>
+    <message>
+        <source>PB</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">PB</translation>
+    </message>
+    <message>
+        <source>E</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">E</translation>
+    </message>
+    <message>
+        <source>L</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">L</translation>
+    </message>
+    <message>
+        <source>NRI</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">NRI</translation>
+    </message>
+    <message>
+        <source>VS</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">VS</translation>
+    </message>
+    <message>
+        <source>VS2</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">VS2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="212"/>
+        <source>UF1</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="213"/>
+        <source>UF2</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <source>UF3</source>
+        <translatorcomment>Letters in de cirkelgrafiek</translatorcomment>
+        <translation type="obsolete">UF3</translation>
+    </message>
+    <message>
+        <source>Selection AHI</source>
+        <translation type="vanished">Selectie AHI</translation>
+    </message>
+    <message>
+        <source>CSR</source>
+        <translation type="obsolete">CSR</translation>
+    </message>
+    <message>
+        <source>PR</source>
+        <translation type="obsolete">PR</translation>
+    </message>
+    <message>
+        <source>U1</source>
+        <translation type="vanished">U1</translation>
+    </message>
+    <message>
+        <source>U2</source>
+        <translation type="vanished">U2</translation>
+    </message>
+    <message>
+        <source>U3</source>
+        <translation type="vanished">U3</translation>
+    </message>
+    <message>
+        <source>O2</source>
+        <translation type="obsolete">O2</translation>
+    </message>
+    <message>
+        <source>Events/hour</source>
+        <translation type="vanished">Incidenten/uur</translation>
+    </message>
+    <message>
+        <source>PD</source>
+        <translation type="obsolete">PD</translation>
+    </message>
+    <message>
+        <source>No Data</source>
+        <translation type="obsolete">Geen gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="517"/>
+        <source>No %1 events are recorded this day</source>
+        <translation>Er zijn vandaag geen %1 incidenten geweest</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="615"/>
+        <source>%1 event</source>
+        <translation>%1 incident</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="616"/>
+        <source>%1 events</source>
+        <translation>%1 incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1093"/>
+        <source>PAP Mode: %1<br/></source>
+        <translation>Soort PAP: %1<br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1098"/>
+        <source>This day has missing pressure, mode and settings data.</source>
+        <translation>Op deze dag ontbreken gegevens over druk, soort PAP en instellingen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1140"/>
+        <source>%1%2</source>
+        <translation>%1%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1206"/>
+        <source>This day just contains summary data, only limited information is available .</source>
+        <translation>Van deze dag zijn alleen overzichtsgegevens beschikbaar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1216"/>
+        <source>Total time in apnea</source>
+        <translation>Totale Tijd in Apneu</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1226"/>
+        <source>Time over leak redline</source>
+        <translation>Tijdsduur boven de rode leklimiet</translation>
+    </message>
+    <message>
+        <source>Time spent in ramp</source>
+        <translation type="vanished">Tijd doorgebracht in druk-aanloop</translation>
+    </message>
+    <message>
+        <source>Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked.</source>
+        <translatorcomment>WJG: spelling oxymetrie (zie Van Dale)
+AK: mee eens</translatorcomment>
+        <translation type="vanished">Oxymetriegegevens beschikbaar, maar de tijden verschillen teveel: de grafieken worden niet verbonden.</translation>
+    </message>
+    <message>
+        <source>No Graphs :(</source>
+        <translation type="vanished">Geen grafieken :(</translation>
+    </message>
+    <message>
+        <source>CPAP</source>
+        <translation type="obsolete">CPAP</translation>
+    </message>
+    <message>
+        <source>APAP</source>
+        <translation type="obsolete">APAP</translation>
+    </message>
+    <message>
+        <source>Bi-Level</source>
+        <translation type="obsolete">BiPAP</translation>
+    </message>
+    <message>
+        <source>ASV</source>
+        <translatorcomment>Adaptieve ventilatie-instelling ASI?
+AK: Hmmm ASV=Adaptive Servo-Ventilation
+Maar het is een vierde soort apparaat, tegen Centrale Apneus</translatorcomment>
+        <translation type="vanished">ASV</translation>
+    </message>
+    <message>
+        <source>Unknown</source>
+        <translation type="obsolete">Onbekend</translation>
+    </message>
+    <message>
+        <source>Date</source>
+        <translation type="obsolete">Datum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Sleep</source>
+        <translation>Start</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Wake</source>
+        <translation>Einde</translation>
+    </message>
+    <message>
+        <source>Hypopnea</source>
+        <translation type="obsolete">Hypopneu (H)</translation>
+    </message>
+    <message>
+        <source>Apnea</source>
+        <translation type="obsolete">Onbekende apneu (A)</translation>
+    </message>
+    <message>
+        <source>Obstructive</source>
+        <translatorcomment>AK: nee,Obstructieve  is bijv.nw. bij apneu
+Toch ief, staat in de tabel</translatorcomment>
+        <translation type="obsolete">Obstructieve apneu (OA)</translation>
+    </message>
+    <message>
+        <source>Flow Limit</source>
+        <translatorcomment>AK: Inderdaad, bedoeld wordt een herkende vermindering in luchtstroom, hij gebruikt Flow Limit en -Limitation door elkaar</translatorcomment>
+        <translation type="obsolete">Stroombeperking (FL)</translation>
+    </message>
+    <message>
+        <source>Clear Airway</source>
+        <translation type="obsolete">Open luchtweg of Centrale apneu (CA)</translation>
+    </message>
+    <message>
+        <source>User Flags</source>
+        <translation type="obsolete">Gebruikers vlag (UF)</translation>
+    </message>
+    <message>
+        <source>RERA</source>
+        <translation type="obsolete">RERA (RE)</translation>
+    </message>
+    <message>
+        <source>VSnore</source>
+        <translation type="obsolete">VSnore (VS)</translation>
+    </message>
+    <message>
+        <source>VSnore2</source>
+        <translation type="obsolete">VSnore2</translation>
+    </message>
+    <message>
+        <source>PB/CSR</source>
+        <translation type="obsolete">PA(PB)/CSR</translation>
+    </message>
+    <message>
+        <source>Exh&nbsp;Puff</source>
+        <translation type="obsolete">Exh&nbsp;Pufje</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1523"/>
+        <source>Event Breakdown</source>
+        <translation>Verdeling incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1558"/>
+        <source>Sessions all off!</source>
+        <translatorcomment>Niet gevonden</translatorcomment>
+        <translation>Alle sessies uit!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1560"/>
+        <source>Sessions exist for this day but are switched off.</source>
+        <translation>Er zijn wel sessies, maar die staan uit.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1563"/>
+        <source>Impossibly short session</source>
+        <translation>Onmogelijk korte sessie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1564"/>
+        <source>Zero hours??</source>
+        <translation>Nul uren???</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1567"/>
+        <source>BRICK :(</source>
+        <translatorcomment>Arie: Als er niets uit komt is het echt fout
+Volgens mij zit er een foutje in deze string: dat eerste ( hoort er niet in dacht ik...
+Oh, dat is een smiley   ;-)</translatorcomment>
+        <translation>BAKSTEEN :(</translation>
+    </message>
+    <message>
+        <source>Sorry, your machine does not record data.</source>
+        <translatorcomment>WJG: machine = groter; apparaat gebruikelijker voor dit soort toestellen (zie Van Dale - apparaat, waarbij beademingsapparaat genoemd wordt</translatorcomment>
+        <translation type="obsolete">Sorry, je apparaat bewaart geen gegevens.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1569"/>
+        <source>Complain to your Equipment Provider!</source>
+        <translation>Klaag bij je leverancier!</translation>
+    </message>
+    <message>
+        <source>Avg</source>
+        <translation type="vanished">Gem.</translation>
+    </message>
+    <message>
+        <source>Med</source>
+        <translation type="vanished">Med.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1135"/>
+        <source>Statistics</source>
+        <translation>Statistieken</translation>
+    </message>
+    <message>
+        <source>Channel</source>
+        <translation type="obsolete">Kanaal</translation>
+    </message>
+    <message>
+        <source>Min</source>
+        <translation type="obsolete">Min.</translation>
+    </message>
+    <message>
+        <source>%1%</source>
+        <translation type="vanished">%1%</translation>
+    </message>
+    <message>
+        <source>Max</source>
+        <translation type="obsolete">Max.</translation>
+    </message>
+    <message>
+        <source><b>Please Note:</b> This day just contains summary data, only limited information is available .</source>
+        <translation type="vanished"><b>Let op:</b> Deze dag heeft alleen overzichtsgegevens; alleen beperkte informatie dus.</translation>
+    </message>
+    <message>
+        <source>No data available</source>
+        <translation type="vanished">Geen gegevens beschikbaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1057"/>
+        <source>Oximeter Information</source>
+        <translation>Oxymeterinformatie</translation>
+    </message>
+    <message>
+        <source>Int. Pulse</source>
+        <translation type="vanished">Int. polsslag</translation>
+    </message>
+    <message>
+        <source>Int. SpO2</source>
+        <translation type="vanished">Int. SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="651"/>
+        <source>Session Start Times</source>
+        <translation>Starttijden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="652"/>
+        <source>Session End Times</source>
+        <translation>Stoptijden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="892"/>
+        <source>Duration</source>
+        <translation>Tijdsduur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="872"/>
+        <source>Oximetery Sessions</source>
+        <translation>Oxymetrie sessies</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="878"/>
+        <source>Position Sensor Sessions</source>
+        <translation>Sessies met positie-sensor</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="883"/>
+        <source>Unknown Session</source>
+        <translation>Onbekende sessie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="949"/>
+        <source>Machine Settings Unavailable</source>
+        <translation>Geen apparaat-instellingen beschikbaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1232"/>
+        <source>Total ramp time</source>
+        <translation>Totale aanlooptijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1236"/>
+        <source>Time outside of ramp</source>
+        <translation>Tijd na aanloop</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1246"/>
+        <source>AHI excluding ramp</source>
+        <translation>AHI buiten de aanloop</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1587"/>
+        <source>"Nothing's here!"</source>
+        <translation>"Er is hier niets!"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1590"/>
+        <source>Bob is bored with this days lack of data.</source>
+        <translation>Bob verveelt zich met deze dag zonder gegevens.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Hide all events</source>
+        <translation>Verberg alle incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Show all events</source>
+        <translation>Toon alle incidenten</translation>
+    </message>
+    <message>
+        <source>EPR:%1 EPR_LEVEL:%2</source>
+        <translation type="vanished">EPR: %1 (uit of aan), EPR niveau: %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1061"/>
+        <source>SpO2 Desaturations</source>
+        <translatorcomment>WJG: hoofdletter D?</translatorcomment>
+        <translation>SpO2 desaturaties</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1062"/>
+        <source>Pulse Change events</source>
+        <translatorcomment>AK: Oei! Bedoeld worden plotselinge, kortdurende wijzigingen in de polsslag. Maar hoe maak je dat kort?</translatorcomment>
+        <translation>Polsslag incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1063"/>
+        <source>SpO2 Baseline Used</source>
+        <translatorcomment>WJG: hoofdletter B?</translatorcomment>
+        <translation>SpO2 basislijn gebruikt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="945"/>
+        <source>Machine Settings</source>
+        <translation>Apparaatinstellingen</translation>
+    </message>
+    <message>
+        <source>Pr. Relief</source>
+        <translation type="obsolete">Drukvermindering</translation>
+    </message>
+    <message>
+        <source>Humidifier</source>
+        <translation type="obsolete">Bevochtiger</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="837"/>
+        <source>Session Information</source>
+        <translation>Sessie-informatie</translation>
+    </message>
+    <message>
+        <source>SessionID</source>
+        <translation type="obsolete">Sessienummer</translation>
+    </message>
+    <message>
+        <source>On</source>
+        <translatorcomment>is een schakelaar, beneuwd of het past...</translatorcomment>
+        <translation type="obsolete">aan/uit</translation>
+    </message>
+    <message>
+        <source>Start</source>
+        <translation type="obsolete">Start</translation>
+    </message>
+    <message>
+        <source>End</source>
+        <translation type="obsolete">Einde</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="869"/>
+        <source>CPAP Sessions</source>
+        <translation>CPAP-sessies</translation>
+    </message>
+    <message>
+        <source>Oximetry Sessions</source>
+        <translation type="obsolete">Oxymetriesessies</translation>
+    </message>
+    <message>
+        <source>Oximeter</source>
+        <translation type="obsolete">Oxymeter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="875"/>
+        <source>Sleep Stage Sessions</source>
+        <translation>Slaapfasesessies</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="933"/>
+        <source>One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.</source>
+        <translatorcomment>WJG: tikfout</translatorcomment>
+        <translation>Een of meer golfvormgegevens had foutieve brongegevens. Sommige kunnen niet goed aansluiten.</translation>
+    </message>
+    <message>
+        <source>PAP Setting</source>
+        <translation type="vanished">Instelling PAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1568"/>
+        <source>Sorry, your machine only provides compliance data.</source>
+        <translation>Sorry, jouw apparaat geeft uitsluitend gegevens over compliantie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1869"/>
+        <source>Pick a Colour</source>
+        <translation>Kies een kleur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2131"/>
+        <source>This bookmarked is in a currently disabled area..</source>
+        <translation>Deze bladwijzer staat in een uitgeschakeld gebied..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2174"/>
+        <source>Bookmark at %1</source>
+        <translation>Bladwijzer bij %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2365"/>
+        <source>Show all graphs</source>
+        <translation>Toon alle grafieken</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">Alle grafieken staan uit!</translation>
+    </message>
+    <message>
+        <source>Summary Only :(</source>
+        <translation type="vanished">Alleen overzichtgegevens :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2385"/>
+        <source>Hide all graphs</source>
+        <translation>Verberg alle grafieken</translation>
+    </message>
+</context>
+<context>
+    <name>ExportCSV</name>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="14"/>
+        <source>Export as CSV</source>
+        <translation>Exporteer naar .csv bestand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="24"/>
+        <source>Dates:</source>
+        <translation>Periode:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="37"/>
+        <source>Resolution:</source>
+        <translation>Resolutie:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="46"/>
+        <source>Details</source>
+        <translation>Details</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="53"/>
+        <source>Sessions</source>
+        <translation>Sessies</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="60"/>
+        <source>Daily</source>
+        <translation>Dagelijks</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="85"/>
+        <source>Filename:</source>
+        <translation>Bestandsnaam:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="107"/>
+        <source>Cancel</source>
+        <translation>Annuleren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="114"/>
+        <source>Export</source>
+        <translation>Exporteren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="131"/>
+        <source>Start:</source>
+        <translation>Start:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="154"/>
+        <source>End:</source>
+        <translation>Einde:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="192"/>
+        <source>Quick Range:</source>
+        <translation>Snelkeuze:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="60"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="122"/>
+        <source>Most Recent Day</source>
+        <translatorcomment>WJG: zie ook bij Daily</translatorcomment>
+        <translation>Meest recente dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="205"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="125"/>
+        <source>Last Week</source>
+        <translation>Afgelopen week</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="210"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="128"/>
+        <source>Last Fortnight</source>
+        <translation>Afgelopen twee weken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="215"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="131"/>
+        <source>Last Month</source>
+        <translation>Afgelopen maand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="220"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="134"/>
+        <source>Last 6 Months</source>
+        <translation>Afgelopen halfjaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="225"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="137"/>
+        <source>Last Year</source>
+        <translatorcomment>AK: Bij vorig jaar denk ik nu aan 2012. Bedoeld wordt een jaar voor gisteren.... Dat is toch afgelopen jaar?</translatorcomment>
+        <translation>Afgelopen jaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="230"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="119"/>
+        <source>Everything</source>
+        <translation>Alles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="235"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="108"/>
+        <source>Custom</source>
+        <translation>Zelf kiezen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="248"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="73"/>
+        <source>SleepyHead_</source>
+        <translation>SleepyHead_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="76"/>
+        <source>Details_</source>
+        <translation>Details_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="78"/>
+        <source>Sessions_</source>
+        <translatorcomment>WJG: Engels is meervoud
+AK: Wat betekent het streepje erachter?
+Het zit in de bestandsnaam, het streepje is een spatie</translatorcomment>
+        <translation>Sessies_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="80"/>
+        <source>Summary_</source>
+        <translation>Overzicht_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="87"/>
+        <source>Select file to export to</source>
+        <translation>Kies exportbestand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="88"/>
+        <source>CSV Files (*.csv)</source>
+        <translatorcomment>bestandstype</translatorcomment>
+        <translation>CSV bestanden (*.csv)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>DateTime</source>
+        <translation>Datum-Tijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Session</source>
+        <translation>Sessie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Event</source>
+        <translation>Incident</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Data/Duration</source>
+        <translation>Gegevens/duur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <source>Session Count</source>
+        <translation>Aantal sessies</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Start</source>
+        <translation>Start</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>End</source>
+        <translation>Einde</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>Total Time</source>
+        <translation>Totale tijdsduur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>AHI</source>
+        <translation>AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="207"/>
+        <source> Count</source>
+        <translation> Aantal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="211"/>
+        <source> Avg</source>
+        <translation> gem.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="215"/>
+        <source> %1%</source>
+        <translation> %1%</translation>
+    </message>
+</context>
+<context>
+    <name>FPIconLoader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="128"/>
+        <source>Import Error</source>
+        <translation>Importfout</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>This Machine Record cannot be imported in this profile.</source>
+        <translation>Deze apparaatgegevens kunnen niet in dit profiel worden geimporteerd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>The Day records overlap with already existing content.</source>
+        <translation>De gegevens van deze dag overlappen met bestaande gegevens.</translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="441"/>
+        <source>SleepyHead</source>
+        <translatorcomment>AK: Ik ben van mening dat we de naam niet moeten vertalen</translatorcomment>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1007"/>
+        <source>&Statistics</source>
+        <translation>&Statistieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="981"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html></source>
+        <translation><html><head/><body><p><span style=" font-weight:600;">Waarschuwing: </span>Dit is een testversie, delen van dit programma zouden nog niet kunnen werken zoals verwacht.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="998"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1035"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3050"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3107"/>
+        <source>about:blank</source>
+        <translation type="unfinished">about:blank</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1073"/>
+        <source>Report Mode</source>
+        <translation>Soort rapportage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1080"/>
+        <source>Standard</source>
+        <translation>Standaard layout</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1090"/>
+        <source>Monthly</source>
+        <translation>Maand layout</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1097"/>
+        <source>Date Range</source>
+        <translation>Tijdspanne</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1141"/>
+        <source>&Help Browser</source>
+        <translatorcomment>AK: Volgens mij brengt dit je naar: "Over SleepyHead".
+20/9 WJG: is dat niet gewoon wat er helemaal boven in de menubalk staat,ongeacht waar je in het programma bent?
+AK: klopt</translatorcomment>
+        <translation>&Over SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1204"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1224"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1244"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="2932"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1317"/>
+        <source>qrc:/docs/index.html</source>
+        <translatorcomment>geen idee!</translatorcomment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&Navigation</source>
+        <translation type="vanished">&Navigatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1633"/>
+        <source>Statistics</source>
+        <translation>Statistieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1683"/>
+        <source>Daily</source>
+        <translation>Dagelijks</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1727"/>
+        <source>Overview</source>
+        <translation>Overzicht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1771"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1096"/>
+        <source>Oximetry</source>
+        <translation>Oxymetrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1821"/>
+        <source>Import</source>
+        <translation>Importeren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1871"/>
+        <source>Help</source>
+        <translation>Over SleepyHead</translation>
+    </message>
+    <message>
+        <source>&Bookmarks</source>
+        <translatorcomment>AK: Beter B&ladwijzers en &Bestand</translatorcomment>
+        <translation type="vanished">B&ladwijzers</translation>
+    </message>
+    <message>
+        <source>&Records</source>
+        <translation type="vanished">&Erelijst</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3136"/>
+        <source>&File</source>
+        <translatorcomment>WJG: Onderstreepte letter kan geen B zijn, is al gebruikt bij Bladwijzers
+AK: Dan zou ik het andersom doen: B&ladwijzers</translatorcomment>
+        <translation>&Bestand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3154"/>
+        <source>&View</source>
+        <translation>&Weergave</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3172"/>
+        <source>&Help</source>
+        <translation>&Help</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3188"/>
+        <source>&Data</source>
+        <translation>&Gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3192"/>
+        <source>&Advanced</source>
+        <translation>Ge&avanceerd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3490"/>
+        <source>Ctrl+L</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>&Purge CPAP Data</source>
+        <translatorcomment>WJG: W is al gebruikt bij Weergave</translatorcomment>
+        <translation type="vanished">Wis &CPAP gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3196"/>
+        <source>Purge Oximetery Data</source>
+        <translation>Wis oxymetrie gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3202"/>
+        <source>Purge ALL CPAP Data</source>
+        <translation>Wis ALLE gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3212"/>
+        <source>Rebuild CPAP Data</source>
+        <translation>Herstel CPAP gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3250"/>
+        <source>&Import Data</source>
+        <translation>Gegevens &importeren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3253"/>
+        <source>Shift+F2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3258"/>
+        <source>&Preferences</source>
+        <translatorcomment>WJG: i is al gebruikt bij Gegevens importeren</translatorcomment>
+        <translation>I&nstellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3263"/>
+        <source>&Profiles</source>
+        <translation>&Profielen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3268"/>
+        <source>Exit</source>
+        <translation>Afsluiten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3355"/>
+        <source>O&ximetry Wizard</source>
+        <translation>O&xymetrie wizard</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3396"/>
+        <source>&Automatic Oximetry Cleanup</source>
+        <translation>&Automatisch opschonen van de oxymetrie-gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3425"/>
+        <source>F10</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3487"/>
+        <source>Toggle &Line Cursor</source>
+        <translation>Kies &Lijn of Cursor</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="276"/>
+        <source>E&xit</source>
+        <translation>&Afsluiten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3273"/>
+        <source>View &Daily</source>
+        <translatorcomment>20/9 WJG: aangepast na compilatie</translatorcomment>
+        <translation>&Dagweergave</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3276"/>
+        <source>F5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3281"/>
+        <source>View &Overview</source>
+        <translation>&Overzichtpagina</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3284"/>
+        <source>F6</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3289"/>
+        <source>View &Welcome</source>
+        <translatorcomment>WJG: Om de al gebruikte W te omzeilen
+AK: Waar staat dat Welkomst-/Startscherm???
+20/9 WJG: Goeie vraag, waarschijnlijk dateert dat nog uit een oudere versie en heeft Mark dat niet opgeruimd?</translatorcomment>
+        <translation variants="yes">
+            <lengthvariant>&Welkomstscherm</lengthvariant>
+            <lengthvariant></lengthvariant>
+        </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3292"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3439"/>
+        <source>F4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3297"/>
+        <source>-</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3300"/>
+        <source>Ctrl+Tab</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3308"/>
+        <source>Use &AntiAliasing</source>
+        <translation>Gebruik &Anti-aliasing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3313"/>
+        <source>&About SleepyHead</source>
+        <translatorcomment>WJG: O is al gebruikt</translatorcomment>
+        <translation>Over &SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3321"/>
+        <source>&Fullscreen Toggle</source>
+        <translation>&Volledig scherm aan/uit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3324"/>
+        <source>F11</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3332"/>
+        <source>Show Debug Pane</source>
+        <translation>Foutopsporingsvenster</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3337"/>
+        <source>&Reset Graph Layout</source>
+        <translation>&Reset alle grafieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3342"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="273"/>
+        <source>Check for &Updates</source>
+        <translation>Zoek naar &updates</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3347"/>
+        <source>Take &Screenshot</source>
+        <translation>&Schermopname maken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3350"/>
+        <source>F12</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3381"/>
+        <source>Exp&ort Data</source>
+        <translation>Exp&orteer gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3520"/>
+        <source>Daily Calendar</source>
+        <translation>Dagkalender</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3523"/>
+        <source>F9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3528"/>
+        <source>Backup &Journal</source>
+        <translation>&Dagboek opslaan</translation>
+    </message>
+    <message>
+        <source>View O&ximetry</source>
+        <translation type="vanished">O&xymetrievenster</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3358"/>
+        <source>F7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3363"/>
+        <source>Print &Report</source>
+        <translation>&Rapport afdrukken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3368"/>
+        <source>&Edit Profile</source>
+        <translation>Profiel &aanpassen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3376"/>
+        <source>&Link Graph Groups</source>
+        <translation>Grafiekgroepen &koppelen</translation>
+    </message>
+    <message>
+        <source>Exp&ort</source>
+        <translation type="vanished">Exp&orteer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3386"/>
+        <source>Online Users &Guide</source>
+        <translation>Online &gebruiksaanwijzing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3391"/>
+        <source>&Frequently Asked Questions</source>
+        <translation>&FAQ</translation>
+    </message>
+    <message>
+        <source>&Rebuild Oximetry Indices</source>
+        <translation type="vanished">Oxymetrie-indexen &herstellen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3401"/>
+        <source>Change &User</source>
+        <translation>Ander &profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3406"/>
+        <source>Purge &Current Selected Day</source>
+        <translation>Wis de &huidige geselecteerde dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3479"/>
+        <source>Current Days</source>
+        <translation>Huidige dagen</translation>
+    </message>
+    <message>
+        <source>&Current Selected Day</source>
+        <translation type="vanished">&Geselecteerde dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3411"/>
+        <source>All data for current CPAP machine</source>
+        <translation>Alle gegevens van dit apparaat</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3422"/>
+        <source>Right &Sidebar</source>
+        <translation>&Rechter zijbalk aan/uit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3506"/>
+        <source>Daily Sidebar</source>
+        <translation>Zijbalk dagoverzicht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3509"/>
+        <source>F8</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3430"/>
+        <source>View S&tatistics</source>
+        <translation>Bekijk S&tatistiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1606"/>
+        <source>Navigation</source>
+        <translation>Navigatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3077"/>
+        <source>Records</source>
+        <translation>Gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3433"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3436"/>
+        <source>View Statistics</source>
+        <translation>Bekijk Statistiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3474"/>
+        <source>Import &Somnopose Data</source>
+        <translation>Importeer &SomnoPose gegevens</translation>
+    </message>
+    <message>
+        <source>View S&ummary</source>
+        <translation type="vanished">&Statistiekpagina</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3444"/>
+        <source>Import &ZEO Data</source>
+        <translation>Importeer &ZEO gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3449"/>
+        <source>Import RemStar &MSeries Data</source>
+        <translation>Importeer RemStar &M-series gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3454"/>
+        <source>&Support SleepyHead Development</source>
+        <translation>&Help bij ontwikkeling SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3459"/>
+        <source>Sleep Disorder Terms &Glossary</source>
+        <translation>&Woordenlijst slaapaandoeningen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3464"/>
+        <source>Change &Language</source>
+        <translation>Wijzig &Taal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3469"/>
+        <source>Change &Data Folder</source>
+        <translation>Wijzig &Gegevensmap</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="609"/>
+        <source>Loading Data</source>
+        <translation>Gegevens laden</translation>
+    </message>
+    <message>
+        <source>Datacard Located</source>
+        <translation type="vanished">Datakaart gevonden</translation>
+    </message>
+    <message>
+        <source>A %1 datacard structure was detected at
+%2
+
+Would you like to import from this location?</source>
+        <translation type="vanished">Een %1 datakaart structuur gevonden op
+%2
+
+Wil je vanaf deze lokatie importeren?</translation>
+    </message>
+    <message>
+        <source>Yes</source>
+        <translation type="vanished">Ja</translation>
+    </message>
+    <message>
+        <source>Select another folder</source>
+        <translation type="obsolete">Selecteer een andere map</translation>
+    </message>
+    <message>
+        <source>Please wait, SleepyHead is importing data...</source>
+        <translation type="vanished">Even wachten, SleepyHead importeert gegevens...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1017"/>
+        <source>Importing Data</source>
+        <translation>Gegevens importeren</translation>
+    </message>
+    <message>
+        <source>RDI</source>
+        <translation type="obsolete">RDI</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation type="obsolete">AHI</translation>
+    </message>
+    <message>
+        <source>No CPAP data available.</source>
+        <translation type="obsolete">Geen CPAP-gegevens beschikbaar.</translation>
+    </message>
+    <message>
+        <source>%1 day of CPAP Data, on %2.</source>
+        <translation type="obsolete">Dag %1 van CPAP-gegevens, op %2.</translation>
+    </message>
+    <message>
+        <source>%1 days of CPAP Data, between %2 and %3</source>
+        <translation type="obsolete">%1 dagen met CPAP-gegevens, tussen %2 en %3</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation type="obsolete">Details</translation>
+    </message>
+    <message>
+        <source>Most Recent</source>
+        <translation type="obsolete">Laatste ingelezen dag</translation>
+    </message>
+    <message>
+        <source>Last 7 Days</source>
+        <translatorcomment>WJG: hoeft niet per se een week te zijn?</translatorcomment>
+        <translation type="obsolete">Afgelopen 7 dagen</translation>
+    </message>
+    <message>
+        <source>Last 30 Days</source>
+        <translation type="obsolete">Afgelopen 30 dagen</translation>
+    </message>
+    <message>
+        <source>Last 6 months</source>
+        <translation type="obsolete">Afgelopen 6 maanden</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translatorcomment>AK: Zie mijn eerdere opmerking</translatorcomment>
+        <translation type="obsolete">Afgelopen jaar</translation>
+    </message>
+    <message>
+        <source>RERA Index</source>
+        <translation type="obsolete">RERA-index</translation>
+    </message>
+    <message>
+        <source>Flow Limit Index</source>
+        <translatorcomment>En wat wordt de afkorting?
+AK: SBI</translatorcomment>
+        <translation type="obsolete">Stroom Beperking Index
+(FLI)</translation>
+    </message>
+    <message>
+        <source>Hours per Night</source>
+        <translation type="obsolete">Uren per nacht</translation>
+    </message>
+    <message>
+        <source>Min EPAP</source>
+        <translation type="obsolete">Min. EPAP</translation>
+    </message>
+    <message>
+        <source>%1% EPAP</source>
+        <translation type="obsolete">%1% EPAP</translation>
+    </message>
+    <message>
+        <source>Max IPAP</source>
+        <translation type="obsolete">Max. IPAP</translation>
+    </message>
+    <message>
+        <source>%1% IPAP</source>
+        <translation type="obsolete">%1% IPAP</translation>
+    </message>
+    <message>
+        <source>Average Pressure</source>
+        <translation type="obsolete">Gemiddelde druk</translation>
+    </message>
+    <message>
+        <source>%1% Pressure</source>
+        <translation type="obsolete">%1% Druk</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation type="obsolete">Druk</translation>
+    </message>
+    <message>
+        <source>Average %1</source>
+        <translation type="obsolete">Gemiddelde %1</translation>
+    </message>
+    <message>
+        <source>%1% %2</source>
+        <translation type="obsolete">%1% %2</translation>
+    </message>
+    <message>
+        <source>Oximetry Summary</source>
+        <translation type="obsolete">Oxymetrie overzicht</translation>
+    </message>
+    <message>
+        <source>%1 day of Oximetry Data, on %2.</source>
+        <translation type="obsolete">%1 dag van oxymetriegegevens, op %2</translation>
+    </message>
+    <message>
+        <source>%1 days of Oximetry Data, between %2 and %3</source>
+        <translation type="obsolete">%1 dagen van oxymetrie-gegevens, tussen %2 en %3</translation>
+    </message>
+    <message>
+        <source>Average SpO2</source>
+        <translation type="obsolete">Gemiddelde SpO2</translation>
+    </message>
+    <message>
+        <source>Minimum SpO2</source>
+        <translation type="obsolete">Minimum SpO2</translation>
+    </message>
+    <message>
+        <source>SpO2 Events / Hour</source>
+        <translatorcomment>Dit zijn echt geen apneus, hoor...</translatorcomment>
+        <translation type="obsolete">SpO2 incidenten per uur</translation>
+    </message>
+    <message>
+        <source>% of time in SpO2 Events</source>
+        <translation type="obsolete">Tijd in SpO2 incidenten</translation>
+    </message>
+    <message>
+        <source>Average Pulse Rate</source>
+        <translation type="obsolete">Gemiddelde polsslag</translation>
+    </message>
+    <message>
+        <source>Minimum Pulse Rate</source>
+        <translation type="obsolete">Minumum polsslag</translation>
+    </message>
+    <message>
+        <source>Maximum Pulse Rate</source>
+        <translation type="obsolete">Maximum polsslag</translation>
+    </message>
+    <message>
+        <source>Pulse Change Events / Hour</source>
+        <translatorcomment>Het gaat om veranderingen als incident</translatorcomment>
+        <translation type="obsolete">Polsslagincidenten per uur</translation>
+    </message>
+    <message>
+        <source>Usage Information</source>
+        <translatorcomment>Dit staat onder "records"</translatorcomment>
+        <translation type="obsolete">Gebruiksinformatie</translation>
+    </message>
+    <message>
+        <source>Total Days</source>
+        <translation type="obsolete">Totaal aantal dagen</translation>
+    </message>
+    <message>
+        <source>Compliant Days</source>
+        <translation type="obsolete">Therapietrouw-dagen</translation>
+    </message>
+    <message>
+        <source>Days AHI &gt;5.0</source>
+        <translation type="obsolete">Dagen met AHI &gt 5,0</translation>
+    </message>
+    <message>
+        <source>Best&nbsp;%1</source>
+        <translation type="obsolete">Beste &nbsp;%1</translation>
+    </message>
+    <message>
+        <source>Worst&nbsp;%1</source>
+        <translation type="obsolete">Slechtste &nbsp;%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1091"/>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <source>APAP</source>
+        <translation type="obsolete">APAP</translation>
+    </message>
+    <message>
+        <source>Bi-Level</source>
+        <translation type="obsolete">BiPAP</translation>
+    </message>
+    <message>
+        <source>ST/ASV</source>
+        <translatorcomment>Adaptieve ventilatie-instelling ASI?</translatorcomment>
+        <translation type="obsolete">ST/ASV</translation>
+    </message>
+    <message>
+        <source>Best RX Setting</source>
+        <translation type="obsolete">Beste Rx instelling</translation>
+    </message>
+    <message>
+        <source>Mode</source>
+        <translation type="obsolete">Modus</translation>
+    </message>
+    <message>
+        <source>Worst RX Setting</source>
+        <translation type="obsolete">Slechtste Rx instelling</translation>
+    </message>
+    <message>
+        <source>EPAP</source>
+        <translation type="obsolete">EPAP</translation>
+    </message>
+    <message>
+        <source>IPAPLo</source>
+        <translation type="obsolete">IPAP laag</translation>
+    </message>
+    <message>
+        <source>IPAPHi</source>
+        <translation type="obsolete">IPAP hoog</translation>
+    </message>
+    <message>
+        <source>PS Min</source>
+        <translation type="obsolete">PS min.</translation>
+    </message>
+    <message>
+        <source>PS Max</source>
+        <translation type="obsolete">PS max.</translation>
+    </message>
+    <message>
+        <source>IPAP</source>
+        <translation type="obsolete">IPAP</translation>
+    </message>
+    <message>
+        <source>PS</source>
+        <translation type="obsolete">PS</translation>
+    </message>
+    <message>
+        <source>Min Pres.</source>
+        <translation type="obsolete">Min. druk</translation>
+    </message>
+    <message>
+        <source>Max Pres.</source>
+        <translation type="obsolete">Max. druk</translation>
+    </message>
+    <message>
+        <source>First</source>
+        <translation type="obsolete">Eerste dag</translation>
+    </message>
+    <message>
+        <source>Last</source>
+        <translation type="obsolete">Laatste dag</translation>
+    </message>
+    <message>
+        <source>Days</source>
+        <translation type="obsolete">Dagen</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation type="obsolete">FL</translation>
+    </message>
+    <message>
+        <source>Machine</source>
+        <translation type="obsolete">Apparaat</translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="obsolete">Drukvermindering</translation>
+    </message>
+    <message>
+        <source>%5 %1% EPAP=%2<br/>%3% IPAP=%4</source>
+        <translation type="obsolete">%5 %1% EPAP=%2<br/>%3% IPAP=%4</translation>
+    </message>
+    <message>
+        <source>%3 %1% Pressure=%2</source>
+        <translation type="obsolete">%3 %1% Druk=%2</translation>
+    </message>
+    <message>
+        <source>Brand</source>
+        <translation type="obsolete">Merk</translation>
+    </message>
+    <message>
+        <source>Model</source>
+        <translation type="obsolete">Type</translation>
+    </message>
+    <message>
+        <source>Serial</source>
+        <translation type="obsolete">Serienummer</translation>
+    </message>
+    <message>
+        <source>First Use</source>
+        <translation type="obsolete">Eerste gebruik</translation>
+    </message>
+    <message>
+        <source>Last Use</source>
+        <translation type="obsolete">Laatste gebruik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1293"/>
+        <source>Loading</source>
+        <translation>Laden</translation>
+    </message>
+    <message>
+        <source><html><body><div align='center'><h2>SleepyHead v%1.%2.%3-%4 (%8)</h2>Build Date: %5 %6<br/>%7<br/>Data Folder: %9<hr>Copyright &copy;2011 Mark Watkins (jedimark) <br> 
+<a href='http://sleepyhead.sourceforge.net'>http://sleepyhead.sourceforge.net</a> <hr>This software is released under the GNU Public License <br><i>This software comes with absolutely no warranty, either express of implied. It comes with no guarantee of fitness for any particular purpose. No guarantees are made regarding the accuracy of any data this program displays.</div></body></html></source>
+        <translatorcomment>WJG: juridische terminologie aangepast. Klopt de Nederlandse downloadsite?
+AK: De site wijzigt niet, is een algemene verwijzing. De vertaling wordt tzt in het standaard programma opgenomen, als taalkeuze.</translatorcomment>
+        <translation type="obsolete"><html><body><div align='center'><h2>SleepyHead v%1.%2.%3-%4 (%8)</h2>Build Date: %5 %6<br/>%7<br/>Data Folder: %9<hr>Copyright &copy;2011 Mark Watkins (jedimark) <br> 
+<a href='http://sleepyhead.sourceforge.net'>http://sleepyhead.sourceforge.net</a> <hr>Deze software is vrijgegeven onder de GNU Public License <br> <i> Deze software sluit elke vorm van aansprakelijkheid uit, zowel expliciet als impliciet. Het wordt geleverd zonder waarborg voor geschiktheid voor een bepaald doel. Er zijn geen garanties met betrekking tot de juistheid van de gegevens die dit programma toont.</div></body></html></t [...]
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1082"/>
+        <source>About SleepyHead</source>
+        <translation>Over SleepyHead</translation>
+    </message>
+    <message>
+        <source>There are no graphs visible to print</source>
+        <translation type="obsolete">Geen zichtbare grafieken om af te drukken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1993"/>
+        <source>Bookmarks</source>
+        <translation>Bladwijzers</translation>
+    </message>
+    <message>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation type="obsolete">Wil je gebieden met bladwijzer in dit rapport tonen?</translation>
+    </message>
+    <message>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation type="obsolete">Dit kan even duren...
+Alsjeblieft niets aanraken tot ik klaar ben!</translation>
+    </message>
+    <message>
+        <source>Printing %1 Report</source>
+        <translation type="obsolete">Rapport %1 afdrukken</translation>
+    </message>
+    <message>
+        <source>%1 Report</source>
+        <translation type="obsolete">%1 Rapport</translation>
+    </message>
+    <message>
+        <source>Name:	 %1, %2
+</source>
+        <translation type="obsolete">Naam:		 %1, %2
+</translation>
+    </message>
+    <message>
+        <source>DOB:	%1
+</source>
+        <translation type="obsolete">Geboortedatum:		%1
+</translation>
+    </message>
+    <message>
+        <source>Patient ID:	%1
+</source>
+        <translation type="obsolete">Patientnr.:		%1
+</translation>
+    </message>
+    <message>
+        <source>Phone:	%1
+</source>
+        <translation type="obsolete">Telefoon:		%1
+</translation>
+    </message>
+    <message>
+        <source>Email:	%1
+</source>
+        <translation type="obsolete">E-mail:		%1
+</translation>
+    </message>
+    <message>
+        <source>
+Address:
+%1</source>
+        <translation type="obsolete">
+Adres:
+%1</translation>
+    </message>
+    <message>
+        <source>Mask Time: </source>
+        <translation type="obsolete">Maskertijd: </translation>
+    </message>
+    <message>
+        <source>Bedtime: </source>
+        <translation type="obsolete">Gaan slapen:</translation>
+    </message>
+    <message>
+        <source>Wake-up: </source>
+        <translation type="obsolete">Opgestaan: </translation>
+    </message>
+    <message>
+        <source>Machine: </source>
+        <translation type="obsolete">Apparaaat: </translation>
+    </message>
+    <message>
+        <source>
+Mode: </source>
+        <translation type="obsolete">
+Modus: </translation>
+    </message>
+    <message>
+        <source>ASV</source>
+        <translatorcomment>Adaptieve ventilatie-instelling ASI?</translatorcomment>
+        <translation type="obsolete">ASV</translation>
+    </message>
+    <message>
+        <source>Unknown</source>
+        <translation type="obsolete">Onbekend</translation>
+    </message>
+    <message>
+        <source>RDI	%1
+</source>
+        <translation type="obsolete">RDI	%1
+</translation>
+    </message>
+    <message>
+        <source>AHI	%1
+</source>
+        <translation type="obsolete">AHI	%1
+</translation>
+    </message>
+    <message>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation type="obsolete">AI=%1 HI=%2 CAI=%3 </translation>
+    </message>
+    <message>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%</source>
+        <translation type="obsolete">REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%</translation>
+    </message>
+    <message>
+        <source>UAI=%1 </source>
+        <translation type="obsolete">UAI=%1 </translation>
+    </message>
+    <message>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation type="obsolete">NRI=%1 LKI=%2 EPI=%3</translation>
+    </message>
+    <message>
+        <source>Weight %1 </source>
+        <translation type="obsolete">Gewicht %1</translation>
+    </message>
+    <message>
+        <source>BMI %1 </source>
+        <translation type="obsolete">BMI %1 </translation>
+    </message>
+    <message>
+        <source>Zombie %1/10 </source>
+        <translation type="obsolete">Zombie %1/10 </translation>
+    </message>
+    <message>
+        <source>Reporting from %1 to %2</source>
+        <translation type="obsolete">Rapport van %1 tot %2</translation>
+    </message>
+    <message>
+        <source>Reporting data goes here</source>
+        <translation type="obsolete">De rapportgegevens komen hier</translation>
+    </message>
+    <message>
+        <source>Entire Day's Flow Waveform</source>
+        <translation type="obsolete">Flow golfvorm hele dag</translation>
+    </message>
+    <message>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation type="obsolete">SleepyHead v%1 - http://sleepyhead.sourceforge.net</translation>
+    </message>
+    <message>
+        <source>Page %1 of %2</source>
+        <translation type="obsolete">Pagina %1 van %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="151"/>
+        <source>Profile</source>
+        <translation>Profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="942"/>
+        <source>Welcome</source>
+        <translation>Welkom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="272"/>
+        <source>&About</source>
+        <translation>&Over</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="300"/>
+        <source>Loading...</source>
+        <translation>Laden...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="318"/>
+        <source>When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes.</source>
+        <translation type="vanished"><b>Waarschuwing</b> De rapporten die dit programma maakt zijn niet bruikbaar voor compliantie of medische diagnose.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Imported %1 CPAP session(s) from
+
+%2</source>
+        <translation>%1 Sessies geimporteerd van
+
+%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Import Success</source>
+        <translation>Import gelukt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Already up to date with CPAP data at
+
+%1</source>
+        <translation>Al bijgewerkt met gegevens van
+
+%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Up to date</source>
+        <translation>Reeds bijgewerkt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Couldn't find any valid Machine Data at
+
+%1</source>
+        <translation>Kon geen geldige gegevens vinden op
+
+%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="866"/>
+        <source>Access to Import has been blocked while recalculations are in progress.</source>
+        <translation>Tijdens een herberekening kan niet geïmporteerd worden.</translation>
+    </message>
+    <message>
+        <source>Import from where?</source>
+        <translation type="vanished">Waar vandaan importeren?</translation>
+    </message>
+    <message>
+        <source>Do you just want to Import from the usual (remembered) locations?
+</source>
+        <translation type="vanished">Wil je van de gebruikelijke (opgeslagen) lokatie importeren?</translation>
+    </message>
+    <message>
+        <source>The Usual</source>
+        <translation type="vanished">Gebruikelijk</translation>
+    </message>
+    <message>
+        <source>New Location</source>
+        <translation type="vanished">Nieuw</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="vanished">Annuleren</translation>
+    </message>
+    <message>
+        <source>Remember this Location?</source>
+        <translation type="vanished">Deze lokatie bewaren?</translation>
+    </message>
+    <message>
+        <source>Would you like to remember this import location for next time?</source>
+        <translation type="vanished">Wil je deze lokatie bewaren voor de volgende keer?</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations
+
+</source>
+        <translation type="vanished">Gegevens succesvol geïmporteerd vanaf
+
+</translation>
+    </message>
+    <message>
+        <source>Import Problem
+
+Couldn't find any new Machine Data at the locations given</source>
+        <translation type="vanished">Probleem:
+
+Kon geen nieuwe gegevens op de bekende lokaties vinden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="878"/>
+        <source>Please wait, scanning for CPAP data cards...</source>
+        <translation>Even wachten, zoeken naar SD kaart met CPAP gegevens...</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations:</source>
+        <translation type="vanished">Gegevens succesvol geimporteerd van: </translation>
+    </message>
+    <message>
+        <source>Couldn't find any new Machine Data at the locations given.</source>
+        <translation type="vanished">Kon geen nieuwe gegevens op deze locatie vinden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Import Problem</source>
+        <translation>Import probleem</translation>
+    </message>
+    <message>
+        <source>Click here to choose a folder</source>
+        <translation type="vanished">Klik hier om een folder te kiezen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="899"/>
+        <source>CPAP Data Located</source>
+        <translation>CPAP gegevens gevonden</translation>
+    </message>
+    <message>
+        <source>CPAP Datacard structures were detected at the following locations:</source>
+        <translation type="obsolete">CPAP gegevens-structuur gevonden op de volgende lokaties:</translation>
+    </message>
+    <message>
+        <source>Would you like to import from the path(s) shown above?</source>
+        <translation type="vanished">Wil je van bovenstaande lokatie gegevens downloaden?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="916"/>
+        <source>Please wait, launching file dialog...</source>
+        <translation>Even wachten, gegevens dialoog starten...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="922"/>
+        <source>No CPAP data card detected, launching file dialog...</source>
+        <translation>Geen CPAP gegevens gevonden, dialoog starten...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="928"/>
+        <source>Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder.</source>
+        <translation>LET OP: kies de hoofdmap of een drive letter, niet een submap.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="929"/>
+        <source>Import Reminder</source>
+        <translation>Import herinnering</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1079"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Welkom bij SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1083"/>
+        <source>This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.</source>
+        <translation>Deze software is gemaakt om u te helpen bij het beoordelen van de gegevens van een CPAP, die wordt gebruikt bij de behandeling van verschillende slaapstoornissen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1085"/>
+        <source>SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.</source>
+        <translation>SleepyHead is ontworpen door een softwareontwikkelaar met persoonlijke ervaring van een slaapstoornis en gevormd door de feedback van vele andere welwillende testers die omgaan met vergelijkbare omstandigheden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1087"/>
+        <source>This is a beta release, some features may not yet behave as expected.</source>
+        <translation>Dit is een bètaversie, mogelijk dat bepaalde functies zich nog niet gedragen als verwacht.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1088"/>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation>Geef alle bugs die je vindt op bij de SourceForge pagina van SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1090"/>
+        <source>Currenly supported machines:</source>
+        <translation>Momenteel ondersteunde apparaten:</translation>
+    </message>
+    <message>
+        <source>Philips Respironics System One (CPAP, Auto, BiPAP & ASV models)</source>
+        <translation type="vanished">Philips Respironics System One (CPAP, AutoPAP, BiPAP & ASV modellen)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1093"/>
+        <source>ResMed S9 models (CPAP, Auto, VPAP)</source>
+        <translation>ResMed S9 modellen (CPAP, AutoPAP, VPAP)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1094"/>
+        <source>DeVilbiss Intellipap (Auto)</source>
+        <translation>DeVilbiss Intellipap (Auto)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1095"/>
+        <source>Fisher & Paykel ICON (CPAP, Auto)</source>
+        <translation>Fisher & Paykel ICON (CPAP, AutoPAP)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1097"/>
+        <source>Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters</source>
+        <translation>Contec CMS50D+, CMS50E en CMS50F (niet de 50FW) Oxymeters</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1098"/>
+        <source>ResMed S9 Oximeter Attachment</source>
+        <translation>ResMed S9 Oxymeter adapter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1099"/>
+        <source>Online Help Resources</source>
+        <translation>Online hulpbronnen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1100"/>
+        <source>Note:</source>
+        <translation>Let op:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1101"/>
+        <source>I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.</source>
+        <translation>Deze ingebouwde webbrowser is niet geschikt op uitgebreid te surfen, het werkt maar is vooral bedoeld als help browser.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1103"/>
+        <source>(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)</source>
+        <translation>(Ondersteunt geen SSL-encryptie, dus het is geen goed idee om uw wachtwoorden of persoonlijke gegevens ergens te typen.)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1114"/>
+        <source>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/></source>
+        <translation>De website van het <a href='http://www.sourceforge.net/projects/sleepyhead'> SleepyHead Project</a> op de site van SourceForge<br/></translation>
+    </message>
+    <message>
+        <source>Got a neat idea on how to improve SleepyHead? Check out SleepyHeads <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">Idea Torrent</a></source>
+        <translation type="vanished">Heb je een leuk idee om SleepyHead te verbeteren? Ga naar SleepyHead's <a href="http://sourceforge.net/apps/ideatorrent/sleepyhead/">Idea Torrent (in het Engels).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1116"/>
+        <source>Further Information</source>
+        <translation>Verdere informatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1118"/>
+        <source>Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version.</source>
+        <translation>Hier staan de <a href='qrc:/docs/release_notes.html'>release notes</a> voor deze versie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1120"/>
+        <source>Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users.</source>
+        <translation>Plus een paar <a href='qrc:/docs/usage.html'>gebruiks-aantekeningen</a>, en belangrijke informatie voor Mac gebruikers.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1122"/>
+        <source>About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia</source>
+        <translation>Informatie over <a href='http://nl.wikipedia.org/wiki/Slaapapneu'>Slaapapneu</a> op de Nederlandse Wikipedia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1125"/>
+        <source>Friendly forums to talk and learn about Sleep Apnea:</source>
+        <translation>Vriendelijke forums om te praten en leren over slaapapneu:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1126"/>
+        <source><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</source>
+        <translation type="unfinished"><a href='http://www.apneuvereniging.nl/forum'>het forum van de ApneuVereniging</a>, <a href='http://www.cpaptalk.com'>het CPAPTalk Forum</a> en </translation>
+    </message>
+    <message>
+        <source><a href='http://s7.zetaboards.com/Apnea_Board/index'>Apnea Board</a></source>
+        <translation type="vanished"><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>Copyright:</source>
+        <translation>Auteursrecht:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>&copy;2011-2014</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1137"/>
+        <source>License:</source>
+        <translation>Licentie:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1138"/>
+        <source>This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>.</source>
+        <translation>De software wordt vrijgegeven onder de <a href="qrc:/COPYING">GNU Public License</a>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1141"/>
+        <source>DISCLAIMER:</source>
+        <translation>AANSPRAKELIJKHEID:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1143"/>
+        <source>This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.</source>
+        <translation>Dit is GEEN MEDISCHE SOFTWARE, maar meer een onderzoeksgereedschap voor de visuele interpretatie van gegevens uit ondersteunde apparatuur.Deze software is NIET TOEPASBAAR voor medische diagnose, CPAP compliantie rapportage of vergelijkbare doelen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1145"/>
+        <source>The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.</source>
+        <translation>De auteur en al zijn collega's accepteren GEEN ENKELE AANSPRAKELIJKHEID voor schade, in welke vorm ook, door het gebruik of misbruik van deze software.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1147"/>
+        <source>Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.</source>
+        <translation>Uw arts is altijd de eerste en beste bron van hulp voor het belangrijke onderwerp van uw gezondheid.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1149"/>
+        <source>*** <u>Use at your own risk</u> ***</source>
+        <translation>*** <u>Het gebruik van deze software is geheel voor eigen risico</u> ***</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>Revision:</source>
+        <translation>Revisie: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>branch</source>
+        <translation>Tak</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1331"/>
+        <source>Data Folder Location: <a href="file://%1">%2</a></source>
+        <translation>Gegevensmap: <a href="file://%1">%2</a></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1355"/>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1366"/>
+        <source>Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation>Een speciaal woord van dank voor Pugsy en RobySue van <a href='http://cpaptalk.com'>CPAPTalk</a> voor hun hulp bij de documentatie en handleidingen, en voor iedereen die heeft meegewerkt door te testen en hun CPAP gegevens met elkaar te delen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2037"/>
+        <source>Are you sure you want to rebuild all CPAP data for the following machine:</source>
+        <translation>Weet je zeker dat je alle CPAP gegevens voor het volgende apparaat wilt herstellen:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2040"/>
+        <source>Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way.</source>
+        <translation>Houd er rekening mee, dat dit kan leiden tot verlies van grafische gegevens indien de interne back-ups van SleepyHead op enige manier zijn uitgeschakeld of verstoord.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2048"/>
+        <source>For some reason, SleepyHead does not have internal backups for the following machine:</source>
+        <translation>Om een ​​of andere reden heeft SleepyHead geen interne back-ups voor de volgende machine:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2051"/>
+        <source>Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.</source>
+        <translation>Mits je <i>je<b> zelf </b> backups gemaakt hebt van AL JE CPAP gegevens </i>, kun je dit nog steeds afronden, maar je zal deze back-ups handmatig moeten terugzetten.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2052"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation>Weet je echt zeker dat je dit wilt?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2097"/>
+        <source>You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine:</source>
+        <translation>Je staat op het punt om alle gegevens te <font size=+2>vernietigen</font> van het volgende apparaat:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2100"/>
+        <source>Note as a precaution, the backup folder will be left in place.</source>
+        <translation>Ter geruststelling: de backup map blijft intakt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2101"/>
+        <source>Are you <b>absolutely sure</b> you want to proceed?</source>
+        <translation>Weet je <b>absoluut zeker</b> dat je wilt doorgaan?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2124"/>
+        <source>A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:</source>
+        <translation>Het samenstellen is mislukt, je moet zelf de volgende map wissen:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2649"/>
+        <source>%1's Journal</source>
+        <translation>%1's dagboek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>Choose where to save journal</source>
+        <translation>Kies waar het dagboek moet worden opgeslagen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>XML Files (*.xml)</source>
+        <translation>XML bestanden (*.xml)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2065"/>
+        <source>Because there are no internal backups to rebuild from, you will have to restore from your own.</source>
+        <translation>Aangezien er geen interne backups zijn om uit te herstellen, moet je dat uit je eigen backups doen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="314"/>
+        <source><b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes.</source>
+        <translation><b>Waarschuwing:</b> Dit is een voorpublicatie van het programma, het zal zich soms onstabiel gedragen. Het is bedoeld om te testen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="315"/>
+        <source>If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu.</source>
+        <translation>Als je grafiek- of gegevensfouten tegenkomt na installatie van een nieuwe versie, probeer dan de CPAP database opnieuw op te bouwen uit het gegevensmenu.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="316"/>
+        <source>Make sure your keep your SleepyHead data folder backed up when trying testing versions.</source>
+        <translation>Zorg dat je steeds backups maakt van de map SleepyHeadData zolang je werkt met testversies.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="317"/>
+        <source>Please ensure you are running the latest version before reporting any bugs.</source>
+        <translation>Probeer eerst de nieuwste versie voordat je fouten rapporteert.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="319"/>
+        <source>Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report.</source>
+        <translation>Er wordt verwacht dat je een .zip bestand van je CPAP gegevens of een crash report instuurt als je fouten rapporteert.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="320"/>
+        <source>Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!</source>
+        <translation>Denk twee keer na voordat je een foutrapport instuurt. Zoek ALSJEBLIEFT eerst, want waarschijnlijk ben je niet de eerste die het heeft gemerkt!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="321"/>
+        <source>This red message line is intentional, and will not be a feature in the final version...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2066"/>
+        <source>Would you like to import from your own backups now? (you will have no data visible for this machine until you do)</source>
+        <translation>Wil je nu importeren vanuit je eigen back-ups? (je hebt geen zichtbare gegevens voor dit apparaat totdat je dit doet)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2587"/>
+        <source>Are you sure you want to delete oximetry data for %1</source>
+        <translation>Weet je zeker dat je de oxymetrie-gegevens van %1 wilt wissen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2589"/>
+        <source><b>Please be aware you can not undo this operation!</b></source>
+        <translation><b>Dit kan niet ongedaan worden gemaakt!</b></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2609"/>
+        <source>Select the day with valid oximetry data in daily view first.</source>
+        <translation>Selecteer eerst de dag met geldige oxymetrie-gegevens in het dagoverzicht.</translation>
+    </message>
+    <message>
+        <source>Build Date</source>
+        <translation type="vanished">Versiedatum</translation>
+    </message>
+    <message>
+        <source>Data Folder Location</source>
+        <translation type="vanished">Locatie folder SleepyHeadData</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1332"/>
+        <source>Copyright</source>
+        <translation>Copyright</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1333"/>
+        <source>This software is released under the GNU Public License v3.0<br/></source>
+        <translation>De software wordt vrijgegeven onder de GNU Public License v3.0<br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1337"/>
+        <source>SleepyHead Project Page</source>
+        <translation>SleepyHead Project pagina</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1340"/>
+        <source>SleepyHead Wiki</source>
+        <translation>SleepyHead Wiki</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:</source>
+        <translation type="vanished">Weet je zeker dat je alle CPAP gegevens van het volgende apparaat wilt wissen:</translation>
+    </message>
+    <message>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, and Sean Stangl.</source>
+        <translation type="vanished">James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, en Sean Stangl.</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:
+
+</source>
+        <translation type="vanished">Weet je zeker dat je alle CPAP gegevens wilt wissen voor het volgende apparaat:
+
+</translation>
+    </message>
+    <message>
+        <source>Not all session data could be removed, you have to delete the following folder manually.</source>
+        <translation type="obsolete">Niet alle sessiegegevens konden worden gewist. Je moet zelf de volgende map wissen.</translation>
+    </message>
+    <message>
+        <source>Machine data has been successfully purged.</source>
+        <translation type="vanished">Alle gegevens zijn succesvol gewist.</translation>
+    </message>
+    <message>
+        <source>Would you like to reimport from the backup folder?</source>
+        <translation type="obsolete">Wil je uit de backup-map opnieuw importeren?</translation>
+    </message>
+    <message>
+        <source>Please wait, importing...</source>
+        <translation type="vanished">Even wachten, importeren...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2492"/>
+        <source>There was a problem opening Somnopose Data File: </source>
+        <translation>Er was een probleem met het openen van het SomnoPose gegevensbestand: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2496"/>
+        <source>Somnopause Data Import complete</source>
+        <translation>Import van SomnoPose gegevens voltooid</translation>
+    </message>
+    <message>
+        <source>Authors Twitter Feed</source>
+        <translation type="vanished">Twitter-feed van de auteur</translation>
+    </message>
+    <message>
+        <source><p>The author wishes to express thanks to James Marshall and Rich Freeman for their assistance with this project.</p></source>
+        <translation type="vanished"><p>De auteur wil James Marshall en Rich Freeman bedanken voor hun hulp bij dit project</p></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1376"/>
+        <source>This software comes with absolutely no warranty, either express of implied.</source>
+        <translation>Deze software sluit elke vorm van aansprakelijkheid uit, zowel expliciet als impliciet.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1377"/>
+        <source>It comes with no guarantee of fitness for any particular purpose.</source>
+        <translation>Het wordt geleverd zonder waarborg voor geschiktheid voor een bepaald doel.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1378"/>
+        <source>No guarantees are made regarding the accuracy of any data this program displays.</source>
+        <translation>Er zijn geen garanties met betrekking tot de juistheid van de gegevens die dit programma toont.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1380"/>
+        <source>This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.</source>
+        <translation>Dit is GEEN MEDISCHE SOFTWARE, maar meer een onderzoeksgereedschap voor de visuele interpretatie van gegevens uit ondersteunde apparatuur.</translation>
+    </message>
+    <message>
+        <source>This software is NOT suitable for medical diagnosis, CPAP complaince reporting and other similar purposes.</source>
+        <translation type="vanished">Deze software is NIET TOEPASBAAR voor medische diagnose, CPAP compliantie rapportage of vergelijkbare doelen.</translation>
+    </message>
+    <message>
+        <source>The author and any associates of his accept NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation type="vanished">De auteur en al zijn collegas accepteren GEEN ENKELE AANSPRAKELIJKHEID voor schade, in welke vorm ook, door het gebruik of misbruik van deze software.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1387"/>
+        <source>Use this software entirely at your own risk.</source>
+        <translation>Het gebruik van deze software is geheel voor eigen risico.</translation>
+    </message>
+    <message>
+        <source>If you find this free software to be of use, please consider supporting the development efforts by making a paypal donation to the Author</source>
+        <translation type="vanished">Wanneer u dit programma de moeite waard vindt, steun dan de ontwikkeling met een PayPal donatie aan de auteur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1344"/>
+        <source>Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</source>
+        <translation>Vergeet niet om SleepyHead op <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> of <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</a> een like of +1 te geven</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1349"/>
+        <source>SleepyHead, brought to you by Jedimark</source>
+        <translation>SleepyHead, een product van JediMark</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1353"/>
+        <source>Kudos & Credits</source>
+        <translation>Lof en dank</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1354"/>
+        <source>Bugfixes, Patches and Platform Help:</source>
+        <translation>Opgeloste programmafouten, aanpassingen en hulp bij de ontwikkeling:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Translators:</source>
+        <translation>Vertalers:</translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz (German).</source>
+        <translation type="vanished">Arie Klerk (Nederlands), Steffen Reitz (Deutsch).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1361"/>
+        <source>3rd Party Libaries:</source>
+        <translation>Externe programmabibliotheken:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1362"/>
+        <source>SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>.</source>
+        <translation>SleepyHead wordt gebouwd met het <a href="http://qt-project.org">Qt toepassingsraamwerk</a>.</translation>
+    </message>
+    <message>
+        <source>It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module.</source>
+        <translation type="vanished">Het maakt gebruik van de universele <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> bibliotheek voor toegang tot de seriele poort in the oxymetrie module.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1364"/>
+        <source>In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.</source>
+        <translation>Voor de automatische update maakt SleepyHead gebruik van <a href="http://sourceforge.net/projects/quazip">QuaZip</a> door Sergey A. Tachenov, het is een C++ verpakking van Gilles Vollant's ZIP/UNZIP pakket.</translation>
+    </message>
+    <message>
+        <source>Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="vanished">Een speciaal woord van dank voor Pugsy van <a href='http://cpaptalk.com'>CPAPTalk</a> voor haar hulp bij de documentatie en handleidingen, en voor iedereen die heeft meegewerkt door hun CPAP gegevens te testen en delen met elkaar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1371"/>
+        <source>Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.</source>
+        <translation>Bedankt voor het gebruik van Sleepyhead. Als je het goed kunt gebruiken, dan kun je overwegen de toekomstige ontwikkeling te steunen door middel van een donatie via Paypal.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1382"/>
+        <source>This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.</source>
+        <translation>Deze software is NIET TOEPASBAAR voor medische diagnose, CPAP compliantie rapportage of vergelijkbare doelen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1385"/>
+        <source>The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation>De auteur en al zijn collegas accepteren GEEN ENKELE AANSPRAKELIJKHEID voor schade, in welke vorm ook, door het gebruik of misbruik van deze software.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1456"/>
+        <source>Access to Preferences has been blocked until recalculation completes.</source>
+        <translation>Toegang tot de instellingen is geblokkeerd gedurende herberekening.</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">Vraag</translation>
+    </message>
+    <message>
+        <source>CPAP data was recently purged and needs to be re-imported.</source>
+        <translation type="vanished">De CPAP gegevens zijn recent gewist en moeten opnieuw worden geïmporteerd.</translation>
+    </message>
+    <message>
+        <source>Would you like this done automatically from the Backup Folder?</source>
+        <translation type="obsolete">Wil je dit automatisch laten doen vanuit de backup map?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="720"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2062"/>
+        <source>Please wait, importing from backup folder(s)...</source>
+        <translation>Even wachten, importeren vanuit de backup-map(pen)...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="814"/>
+        <source>Please insert your CPAP data card...</source>
+        <translation>Plaats je cpap gegevenskaart...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="821"/>
+        <source>Choose a folder</source>
+        <translation>Kies een gegevensmap</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="892"/>
+        <source>A %1 file structure for a %2 was located at:</source>
+        <translation>Een %1 bestandsstructuur voor een %2 is gevonden op:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="894"/>
+        <source>A %1 file structure was located at:</source>
+        <translation>Een %1 bestandsstructuur is gevonden op:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="901"/>
+        <source>Would you like to import from this location?</source>
+        <translation>Wil je vanaf deze lokatie importeren?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="905"/>
+        <source>Specify</source>
+        <translation>Specificeren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1092"/>
+        <source>Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)</source>
+        <translation>Philips Respironics System One (CPAP Pro, AutoPAP, BiPAP en ASV modellen)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1106"/>
+        <source>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation>Gebruiksaanwijzing van SleepyHead op het net: <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">(nog in het Engels)</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1108"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1110"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Termen en begrippen</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1112"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1127"/>
+        <source><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></source>
+        <translation><a href='http://www.apneuvereniging.nl'>ApneuVereniging</a></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1327"/>
+        <source>Build Date: %1 %2</source>
+        <translation>Versie datum: %1 %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1329"/>
+        <source>Graphics Engine: %1</source>
+        <translation>Grafische kaart: %1</translation>
+    </message>
+    <message>
+        <source>Data Folder Location: %1</source>
+        <translation type="vanished">Gegevens map: %1</translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here.</source>
+        <translation type="vanished">Arie Klerk (Nederlands), Steffen Reitz (Duits), Chen Hao (Chinees), Lars-Erik Söderström (Zweeds), Damien Vigneron (Frans) en anderen die nog moeten worden toegevoegd.</translation>
+    </message>
+    <message>
+        <source>Do you have a CMS50[x] Oximeter?
+One is required to use this section.</source>
+        <translation type="vanished">Heeft u een CMS50[x] oxymeter?
+Die is vereist voor gebruik van deze sectie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1545"/>
+        <source>There was an error saving screenshot to file "%1"</source>
+        <translation>Er is iets fout gegaan bij het opslaan van een beeldschermafdruk naar het bestand "%1"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1547"/>
+        <source>Screenshot saved to file "%1"</source>
+        <translation>Schermafbeelding bewaard als bestand "%1"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1567"/>
+        <source>Printing Disabled</source>
+        <translation>Afdrukken is uitgeschakeld</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1568"/>
+        <source>Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>Gah!</source>
+        <translation>Bah!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>If you can read this, the restart command didn't work. Your going to have to do it yourself manually.</source>
+        <translation>Als je dit kunt lezen, heeft het herstartcommando niet gewerkt. Je zult het handmatig moeten doen.</translation>
+    </message>
+    <message>
+        <source>Are you sure?</source>
+        <translation type="vanished">Weet je het zeker?</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:
+</source>
+        <translation type="vanished">Weet je zeker dat je alle CPAP-gegevens wilt wissen van het volgende apparaat:
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2287"/>
+        <source>Performance will be degraded during these recalculations.</source>
+        <translation>Tijdens herberekening gaan de prestaties van de PC achteruit.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2288"/>
+        <source>Recalculating Indices</source>
+        <translation>Herberekening van de indexen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2300"/>
+        <source>Loading Event Data</source>
+        <translation>Incident gegevens laden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2302"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2362"/>
+        <source>Recalculating Summaries</source>
+        <translation>Overzichten opnieuw berekenen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2374"/>
+        <source>Restart Required</source>
+        <translation>Herstart vereist</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2375"/>
+        <source>Recalculations are complete, the application now needs to restart to display the changes.</source>
+        <translation>Herberekening voltooid, de applicatie moet nu herstarten om de wijzigingen zichtbaar te maken.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Recalculations are now complete.</source>
+        <translation>Herberekening voltooid.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Task Completed</source>
+        <translation>Taak voltooid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2404"/>
+        <source>There was a problem opening ZEO File: </source>
+        <translation>Er was een probleem met het openen van het ZEO gegevensbestand: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2408"/>
+        <source>Zeo CSV Import complete</source>
+        <translation>Import van het ZEO .csv bestand voltooid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2430"/>
+        <source>There was a problem opening MSeries block File: </source>
+        <translation>Er was een probleem bij het openen van het M-Series blokbestand: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2434"/>
+        <source>MSeries Import complete</source>
+        <translation>Import M-Series voltooid</translation>
+    </message>
+</context>
+<context>
+    <name>MinMaxWidget</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1773"/>
+        <source>Auto-Fit</source>
+        <translation>Automatisch</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1774"/>
+        <source>Defaults</source>
+        <translation>Standaard</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1775"/>
+        <source>Override</source>
+        <translation>Instellen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1776"/>
+        <source>The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own.</source>
+        <translation>Instelling y-as: 'Automatisch' om alles te zien, 'Standaard' voor fabrieksinstelling en 'Instellen' om zelf te kiezen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1782"/>
+        <source>The Minimum Y-Axis value.. Note this can be a negative number if you wish.</source>
+        <translation>De minimale waarde. Dit mag negatief zijn als je wilt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1783"/>
+        <source>The Maximum Y-Axis value.. Must be greater than Minimum to work.</source>
+        <translation>De maximale waarde. Deze moet groter zijn dan de minimale waarde.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1818"/>
+        <source>Scaling Mode</source>
+        <translation>Schaalinstelling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1840"/>
+        <source>This button resets the Min and Max to match the Auto-Fit</source>
+        <translation>Deze knop reset de min en max waarden naar Automatisch</translation>
+    </message>
+</context>
+<context>
+    <name>NewProfile</name>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="14"/>
+        <source>Edit User Profile</source>
+        <translation>Gebruikersprofiel aanpassen</translation>
+    </message>
+    <message>
+        <source>Language</source>
+        <translation type="obsolete">Taal</translation>
+    </message>
+    <message>
+        <source>English</source>
+        <translation type="obsolete">English</translation>
+    </message>
+    <message>
+        <source>Data Folder</source>
+        <translation type="obsolete">Bestandsmap</translation>
+    </message>
+    <message>
+        <source>Shows the directory where SleepyHead data will be stored. </source>
+        <translation type="obsolete">De gegevens van SleepyHead worden in deze map opgeslagen.</translation>
+    </message>
+    <message>
+        <source>Click here to choose where to store SleepyHead data.</source>
+        <translatorcomment>Dit is een hulptekst, mag lang zijn.
+20/9 WJG: op zich met de redenatie eens, al ben ik er ook voor om hulpteksten zo compact en duidelijk mogelijk te houden.</translatorcomment>
+        <translation type="obsolete">Kies hier waar SleepyHead gegevens opslaat.</translation>
+    </message>
+    <message>
+        <source>...</source>
+        <translation type="obsolete">...</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:italic;">Welcome to SleepyHead</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This software is being designed to help you review data related to your CPAP treatment.</p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It's intended as merely a data viewer, and not a substitute for competent medical guidance from your Doctor.  </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This software has been released freely under the <a href="qrc:/LICENSE.txt"><span style=" text-decoration: underline; color:#0000ff;">GNU Public License</span></a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Accuracy of any data displayed is not and can not be guaranteed. </p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Any reports generated are for PERSONAL USE ONLY, and not fit for compliance purposes.</p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The author will not be held liable for <span style=" text-decoration: underline;">anything</span> related to the use or misuse of this software. </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use at your own risk. </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This software is copyright ©2011 Mark Watkins </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></source>
+        <translation type="obsolete"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:italic;">Welkom bij SleepyHead</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dit programma is ontworpen als hulp bij het beoordelen van de gegevens over je CPAP behandeling.</p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het is voornamelijk bedoeld om gegevens te bekijken en absoluut geen vervanging van de  medische begeleiding door je arts.  </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Deze software is vrijelijk uitgegeven onder de <a href="qrc:/LICENSE.txt"><span style=" text-decoration: underline; color:#0000ff;">GNU Public License</span></a>, en wordt geleverd zonder garantie en zonder enige aanspraak op geschiktheid voor welk doel dan ook.</p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De juistheid van alle weergegeven gegevens is niet en kan niet worden gegarandeerd. </p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Ieder gegenereerd rapport is voor EIGEN GEBRUIK en is niet geschikt om de naleving te beoordelen.</p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De auteur kan niet verantwoordelijk worden gehouden voor <span style=" text-decoration: underline;">alles</span> dat is gerelateerd aan het gebruik of misbruik van deze programmatuur. </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Gebruik op eigen risico. </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Auteursrecht software ©2011 Mark Watkins </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></translation>
+    </message>
+    <message>
+        <source>qrc:/docs/intro.html</source>
+        <translation type="vanished">qrc:/docs/intro.html</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="70"/>
+        <source>I agree to all the conditions above.</source>
+        <translation>Ik ga akkoord met alle bovengenoemde voorwaarden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="111"/>
+        <source>User Information</source>
+        <translation>Gebruikersinformatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="137"/>
+        <source>User Name</source>
+        <translation>Naam gebruiker</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="152"/>
+        <source>Keep the kids out.. Nothing more.. This isn't meant to be uber security.</source>
+        <translatorcomment>WJG: Mooi gevonden!</translatorcomment>
+        <translation>Hou de kinderen erbuiten... niets meer of minder... 
+Dit is GEEN ECHTE BEVEILIGING.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="155"/>
+        <source>Password Protect Profile</source>
+        <translation>Wachtwoordbeveiliging van het profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="182"/>
+        <source>Password</source>
+        <translation>Wachtwoord</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="196"/>
+        <source>...twice...</source>
+        <translation>... nog eens ...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="213"/>
+        <source>Locale Settings</source>
+        <translation>Landinstellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="285"/>
+        <source>Country</source>
+        <translation>Land</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="253"/>
+        <source>TimeZone</source>
+        <translation>Tijdzone</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="54"/>
+        <source>about:blank</source>
+        <translation type="unfinished">about:blank</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="240"/>
+        <source>DST Zone</source>
+        <translation>Automatische zomertijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="320"/>
+        <source>Personal Information (for reports)</source>
+        <translation>Persoonlijke informatie (voor rapporten)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="344"/>
+        <source>First Name</source>
+        <translation>Voornaam</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="354"/>
+        <source>Last Name</source>
+        <translation>Achternaam</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="364"/>
+        <source>D.O.B.</source>
+        <translation>Geboortedatum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="380"/>
+        <source>Gender</source>
+        <translation>Geslacht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="393"/>
+        <source>Male</source>
+        <translation>Man</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="398"/>
+        <source>Female</source>
+        <translation>Vrouw</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="414"/>
+        <source>Height</source>
+        <translation>Lengte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="453"/>
+        <source>metric</source>
+        <translation>metrisch</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="458"/>
+        <source>archiac</source>
+        <translatorcomment>WJG: is grapje van de maker
+AK: Ik heb het nu ook door!</translatorcomment>
+        <translation>archaïsch</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="471"/>
+        <source>Contact Information</source>
+        <translation>Contactinformatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="498"/>
+        <location filename="../sleepyhead/newprofile.ui" line="773"/>
+        <source>Address</source>
+        <translation>Adres</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="515"/>
+        <location filename="../sleepyhead/newprofile.ui" line="804"/>
+        <source>Email</source>
+        <translation>E-mail</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="525"/>
+        <location filename="../sleepyhead/newprofile.ui" line="794"/>
+        <source>Phone</source>
+        <translation>Telefoon</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="570"/>
+        <source>CPAP Treatment Information</source>
+        <translation>Informatie over de behandeling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="597"/>
+        <source>Date Diagnosed</source>
+        <translation>Datum diagnose</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="611"/>
+        <source>Untreated AHI</source>
+        <translation>Onbehandelde AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="625"/>
+        <source>CPAP Mode</source>
+        <translatorcomment>WJG: klopt dit wel, want Bi-level en APAP zijn in feite geen CPAP-soorten, toch? Ik geef maar wat alternatieven, ook spreekt het wel voor zich en zou je ook 'Soort CPAP' kunnen laten staan.
+20/9 WJG: Soort apparaat lijkt me prima!</translatorcomment>
+        <translation variants="yes">
+            <lengthvariant>Soort apparaat</lengthvariant>
+            <lengthvariant></lengthvariant>
+            <lengthvariant></lengthvariant>
+        </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="633"/>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="638"/>
+        <source>APAP</source>
+        <translation>APAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="643"/>
+        <source>Bi-Level</source>
+        <translation>Bi-level</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="648"/>
+        <source>ASV</source>
+        <translatorcomment>Adaptieve ventilatie-instelling ASI?</translatorcomment>
+        <translation>ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="656"/>
+        <source>RX Pressure</source>
+        <translation>Voorgeschreven druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="702"/>
+        <source>Doctors / Clinic Information</source>
+        <translation>Specialist/ziekenhuis</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="729"/>
+        <source>Doctors Name</source>
+        <translation>Specialist</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="746"/>
+        <source>Practice Name</source>
+        <translatorcomment>WJG: zou dit niet bedoeld worden? Bij het adres wordt wel duidelijk welk ziekenhuis het is. Bij mij is de behandeling bij 'Longziekten', misschien heet dat bij een ander ziekenhuis anders?</translatorcomment>
+        <translation>Afdeling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="756"/>
+        <source>Patient ID</source>
+        <translation>Patient-ID</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="852"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="867"/>
+        <source>TextLabel</source>
+        <translation>Tekstlabel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="943"/>
+        <source>&Cancel</source>
+        <translation>&Annuleren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="959"/>
+        <source>&Back</source>
+        <translation>&Terug</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="975"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="275"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="284"/>
+        <source>&Next</source>
+        <translation>&Volgende</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="59"/>
+        <source>Select Country</source>
+        <translation>Kies land</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="109"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Welkom bij SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="111"/>
+        <source>This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</source>
+        <translation>Deze software is ontworpen om je te helpen bij het analyseren van de gegevens van je CPAP.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="114"/>
+        <source>SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</source>
+        <translation>SleepyHead is vrij vrijgegeven onder de <a href='qrc:/COPYING'> GNU Public License </ a>, en wordt geleverd zonder garantie en zonder enige aanspraak op geschiktheid voor enig doel.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="116"/>
+        <source>PLEASE READ CAREFULLY</source>
+        <translation>GRAAG AANDACHTIG LEZEN</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="117"/>
+        <source>SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.</source>
+        <translation>SleepyHead is voornamelijk bedoeld om gegevens te bekijken en absoluut geen vervanging voor de medische begeleiding door uw arts.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="120"/>
+        <source>Accuracy of any data displayed is not and can not be guaranteed.</source>
+        <translation>De betrouwbaarheid van de weergegeven gegevens wordt en kan nooit worden gegarandeerd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="122"/>
+        <source>Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.</source>
+        <translation>Alle rapportages zijn voor EIGEN GEBRUIK en kunnen ONDER GEEN VOORWAARDE worden toegepast voor medische diagnostiek.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="125"/>
+        <source>The author will not be held liable for <u>anything</u> related to the use or misuse of this software.</source>
+        <translation>De auteur accepteert GEEN ENKELE AANSPRAKELIJKHEID voor schade, in welke vorm ook, door het gebruik of misbruik van deze software.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="129"/>
+        <source>Use of this software is entirely at your own risk.</source>
+        <translation>Het gebruik van deze software is geheel voor eigen risico.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="132"/>
+        <source>SleepyHead is copyright &copy;2011-2014 Mark Watkins</source>
+        <translation>Het auteursrecht van SleepyHead &copy;2011-2014 berust bij Mark Watkins</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="157"/>
+        <source>Please provide a username for this profile</source>
+        <translation>Geef een gebruikersnaam voor dit profiel</translation>
+    </message>
+    <message>
+        <source>Empty Username</source>
+        <translation type="vanished">Geen gebruikernaam</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="167"/>
+        <source>Passwords don't match</source>
+        <translation>Wachtwoorden komen niet overeen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Profile Changes</source>
+        <translation>Profielwijzigingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Accept and save this information?</source>
+        <translation>Opslaan?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="273"/>
+        <source>&Finish</source>
+        <translation>&Einde</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="449"/>
+        <source>&Close this window</source>
+        <translation>&Sluit dit venster</translation>
+    </message>
+</context>
+<context>
+    <name>Overview</name>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="68"/>
+        <source>Range:</source>
+        <translation>Bereik:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="82"/>
+        <source>Last Week</source>
+        <translation>Afgelopen week</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="87"/>
+        <source>Last Two Weeks</source>
+        <translation>Afgelopen twee weken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="92"/>
+        <source>Last Month</source>
+        <translation>Afgelopen maand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="97"/>
+        <source>Last Two Months</source>
+        <translation>Afgelopen twee maanden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="102"/>
+        <source>Last Three Months</source>
+        <translation>Afgelopen drie maanden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="107"/>
+        <source>Last 6 Months</source>
+        <translation>Afgelopen halfjaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="112"/>
+        <source>Last Year</source>
+        <translation>Afgelopen jaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="117"/>
+        <source>Everything</source>
+        <translation>Alles</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="122"/>
+        <source>Custom</source>
+        <translation>Zelf kiezen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="130"/>
+        <source>Start:</source>
+        <translation>Start:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="153"/>
+        <source>End:</source>
+        <translation>Einde:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="176"/>
+        <source>Reset view to selected date range</source>
+        <translatorcomment>WJG: is wat preciezer, als het past</translatorcomment>
+        <translation>Herstel naar geselecteerd datumbereik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="195"/>
+        <location filename="../sleepyhead/overview.ui" line="244"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="225"/>
+        <source>Toggle Graph Visibility</source>
+        <translation>Grafieken aan/uit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="260"/>
+        <source>Drop down to see list of graphs to switch on/off.</source>
+        <translation>Lijst met grafieken om aan/uit te zetten.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="264"/>
+        <source>Graphs</source>
+        <translation>Grafieken</translation>
+    </message>
+    <message>
+        <source>RDI</source>
+        <translation type="obsolete">RDI</translation>
+    </message>
+    <message>
+        <source>AHI</source>
+        <translation type="obsolete">AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="123"/>
+        <source>Apnea
+Hypopnea
+Index</source>
+        <translation>Apneu
+Hypopneu
+Index</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage</source>
+        <translation>Gebruik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage
+(hours)</source>
+        <translation>Gebruik
+(uren)</translation>
+    </message>
+    <message>
+        <source>Flow Limit</source>
+        <translation type="obsolete">Stroombeperking</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times</source>
+        <translation>Sessietijden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times
+(hours)</source>
+        <translation>Sessietijden
+(uren)</translation>
+    </message>
+    <message>
+        <source>Pressure
+(cmH2O)</source>
+        <translation type="obsolete">Druk
+(cmWK)</translation>
+    </message>
+    <message>
+        <source>Settings</source>
+        <translation type="obsolete">Instellingen</translation>
+    </message>
+    <message>
+        <source>Leaks</source>
+        <translation type="obsolete">Maskerlek</translation>
+    </message>
+    <message>
+        <source>Unintentional Leaks
+(L/min)</source>
+        <translation type="obsolete">Maskerlek
+(l/min)</translation>
+    </message>
+    <message>
+        <source>Total Leaks</source>
+        <translation type="obsolete">Totale lek</translation>
+    </message>
+    <message>
+        <source>Total Leaks
+(L/min)</source>
+        <translation type="obsolete">Totale lek
+(l/min)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="121"/>
+        <source>Respiratory
+Disturbance
+Index</source>
+        <translation>Ademhalings
+Stoornis
+Index (RDI)</translation>
+    </message>
+    <message>
+        <source>% in PB</source>
+        <translatorcomment>WJG: moet dat niet 'periodieke ademhaling zijn, zie volgende item
+AK: Discussie</translatorcomment>
+        <translation type="vanished">% in PB</translation>
+    </message>
+    <message>
+        <source>Periodic
+Breathing
+(% of night)</source>
+        <translatorcomment>WJG: wat wordt er eigenlijk precies mee bedoeld? Gaat het hier om de reguliere/normale ademhaling, d.w.z. zonder ademstops? Dan zou je 'periodiek beter door 'Reguliere' of 'Normale' kunnen vervangen.
+AK: Het is een oscillerende ademhaling, mss is "Cyclische" beter?
+20/9: Dat zou dan beter zijn.</translatorcomment>
+        <translation type="vanished">Cyclische
+ademhaling (PB)
+(% van de nacht)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>% in %1</source>
+        <translation>% in %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <source>%1
+(% of night)</source>
+        <translation>%1
+(% van de nacht)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>Large Leaks
+(% of night)</source>
+        <translation>Groot lek
+(% van de nacht)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI</source>
+        <translatorcomment>AK: Deze niet vertalen? Respiratory Disturbance Index...</translatorcomment>
+        <translation>Piek RDI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI
+Shows RDI Clusters
+(RDI/hr)</source>
+        <translatorcomment>WJG: zo'n spellingsdingetje met streepjes en al dan niet aan elkaar schrijven.
+AK: Deze niet vertalen? Respiratory Disturbance Index...
+20/9 WJG: Als dat gangbaar is om het onvertaald te gebruiken, dan inderdaad laten.</translatorcomment>
+        <translation>Piek RDI, maakt
+RDI-clusters zichtbaar
+(RDI/uur)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI</source>
+        <translation>Piek-AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI
+Shows AHI Clusters
+(AHI/hr)</source>
+        <translation>Piek-AHI, maakt
+AHI-clusters zichtbaar
+(AHI/uur)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="161"/>
+        <source>
+(count)</source>
+        <translation>
+(aantal)</translation>
+    </message>
+    <message>
+        <source>Resp. Rate</source>
+        <translatorcomment>WJG: afgebroken vanwege beschikbare ruimte</translatorcomment>
+        <translation type="obsolete">Ademtempo</translation>
+    </message>
+    <message>
+        <source>Respiratory
+Rate
+(breaths/min)</source>
+        <translatorcomment>WJG: afbreeksreepje</translatorcomment>
+        <translation type="vanished">Ademtempo
+(per minuut)</translation>
+    </message>
+    <message>
+        <source>Tidal Volume</source>
+        <translation type="obsolete">Teugvolume</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="157"/>
+        <source>Tidal
+Volume
+(ml)</source>
+        <translatorcomment>WJG: maar misschien past het ook wel zonder afbreking
+AK: Ik zie het nergens...
+20/9 WJG: Als je met je cursor over de grafiek Tidal Vulume beweegt en op de grafiektitel gaat staan, zie je een geel hulptekstje verschijnen (is bij al die grafieken het geval). De breedte van die gele balonnetjes past zich aan de tekst aan - tot op zekere hoogte.</translatorcomment>
+        <translation>Teugvolume
+(ml)</translation>
+    </message>
+    <message>
+        <source>Minute Vent.</source>
+        <translatorcomment>WJG: ik weet niet precies wat er getoond wordt, ik ken de waarden niet, maar 'minuutventitlatie' lijkt me niet goed. 'Minute' kan in het Engels ook 'zeer klein, miniem' betekenen,  misschien moet het eerder in die richting gezocht worden, in plaats van met tijdeenheden?
+AK: Nee, het is The average minute ventilation (tidal volume x rate).
+Staat in: Instellingen-Grafieken</translatorcomment>
+        <translation type="obsolete">Minuutventilatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="158"/>
+        <source>Minute
+Ventilation
+(L/min)</source>
+        <translatorcomment>WJG: zie vorige</translatorcomment>
+        <translation>Minuutventilatie
+(l/min)</translation>
+    </message>
+    <message>
+        <source>Target Vent.</source>
+        <translatorcomment>WJG: zit een beetje met het woord 'ventialtie'. Kan ook 'verversing' zijn. Mijn kennis van het lezen van deze grafiek schiet me hier echter te kort.
+AK: Ik zie het nergens staan...
+20/9 WJG: Is de een na onderste keuze in het dropdown menuutje rechtsonder</translatorcomment>
+        <translation type="obsolete">Doelventilatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="159"/>
+        <source>Target
+Ventilation
+(L/min)</source>
+        <translatorcomment>WJG: zie vorige</translatorcomment>
+        <translation>Doelventilatie
+(l/min)</translation>
+    </message>
+    <message>
+        <source>Pat. Trig. Br.</source>
+        <translatorcomment>Staat in: Instellingen-Grafieken</translatorcomment>
+        <translation type="obsolete">Pat. geact. teugen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="160"/>
+        <source>Patient
+Triggered
+Breaths
+(%)</source>
+        <translatorcomment>WJG: als dit past is dit 'meer' Nederlands</translatorcomment>
+        <translation>Patient
+geactiveerde
+ademhaling
+(PTB) (%)</translation>
+    </message>
+    <message>
+        <source>Sessions</source>
+        <translation type="obsolete">Sessies</translation>
+    </message>
+    <message>
+        <source>Sessions
+(count)</source>
+        <translation type="obsolete">Sessies
+(aantal)</translation>
+    </message>
+    <message>
+        <source>Pulse Rate</source>
+        <translation type="obsolete">Polsslag</translation>
+    </message>
+    <message>
+        <source>Pulse Rate
+(bpm)</source>
+        <translation type="obsolete">Polsslag
+(per minuut)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="163"/>
+        <source>Oxygen Saturation
+(%)</source>
+        <translation>Zuurstofsaturatie
+(%)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="164"/>
+        <source>SensAwake
+(count)</source>
+        <translation>SensAwake
+(aantal)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="167"/>
+        <source>Body
+Mass
+Index</source>
+        <translation>Body
+Mass
+Index
+(BMI)</translation>
+    </message>
+    <message>
+        <source>Zombie</source>
+        <translation type="obsolete">Zombie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="168"/>
+        <source>How you felt
+(0-10)</source>
+        <translation>Hoe je je voelde
+(0-10)</translation>
+    </message>
+    <message>
+        <source>Events/Hr</source>
+        <translation type="vanished">Incidenten/uur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="185"/>
+        <source>Zombie Meter</source>
+        <translation>Zombie-meter</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation type="obsolete">FL</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="254"/>
+        <source>breaths/min</source>
+        <translation>teugen/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="262"/>
+        <source>L/b</source>
+        <translation>l/teug</translation>
+    </message>
+    <message>
+        <source>L/m</source>
+        <translation type="obsolete">l/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="284"/>
+        <source>%PTB</source>
+        <translatorcomment>WJG: patiënt-geactiveerde teugen? Of betekent PTB hier iets anders dan patient triggered breaths
+AK: Ik zie het nergens...
+Even afwachten</translatorcomment>
+        <translation>% PTB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="311"/>
+        <source>% PB</source>
+        <translatorcomment>WJG: ? zie vorige
+AK: Cyclische ademhaling kan niet: CA is al Centrale Apneu...</translatorcomment>
+        <translation>% Cyclische ademhaling
+(PB)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="314"/>
+        <source>% %1</source>
+        <translation>% %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="670"/>
+        <source>Show all graphs</source>
+        <translation>Alle grafieken zichtbaar</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">Grafieken staan uit!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="683"/>
+        <source>Hide all graphs</source>
+        <translation>Verberg alle grafieken</translation>
+    </message>
+</context>
+<context>
+    <name>OximeterImport</name>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="14"/>
+        <source>Dialog</source>
+        <translation>Dialoog</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="39"/>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="35"/>
+        <source>Oximeter Import Wizard</source>
+        <translation>Oxymeter import wizard</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="749"/>
+        <source>Skip this page next time.</source>
+        <translation>Sla deze pagina volgende keer over.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="789"/>
+        <source><html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html></source>
+        <translation><html><head/><body><p>SleepyHead ondersteunt de Contec CMS50D+/E/F serie van oxymeters volledig, <br/>net zoals gegevensbestanden van de ChoiceMMed MD300W1 oxymeters'</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="823"/>
+        <source>Where would you like to import from?</source>
+        <translation>Waar wilt u vandaan importeren?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="846"/>
+        <source><html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html></source>
+        <translation><html><head/><body><p>Deze optie geeft de mogelijkheid om de gegevens uit je oxymeter (via een kabel) te importeren.</p><p>Na kiezen van deze optie, moet bij sommige oxymeters de upload gestart worden.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="852"/>
+        <source>Directly from a recording on a device</source>
+        <translation>Direct van af de oxymeter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="872"/>
+        <source><html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html></source>
+        <translation><html><head/><body><p>Als je er geen probleem mee hebt om de hele nacht aan de computer te hangen, geeft deze optie de mogelijkheid van een live "plethysomogram"-grafiek, met indicatie van het hartritme en natuurlijk de normale zuurstofsaturatiegrafiek.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="878"/>
+        <source>Record attached to computer overnight (provides plethysomogram)</source>
+        <translation>Opname direct naar de computer (geeft plethysomogram)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="895"/>
+        <source><html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html></source>
+        <translation><html><head/><body><p>Deze optie laat gegevensbestanden importeren, die door het programma van de oxymeter zijn gemaakt, zoals SpO2Review.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="901"/>
+        <source>Import from a datafile saved by another program, like SpO2Review</source>
+        <translation>Importeren van gegevensbestanden van een ander programma, zoals SpO2Review</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="942"/>
+        <source><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p>& [...]
+        <translation><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Herinnering voor CPAP gebruikers: </span><span style=" color:#fb0000;">Heb je eraan gedacht om eerst je CPAP sessies te importeren?</span></p><p>Als je dat vergeet, heb je geen geldige tijd om de oxymetrie-sessie mee te synchroniseren.<br/><br/>Om een goede synchronisatie te krijgen moet je altijd de twee [...]
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="964"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1000"/>
+        <source>Please connect your oximeter device</source>
+        <translation>Sluit je oxymeter aan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1026"/>
+        <source>Press Start to commence recording</source>
+        <translation>Druk op Start om de opname te beginnen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1072"/>
+        <source>Show Live Graphs</source>
+        <translation>Live grafieken laten zien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1103"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1357"/>
+        <source>Duration</source>
+        <translation>Tijdsduur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1139"/>
+        <source>SpO2 %</source>
+        <translation>SpO2 %</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1221"/>
+        <source>Pulse Rate</source>
+        <translation>Polsslag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1313"/>
+        <source>Multiple Sessions Detected</source>
+        <translation>Meerdere sessies gevonden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1329"/>
+        <source>Please choose which one you want to import into SleepyHead</source>
+        <translation>Kies welke je wilt importeren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1352"/>
+        <source>Start Time</source>
+        <translation>Starttijd</translation>
+    </message>
+    <message>
+        <source>Import Time</source>
+        <translation type="vanished">Import tijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1362"/>
+        <source>Details</source>
+        <translation>Details</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1379"/>
+        <source>Import Completed. When did the recording start?</source>
+        <translation>Import gelukt. Wanneer is de opname gestart?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1403"/>
+        <source>Day recording (normally would of) started</source>
+        <translation>De dag waarop de opname (normaal gesproken) gestart is</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1449"/>
+        <source>Oximeter Starting time</source>
+        <translation>Oxymeter starttijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1461"/>
+        <source>I want to use the time reported by my oximeter's built in clock.</source>
+        <translation>Ik wil de tijd van de klok van de oxymeter gebruiken.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1477"/>
+        <source>I started this oximeter recording at (or near) the same time as a session on my CPAP machine.</source>
+        <translation>Ik startte de oxymeter (ongeveer) tegelijk met de CPAP.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1506"/>
+        <source><html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html></source>
+        <translation><html><head/><body><p>SleepyHead heeft een starttijd nodig om de sessie op te kunnen slaan.</p><p>Kies een van de volgende opties:</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1538"/>
+        <source><html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html></source>
+        <translation><html><head/><body><p>Let op: Beide apparaten tegelijk starten is altijd nauwkeuriger.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1559"/>
+        <source>Choose CPAP session to sync to:</source>
+        <translation>Kies de CPAP-sessie waarmee moet worden gesynchroniseerd:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1598"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1637"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1679"/>
+        <source>You can manually adjust the time here if required:</source>
+        <translation>Je kunt hier eventueel de tijd zelf aanpassen:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1700"/>
+        <source>HH:mm:ssap</source>
+        <translation>uu:mm:ss AP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1753"/>
+        <source>&Cancel</source>
+        <translation>&Annuleren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1760"/>
+        <source>&Information Page</source>
+        <translation>&Informatiepagina</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1780"/>
+        <source>&Retry</source>
+        <translation>&Opnieuw</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1787"/>
+        <source>&Choose Session</source>
+        <translation>&Kies sessie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1794"/>
+        <source>&End Recording</source>
+        <translation>&Einde opname</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1801"/>
+        <source>&Sync and Save</source>
+        <translation>&Sync en sla op</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1808"/>
+        <source>&Save and Finish</source>
+        <translation>&Opslaan en afsluiten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1815"/>
+        <source>&Start</source>
+        <translation>&Start</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="170"/>
+        <source>Scanning for compatible oximeters</source>
+        <translation>Zoeken naar een compatibele oxymeter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="202"/>
+        <source>Could not detect any connected oximeter devices.</source>
+        <translation>Kon geen enkele oxymeter vinden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="209"/>
+        <source>Connecting to %1 Oximeter</source>
+        <translation>Verbinden met de oxymeter %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="269"/>
+        <source>"%1", session %2</source>
+        <translation>"%1", sessie %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="288"/>
+        <source>Waiting for %1 to start</source>
+        <translation>Wacht op starten van %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="289"/>
+        <source>Waiting for the device to start the upload process...</source>
+        <translation>Wacht tot het apparaat gaat verzenden...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="291"/>
+        <source>Select upload option on %1</source>
+        <translation>Kies 'upload' op de %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="292"/>
+        <source>Waiting for you to start the upload process...</source>
+        <translation>Wachten tot 'upload' start...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="323"/>
+        <source>%1 device is uploading data...</source>
+        <translation>Oxymeter %1 stuurt gegevens...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="324"/>
+        <source>Please wait until oximeter upload process completes. Do not unplug your oximeter.</source>
+        <translation>Even wachten tot de gegevensoverdracht klaar is. Houd de oxymeter aangesloten.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="341"/>
+        <source>Oximeter import completed..</source>
+        <translation>Import geslaagd..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Select a valid oximetry data file</source>
+        <translation>Kies een geldig gegevensbestand</translation>
+    </message>
+    <message>
+        <source>Oximetry Files (*.spo *.spor *.dat)</source>
+        <translation type="vanished">Oxymetrie bestanden: *.spo, *.spor, *.dat</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Oximetry Files (*.spo *.spor *.spo2 *.dat)</source>
+        <translation>Oxymetrie bestanden (*.spo, *.spor, *.spo2 *.dat)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="391"/>
+        <source>No Oximetery module could parse the given file:</source>
+        <translation>Er was geen oxymeter die het opgegeven bestand kon lezen:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="413"/>
+        <source>Oximeter not detected</source>
+        <translation>Geen oxymeter gedetecteerd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="420"/>
+        <source>Couldn't access oximeter</source>
+        <translation>Kon geen oxymeter benaderen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="431"/>
+        <source>Live Oximetery Mode</source>
+        <translation>Directe oxymetrie-aansluiting</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="434"/>
+        <source>Starting up...</source>
+        <translation>Opstarten...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="435"/>
+        <source>If you can still read this after a few seconds, cancel and try again</source>
+        <translation>Als je dit na enkele seconden nog ziet, druk dan op 'cancel' en probeer het opnieuw</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="478"/>
+        <source>Live Import Stopped</source>
+        <translation>Directe import beeindigd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="479"/>
+        <source>Live Oximetery Stopped</source>
+        <translation>Directe oxymetrie gestopt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="480"/>
+        <source>Live Oximetery import has been stopped</source>
+        <translation>Directe oxymetrie-import is beeindigd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="527"/>
+        <source>%1 session(s) on %2, starting at %3</source>
+        <translation>%1 sessie(s) op %2, beginnend met %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="531"/>
+        <source>No CPAP data available on %1</source>
+        <translation>Geen CPAP gegevens beschikbaar op %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="537"/>
+        <source>%1</source>
+        <translation type="unfinished">%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="650"/>
+        <source>Recording...</source>
+        <translation>Opnemen...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="657"/>
+        <source>Finger not detected</source>
+        <translation>Geen vinger gedetecteerd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="750"/>
+        <source>I want to use the time my computer recorded for this live oximetry session.</source>
+        <translation>Ik wil de tijd van mijn computer gebruiken voor deze directe oxymetrie-sessie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="753"/>
+        <source>I need to set the time manually, because my oximeter doesn't have an internal clock.</source>
+        <translation>Ik moet de tijd zelf instellen, want mijn oxymeter heeft geen klok.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="764"/>
+        <source>Something went wrong getting session data</source>
+        <translation>Er ging iets fout bij het ophalen van sessie-gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="993"/>
+        <source>CMS50 Session %1</source>
+        <translation>CMS50 sessie %1</translation>
+    </message>
+</context>
+<context>
+    <name>Oximetry</name>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="89"/>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="102"/>
+        <source>d/MM/yy h:mm:ss AP</source>
+        <translation>dd/MM/jj uu:mm:ss AP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="131"/>
+        <source>R&eset</source>
+        <translation>R&eset</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="160"/>
+        <source>SpO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="245"/>
+        <source>Pulse</source>
+        <translation>Pols</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="346"/>
+        <source>...</source>
+        <translation type="unfinished">...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="366"/>
+        <source>&Open .spo/R File</source>
+        <translation>&Open SpO/R gegevensbestand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="385"/>
+        <source>Serial &Import</source>
+        <translation>Seriële &import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="398"/>
+        <source>&Start Live</source>
+        <translation>&Start live</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="421"/>
+        <source>Serial Port</source>
+        <translation>Seriële poort</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="450"/>
+        <source>&Rescan Ports</source>
+        <translation>&Herscan poorten</translation>
+    </message>
+    <message>
+        <source>Control</source>
+        <translatorcomment>WJG: Ik heb geen oxymeter, kan in SleepyHead niet kijken wat hier bedoeld wordt. 'Control' kan verschillende betekenissen hebben: beheren en checken (contoleren)</translatorcomment>
+        <translation type="vanished">Control</translation>
+    </message>
+    <message>
+        <source>No Oximetry Data</source>
+        <translation type="vanished">Geen oxymetriegegevens</translation>
+    </message>
+    <message>
+        <source>Connect Oximeter</source>
+        <translation type="vanished">Sluit oxymeter aan</translation>
+    </message>
+    <message>
+        <source>Please connect oximeter device</source>
+        <translation type="vanished">Sluit aub de oxymeter aan</translation>
+    </message>
+    <message>
+        <source>Device Connected</source>
+        <translation type="vanished">Oxymeter aangesloten</translation>
+    </message>
+    <message>
+        <source>Please make sure Oximeter device is in upload mode.</source>
+        <translation type="vanished">Zet de oxymeter op UPLOAD</translation>
+    </message>
+    <message>
+        <source>Oximetry live recording has been terminated due to timeout.</source>
+        <translation type="vanished">Oxymetrie live-opname is beëindigd vanwege time-out.</translation>
+    </message>
+    <message>
+        <source>&Start</source>
+        <translation type="vanished">&Start</translation>
+    </message>
+    <message>
+        <source>Current oximetry session still has unsaved data in it.</source>
+        <translation type="vanished">Er zijn nog niet opgeslagen oxymetrie-gegevens.</translation>
+    </message>
+    <message>
+        <source>Would you like to save it first?</source>
+        <translation type="vanished">Wil je die eerst opslaan?</translation>
+    </message>
+    <message>
+        <source>Save Session?</source>
+        <translation type="vanished">Sessie opslaan?</translation>
+    </message>
+    <message>
+        <source>Creating a new oximetry session will destroy the old one.
+Would you like to save it first?</source>
+        <translation type="vanished">Een nieuwe oxymetriesessie zal de oude wissen.
+Wilt u de oude eerst opslaan?</translation>
+    </message>
+    <message>
+        <source>Save</source>
+        <translation type="vanished">Opslaan</translation>
+    </message>
+    <message>
+        <source>Destroy It</source>
+        <translation type="vanished">Wissen!</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="vanished">Annuleren</translation>
+    </message>
+    <message>
+        <source>Please Wait</source>
+        <translation type="vanished">Even geduld</translation>
+    </message>
+    <message>
+        <source>Oximetry Error!
+
+Something is wrong with the device connection.</source>
+        <translation type="vanished">Oxymetrie fout!
+
+Er ging iets fout bij de aansluiting.</translation>
+    </message>
+    <message>
+        <source>&Stop</source>
+        <translation type="vanished">&Stop</translation>
+    </message>
+    <message>
+        <source>Oximeter Error
+
+The device has not responded.. Make sure it's switched on.</source>
+        <translation type="vanished">Oxymetrie fout!
+
+Het apparaat reageerde niet... staat het wel aan?</translation>
+    </message>
+    <message>
+        <source>Keep This Recording?</source>
+        <translation type="vanished">Deze gegevens bewaren?</translation>
+    </message>
+    <message>
+        <source>Would you like to save this oximetery session?</source>
+        <translation type="vanished">Wil je deze oxymetie sessie bewaren?</translation>
+    </message>
+    <message>
+        <source>Opening this oximetry file will destroy the current session.
+Would you like to keep it?</source>
+        <translation type="vanished">De huidige sessie gaat verloren als je dit bestand opent.
+Wil je hem bewaren?</translation>
+    </message>
+    <message>
+        <source>Select an oximetry file</source>
+        <translation type="vanished">Kies een oxymetrie bestand</translation>
+    </message>
+    <message>
+        <source>Oximetry Files (*.spo *.spoR)</source>
+        <translation type="vanished">Oxymetrie bestanden (*.spo, *.spoR)</translation>
+    </message>
+    <message>
+        <source>Couldn't open oximetry file "</source>
+        <translation type="vanished">Kon het oxymeter bestand niet openen "</translation>
+    </message>
+    <message>
+        <source>Opening this oximetry session will destroy the unsavedsession in the oximetry tab.
+Would you like to store it first?</source>
+        <translation type="vanished">Als je deze oxymetie sessie opent, gaat de niet opgeslagen sessie verloren.
+Wil je deze eerst opslaan?</translation>
+    </message>
+    <message>
+        <source>Ready</source>
+        <translation type="obsolete">Klaar</translation>
+    </message>
+    <message>
+        <source>Check Oximeter is Ready</source>
+        <translatorcomment>WJG: spelling</translatorcomment>
+        <translation type="vanished">Controleer of de oxymeter aan staat</translation>
+    </message>
+    <message>
+        <source>Oximeter Error
+
+The device did not respond.. Make sure it's switched on.</source>
+        <translatorcomment>WJG: ik vermoed een inconsistentie bij de naker van het programma (zie vertaling twee regels hierboven): de werkwoordtijden zijn verschillend, maar de bedoeling zal hetzelfde zijn.</translatorcomment>
+        <translation type="vanished">Oxymetriefout!
+
+Het apparaat reageerde niet... staat het wel aan?</translation>
+    </message>
+    <message>
+        <source>Please make sure your oximeter is switched on, and in the right mode to transmit data.</source>
+        <translation type="vanished">Controleer of de oxymeter aan staat en op gegevensoverdracht is ingesteld.</translation>
+    </message>
+    <message>
+        <source>Oximeter Error!</source>
+        <translation type="vanished">Oxymeterfout!</translation>
+    </message>
+</context>
+<context>
+    <name>PreferencesDialog</name>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="23"/>
+        <source>Preferences</source>
+        <translation>Instellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="58"/>
+        <source>&Import</source>
+        <translation>&Importeer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="79"/>
+        <source>Session Settings</source>
+        <translation>Sessie-instellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="102"/>
+        <source>Combine Close Sessions </source>
+        <translation>Combineer nabije sessies</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="112"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="197"/>
+        <source>Minutes</source>
+        <translation>Minuten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="132"/>
+        <source>Multiple sessions closer together than this value will be kept on the same day.
+</source>
+        <translation>Tijd tussen sessies die nog tot dezelfde dag gerekend moeten worden.
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="187"/>
+        <source>Ignore Short Sessions</source>
+        <translation>Negeer korte sessies</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="211"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kortere sessies worden niet weergegeven<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="252"/>
+        <source>Day Split Time</source>
+        <translation>Volgende dag start om </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="262"/>
+        <source>Sessions starting before this time will go to the previous calendar day.</source>
+        <translation>Sessies die voor dit tijdstip gestart werden, horen bij de vorige dag.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="282"/>
+        <source>Keep session data in memory to speed up revisiting days.</source>
+        <translation>Houd sessiegegevens in geheugen voor hogere snelheid.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="285"/>
+        <source>Cache Session Data (uses more system memory)</source>
+        <translation>Cache sessiegegevens (kost meer geheugen)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="395"/>
+        <source>Session Storage Options</source>
+        <translation>Opties voor sessie-opslag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="419"/>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+SleepyHead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translatorcomment>WJG: kleine spellingsdingetjes, o.a. de twee hoofdletters in SleepyHead; die Mark is zelf niet altijd consistent, maar het is dan ook geen linguïst
+AK: <grin></translatorcomment>
+        <translation>Dit zorgt voor een back-up van de SD-kaart voor ResMed-apparaten,
+
+ResMed apparaten verwijderen hoge resolutie-gegevens ouder dan 7 dagen,
+en grafiekgegevens die ouder zijn dan 30 dagen..
+
+SleepyHead kan een kopie van deze gegevens bewaren voor na een herinstallatie.
+(Sterk aanbevolen, tenzij je weinig schijfruimte hebt of niets om grafiekgegevens geeft)</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (only for ResMed so far, highly recommended)</source>
+        <translation type="vanished">Maak tijdens importeren een back-up van de SD-kaart (alleen nog voor ResMed, sterk aan te bevelen)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="435"/>
+        <source>This makes SleepyHead's data take around half as much space.
+But it makes import and day changing take longer.. 
+If you've got a new computer with a small solid state disk, this is a good option.</source>
+        <translatorcomment>WJG: iets te kort door de bocht in de eerste regel, want de opslag wordt niet langzamer (dat kan ook niet), maar de processen gaan trager
+AK: In SSD zit al een disk, dus niet nog eens schijf... En het is niet eens een schijf ;-))
+20/9 WJG: De facto heb je natuurlijk gelijk, alleen wordt er in de volksmond wel over een schijf gesproken.
+AK: Dank je! Je hebt gelijk...</translatorcomment>
+        <translation>De grootte van de opslag wordt gehalveerd,
+maar maakt het importeren en verwerken trager.
+Als je een nieuwe computer met SSD hebt, is dit een goede keuze.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="440"/>
+        <source>Compress Session Data (makes SleepyHead data smaller, but day changing slower.)</source>
+        <translation>Comprimeer sessiegegevens (minder opslagruimte, maar tragere verwerking).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="447"/>
+        <source>Compress ResMed (EDF) backups to save disk space.
+Backed up EDF files are stored in the .gz format, 
+which is common on Mac & Linux platforms.. 
+
+SleepyHead can import from this compressed backup directory natively.. 
+To use with ResScan will require the .gz files to be uncompressed first..</source>
+        <translation>Comprimeer ResMed (EDF) back-ups om schijfruimte te besparen.
+Back-ups van EDF bestanden worden opgeslagen in het gz-formaat,
+dat veel gebruikt wordt op Mac & Linux-systemen ..
+
+SleepyHead kan hier rechtstreeks uit importeren,
+maar voor ResScan moeten de .gz-bestanden eerst uitgepakt worden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="455"/>
+        <source>Compress SD Card Backups (slower first import, but makes backups smaller)</source>
+        <translation>Comprimeer SD-kaart back-ups (langzamere eerste import, maar minder opslagruimte nodig)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="467"/>
+        <source>The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes.</source>
+        <translation>De volgende opties hebben effect op de gebruikte schijfruimte en op de snelheid van importeren.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="477"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data.  </span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Wijzigen van SD-backup compressie comprimeert de back-upgegevens niet automatisch opnieuw.  </span></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="508"/>
+        <source>&CPAP</source>
+        <translation>&Masker en apparaat</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="535"/>
+        <source>CPAP Mask Information</source>
+        <translation>Informatie over het  masker</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="562"/>
+        <source>Mask Type</source>
+        <translation>Soort masker</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="569"/>
+        <source>Generic mask type. Select the one that's closest to your mask.</source>
+        <translation>Algemeen maskertype. Kies wat het beste overeenkomt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="587"/>
+        <source>Description</source>
+        <translation>Beschrijving</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="594"/>
+        <source>The name of your mask, or at least the name you call it.</source>
+        <translation>De naam van het masker, of zoals je het noemt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="607"/>
+        <source>Method of unintentional leaks calculation if not provided by your machine.
+Note: Statistical Model is experimental.</source>
+        <translatorcomment>WJG: spreken we de gebruiker met 'u' of 'je' aan? Vaak tutoyeer je, wat gezien de luchtige toon van de teksten ook mijn voorkeur heeft. Denk dat de hele vertaling nog een keer hierop nagelopen moet worden.</translatorcomment>
+        <translation>Wijze van berekening van maskerlekkage, als het apparaat dat niet zelf doet.
+Opmerking: Het statistisch model is experimenteel.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="612"/>
+        <source>Mask Profile</source>
+        <translation>Masker lekprofiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="617"/>
+        <source>Statistical Model</source>
+        <translation>Statistisch model</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="631"/>
+        <source>Leak calcs</source>
+        <translatorcomment>Lekkage?
+20/9 WJG: Nergens anders wordt 'lekkage' gebruikt - al zou dat wel een beter woord zijn</translatorcomment>
+        <translation>Berekening lekkage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="644"/>
+        <source>Started Using</source>
+        <translation>Start gebruik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="657"/>
+        <source>The date you started using this mask</source>
+        <translation>De datum waarop je het masker in gebruik nam</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="673"/>
+        <source>Leak Profile</source>
+        <translation>Masker lekprofiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="687"/>
+        <source>Pressure</source>
+        <translation>Druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="692"/>
+        <source>Leak</source>
+        <translation>Lekkage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Let op: </span>Het onderstaande werkt nog niet...</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1153"/>
+        <source>Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA)</source>
+        <translatorcomment>WJG: is voor RDI geen Nederlandse vertaling? Is natuurlijk het probleem met veel van die afkortingen.
+AK: Mss later?</translatorcomment>
+        <translation>Toont de "Respiratory Disturbance Index (RDI)" ipv de "Apneu Hypopneu Index (AHI)" (RDI = AHI + RERA)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1156"/>
+        <source>Use RDI instead of AHI (PRS1 only)</source>
+        <translation>Gebruik RDI in plaats van AHI (alleen bij PRS1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1069"/>
+        <source>Don't show any compliance information</source>
+        <translatorcomment>WJG: lastige. Ik denk dat het hier gaat om het al dan niet opvolgen van het gebruik. Gaat hier om het aantal uren dat je het masker per nacht gebruikt. Compliance is naleving in de zin van wetten, maar voor ander gebruik zeg je wat anders. 'Opvolgen' is er een voor, maar ik vind dat het allemaal niet zo lekker past. Kortom, hier ben ik niet helemaal uit.
+AK: Compliantie is al gebruikelijk,therapietrouw is dè uitdrukking</translatorcomment>
+        <translation>Toon  informatie over therapietrouw</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON)</source>
+        <translation type="vanished">Maak backups van de SD kaart gedurende het importeren (Belangrijk voor ResMed en F&P Icon)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1072"/>
+        <source>Show Compliance</source>
+        <translatorcomment>AK: Het gaat om de juridische term...
+20/9 WJG: Dat lijkt me wat sterk... Er zijn toch geen wettelijke sancties verbonden aan het al dan niet gebruiken van je masker?
+AK: Zie hier boven</translatorcomment>
+        <translation>Laat therapietrouw zien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1105"/>
+        <source>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</source>
+        <translatorcomment>WJG: bij gebrek aan beter, maar 'niet-compliant' en 'compliant' zijn geen termen die je in Van Dale tegenkomt
+Als ze het maar begrijpen, klachten mogen </translatorcomment>
+        <translation>Beschouw dagen met minder gebruik als "niet-therapietrouw". 4 uur wordt meestal als "therapietrouw" beschouwd .</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1108"/>
+        <source> hours</source>
+        <translation> uren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1130"/>
+        <source>as over</source>
+        <translation>indien meer dan </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1137"/>
+        <source>of usage per night</source>
+        <translation>gebruik per nacht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="728"/>
+        <source>Enable/disable experimental event flagging enhancements. 
+It allows detecting borderline events, and some the machine missed.
+This option must be enabled before import, otherwise a purge is required.</source>
+        <translation>Zet experimentele incidentmarkeringen aan of uit.
+Dit detecteert incidenten 'op het randje' en door het apparaat gemiste incidenten.
+Deze optie moet worden aangezet vóór het importeren, anders eerst alles wissen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="733"/>
+        <source>Custom User Event Flagging</source>
+        <translatorcomment>AK: Het is een keuze van de gebruiker...
+20/9 WJG: Oké, maar dan moet het streepje weg.</translatorcomment>
+        <translation>Aangepaste gebruikers markering</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="797"/>
+        <source>Flow Restriction</source>
+        <translatorcomment>AK: Inderdaad, afsluiting is 0%, hier kan je kiezen,
+Debietreductie
+Debietbeperking
+Stroombeperking
+Debietbegrenzing
+Doorstroombeperking</translatorcomment>
+        <translation>Debietreductie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="843"/>
+        <source>Percentage of restriction in airflow from the median value. 
+A value of 20% works well for detecting apneas. </source>
+        <translation>Percentage van de vermindering van de luchtstroom ten opzichte van de mediane waarde.
+Een waarde van 20% werkt goed voor het opsporen van apneus.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="760"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="847"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1432"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1487"/>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="875"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Aangepast markeren is een experimentele werkwijze voor het detecteren van incidenten die zijn gemist door het apparaat. Ze worden <span style=" text-decoration: underline;">niet </ span> opgenomen in de AHI.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="821"/>
+        <source>Duration of airflow restriction</source>
+        <translatorcomment>20/9 WJG: Vanaf hier weer verder gegaan</translatorcomment>
+        <translation>Duur van de vermindering van de luchtstroom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="804"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="824"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1377"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1406"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1477"/>
+        <source>s</source>
+        <translation> s</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="814"/>
+        <source>Event Duration</source>
+        <translation>Tijdsduur incident</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="857"/>
+        <source>Allow duplicates near machine events.</source>
+        <translatorcomment>20/9 WJG: Maar ik kan deze tekst niet terugvinden op het tabblad CPAP van Preferences
+AK: inderdaad, vreemd</translatorcomment>
+        <translation>Sta duplicaten toe vlak naast apparaat-incidenten.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="947"/>
+        <source>AHI/Hour Graph Settings</source>
+        <translation>Instelling grafiek AHI/uur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="983"/>
+        <source>Window</source>
+        <translatorcomment>20/9 WJG: past beter in het schermpje en is ook wel duidelijk. Ik kan deze instelling overigens niet wijzigen</translatorcomment>
+        <translation>Tijdsduur </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="990"/>
+        <source>Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.</source>
+        <translation>Regelt de hoeveelheid gegevens die worden beschouwd voor elk punt in de grafiek AHI/uur.
+Staat standaard op 60 minuten. Sterk aanbevolen het op deze waarde te laten staan,
+anders is het geen AHI/uur meer.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="994"/>
+        <source> minutes</source>
+        <translation> minuten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1010"/>
+        <source>Reset the counter to zero at beginning of each (time) window.</source>
+        <translation>Zet de teller op nul aan het begin van elke periode.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1013"/>
+        <source>Zero Reset</source>
+        <translation>Telkens op nul zetten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1029"/>
+        <source>CPAP Clock Drift</source>
+        <translation>Correctie afwijking klok CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="318"/>
+        <source>Do not import sessions older than:</source>
+        <translation>Importeer geen sessies ouder dan:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="325"/>
+        <source>Sessions older than this date will not be imported</source>
+        <translation>Sessies ouder dan deze datum worden niet geimporteerd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="351"/>
+        <source>dd MMMM yyyy</source>
+        <translation>dd MMMM jjjj</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1036"/>
+        <source>Don't touch this unless you know your CPAP clock is out.
+Try to sync it to your PC's clock (which should be synced to a timeserver)</source>
+        <translatorcomment>20/9 WJG: beslissing nemen over aanspreekpersoon en dat consistent doorvoeren</translatorcomment>
+        <translation>Wijzig dit niet, tenzij je zeker weet dat de klok van je CPAP fout staat.
+Probeer hem eerst te synchroniseren met de klok van de PC (niet mogelijk voor PRS1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1040"/>
+        <source> seconds</source>
+        <translation> seconden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="770"/>
+        <source>Show in Event Breakdown Piechart</source>
+        <translation>Laat zien in de incidenten grafiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="777"/>
+        <source>#1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="784"/>
+        <source>#2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="905"/>
+        <source>This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.</source>
+        <translation>Deze experimentele optie probeert de incident-markeringen te gebruiken om een betere correlatie te kunnen zien.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="908"/>
+        <source>Resync Machine Detected Events (Experimental)</source>
+        <translation>Synchroniseer de door het apparaat gedetecteerde incidenten opnieuw (experimenteel)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="934"/>
+        <source>User definable threshold considered large leak</source>
+        <translation>Instelbare grens voor 'overmatige' lekkage (meestal 24 l/min)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="937"/>
+        <source> L/min</source>
+        <translation> l/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="924"/>
+        <source>Whether to show the leak redline in the leak graph</source>
+        <translation>Of je de rode lijn in de lekgrafiek wilt zien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="927"/>
+        <source>Show Leak Redline</source>
+        <translation>Maak leklimiet zichtbaar</translation>
+    </message>
+    <message>
+        <source>&Events</source>
+        <translatorcomment>Deze tab zie ik niet...</translatorcomment>
+        <translation type="vanished">&Incidenten</translation>
+    </message>
+    <message>
+        <source>Not entirely sure if this will get to live or not..</source>
+        <translatorcomment>20/9 WJG: Mooi compact</translatorcomment>
+        <translation type="vanished">Onzeker of dit ooit gaat werken..</translation>
+    </message>
+    <message>
+        <source>Show</source>
+        <translation type="vanished">Tonen</translation>
+    </message>
+    <message>
+        <source>Colour</source>
+        <translation type="vanished">Kleur</translation>
+    </message>
+    <message>
+        <source>Event</source>
+        <translatorcomment>Staat in: Instellingen-Grafieken</translatorcomment>
+        <translation type="vanished">Incident</translation>
+    </message>
+    <message>
+        <source>ID</source>
+        <translation type="vanished">ID</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation type="vanished">Grafieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1189"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1261"/>
+        <source>Search</source>
+        <translation>Zoeken</translation>
+    </message>
+    <message>
+        <source>Filters the graph list. Simply start typing the name of the graph your looking for.</source>
+        <translation type="vanished">Filtert de grafiek lijst. Gewoon beginnen met het typen van de naam van de grafiek die je zoekt.</translation>
+    </message>
+    <message>
+        <source>&Defaults</source>
+        <translation type="vanished">&Standaardinstellingen</translation>
+    </message>
+    <message>
+        <source>Double click on the (Y-axis) min/max values to edit them</source>
+        <translation type="vanished">Dubbelklik op de min/max waarden om de Y-as te wijzigen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1310"/>
+        <source>&Oximetry</source>
+        <translation>&Oxymetrie</translation>
+    </message>
+    <message>
+        <source>Use Oximetry</source>
+        <translation type="vanished">Gebruik oxymeter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1537"/>
+        <source>Type</source>
+        <translation>Type</translation>
+    </message>
+    <message>
+        <source>Contec CMS50</source>
+        <translation type="vanished">Contec CMS50</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2361"/>
+        <source>Line Thickness</source>
+        <translation>Lijndikte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2373"/>
+        <source>The pixel thickness of line plots</source>
+        <translation>Pixelgrootte van lijngrafieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2466"/>
+        <source>Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</source>
+        <translation>"Pixmap caching" is een grafische versnellingstechniek. Kan problemen geven bij sommige teksten in de grafische omgeving.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2476"/>
+        <source><html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html></source>
+        <translation><html><head/><body><p>Deze instellingen zijn tijdelijk uitgeschakeld. Ze komen later terug.</p></body></html></translation>
+    </message>
+    <message>
+        <source>Overpriced ResMed S9 Oximeter</source>
+        <translation type="obsolete">(Te dure) ResMed S9 oxymeter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1550"/>
+        <source>Tries to forces the oximetry data to link with CPAP when possible.</source>
+        <translation>Dwingt de oxymetergegevens te koppelen met de CPAP, indien mogelijk.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1553"/>
+        <source>Link Oximetry and CPAP graphs</source>
+        <translation>Koppel oxymeter met andere grafieken</translation>
+    </message>
+    <message>
+        <source>Flag changes in oximetry stats</source>
+        <translation type="vanished">Markeer veranderingen in oxymeterstatistieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1367"/>
+        <source>SPO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1429"/>
+        <source>Percentage drop in oxygen saturation</source>
+        <translatorcomment>20/9 WJG: Zuurstof wellicht niet echt nodig?</translatorcomment>
+        <translation>Percentage daling van zuurstofsaturatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1422"/>
+        <source>Pulse</source>
+        <translatorcomment>209/ WJG: Als 't past</translatorcomment>
+        <translation>Polsslag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1387"/>
+        <source>Sudden change in Pulse Rate of at least this amount</source>
+        <translation>Plotselinge verandering in polsslag van tenminste deze hoeveelheid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1390"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1514"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1521"/>
+        <source> bpm</source>
+        <translatorcomment>20/9 WJG: slagen per minuut</translatorcomment>
+        <translation> per minuut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1374"/>
+        <source>Minimum duration of drop in oxygen saturation</source>
+        <translation>Minimale duur van de verlaging</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1403"/>
+        <source>Minimum duration of pulse change event.</source>
+        <translation>Minimale duur van de verandering van de polsslag.</translation>
+    </message>
+    <message>
+        <source>Discard chunks under</source>
+        <translation type="vanished">Verwaarloos als korter dan </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1474"/>
+        <source>Small chunks of oximetry data under this amount will be discarded.</source>
+        <translation>Kortdurende oxymetrie-incidenten worden verwaarloosd.</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does <span style=" font-weight:600; text-decoration: underline;">not</span> have the correct timestamp needed to sync.</p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you start your Oximeters recording mode at <span style=" font-style:italic;">exactly </span>the same time you start your CPAP machine, you can now also achieve sync. </p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</p></body></html></source>
+        <translatorcomment>20/9 WJG: Iets met koppeltekens gedaan en u in je veranderd</translatorcomment>
+        <translation type="obsolete"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Synchronisatie van oximetrie- en CPAP-gegevens</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">De geïmporteerde gegevens van de CMS50 uit SpO2Review (dus uit .spoR bestanden) zowel als de seriële import methode hebben <span style=" font-weight:600; text-decoration: underline;">niet</span> de correcte tijdsaanduiding die voor synchronisatie nodig is.</p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Live view-modus (met een seriële kabel) is een manier om een ​​nauwkeurige synchronisatie op CMS50 oxymeters te bereiken, maar houdt geen rekening met de verlopende CPAP klok.</p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als de opname van de oxymeter <span style=" font-style:italic;"> precies </span> tegelijk met de CPAP wordt gestart,is er ook synchronisatie bereikt. </p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Het proces van  seriële import neemt de starttijd van de eerste CPAP sessie van de afgelopen nacht. (Vergeet niet om eerst de CPAP gegevens te importeren!)</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1649"/>
+        <source>&General</source>
+        <translation>&Algemeen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1798"/>
+        <source>General Settings</source>
+        <translation>Algemene instellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1850"/>
+        <source>Daily view navigation buttons will skip over days without data records</source>
+        <translation>De navigatieknoppen slaan de dagen zonder gegevens over</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1853"/>
+        <source>Skip over Empty Days</source>
+        <translation>Sla lege dagen over</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1839"/>
+        <source>Allow use of multiple CPU cores where available to improve performance. 
+Mainly affects the importer.</source>
+        <translation>Gebruik meerdere CPU-cores voor betere prestaties.
+Werkt vooral bij importeren.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1843"/>
+        <source>Enable Multithreading</source>
+        <translation>Multithreading inschakelen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1829"/>
+        <source>Bypass the login screen and load the most recent User Profile</source>
+        <translation>Sla het inlogscherm over en laad het meest recente gebruikersprofiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1832"/>
+        <source>Skip Login Screen</source>
+        <translation>Sla login-scherm over</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1679"/>
+        <source>Changes to the following settings needs a restart, but not a recalc.</source>
+        <translation>Wijzigingen in de volgende instellingen werken pas na een herstart, maar er is geen herberekening nodig.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="361"/>
+        <source>Summary only data is more accurate for ResMed users if this is left on.</source>
+        <translation>Voor ResMed gebruikers kan dit beter aan blijven staan.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="364"/>
+        <source>Don't Split Summary Days</source>
+        <translation>Dagen met uitsluitend overzichtgegeens niet splitsen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="428"/>
+        <source>Create SD Card Backups during Import (Turn this off at your own peril!)</source>
+        <translation>Maak tijdens importeren een backup van de SD-kaart (Uitschakelen op eigen risico!)</translation>
+    </message>
+    <message>
+        <source>C&hannels</source>
+        <translation type="vanished">&Kanalen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1212"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1284"/>
+        <source>Reset &Defaults</source>
+        <translation>&Standaardinstellingen herstellen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1225"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1297"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></source>
+        <translation><html><head/><body><p><span style=" font-weight:600;">Waarschuwing: </span>Hoewel het  mogelijk is, betekent dit nog niet dat het een goede keuze is </p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1331"/>
+        <source>Oximetery Settings</source>
+        <translation>Oxymetrie instellingen</translation>
+    </message>
+    <message>
+        <source>Contec CMS50D+</source>
+        <translation type="vanished">Contec CMS50D+</translation>
+    </message>
+    <message>
+        <source>Contec CMS50E/F</source>
+        <translation type="vanished">Contec CMS50E/F</translation>
+    </message>
+    <message>
+        <source>Contec CMS50F v3.7</source>
+        <translation type="vanished">Contec CMS50F v3.7</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1682"/>
+        <source>Preferred Calculation Methods</source>
+        <translation>Voorkeur berekeningsmethoden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1709"/>
+        <source>Middle Calculations</source>
+        <translation>Gemiddelden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1716"/>
+        <source>Upper Percentile</source>
+        <translation>Bovenste percentiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1723"/>
+        <source>For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.</source>
+        <translatorcomment>20/9 WJG: koppelteken en extra woorje</translatorcomment>
+        <translation>Voor consistentie moeten ResMed-gebruikers hier 95% instellen,
+want dit is de enige waarde die beschikbaar is op de dagen met alleen een samenvatting.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1737"/>
+        <source>Median is recommended for ResMed users.</source>
+        <translation>Mediaan wordt aanbevolen voor ResMed-gebruikers.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1741"/>
+        <source>Median</source>
+        <translation>Mediaan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1746"/>
+        <source>Weighted Average</source>
+        <translation>Gewogen gemiddelde</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1751"/>
+        <source>Normal Average</source>
+        <translation>Normaal gemiddelde</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1771"/>
+        <source>ResMed users probably should use 99th Percentile for visual consistency.</source>
+        <translatorcomment>20/9 WJG: koppelteken en Van Dale zegt 'het' tegen percentiel</translatorcomment>
+        <translation>ResMed-gebruikers moeten waarschijnlijk het 99e percentiel gebruiken voor visuele consistentie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1775"/>
+        <source>True Maximum</source>
+        <translation>Ware maximum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1780"/>
+        <source>99% Percentile</source>
+        <translation>99% percentiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1788"/>
+        <source>Maximum Calcs</source>
+        <translation>Berekening maximum</translation>
+    </message>
+    <message>
+        <source>Import Locations</source>
+        <translatorcomment>20/9 WJG: spelling</translatorcomment>
+        <translation type="vanished">Importlocaties</translation>
+    </message>
+    <message>
+        <source>Add</source>
+        <translation type="vanished">Toevoegen</translation>
+    </message>
+    <message>
+        <source>Remove</source>
+        <translation type="vanished">Verwijderen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1892"/>
+        <source>Automatically Check For Updates</source>
+        <translation>Automatisch controleren op updates</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1909"/>
+        <source>Check for new version every</source>
+        <translation>Controleer elke</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1916"/>
+        <source>Sourceforge hosts this project for free.. Please be considerate of their resources..</source>
+        <translation>Sourceforge hosts dit project gratis .. Maak er zorgvuldig gebruik van..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1932"/>
+        <source>days.</source>
+        <translation>dagen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1997"/>
+        <source>&Check for Updates now</source>
+        <translation>Nu &controleren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2020"/>
+        <source>Last Checked For Updates: </source>
+        <translation>Laatste controle:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2033"/>
+        <source>TextLabel</source>
+        <translation>Tekstlabel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2055"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></source>
+        <translatorcomment>20/9 WJG: aanpsreekvorm</translatorcomment>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Als je geïnteresseerd bent in het helpen testen van nieuwe features en bugfixes, klik hier.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Maar wees gewaarschuwd: dit zal soms vastlopers betekenen!!</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2064"/>
+        <source>I want to try experimental and test builds (Advanced users only please.)</source>
+        <translation>Ik wil experimentele en testupdates proberen (s.v.p. alleen gevorderde gebruikers!)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2088"/>
+        <source>&Appearance</source>
+        <translation>&Uiterlijk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2120"/>
+        <source>Graph Settings</source>
+        <translation>Grafiekinstellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2127"/>
+        <source>Bar Tops</source>
+        <translation>Staafgrafieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2132"/>
+        <source>Line Chart</source>
+        <translation>Lijngrafieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2140"/>
+        <source>Overview Linecharts</source>
+        <translation>Overzicht lijngrafieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2165"/>
+        <source><html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html></source>
+        <translation>Dit maakt scrollen makkelijker bij een tablet, 50 ms wordt aanbevolen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2193"/>
+        <source>milliseconds</source>
+        <translation>milliseconden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2259"/>
+        <source>Scroll Dampening</source>
+        <translation>Scrollen dempen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2351"/>
+        <source>Overlay Flags</source>
+        <translation>Markeringen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2317"/>
+        <source>The visual method of displaying waveform overlay flags.
+</source>
+        <translation>De visuele methode voor het tonen van markeringen in golfvormgrafieken.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2322"/>
+        <source>Standard Bars</source>
+        <translation>Standaardbalken</translation>
+    </message>
+    <message>
+        <source>Top & Bottom Markers</source>
+        <translation type="vanished">Onder en boven</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2335"/>
+        <source>Graph Height</source>
+        <translation>Grafiekhoogte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2285"/>
+        <source>Default display height of graphs in pixels</source>
+        <translation>Standaardhoogte grafieken in pixels</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2213"/>
+        <source>How long you want the tooltips to stay visible.</source>
+        <translation>Hoe lang moeten de tooltips zichtbaar blijven?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1629"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style= [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">t [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Synchroniseer oxymetrie en CPAP gegevens</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">De CMS50 gegevens, geimporteerd uit SpO2Review (uit .spoR bestanden) en de seriele import methode hebben </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">niet</span& [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live weergave (met een seriele/USB kabel) is een manier om een accurate synchronisatie met CMS50 oxymeters te krijgen, maar helpt ook niet tegen het verlopen van de klok van de CPAP.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Als je de opname van je oxymeter op </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">precies </span><span style=" font-family:'Sans'; font-size:10pt;">hetzelfde m [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Het proces van import neemt de starttijd van de eerste CPAP sessie van de vorige nacht. (Vergeet niet om eerst je CPAP gegevens te importeren!)</span></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1166"/>
+        <source>Events</source>
+        <translation>Incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1355"/>
+        <source>Flag rapid changes in oximetry stats</source>
+        <translation>Markeer snelle veranderingen in de oxymeter statistieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1448"/>
+        <source>Other oximetry options</source>
+        <translation>Andere oxymeter opties</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1454"/>
+        <source>Flag SPO2 Desaturations Below</source>
+        <translation>Markeer SpO2 desaturaties onder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1464"/>
+        <source>Discard segments under</source>
+        <translation>Verwerp segmenten onder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1494"/>
+        <source>Flag Pulse Rate Above</source>
+        <translation>Markeer polsslag boven</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1504"/>
+        <source>Flag Pulse Rate Below</source>
+        <translation>Markeer polsslag onder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1574"/>
+        <source>Contec CMS50D+/E/F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1579"/>
+        <source>Contec CMS50F v3.7+</source>
+        <translation type="unfinished">Contec CMS50F v3.7+ {50F?}</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1584"/>
+        <source>ChoiceMMed MD300W1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1589"/>
+        <source>ResMed S9 Oximeter Module</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1610"/>
+        <source>If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time.</source>
+        <translation>Als je oxymeter het ondersteunt, zal SleepyHead de klok gelijkzetten met de computer.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1613"/>
+        <source>Update Oximeter Clock during import</source>
+        <translation>Zet de klok van de oxymeter gelijk gedurende het importeren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1819"/>
+        <source>Show flags for machine detected events that haven't been identified yet.</source>
+        <translation>Zet de markeringen voor de zelf gekozen incident-vlaggen aan.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1822"/>
+        <source>Show Unknown Flags</source>
+        <translation>Toon onbekende incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1860"/>
+        <source>Import without nagging</source>
+        <translation>Importeer zonder vragen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2269"/>
+        <source>Tooltip Timeout</source>
+        <translation>Tooltip timeout</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2304"/>
+        <source>Graph Tooltips</source>
+        <translation>Grafiek tekstballonnen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2327"/>
+        <source>Top Markers</source>
+        <translation>Top markeringen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2422"/>
+        <source>Other Visual Settings</source>
+        <translation>Overige visuele instellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2428"/>
+        <source>Anti-Aliasing applies smoothing to graph plots.. 
+Certain plots look more attractive with this on. 
+This also affects printed reports.
+
+Try it and see if you like it.</source>
+        <translation>Anti-aliasing strijkt de grafieken glad.
+Sommige grafieken zien er dan mooier uit.
+Dit is ook van invloed op afgedrukte rapporten.
+
+Probeer het en kijk of je het leuk vindt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2435"/>
+        <source>Use Anti-Aliasing</source>
+        <translation>Gebruik Anti-aliasing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2442"/>
+        <source>Makes certain plots look more "square waved".</source>
+        <translation>Zorgt ervoor dat sommige grafieken  er hoekiger uitzien.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2445"/>
+        <source>Square Wave Plots</source>
+        <translation>Hoekige golfgrafieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2452"/>
+        <source>Allows graphs to be "screenshotted" for display purposes.
+The Event Breakdown PIE chart uses this method, as does
+the printing code.
+Unfortunately some older computers/versions of Qt can cause
+this application to be unstable with this feature enabled.</source>
+        <translatorcomment>20/9 WJG: ietsje duidelijker en past beter in het hulptekstje</translatorcomment>
+        <translation>Toont grafieken als "screenshots".
+Het cirkeldiagram van de incidentgrafiek maakt hiervan gebruik,
+net als de afdrukcode.
+Helaas veroorzaken sommige oudere computers en versies van Qt
+dat hierdoor deze toepassing instabiel wordt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2459"/>
+        <source>Show event breakdown pie chart</source>
+        <translation>Toon cirkeldiagram</translation>
+    </message>
+    <message>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</span></p></body></html></source>
+        <translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:8pt;">Pixmap caching is een graphische versnellingstechniek. Het kan echter wel problemen opleveren met de tekst bij de grafieken, afhankelijk van het computerplatform.</span></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2469"/>
+        <source>Use Pixmap Caching</source>
+        <translation>Gebruik Pixmap Caching</translation>
+    </message>
+    <message>
+        <source>Turn on/off the spinning "context" cube.
+It really doesn't use that much resources.. :)</source>
+        <translation type="vanished">Zet de ronddraaiende kubus aan.
+Gebruikt echt niet zoveel geheugen... :)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2479"/>
+        <source>Animations && Fancy Stuff</source>
+        <translation>Animaties en grappige dingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2486"/>
+        <source>Whether to allow changing yAxis scales by double clicking on yAxis labels</source>
+        <translation>Toestaan om de automatische y-as instelling te wijzigen door dubbelklikken op een label</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2489"/>
+        <source>Allow YAxis Scaling</source>
+        <translation>Sta automatische y-as instelling toe</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2508"/>
+        <source>Application Fonts</source>
+        <translation>Tekstinstellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2543"/>
+        <source>Font</source>
+        <translation>Lettertype</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2562"/>
+        <source>Size</source>
+        <translation>Grootte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2581"/>
+        <source>Bold  </source>
+        <translation>Vet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2603"/>
+        <source>Italic</source>
+        <translation>Cursief</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2616"/>
+        <source>Application</source>
+        <translation>Toepassing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2680"/>
+        <source>Graph Text</source>
+        <translation>Grafiektekst</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2741"/>
+        <source>Graph Titles</source>
+        <translation>Gafiektitels</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2802"/>
+        <source>Big  Text</source>
+        <translation>Grote tekst</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2863"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="410"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="530"/>
+        <source>Details</source>
+        <translation>Details</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2920"/>
+        <source>&Cancel</source>
+        <translation>&Annuleren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2927"/>
+        <source>&Ok</source>
+        <translation>&OK</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="68"/>
+        <source>Nasal Pillows</source>
+        <translation>Neuskussens</translation>
+    </message>
+    <message>
+        <source>Span Events</source>
+        <translation type="vanished">Gebeurtenissen binnen het gekozen bereik</translation>
+    </message>
+    <message>
+        <source>Flags</source>
+        <translation type="vanished">Markeringen</translation>
+    </message>
+    <message>
+        <source>Minor Flags</source>
+        <translation type="vanished">Geringe markeringen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1238"/>
+        <source>Waveforms</source>
+        <translation>Golfvormgrafiek</translation>
+    </message>
+    <message>
+        <source>Data Channels</source>
+        <translation type="vanished">Gegevenskanalen</translation>
+    </message>
+    <message>
+        <source>Settings Channels</source>
+        <translation type="vanished">Instellingskanalen</translation>
+    </message>
+    <message>
+        <source>Unknown Channels</source>
+        <translation type="vanished">Onbekende kanalen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="406"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="525"/>
+        <source>Name</source>
+        <translation>Naam</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="407"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="526"/>
+        <source>Color</source>
+        <translation>Kleur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="409"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="529"/>
+        <source>Label</source>
+        <translation>Label</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="709"/>
+        <source>Data Reindex Required</source>
+        <translation>Gegevens opnieuw indexeren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="710"/>
+        <source>A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.
+
+Are you sure you want to make these changes?</source>
+        <translation>Herindexering van de gegevens is nodig. Dit kan een paar minuten duren.
+
+Weet je zeker dat je deze wijzigingen wilt doorvoeren?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="716"/>
+        <source>Restart Required</source>
+        <translation>Herstart vereist</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="717"/>
+        <source>One or more of the changes you have made will require this application to be restarted,
+in order for these changes to come into effect.
+
+Would you like do this now?</source>
+        <translation>Een of meer wijzigingen vereisen dat SleepyHead opnieuw start, opdat deze veranderingen in werking treden.
+
+Wil je dit nu doen?</translation>
+    </message>
+    <message>
+        <source>Add this Location to the Import List</source>
+        <translation type="vanished">Voeg deze locatie toe aan de importlijst</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="61"/>
+        <source>Flag</source>
+        <translation>Markering</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="62"/>
+        <source>Minor Flag</source>
+        <translation>Kleine vlag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="63"/>
+        <source>Span</source>
+        <translation>Bereik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="64"/>
+        <source>Always Minor</source>
+        <translation>Altijd klein</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="408"/>
+        <source>Flag Type</source>
+        <translation>Soort markering</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="425"/>
+        <source>CPAP Events</source>
+        <translation>CPAP incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="426"/>
+        <source>Oximeter Events</source>
+        <translation>Oxymeter incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="427"/>
+        <source>Positional Events</source>
+        <translation>Positie incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="428"/>
+        <source>Sleep Stage Events</source>
+        <translation>Slaapfase incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="429"/>
+        <source>Unknown Events</source>
+        <translation>Onbekende incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="468"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="589"/>
+        <source>Double click to change the descriptive name this channel.</source>
+        <translation>Dubbelklik om de naam van dit kanaal te wijzigen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="476"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="596"/>
+        <source>Double click to change the default color for this channel plot/flag/data.</source>
+        <translation>Dubbelklik om de kleur te wijzigen van dit kanaal (grafiek/markering/gegevens).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="484"/>
+        <source>Here you can change the type of flag shown for this event</source>
+        <translation>Hier kun je het soort markering van dit incident wijzigen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="489"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="612"/>
+        <source>This is the short-form label to indicate this channel on screen.</source>
+        <translation>Dit is het beknopte label om dit kanaal op het scherm te tonen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="495"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="618"/>
+        <source>This is a description of what this channel does.</source>
+        <translation>Dit is de beschrijving van wat dit kanaal doet.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="527"/>
+        <source>Lower</source>
+        <translation>Onderste</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="528"/>
+        <source>Upper</source>
+        <translation>Bovenste</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="546"/>
+        <source>CPAP Waveforms</source>
+        <translation>CPAP golfgrafiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="547"/>
+        <source>Oximeter Waveforms</source>
+        <translation>Oxymeter grafiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="548"/>
+        <source>Positional Waveforms</source>
+        <translation>Positie grafiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="549"/>
+        <source>Sleep Stage Waveforms</source>
+        <translation>Slaapfase grafiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="602"/>
+        <source>Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation>Hier kun je de <b>onderste</b> drempel instellen van enkele berekeningen aan de %1 grafiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="607"/>
+        <source>Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation>Hier kun je de <b>bovenste</b> drempel instellen van enkele berekeningen aan de %1 grafiek</translation>
+    </message>
+    <message>
+        <source>Daily Graphs</source>
+        <translation type="vanished">Dagelijkse grafieken</translation>
+    </message>
+    <message>
+        <source>Overview Graphs</source>
+        <translation type="vanished">Overzichtgrafieken</translation>
+    </message>
+    <message>
+        <source>Graph</source>
+        <translation type="vanished">Grafiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1095"/>
+        <source>This may not be a good idea</source>
+        <translation>Dit lijkt me niet zo'n goed idee</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1096"/>
+        <source>ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).</source>
+        <translation>ResMed S9 apparaten wissen bepaalde gegevens van je SD kaart als ze ouder zijn dan 7 en 30 dagen (afhankelijk van de resolutie).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1097"/>
+        <source>If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.</source>
+        <translation>Als je ooit gegevens opnieuw moet inlezen (in SleepyHead of in ResScan), krijg je deze gegevens niet terug.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1098"/>
+        <source>If you need to conserve disk space, please remember to carry out manual backups.</source>
+        <translation>Als je zuinig moet zijn met schijfruimte, vergeet dan niet om zelf backups te maken.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1099"/>
+        <source>Are you sure you want to disable these backups?</source>
+        <translation>Weet je zeker dat je deze automatische backups wilt uitschakelen?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1141"/>
+        <source>Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.</source>
+        <translation>Het is geen goed idee om da automatische backup-functie uit te schakelen, SleepyHead heeft deze nodig voor het eventuele herstellen van de database.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1142"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation>Weet je zeker dat je dit wilt?</translation>
+    </message>
+    <message>
+        <source>Min</source>
+        <translation type="obsolete">Min.</translation>
+    </message>
+    <message>
+        <source>Max</source>
+        <translation type="obsolete">Max.</translation>
+    </message>
+    <message>
+        <source>N/A</source>
+        <translation type="vanished">nvt</translation>
+    </message>
+    <message>
+        <source>Oximetry Graphs</source>
+        <translation type="vanished">Oxymetriegrafieken</translation>
+    </message>
+    <message>
+        <source>Confirmation</source>
+        <translation type="vanished">Bevestiging</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to reset your graph preferences to the defaults?</source>
+        <translation type="vanished">Weet je zeker dat je de grafieken opnieuw wilt instellen op standaardwaarden?</translation>
+    </message>
+</context>
+<context>
+    <name>ProfileSelect</name>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="14"/>
+        <source>Select Profile</source>
+        <translation>Kies profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="115"/>
+        <source>Search:</source>
+        <translation>Zoeken:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="188"/>
+        <source>Start with the selected user profile.</source>
+        <translation>Start met het geselecteerde gebruikersprofiel.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="212"/>
+        <source>Create a new user profile.</source>
+        <translation>Maak een nieuw gebruikersprofiel.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="232"/>
+        <source>Choose a different SleepyHead data folder.</source>
+        <translation>Kies een andere map met SleepyHeadData.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="238"/>
+        <source>&Different Folder</source>
+        <translation>&Andere map</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="271"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="284"/>
+        <source>[version]</source>
+        <translation>[versie]</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="307"/>
+        <source>Click here if you didn't want to start SleepyHead.</source>
+        <translation>Klik hier als je SleepyHead niet wilt starten.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="310"/>
+        <source>&Quit</source>
+        <translation>&Afsluiten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="367"/>
+        <source>Folder:</source>
+        <translation>Map:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="380"/>
+        <source>The current location of SleepyHead data store.</source>
+        <translation>De huidige locatie van de map met SleepyHeadData.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="386"/>
+        <source>[data directory]</source>
+        <translation>[gegevens directory]</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="215"/>
+        <source>New Profile</source>
+        <translation>Nieuw profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="191"/>
+        <source>&Select User</source>
+        <translation>&Selecteer profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="94"/>
+        <source>Open Profile</source>
+        <translation>Open profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="95"/>
+        <source>Edit Profile</source>
+        <translation>Wijzig profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="97"/>
+        <source>Delete Profile</source>
+        <translation>Wis profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="144"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="224"/>
+        <source>Enter Password for %1</source>
+        <translation>Geef wachtwoord voor %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="163"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="373"/>
+        <source>Incorrect Password</source>
+        <translation>Verkeerd wachtwoord</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="165"/>
+        <source>You entered the password wrong too many times.</source>
+        <translation>Je hebt te vaak een verkeerd wachtwoord getypt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>Enter the word DELETE below to confirm.</source>
+        <translation>Typ het woord DELETE hieronder om te bevestigen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>You are about to destroy profile '%1'.</source>
+        <translation>Je wist nu het profiel '%1'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>Sorry</source>
+        <translation>Sorry</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>You need to enter DELETE in capital letters.</source>
+        <translation>Je moet het woord DELETE in HOOFDLETTERS intypen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="214"/>
+        <source>Could not open profile.. You will need to delete this profile directory manually</source>
+        <translation>Kon het profiel niet openen. Je moet de profieldirectory zelf wissen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="215"/>
+        <source>You will find it under the following location:</source>
+        <translation>Je vindt die op de volgende locatie:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="243"/>
+        <source>You entered an incorrect password</source>
+        <translation>Je hebt een verkeerd wachtwoord gegeven</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="246"/>
+        <source>If you're trying to delete because you forgot the password, you need to delete it manually.</source>
+        <translation>Als je probeert om het te wissen omdat je het wachtwoord bent vergeten, moet je de directory zelf wissen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="259"/>
+        <source>There was an error deleting the profile directory, you need to manually remove it.</source>
+        <translation>Er ging iets mis bij het wissen van de profieldirectory, je moet deze zelf wissen.</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">Vraag</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to trash the profile "%1"?</source>
+        <translation type="vanished">Weet je zeker dat profiel "%1" moet worden gewist?</translation>
+    </message>
+    <message>
+        <source>Double Checking:
+
+Do you really want "%1" profile to be obliterated?</source>
+        <translation type="vanished">Echt waar: Wil je echt profiel %1 WISSEN?</translation>
+    </message>
+    <message>
+        <source>Okay, I am about to totally OBLITERATE the profile "%1" and all it's contained data..
+
+Don't say you weren't warned. :-p</source>
+        <translation type="vanished">OK, ik ga nu het profiel en al de gegevens van "%1"vernietigen.. 
+
+Zeg niet dat je het niet wist... ;-p</translation>
+    </message>
+    <message>
+        <source>WTH???</source>
+        <translation type="vanished">Hè????</translation>
+    </message>
+    <message>
+        <source>If you can read this you need to delete this profile directory manually (It's under %1)</source>
+        <translation type="vanished">Als je dit leest, moet je de profielmap handmatig verwijderen (Hij heet: %1)</translation>
+    </message>
+    <message>
+        <source>Meheh... If your trying to delete because you forgot the password, your going the wrong way about it. Read the docs.
+
+Signed: Nasty Programmer</source>
+        <translation type="vanished">Hehe... Als je het profiel wilt wissen omdat je het wachtwoord vergeten bent, doe je iets verkeerd: Lees de documentatie.
+
+Ondertekend: Vervelende programmeur</translation>
+    </message>
+    <message>
+        <source>Whoops.</source>
+        <translation type="vanished">Oeps.</translation>
+    </message>
+    <message>
+        <source>There was an error deleting the profile directory.. You need to manually remove %1</source>
+        <translation type="vanished">Er ging iets mis bij het wissen. Je moet zelf de map %1 verwijderen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="263"/>
+        <source>Profile '%1' was succesfully deleted</source>
+        <translation>Het profiel '%1' is succesvol gewist</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="292"/>
+        <source>Create new profile</source>
+        <translation>Maak nieuw profiel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="357"/>
+        <source>Enter Password</source>
+        <translation>Geef wachtwoord</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="376"/>
+        <source>You entered an Incorrect Password too many times. Exiting!</source>
+        <translation>Je typte te vaak een verkeerd wachtwoord.
+Het programma wordt nu afgesloten!</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1276"/>
+        <source>No Data</source>
+        <translation>Geen gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="321"/>
+        <source>cm</source>
+        <translation>cm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="322"/>
+        <source>"</source>
+        <translation>inch</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="323"/>
+        <source>ft</source>
+        <translation>ft</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="324"/>
+        <source>lb</source>
+        <translation>lb</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="325"/>
+        <source>oz</source>
+        <translation>oz</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="326"/>
+        <source>Kg</source>
+        <translation>kg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="327"/>
+        <source>cmH2O</source>
+        <translation> cmWk</translation>
+    </message>
+    <message>
+        <source>Sleep</source>
+        <translation type="vanished">Start</translation>
+    </message>
+    <message>
+        <source>Wake</source>
+        <translation type="vanished">Einde</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="328"/>
+        <source>Hours</source>
+        <translation>Uren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="334"/>
+        <source>bpm</source>
+        <translation>slagen per minuut</translation>
+    </message>
+    <message>
+        <source>L/m</source>
+        <translation type="vanished">l/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="345"/>
+        <source>Error</source>
+        <translation>Fout</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="346"/>
+        <source>Warning</source>
+        <translation>Waarschuwing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="349"/>
+        <source>Please Note</source>
+        <translation>LET OP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="359"/>
+        <source>&Yes</source>
+        <translation>&Ja</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="360"/>
+        <source>&No</source>
+        <translation>&Nee</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="361"/>
+        <source>&Cancel</source>
+        <translation>&Annuleren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="362"/>
+        <source>&Destroy</source>
+        <translation>&Wissen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="363"/>
+        <source>&Save</source>
+        <translation>&Opslaan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="385"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1068"/>
+        <source>Min EPAP</source>
+        <translation>Min. EPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="386"/>
+        <source>Max EPAP</source>
+        <translation>Max. EPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="388"/>
+        <source>Min IPAP</source>
+        <translation>Min. IPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="389"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1069"/>
+        <source>Max IPAP</source>
+        <translation>Max. IPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="430"/>
+        <source>ÇSR</source>
+        <translation>CSR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="496"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="86"/>
+        <source>On</source>
+        <translation>Aan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="497"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="87"/>
+        <source>Off</source>
+        <translation>Uit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="365"/>
+        <source>BMI</source>
+        <translation>BMI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="329"/>
+        <source>Minutes</source>
+        <translation>Minuten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="330"/>
+        <source>Seconds</source>
+        <translation>Seconden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="331"/>
+        <source>Events/hr</source>
+        <translation>Incidenten per uur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="333"/>
+        <source>Hz</source>
+        <translation>Hz</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="336"/>
+        <source>Litres</source>
+        <translation>Liters</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="337"/>
+        <source>ml</source>
+        <translation>ml</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="338"/>
+        <source>Breaths/min</source>
+        <translation>Ademhalingen per minuut</translation>
+    </message>
+    <message>
+        <source>Severety (0-1)</source>
+        <translation type="vanished">Ernst (0 - 1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="342"/>
+        <source>Degrees</source>
+        <translation>Graden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="347"/>
+        <source>Information</source>
+        <translation>Informatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="348"/>
+        <source>Busy</source>
+        <translation>Bezig</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="498"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2124"/>
+        <source>Yes</source>
+        <translation>Ja</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="obsolete">Annuleren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="366"/>
+        <source>Weight</source>
+        <translation>Gewicht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="367"/>
+        <source>Zombie</source>
+        <translation>Zombie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="368"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="259"/>
+        <source>Pulse Rate</source>
+        <translatorcomment>20/9 WJG: overal gebruiken we polsslag - moeten we daar eigenlijk niet hartslag van maken? Dat lijkt me eigenlijk beter...
+Toch maar niet (nog)</translatorcomment>
+        <translation>Polsslag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="369"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="266"/>
+        <source>SpO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="370"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="273"/>
+        <source>Plethy</source>
+        <translatorcomment>20/9 WJG: Wat is dat?
+AK: Het kwam me bekend voor:
+plethy definition, meaning, English dictionary, synonym, see also 'plethora',plethoric',plenty',pleat', Reverso dictionary, English definition, English vocabulary.
+DAT HAD JIJ TOCH MOETEN WETEN?
+Plethysmos = toename
+http://www.apneaboard.com/forums/Thread-CMS50D--3956
+</translatorcomment>
+        <translation>Plethy</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="377"/>
+        <source>Oximeter</source>
+        <translation>oxymeter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="381"/>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="382"/>
+        <source>BiPAP</source>
+        <translation>BiPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="383"/>
+        <source>Bi-Level</source>
+        <translation>Bi-level</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="384"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1065"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1072"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1076"/>
+        <source>EPAP</source>
+        <translation>EPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="387"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1066"/>
+        <source>IPAP</source>
+        <translation>IPAP</translation>
+    </message>
+    <message>
+        <source>IPAPLo</source>
+        <translation type="vanished">IPAP laag</translation>
+    </message>
+    <message>
+        <source>IPAPHi</source>
+        <translation type="vanished">IPAP hoog</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="390"/>
+        <source>APAP</source>
+        <translation>APAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="391"/>
+        <source>ASV</source>
+        <translation>ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="392"/>
+        <source>ST/ASV</source>
+        <translation>ST/ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="394"/>
+        <source>Humidifier</source>
+        <translation>Bevochtiger</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="396"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="187"/>
+        <source>H</source>
+        <translation>H</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="397"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="181"/>
+        <source>OA</source>
+        <translation>OA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="398"/>
+        <source>A</source>
+        <translation>A</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="399"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="175"/>
+        <source>CA</source>
+        <translation>CA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="400"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="197"/>
+        <source>FL</source>
+        <translation>FL</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="401"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="238"/>
+        <source>SA</source>
+        <translation>SA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="402"/>
+        <source>LE</source>
+        <translation>LE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="403"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="233"/>
+        <source>EP</source>
+        <translation>EP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="404"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="206"/>
+        <source>VS</source>
+        <translation>VS</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="406"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="211"/>
+        <source>VS2</source>
+        <translation>VS2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="407"/>
+        <source>RERA</source>
+        <translation>RERA (RE)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="408"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2078"/>
+        <source>PP</source>
+        <translation>PP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="409"/>
+        <source>P</source>
+        <translation>P</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="410"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="202"/>
+        <source>RE</source>
+        <translation>RE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="411"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="228"/>
+        <source>NR</source>
+        <translation>NR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="412"/>
+        <source>NRI</source>
+        <translation>NRI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="413"/>
+        <source>O2</source>
+        <translation>O2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="414"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="283"/>
+        <source>PC</source>
+        <translation>PC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="243"/>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="416"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="248"/>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="417"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="253"/>
+        <source>UF3</source>
+        <translation>UF3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="419"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1070"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1073"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1077"/>
+        <source>PS</source>
+        <translation>PS</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>AHI</source>
+        <translation>AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="421"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>RDI</source>
+        <translation>RDI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="422"/>
+        <source>AI</source>
+        <translation>AI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="423"/>
+        <source>HI</source>
+        <translation>HI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="424"/>
+        <source>UAI</source>
+        <translation>UAI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="425"/>
+        <source>CAI</source>
+        <translation>CAI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="426"/>
+        <source>FLI</source>
+        <translation>FLI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="428"/>
+        <source>REI</source>
+        <translation>REI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="429"/>
+        <source>EPI</source>
+        <translation>EPI</translation>
+    </message>
+    <message>
+        <source>ÇSR</source>
+        <translation type="vanished">ÃSR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="431"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="169"/>
+        <source>PB</source>
+        <translation>PB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="435"/>
+        <source>IE</source>
+        <translation>I/E</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="371"/>
+        <source>Insp. Time</source>
+        <translation>Inademtijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="437"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="367"/>
+        <source>Exp. Time</source>
+        <translation>Uitademtijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="438"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>Resp. Event</source>
+        <translation>Ademhalings-incident</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="439"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="195"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="379"/>
+        <source>Flow Limitation</source>
+        <translation>Stroombeperking</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="440"/>
+        <source>Flow Limit</source>
+        <translation>Stroombeperking</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="441"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="236"/>
+        <source>SensAwake</source>
+        <translation>SensAwake</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="442"/>
+        <source>Pat. Trig. Breath</source>
+        <translation>Pat. Veroorz. Ademh</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="443"/>
+        <source>Tgt. Min. Vent</source>
+        <translation>Doel min. vent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="444"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Vent.</source>
+        <translation>Doelventilatie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="445"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Minute Vent.</source>
+        <translation>Minuutventilatie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="446"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="329"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Tidal Volume</source>
+        <translation>Teugvolume</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="447"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Resp. Rate</source>
+        <translation>Ademtempo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="448"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="334"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Snore</source>
+        <translation>Snurken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="449"/>
+        <source>Leak</source>
+        <translation>Lekkage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="450"/>
+        <source>Leaks</source>
+        <translation>Maskerlek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="453"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Total Leaks</source>
+        <translation>Totale lek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="454"/>
+        <source>Unintentional Leaks</source>
+        <translation>Onbedoelde lek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="455"/>
+        <source>MaskPressure</source>
+        <translation>Maskerdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="456"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="314"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Flow Rate</source>
+        <translation>Stroomsnelheid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="457"/>
+        <source>Sleep Stage</source>
+        <translation>Slaapfase</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="458"/>
+        <source>Usage</source>
+        <translation>Gebruik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="459"/>
+        <source>Sessions</source>
+        <translation>Sessies</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="460"/>
+        <source>Pr. Relief</source>
+        <translation>Drukvermindering</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="351"/>
+        <source>No Data Available</source>
+        <translation>Geen gegevens beschikbaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="352"/>
+        <source>Compliance Only :(</source>
+        <translation>Alleen naleving ;(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="353"/>
+        <source>Graphs Switched Off</source>
+        <translation>Grafieken uitgeschakeld</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="354"/>
+        <source>Summary Only :(</source>
+        <translation>Alleen overzichtgegevens :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="355"/>
+        <source>Sessions Switched Off</source>
+        <translation>Sessies uitgeschakeld</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="462"/>
+        <source>Bookmarks</source>
+        <translation>Bladwijzers</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="465"/>
+        <source>Mode</source>
+        <translation>Modus</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="466"/>
+        <source>Model</source>
+        <translation>Type</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="467"/>
+        <source>Brand</source>
+        <translation>Merk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="468"/>
+        <source>Serial</source>
+        <translation>Serienummer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="469"/>
+        <source>Series</source>
+        <translation>Serie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="470"/>
+        <source>Machine</source>
+        <translation>Apparaat</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="471"/>
+        <source>Channel</source>
+        <translation>Kanaal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="472"/>
+        <source>Settings</source>
+        <translation>Instellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="474"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Inclination</source>
+        <translation>Inclinatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="475"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Orientation</source>
+        <translation>Orientatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="477"/>
+        <source>Name</source>
+        <translation>Naam</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="478"/>
+        <source>DOB</source>
+        <translation>Geboortedatum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="479"/>
+        <source>Phone</source>
+        <translation>Telefoon</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="480"/>
+        <source>Address</source>
+        <translation>Adres</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="481"/>
+        <source>Email</source>
+        <translation>E-mail</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="482"/>
+        <source>Patient ID</source>
+        <translation>Patient-ID</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="483"/>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="485"/>
+        <source>Bedtime</source>
+        <translation>Gaan slapen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="486"/>
+        <source>Wake-up</source>
+        <translation>Opgestaan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="487"/>
+        <source>Mask Time</source>
+        <translation>Maskertijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="488"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="124"/>
+        <source>Unknown</source>
+        <translation>Onbekend</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="489"/>
+        <source>None</source>
+        <translation>Geen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="490"/>
+        <source>Ready</source>
+        <translation>Klaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="492"/>
+        <source>First</source>
+        <translation>Eerste dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="493"/>
+        <source>Last</source>
+        <translation>Laatste dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="494"/>
+        <source>Start</source>
+        <translation>Start</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="495"/>
+        <source>End</source>
+        <translation>Einde</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="499"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2125"/>
+        <source>No</source>
+        <translation>Nee</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="501"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1062"/>
+        <source>Min</source>
+        <translation>Min.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="502"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1063"/>
+        <source>Max</source>
+        <translation>Max.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="503"/>
+        <source>Med</source>
+        <translation>Med</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="505"/>
+        <source>Average</source>
+        <translation>Gemiddeld</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="506"/>
+        <source>Median</source>
+        <translation>Mediaan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="507"/>
+        <source>Avg</source>
+        <translation>Gem.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="508"/>
+        <source>W-Avg</source>
+        <translation>Gew. gem.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="371"/>
+        <source>Pressure</source>
+        <translation>Druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="339"/>
+        <source>?</source>
+        <translation>?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="341"/>
+        <source>Severity (0-1)</source>
+        <translation>Ernst (0-1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="373"/>
+        <source>Daily</source>
+        <translation>Dagelijks</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="374"/>
+        <source>Overview</source>
+        <translation>Overzicht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="375"/>
+        <source>Oximetry</source>
+        <translation>Oxymetrie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="378"/>
+        <source>Event Flags</source>
+        <translation>Incident markeringen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/preferences.cpp" line="33"/>
+        <source>Windows User</source>
+        <translation>Windows-gebruiker</translation>
+    </message>
+    <message>
+        <source>Software changes have been made that require the reimporting of the following machines data:
+
+</source>
+        <translation type="vanished">Door een wijziging in het programma moeten de volgende gegevens van het apparaat opnieuw worden opgehaald:
+
+</translation>
+    </message>
+    <message>
+        <source>I can automatically purge this data for you, or you can cancel now and continue to run in a previous version.
+
+</source>
+        <translation type="vanished">Ik kan automatisch deze gegevens wissen, tenzij je nu afbreekt en de oude versie blijft gebruiken.
+
+</translation>
+    </message>
+    <message>
+        <source>Would you like me to purge this data this for you so you can run the new version?</source>
+        <translation type="vanished">Wil je dat ik de gegevens voor je wis zodat je de nieuwe versie kunt gaan gebruiken?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="308"/>
+        <source>SleepyHead (%1) needs to upgrade its database for %2 %3 %4</source>
+        <translation>SleepyHead (%1) moet de database voor %2 %3 %4.vernieuwen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="321"/>
+        <source><b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b></source>
+        <translation><b>SleepyHead maakt een backup van je SD-kaart voor dit doel.</b></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="322"/>
+        <source><i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i></source>
+        <translation><i>Je oude gegevens moeten worden ingelezen, als de backup-functie tenminste niet is uitgeschakeld</i></translation>
+    </message>
+    <message>
+        <source>SleepyHead does <font size=+1>not</font> yet have an automatic card backup capabilities for this device.</source>
+        <translation type="vanished">SleepyHead heeft voor dit apparaat nog <font size=+1>geen</font> mogelijkheid voor een automatische backup .</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="256"/>
+        <source>Launching Windows Explorer failed</source>
+        <translation>Het is niet gelukt om de Windows Verkenner te starten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="257"/>
+        <source>Could not find explorer.exe in path to launch Windows Explorer.</source>
+        <translation>Kan explorer.exe niet in het pad vinden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="325"/>
+        <source>SleepyHead does not yet have any automatic card backups stored for this device.</source>
+        <translation>SleepyHead heeft nog geen automatische backup-functie voor dit apparaat.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="326"/>
+        <source>This means you will need to import this machine data again afterwards from your own backups or data card.</source>
+        <translation>Dat betekent dat je de gegevens van dit apparaat straks opnieuw van de kaart of uit een eigen backup moet inlezen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Important:</source>
+        <translation>Belangrijk:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore.</source>
+        <translation>Na deze upgrade kun je de gegevens van dit profiel.<font size=+1>niet meer</font> gebruiken met een eerdere versie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="330"/>
+        <source>If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.</source>
+        <translation>Als je je zorgen maakt, klik dan op Nee om af te sluiten en maak eerst een backup van je profiel voordat je SleepyHead opnieuw start.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="331"/>
+        <source>Are you ready to upgrade, so you can run the new version of SleepyHead?</source>
+        <translation>Ben je er klaar voor om met de nieuwe versie te gaan werken?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="334"/>
+        <source>Machine Database Changes</source>
+        <translation>Wijzigingen in de gegevens van het apparaat</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="345"/>
+        <source>Sorry, the purge operation failed, which means this version of SleepyHead can't start.</source>
+        <translation>Sorry, het wissen is mislukt. Dat betekent dat deze versie van SleepyHead niet kan starten.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="346"/>
+        <source>The machine data folder needs to be removed manually.</source>
+        <translation>Je moet zelf de map SleepyHeadData wissen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="347"/>
+        <source>This folder currently resides at the following location:</source>
+        <translation>Deze map staat momenteel hier:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="353"/>
+        <source>Rebuilding from %1 Backup</source>
+        <translation>Herstellen vanuit backup %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="358"/>
+        <source>Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?</source>
+        <translation>Wil je de automatische backup-functie inschakelen, opdat SleepyHead eventueel de database kan herstellen?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="365"/>
+        <source>SleepyHead will now start the import wizard so you can reinstall your %1 data.</source>
+        <translation>Er wordt een importhulp gestart zodat je de gegevens van je %1 kunt inlezen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="375"/>
+        <source>SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:</source>
+        <translation>SleepyHead sluit nu af en probeert het bestandsbeheer te starten, zodat je een backup van het profiel kunt maken:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="377"/>
+        <source>Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.</source>
+        <translation>Gebruik het bestandsbeheer om een copie van het profiel te maken. Start daarna SleepyHead opnieuw en maak het proces verder af.</translation>
+    </message>
+    <message>
+        <source>Purge Failed</source>
+        <translation type="vanished">Wissen mislukt</translation>
+    </message>
+    <message>
+        <source>Sorry, I could not purge this data, which means this version of SleepyHead can't start.. SleepyHead's Data folder needs to be removed manually
+
+This folder currently resides at the following location:
+</source>
+        <translation type="vanished">Sorry, ik kon de gegevens niet wissen, deze versie van SleepyHead kan daardoor niet starten.
+De map met gegevens van SleepyHead moet je zelf wissen.
+
+De map vind je op:
+</translation>
+    </message>
+    <message>
+        <source>SleepyHead Release Notes</source>
+        <translation type="obsolete">SleepyHead versie-opmerkingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="81"/>
+        <source>Release Notes</source>
+        <translation>Versie-opmerkingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="92"/>
+        <source>&Ok, get on with it..</source>
+        <translation>&OK, laten we beginnen..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="164"/>
+        <source>Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.</source>
+        <translation>Zoek deze versie op <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="171"/>
+        <source>A faster build of SleepyHead may be available</source>
+        <translation>Er kan een snellere versie van SleepyHead beschikbaar zijn</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="172"/>
+        <source>You will not be bothered with this message again.</source>
+        <translation>Ik zal je niet meer met dit bericht lastigvallen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="173"/>
+        <source>This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer.</source>
+        <translation>Deze versie zal goed draaien, maar een versie met de aanduidng "<b>%1</b>" zal waarschijnlijk beter draaien op deze computer.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="178"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.</source>
+        <translation>Deze versie van SleepyHead is ontworpen voor oudere computers zonder 'open GL 2.0' ondersteuning, maar bij deze computer hoeft dat niet.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="189"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.</source>
+        <translation>Deze versie van SleepyHead is ontworpen voor oudere computers zonder 'open GL 2.0' ondersteuning, zoals ook deze computer. Maar er is wellicht een nieuwere versie beschikbaar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="191"/>
+        <source>If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.</source>
+        <translation>Als je dit draait in een virtuele machine als VirtualBox of VMware, negeer deze opmerking dan: er is geen betere versie.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="201"/>
+        <source>Incompatible Graphics Hardware</source>
+        <translation>Incompatibele graphicskaart</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="202"/>
+        <source>This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.</source>
+        <translation>Deze versie van SleepyHead werkt met OpenGL 2.0 en helaas ondersteunt deze computer dat niet.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="203"/>
+        <source>You may need to update your computers graphics drivers from the GPU makers website. %1</source>
+        <translation>Wellicht helpt het om de drivers van de grafische kaart te updaten bij %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="204"/>
+        <source>(<a href='http://intel.com/support'>Intel's support site</a>)</source>
+        <translation>(<a href='http://intel.com/support'>Intel's support site</a>)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="205"/>
+        <source>Because graphs will not render correctly, and it may cause crashes, this build will now exit.</source>
+        <translation>Het programma zal worden afgesloten omdat de grafische mogelijkheden beperkt zijn en de computer waarschijnlijk toch zal crashen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="206"/>
+        <source>Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer.</source>
+        <translation>Wees niet teleurgesteld: er is een andere versie met <b> -BrokenGL</b> die wel op deze computer moet draaien.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>No SleepyHead data folder was found.</source>
+        <translation>Er is geen map met gegevens van SleepyHead gevonden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>Would you like SleepyHead to use the default location for storing its data?</source>
+        <translation>Wil je dat SleepyHead de standaard locatie voor gegevensopslag gebruikt?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>As you did not select a data folder, SleepyHead will exit.</source>
+        <translation>Omdat je geen map voor gegevensopslag hebt gekozen, wordt SleepyHead nu afgesloten.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>Next time you run, you will be asked again.</source>
+        <translation>Volgende keer als je het programma start, wordt deze vraag weer gesteld.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>You did not select a directory.</source>
+        <translation>Je hebt geen map gekozen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>SleepyHead will now start with your old one.</source>
+        <translation>SleepyHead start nu met de oude map.</translation>
+    </message>
+    <message>
+        <source>SleepyHead Update Notes</source>
+        <translation type="vanished">SleepyHead update-opmerkingen</translation>
+    </message>
+    <message>
+        <source> Update</source>
+        <translation type="vanished">Bijwerken</translation>
+    </message>
+    <message>
+        <source>Language</source>
+        <translation type="vanished">Taal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="344"/>
+        <source>Question</source>
+        <translation>Vraag</translation>
+    </message>
+    <message>
+        <source>No SleepyHead data folder was found.
+
+Would you like SleepyHead to use the default location for storing its data?
+
+</source>
+        <translation type="vanished">Geen SleepyHeadData folder gevonden.
+
+Wil je dat SleepyHead de standaard lokatie gebruikt voor gegevensopslag?
+
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="245"/>
+        <source>Choose or create new folder for SleepyHead data</source>
+        <translation>Kies of maak een nieuwe map voor SleepyHeadData</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="250"/>
+        <source>Exiting</source>
+        <translation>Afsluiten</translation>
+    </message>
+    <message>
+        <source>As you did not select a data folder, SleepyHead will exit.
+
+Next time you run, you will be asked again.</source>
+        <translation type="vanished">Doordat je geen gegevensfolder hebt gekozen, wordt SleepyHead gestopt.
+
+De volgende keer wordt het opnieuw gevraagd.</translation>
+    </message>
+    <message>
+        <source>No Directory</source>
+        <translation type="vanished">Geen directory</translation>
+    </message>
+    <message>
+        <source>You did not select a directory.
+
+SleepyHead will now start with your old one.
+
+</source>
+        <translation type="vanished">Je hebt geen directory gekozen.
+
+SleepyHead wordt nu gestart met je vorige directory:
+
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="266"/>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.</source>
+        <translation>De map die je koos is niet leeg, maar bevat ook geen gegevens van SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="267"/>
+        <source>Are you sure you want to use this folder?</source>
+        <translation>Weet je zeker dat je deze map wilt gebruiken?</translation>
+    </message>
+    <message>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.
+
+Are you sure you want to use this folder?
+
+</source>
+        <translation type="vanished">De folder die je gekozen hebt is niet leeg, maar bevat ook geen bruikbare SleepyHeadData.
+
+Weet je zeker dat je deze wilt gebruiken?
+
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="463"/>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="40"/>
+        <source>Unspecified</source>
+        <translation>Niet gespecificeerd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="41"/>
+        <source>Nasal Pillows</source>
+        <translation>Neuskussens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="42"/>
+        <source>Hybrid F/F Mask</source>
+        <translation>Hybride volgelaatsmasker</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="43"/>
+        <source>Nasal Interface</source>
+        <translation>Neustussenstuk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="44"/>
+        <source>Full-Face Mask</source>
+        <translation>Volgelaatsmasker</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1132"/>
+        <source>Are you sure you want to reset all your channel colors and settings to defaults?</source>
+        <translation>Weet je zeker dat je de kleuren en instellingen van alle grafieken wilt herstellen?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="262"/>
+        <source>Import Error</source>
+        <translation>Importfout</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="263"/>
+        <source>This Machine Record cannot be imported in this profile.
+The Day records overlap with already existing content.</source>
+        <translation>Deze apparaatgegevens kunnen niet in dit profiel worden geimporteerd.
+De gegevens overlappen reeds bestaande gegevens.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="384"/>
+        <source>Non Data Capable Machine</source>
+        <translation>Dit apparaat verstrekt geen gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="385"/>
+        <source>Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.</source>
+        <translation>Uw apparaat van Respironics (Model %1) kan helaas geen gegevens verstrekken.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="386"/>
+        <source>I'm sorry to report that SleepyHead can only track hours of use for this machine.</source>
+        <translation>Het spijt me dat SleepyHead voor dit apparaat alleen de gebruiksuren kan bijhouden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2169"/>
+        <source>15mm</source>
+        <translation>15mm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2168"/>
+        <source>22mm</source>
+        <translation>22mm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2082"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2084"/>
+        <source>Flex Mode</source>
+        <translation>Flex modus</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2083"/>
+        <source>PRS1 pressure relief mode.</source>
+        <translation>PRS1 drukhulp modus.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2089"/>
+        <source>C-Flex</source>
+        <translation>C-flex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2090"/>
+        <source>C-Flex+</source>
+        <translation>C-flex+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2091"/>
+        <source>A-Flex</source>
+        <translation>A-flex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2092"/>
+        <source>Rise Time</source>
+        <translation>Stijgtijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2093"/>
+        <source>Bi-Flex</source>
+        <translation>Bi-flex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2097"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2099"/>
+        <source>Flex Level</source>
+        <translation>Flex instelling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2098"/>
+        <source>PRS1 pressure relief setting.</source>
+        <translation>PRS1 drukhulp instelling.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2103"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2134"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2156"/>
+        <source>x1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2104"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2135"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2157"/>
+        <source>x2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2105"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2136"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2158"/>
+        <source>x3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2106"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2137"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2159"/>
+        <source>x4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2107"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2138"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2160"/>
+        <source>x5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2111"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2113"/>
+        <source>Humidifier Status</source>
+        <translation>Status bevochtiger</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2112"/>
+        <source>PRS1 humidifier connected?</source>
+        <translation>Is de bevochtiger aan de PRS1 aangesloten?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2115"/>
+        <source>Disconnected</source>
+        <translation>Losgekoppeld</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2116"/>
+        <source>Connected</source>
+        <translation>Aangekoppeld</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2120"/>
+        <source>Heated Tubing</source>
+        <translation>Verwarmde slang</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2121"/>
+        <source>Heated Tubing Connected</source>
+        <translation>Verwarmde slang aangesloten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2122"/>
+        <source>Headed Tubing</source>
+        <translation>Verwarmde slang</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2129"/>
+        <source>Humidification Level</source>
+        <translation>Instelling bevochtiger</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2130"/>
+        <source>PRS1 Humidification level</source>
+        <translation>Instelling bevochtiger PRS1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2131"/>
+        <source>Humid. Lvl.</source>
+        <translation>Bevocht.inst.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2142"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2143"/>
+        <source>System One Resistance Status</source>
+        <translation>Status System One weerstand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2144"/>
+        <source>Sys1 Resist. Status</source>
+        <translation>Status?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2151"/>
+        <source>System One Resistance Setting</source>
+        <translation>Instelling System One weerstand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2152"/>
+        <source>System One Mask Resistance Setting</source>
+        <translation>Instelling maskerweerstand</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2153"/>
+        <source>Sys1 Resist. Set</source>
+        <translation>Inst.weerst.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2164"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2166"/>
+        <source>Hose Diameter</source>
+        <translation>Slangdiameter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2165"/>
+        <source>Diameter of primary CPAP hose</source>
+        <translation>Diameter van de belangrijkste slang</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2173"/>
+        <source>System One Resistance Lock</source>
+        <translation>Weerstand vergrendeling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2174"/>
+        <source>Whether System One resistance settings are available to you.</source>
+        <translation>Of de instellingen beschikbaar zijn.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2175"/>
+        <source>Sys1 Resist. Lock</source>
+        <translation>Vergrendeld?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2182"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2184"/>
+        <source>Auto On</source>
+        <translation>Automatische start</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2183"/>
+        <source>A few breaths automatically starts machine</source>
+        <translation>Het apparaat start na enkele ademhalingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2191"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2193"/>
+        <source>Auto Off</source>
+        <translation>Automatisch uit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2192"/>
+        <source>Machine automatically switches off</source>
+        <translation>Het apparaat schakelt automatisch uit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2200"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2202"/>
+        <source>Mask Alert</source>
+        <translation>Masker waarschuwing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2201"/>
+        <source>Whether or not machine allows Mask checking.</source>
+        <translation>Of controle van het masker is ingeschakeld.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2209"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2211"/>
+        <source>Show AHI</source>
+        <translation>Toon AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2210"/>
+        <source>Whether or not machine shows AHI via LCD panel.</source>
+        <translation>Of het apparaat de AHI op het scherm toont.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2223"/>
+        <source>Unknown PRS1 Code %1</source>
+        <translation>Onbekende PRS1 code %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2224"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2225"/>
+        <source>PRS1_%1</source>
+        <translation>PRS1_%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2290"/>
+        <source>Timed Breath</source>
+        <translation>Geprogrammeerde ademhaling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2291"/>
+        <source>Machine Initiated Breath</source>
+        <translation>Door apparaat getriggerde ademhaling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2292"/>
+        <source>TB</source>
+        <translation>TB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1393"/>
+        <source>About SleepyHead</source>
+        <translation>Over SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1409"/>
+        <source>&Close</source>
+        <translation>&Sluiten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1413"/>
+        <source>&Donate</source>
+        <translation>&Doneren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="39"/>
+        <source>There are no graphs visible to print</source>
+        <translation>Geen zichtbare grafieken om af te drukken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="56"/>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation>Wil je gebieden met bladwijzer in dit rapport tonen?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="96"/>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation>Dit kan even duren...
+Alsjeblieft niets aanraken tot ik klaar ben.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="97"/>
+        <source>Printing %1 Report</source>
+        <translation>Rapport %1 afdrukken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="130"/>
+        <source>%1 Report</source>
+        <translation>%1 Rapport</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="180"/>
+        <source>: %1 hours, %2 minutes, %3 seconds
+</source>
+        <translation>: %1 uren, %2 minuten, %3 seconden
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Range</source>
+        <translation>Bereik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Fixed %1</source>
+        <translation>%1 gerepareerd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="270"/>
+        <source>RDI	%1
+</source>
+        <translation>RDI	%1
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="272"/>
+        <source>AHI	%1
+</source>
+        <translation>AHI	%1
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="306"/>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation>AI: %1 HI: %2 CAI: %3 </translation>
+    </message>
+    <message>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%</source>
+        <translation type="vanished">REI: %1 VSI: %2 FLI; %3 PB/CSR: %4%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="310"/>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</source>
+        <translation>REI: %1 VSI: %2 FLI: %3 PB/CSR: %4%%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="314"/>
+        <source>UAI=%1 </source>
+        <translation>UAI: %1 </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="316"/>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation>NRI: %1 LKI: %2 EPI: %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="384"/>
+        <source>Reporting from %1 to %2</source>
+        <translation>Rapport van %1 tot %2</translation>
+    </message>
+    <message>
+        <source>Reporting data goes here</source>
+        <translation type="vanished">De rapportgegevens komen hier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="451"/>
+        <source>Entire Day's Flow Waveform</source>
+        <translation>Flow golfvorm hele dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="457"/>
+        <source>Current Selection</source>
+        <translation>Huidige selectie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="467"/>
+        <source>Entire Day</source>
+        <translation>Gehele dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="586"/>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation>SleepyHead v%1 - http://sleepyhead.sourceforge.net</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="592"/>
+        <source>Page %1 of %2</source>
+        <translation>Pagina %1 van %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="659"/>
+        <source>SleepyHead has finished sending the job to the printer.</source>
+        <translation>SleepyHead is klaar met afdrukken.</translation>
+    </message>
+    <message>
+        <source>This is an unstable build so expect the possibility things will go wrong.</source>
+        <translation type="vanished">Dit is een onstabiele versie, dus je kunt verwachten dat er wat mis gaat.</translation>
+    </message>
+    <message>
+        <source>Please report bugs you find here to SleepyHead's developer mailing list.</source>
+        <translation type="vanished">Geef alsjeblieft de fouten door aan de ontwikkelaar van SleepyHead of aan de vertaler: klerk at apneuvereniging.nl</translation>
+    </message>
+    <message>
+        <source>This is a beta software and some functionality may not work as intended yet.</source>
+        <translation type="vanished">Dit is een beta programma,  sommige funties zouden niet naar verwachting kunnen werken.</translation>
+    </message>
+    <message>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation type="vanished">Geef alle bugs die je vindt op bij de SourceForge pagina van SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jan</source>
+        <translation>Jan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Feb</source>
+        <translation>Feb</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Mar</source>
+        <translation>Mrt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Apr</source>
+        <translation>Apr</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>May</source>
+        <translation>Mei</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jun</source>
+        <translation>Jun</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Jul</source>
+        <translation>Jul</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Aug</source>
+        <translation>Aug</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Sep</source>
+        <translation>Sep</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Oct</source>
+        <translation>Okt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Nov</source>
+        <translation>Nov</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Dec</source>
+        <translation>Dec</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="404"/>
+        <source>Events</source>
+        <translation>Incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="402"/>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="405"/>
+        <source>Duration</source>
+        <translation>Tijdsduur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="419"/>
+        <source>(% %1 in events)</source>
+        <translation>(%1% in incidenten)</translation>
+    </message>
+    <message>
+        <source>(%%1 in events)</source>
+        <translation type="vanished">(%%1 in incidenten)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="92"/>
+        <source>Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
+        <translation>Kon Channels.xml niet lezen, deze versie is echt brak, geen andere keuze dan om af te breken!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="104"/>
+        <source>Therapy Pressure</source>
+        <translation>Therapiedruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="108"/>
+        <source>Inspiratory Pressure</source>
+        <translation>Inademdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="112"/>
+        <source>Lower Inspiratory Pressure</source>
+        <translation>Laagste inademdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="116"/>
+        <source>Higher Inspiratory Pressure</source>
+        <translation>Hoogste inademdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="120"/>
+        <source>Expiratory Pressure</source>
+        <translation>Uitademdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="124"/>
+        <source>Lower Expiratory Pressure</source>
+        <translation>Onderste uitademdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="128"/>
+        <source>Higher Expiratory Pressure</source>
+        <translation>Bovenste uitademdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="132"/>
+        <source>Pressure Support</source>
+        <translation>Drukhulp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="137"/>
+        <source>PS Min</source>
+        <translation>PS min.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <source>Pressure Support Minimum</source>
+        <translation>Minimale drukhulp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="141"/>
+        <source>PS Max</source>
+        <translation>PS max.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <source>Pressure Support Maximum</source>
+        <translation>Maximale drukhulp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Min Pressure</source>
+        <translation>Minimale druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Minimum Therapy Pressure</source>
+        <translation>Minimum therapiedruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="145"/>
+        <source>Pressure Min</source>
+        <translation>Minimum druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="149"/>
+        <source>Pressure Max</source>
+        <translation>Maximum druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="276"/>
+        <source>Perfusion Index</source>
+        <translation>Perfusie index</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="277"/>
+        <source>A relative assessment of the pulse strength at the monitoring site</source>
+        <translation>Een relatieve benadering van de sterkte van de polsslag op de gemeten plek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="278"/>
+        <source>Perf. Index %</source>
+        <translation>Perf index %</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>CPAP Session contains summary data only</source>
+        <translation>Deze sessie bevat uitsluitend overzichtgegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="438"/>
+        <source>PAP Mode</source>
+        <translation>Soort apparaat</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="437"/>
+        <source>PAP Device Mode</source>
+        <translation>Soort PAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="443"/>
+        <source>APAP (Variable)</source>
+        <translation>APAP (variabel)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="447"/>
+        <source>ASV (Fixed EPAP)</source>
+        <translation>ASV (Vaste EPAP)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="448"/>
+        <source>ASV (Variable EPAP)</source>
+        <translation>ASV (Variabele EPAP)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="922"/>
+        <source>Zero</source>
+        <translation>Nul</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="925"/>
+        <source>Upper Threshold</source>
+        <translation>Bovengrens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="928"/>
+        <source>Lower Threshold</source>
+        <translation>Ondergrens</translation>
+    </message>
+    <message>
+        <source>Pr. Min</source>
+        <translation type="vanished">Min. druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Max Pressure</source>
+        <translation>Max. druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Maximum Therapy Pressure</source>
+        <translation>Maximum therapiedruk</translation>
+    </message>
+    <message>
+        <source>Pr. Max</source>
+        <translation type="vanished">Max. druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="153"/>
+        <source>Ramp Time</source>
+        <translation>Aanlooptijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <source>Ramp Delay Period</source>
+        <translation>Aanloop vertraging</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="161"/>
+        <source>Ramp Event</source>
+        <translation>Aanloop incident</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="162"/>
+        <source>Ramp</source>
+        <translation>Aanloop</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="209"/>
+        <source>Vibratory Snore (VS2) </source>
+        <translation>Vibrerend snurken (VS2) </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="215"/>
+        <source>Leak Flag</source>
+        <translation>Lekmarkering (LF)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="217"/>
+        <source>LF</source>
+        <translation>LF</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="425"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Mask On Time</source>
+        <translation>Tijdstip masker opgezet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Time started according to str.edf</source>
+        <translation>Starttijd volgens het bestand str.edf</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="430"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>Summary Only</source>
+        <translation>Alleen overzichtsgegevens</translation>
+    </message>
+    <message>
+        <source>CPAP Session contains summary data onlyf</source>
+        <translation type="vanished">De CPAP sessie bevat alleen overzichtsgegevens</translation>
+    </message>
+    <message>
+        <source>minutes</source>
+        <translation type="vanished">minuten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="157"/>
+        <source>Ramp Pressure</source>
+        <translation>Aanloopdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <source>Starting Ramp Pressure</source>
+        <translation>Aanloop startdruk</translation>
+    </message>
+    <message>
+        <source>Ramp Pr.</source>
+        <translation type="vanished">Aanloopdruk.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="167"/>
+        <source>Periodic Breathing</source>
+        <translation>Cyclische ademhaling (PB)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="168"/>
+        <source>A period of periodic breathing</source>
+        <translation>Een periode van cyclische ademhaling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="332"/>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="173"/>
+        <source>Clear Airway Apnea</source>
+        <translation>Open luchtweg apneu (CA)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="174"/>
+        <source>An apnea where the airway is open</source>
+        <translation>Een apneu waarbij de luchtweg niet is afgesloten</translation>
+    </message>
+    <message>
+        <source>events/hr</source>
+        <translation type="vanished">gebeurtenissen per uur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="179"/>
+        <source>Obstructive Apnea</source>
+        <translation type="unfinished">Obstructieve apneu (XXXXX)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="180"/>
+        <source>An apnea caused by airway obstruction</source>
+        <translation>Een apneu waarbij de luchtweg is afgesloten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="185"/>
+        <source>Hypopnea</source>
+        <translation>Hypopneu (H)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="186"/>
+        <source>A partially obstructed airway</source>
+        <translation>Een gedeeltelijk afgesloten luchtweg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="190"/>
+        <source>Unclassified Apnea</source>
+        <translation>Onbekende apneu (A)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="191"/>
+        <source>An apnea that could not fit into a category</source>
+        <translation>Een apneu die niet traceerbaar was</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="192"/>
+        <source>UA</source>
+        <translation>UA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="196"/>
+        <source>An restriction in breathing from normal, causing a flattening of the flow waveform.</source>
+        <translation>Een abnormale beperking van de ademhaling, waardoor de stroom afvlakte.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="200"/>
+        <source>Respiratory Effort Related Arousal</source>
+        <translation>Arousal door ademprobleem (RERA)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="201"/>
+        <source>An restriction in breathing that causes an either an awakening or sleep disturbance.</source>
+        <translation>Een stroombeperking die (gedeeltelijk) ontwaken (arousal) veroorzaakt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>Vibratory Snore</source>
+        <translation>Vibrerend snurken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>A vibratory snore</source>
+        <translation>Een snurk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="210"/>
+        <source>A vibratory snore as detcted by a System One machine</source>
+        <translation>System One detecteert vibrerend snurken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2076"/>
+        <source>Pressure Pulse</source>
+        <translation>drukpuls</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2077"/>
+        <source>A pulse of pressure 'pinged' to detect a closed airway.</source>
+        <translation>Een kleine drukgolf waarmee een afgesloten luchtweg wordt gedetecteerd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="451"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="221"/>
+        <source>Large Leak</source>
+        <translation>XXXXXXXXXX</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="216"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="222"/>
+        <source>A large mask leak affecting machine performance.</source>
+        <translation>Dusdanige lekkage dat het apparaat niet meer goed detecteert.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="452"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="223"/>
+        <source>LL</source>
+        <translation>LL</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="226"/>
+        <source>Non Responding Event</source>
+        <translation>Incident zonder reactie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="227"/>
+        <source>A type of respiratory event that won't respond to a pressure increase.</source>
+        <translation>Een ademhalings-incident dat niet door drukverhoging ophoudt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="231"/>
+        <source>Expiratory Puff</source>
+        <translation>Uitademstoot</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="232"/>
+        <source>Intellipap event where you breathe out your mouth.</source>
+        <translation>Een Intellipap incident waarbij je door de mond uitademt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="237"/>
+        <source>SensAwake feature will reduce pressure when waking is detected.</source>
+        <translation>De SensAwake functie verlaagt de druk als een arousal wordt gedetecteerd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="241"/>
+        <source>User Flag #1</source>
+        <translation>Gebruikersmarkering #1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="242"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="252"/>
+        <source>A user definable event detected by SleepyHead's flow waveform processor.</source>
+        <translation>Door de gebruiker instelbaar incident dat door SleepyHead wordt herkend.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="246"/>
+        <source>User Flag #2</source>
+        <translation>Gebruikersmarkering #2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="251"/>
+        <source>User Flag #3</source>
+        <translation>Gebruikersmarkering #3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <source>Heart rate in beats per minute</source>
+        <translation>Pols in slagen per minuut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>Blood-oxygen saturation percentage</source>
+        <translation>Bloedzuurstof saturatie in procent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>SpO2 %</source>
+        <translation>SpO2 %</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="271"/>
+        <source>Plethysomogram</source>
+        <translation>Plethysomogram</translation>
+    </message>
+    <message>
+        <source>hz</source>
+        <translation type="vanished">hz</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="272"/>
+        <source>An optical Photo-plethysomogram showing heart rhythm</source>
+        <translation>Een optisch foto-plethysomogram die het hartritme laat zien</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="281"/>
+        <source>Pulse Change</source>
+        <translation>Wijziging in polsslag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="282"/>
+        <source>A sudden (user definable) change in heart rate</source>
+        <translation>Een plotselinge verandering in polsslag (instelbaar)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="286"/>
+        <source>SpO2 Drop</source>
+        <translation>SpO2 verlaging</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="287"/>
+        <source>A sudden (user definable) drop in blood oxygen saturation</source>
+        <translation>Een plotselinge verlaging in zuurstofsaturatie (instelbaar)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="288"/>
+        <source>SD</source>
+        <translation>SD</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Breathing flow rate waveform</source>
+        <translation>Ademhalings golfvorm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="335"/>
+        <source>L/min</source>
+        <translation>l/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="319"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="320"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="324"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure</source>
+        <translation>Maskerdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure (High resolution)</source>
+        <translation>Maskerdruk (hoge resolutie)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Amount of air displaced per breath</source>
+        <translation>Hoeveelheid lucht verplaatst door ademhaling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Graph displaying snore volume</source>
+        <translation>Grafiek die de mate van snurken weergeeft</translation>
+    </message>
+    <message>
+        <source>??</source>
+        <translation type="vanished">??</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="339"/>
+        <source>Minute Ventilation</source>
+        <translation>Minuutventilatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Amount of air displaced per minute</source>
+        <translation>Hoeveelheid verplaatste lucht per minuut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="344"/>
+        <source>Respiratory Rate</source>
+        <translation>Ademhalingstempo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Rate of breaths per minute</source>
+        <translation>Tempo van de ademhaling per minuut</translation>
+    </message>
+    <message>
+        <source>Bpm</source>
+        <translation type="vanished">slagen per minuut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="349"/>
+        <source>Patient Triggered Breaths</source>
+        <translation>Pat. Veroorz. Ademh</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Percentage of breaths triggered by patient</source>
+        <translation>Percentage ademhalingen door de patient</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Pat. Trig. Breaths</source>
+        <translation>Pat. geact. teugen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="354"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Leak Rate</source>
+        <translation>Leksnelheid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Rate of detected mask leakage</source>
+        <translation>Snelheid van de maskerlekkage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="361"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>I:E Ratio</source>
+        <translation>I:E verhouding</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>Ratio between Inspiratory and Expiratory time</source>
+        <translation>Verhouding tussen inadem- en uitademtijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="340"/>
+        <source>ratio</source>
+        <translation>verhouding</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Expiratory Time</source>
+        <translation>Uitademtijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Time taken to breathe out</source>
+        <translation>Tijdsduur van het uitademen</translation>
+    </message>
+    <message>
+        <source>seconds</source>
+        <translation type="vanished">seconden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Inspiratory Time</source>
+        <translation>Inademtijd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Time taken to breathe in</source>
+        <translation>Tijdsduur van het inademen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="374"/>
+        <source>Respiratory Event</source>
+        <translation>Ademhalingsincident</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>A ResMed data source showing Respiratory Events</source>
+        <translation>Een ResMed gegevensblok met ademhalingsincidenten</translation>
+    </message>
+    <message>
+        <source>events</source>
+        <translation type="vanished">incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Graph showing severity of flow limitations</source>
+        <translation>Grafiek die de ernst van de stroombeperking aangeeft</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Flow Limit.</source>
+        <translation>Stroombeperk.</translation>
+    </message>
+    <message>
+        <source>0-1</source>
+        <translation type="vanished">0=open, 1=dicht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="384"/>
+        <source>Target Minute Ventilation</source>
+        <translation>Doelminuutventilatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Minute Ventilation?</source>
+        <translation>Doelminuutventilatie?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="389"/>
+        <source>Maximum Leak</source>
+        <translation>Maximum lekkage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>The maximum rate of mask leakage</source>
+        <translation>De maximum leksnelheid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>Max Leaks</source>
+        <translation>Max. lek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="394"/>
+        <source>Apnea Hypopnea Index</source>
+        <translation>Apneu-hypopneu Index</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>Graph showing running AHI for the past hour</source>
+        <translation>Grafiek met de voortschrijdende AHI van het afgelopen uur</translation>
+    </message>
+    <message>
+        <source>events/hour</source>
+        <translation type="vanished">gebeurtenissen per uur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="399"/>
+        <source>Total Leak Rate</source>
+        <translation>Totale lekkage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Detected mask leakage including natural Mask leakages</source>
+        <translation>Gedetecteerde maskerlekkage inclusief de bedoelde lek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="404"/>
+        <source>Median Leak Rate</source>
+        <translation>Mediaan van de lekkage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median rate of detected mask leakage</source>
+        <translation>De mediaan van de leksnelheid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median Leaks</source>
+        <translation>Mediaan lek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="409"/>
+        <source>Respiratory Disturbance Index</source>
+        <translation>Ademhalings Stoornis Index (RDI)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>Graph showing running RDI for the past hour</source>
+        <translation>Grafiek met de voorstschrijdende RDI van het afgelopen uur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Sleep position in degrees</source>
+        <translation>Slaaphouding in graden</translation>
+    </message>
+    <message>
+        <source>degrees</source>
+        <translation type="vanished">graden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Upright angle in degrees</source>
+        <translation>Zit/lig stand in graden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="112"/>
+        <source>Name: %1, %2</source>
+        <translation>Naam: %2 %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="114"/>
+        <source>DOB: %1</source>
+        <translation>Geboortedatum: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="117"/>
+        <source>Phone: %1</source>
+        <translation>Telefoon: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="120"/>
+        <source>Email: %1</source>
+        <translation>E-mail: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="123"/>
+        <source>Address:</source>
+        <translation>Adres:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="165"/>
+        <source>Usage Statistics</source>
+        <translation>Gebruiks-statistieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="179"/>
+        <source>This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>.</source>
+        <translation>Dit rapport is vervaardigd met een testversie van SleepyHead (%1), <b>en is op geen enkele wijze geschikt voor de bepaling van de therapietrouw of medische diagnose</b>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="181"/>
+        <source>SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead</source>
+        <translation>SleepyHead is een gratis "open-source" programma, beschikbaar op <a>http://sleepfiles.com/SH/</a>
+<b>Inlichtingen in Nederland en België: klerk at apneuvereniging.nl</b></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1039"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1041"/>
+        <source>Auto Bi-Level</source>
+        <translation>Auto Bi-level</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1045"/>
+        <source>ASV Auto EPAP</source>
+        <translation>ASV auto EPAP</translation>
+    </message>
+    <message>
+        <source>ASV AutoEPAP</source>
+        <translation type="vanished">ASV met auto-EPAP</translation>
+    </message>
+    <message>
+        <source>%1 threshold</source>
+        <translation type="vanished">%1 drempel</translation>
+    </message>
+    <message>
+        <source>No Waveform Available</source>
+        <translation type="vanished">Geen golfvorm gedetecteerd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1066"/>
+        <source>Plots Disabled</source>
+        <translation>Grafieken uitgeschakeld</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1148"/>
+        <source>Duration %1:%2:%3</source>
+        <translation>Tijdsduur %1 %2 %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1149"/>
+        <source>AHI %1</source>
+        <translation>AHI %1</translation>
+    </message>
+    <message>
+        <source>Days=%1</source>
+        <translation type="vanished">Dagen: %1</translation>
+    </message>
+    <message>
+        <source>Low Usage Days=%1</source>
+        <translation type="vanished">Korte dagen: %1</translation>
+    </message>
+    <message>
+        <source>(%%1 compliant, defined as > %2 hours)</source>
+        <translation type="obsolete">(1%% therapietrouw, met > %2 uren)</translation>
+    </message>
+    <message>
+        <source>(Sess=%1)</source>
+        <translation type="vanished">Sessie: %1</translation>
+    </message>
+    <message>
+        <source>Bedtime=%1</source>
+        <translation type="vanished">Naar bed: %1</translation>
+    </message>
+    <message>
+        <source>Waketime=%1</source>
+        <translation type="vanished">Opstaan: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1029"/>
+        <source>Days: %1</source>
+        <translation>Dagen: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1033"/>
+        <source>Low Usage Days: %1</source>
+        <translation>Korte dagen: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1034"/>
+        <source>(%1% compliant, defined as > %2 hours)</source>
+        <translation>(%1% therapietrouw, met meer dan %2 uren)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1148"/>
+        <source>(Sess: %1)</source>
+        <translation>(Sessies: %1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1156"/>
+        <source>Bedtime: %1</source>
+        <translation>Naar bed: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1158"/>
+        <source>Waketime: %1</source>
+        <translation>Opstaan: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1198"/>
+        <source>90%</source>
+        <translation>90%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1270"/>
+        <source>(Summary Only)</source>
+        <translation>(Alleen overzichtgegevens)</translation>
+    </message>
+    <message>
+        <source>Unknown.</source>
+        <translation type="vanished">Onbekend.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="315"/>
+        <source>There is a lockfile already present for profile '%1'.</source>
+        <translation>Er is een blokkeervlag voor het profiel '%1'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="316"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="326"/>
+        <source>You can only work with one instance of an individual SleepyHead profile at a time.</source>
+        <translation>Je mag in SleepyHead maar met een profiel tegelijk open hebben.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="317"/>
+        <source>Please close any other instances of SleepyHead running with this profile before proceeding.</source>
+        <translation>Sluit alsjeblieft elk ander programma dat dit profiel gebruikt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="318"/>
+        <source>If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message.</source>
+        <translation>Als er geen andere programma's draaien, mag deze boodschap worden genegeerd (was SleepyHead gecrasht?).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="325"/>
+        <source>There is a lockfile already present for this profile '%1', claimed on '%2'.</source>
+        <translation>Er is een blokkeervlag voor het profiel '%1', dat in gebruik is door '%2'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="327"/>
+        <source>If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding.</source>
+        <translation>Als je cloud-opslag gebruikt, zorg dan dat SleepyHead is afgesloten en de synchronisatie is afgerond voordat je verder gaat.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>Peak</source>
+        <translation>Piek</translation>
+    </message>
+    <message>
+        <source>Maximum</source>
+        <translation type="vanished">Maximum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="142"/>
+        <source>%1% %2</source>
+        <translation>%1% %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1241"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1060"/>
+        <source>Fixed</source>
+        <translation>Vast</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1243"/>
+        <source>Auto</source>
+        <translation>Auto</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1245"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="444"/>
+        <source>Fixed Bi-Level</source>
+        <translation>Vaste Bi-level</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="445"/>
+        <source>Auto Bi-Level (Fixed PS)</source>
+        <translation>Auto Bi-level (met vaste PS)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1249"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="446"/>
+        <source>Auto Bi-Level (Variable PS)</source>
+        <translation>Auto Bi-level (Variabele PS)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1251"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1043"/>
+        <source>ASV Fixed EPAP</source>
+        <translation>ASV met vaste EPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1253"/>
+        <source>ASV Variable EPAP</source>
+        <translation>ASV met variabele EPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1274"/>
+        <source>%1%2</source>
+        <translation>%1%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1294"/>
+        <source>Fixed %1 (%2)</source>
+        <translation>Vaste %1 (%2)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1296"/>
+        <source>Min %1 Max %2 (%3)</source>
+        <translation>Min: %1 Max: %2 (%3)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1298"/>
+        <source>EPAP %1 IPAP %2 (%3)</source>
+        <translation>EPAP: %1 IPAP: %2 (%3)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1300"/>
+        <source>PS %1 over %2-%3 (%4)</source>
+        <translation>PS: %1 over %2-%3 (%4)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1302"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1306"/>
+        <source>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</source>
+        <translation>Min EPAP: %1 Max IPAP: %2 PS: %3-%4 (%5)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1304"/>
+        <source>EPAP %1 PS %2-%3 (%6)</source>
+        <translation>EPAP: %1 PS: %2-%3 (%6)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="129"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="131"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="133"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>%1 %2</source>
+        <translation>%1 %2</translation>
+    </message>
+    <message>
+        <source>%1-%2 %3</source>
+        <translation type="vanished">%1-%2 %3%</translation>
+    </message>
+    <message>
+        <source>PS %3 over %1-%2 %4 </source>
+        <translation type="vanished">PS %3 boven %1-%2 %4% </translation>
+    </message>
+    <message>
+        <source>PS %4-%5 over %1-%3 %6</source>
+        <translation type="vanished">PS %4-%5 boven %1-%3 %6%</translation>
+    </message>
+    <message>
+        <source>PS %4-%5 over EPAP %1-%2 Max %3 %6</source>
+        <translation type="vanished">PS %4-%5 boven EPAP %1-%2 max. %3 %6%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="90"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Welkom bij SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>What would you like to do?</source>
+        <translation>Wat wil je gaan doen?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>Please Import Some Data</source>
+        <translation>Graag eerst enige gegevens importeren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="104"/>
+        <source>CPAP<br/>Importer</source>
+        <translation>CPAP<br/>importeren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="109"/>
+        <source>Oximetery<br/>Wizard</source>
+        <translation>Oxymetrie<br/>wizard</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="113"/>
+        <source>or</source>
+        <translation>of</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="116"/>
+        <source>View<br/>Statistics</source>
+        <translation>Statistieken<br/>bekijken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="122"/>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation>Het zou een goed idee zijn om eerst de instellingen te bekijken,</br>omdat daar een paar opties staan die belangrijk zijn bij het importeren.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="123"/>
+        <source>First import can take a few minutes.</source>
+        <translation>De eerste import kan enkele minuten duren.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="139"/>
+        <source>Click this box to see this in daily view.</source>
+        <translation>Klik hierop om het dagoverzicht te zien.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="141"/>
+        <source>The last time you used your %1...</source>
+        <translation>De laatste keer dat je de %1 gebruikte ...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="145"/>
+        <source>last night</source>
+        <translation>afgelopen nacht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="146"/>
+        <source>yesterday</source>
+        <translation>gisteren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="147"/>
+        <source>%2 days ago</source>
+        <translation>%2 dagen geleden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="149"/>
+        <source>was %1 (on %2)</source>
+        <translation>was %1 (op %2).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="157"/>
+        <source>perfect :)</source>
+        <translation>perfect :)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="158"/>
+        <source>pretty darn good</source>
+        <translation>verduveld goed</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="159"/>
+        <source>reasonably good</source>
+        <translation>behoorlijk goed</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="160"/>
+        <source>technically "treated"</source>
+        <translation>technisch gezien: "behandeld"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="161"/>
+        <source>not very good</source>
+        <translation>niet erg goed</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="162"/>
+        <source>horrible, please consult your doctor</source>
+        <translation>verschrikkelijk, neem contact op met je arts</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="241"/>
+        <source><p><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation><p><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Bepaalde operating systemen</font></span> schrijven zonder te vragen index-bestanden naar de kaart. Hierdoor kan de kaart voor jouw CPAP onleesbaar worden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="242"/>
+        <source><p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p></source>
+        <translation><p>Als tweede beschermingsmaatregel moet je ALTIJD de kaart EERST AFSLUITEN voor verwijderen!</p></translation>
+    </message>
+    <message>
+        <source>Your had an AHI of %1, which is considered %2.</source>
+        <translation type="vanished">Je had een AHI van %1, dat wordt beschouwd als %2.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="169"/>
+        <source>%1 hours, %2 minutes and %3 seconds</source>
+        <translation>%1 uren, %2 minuten en %3 seconden</translation>
+    </message>
+    <message>
+        <source>You slept for %1.</source>
+        <translation type="vanished">Je sliep gedurende %1.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="172"/>
+        <source><font color = red>You only had the mask on for %1.</font></source>
+        <translation><font color=red>Je droeg je masker maar gedurende %1.</font></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="179"/>
+        <source>You had no <i>major</i> mask leaks (maximum was %1 %2).</source>
+        <translation>Je had geen <i>'overmatige'</i> maskerlekkage (maximaal %1 %2).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="180"/>
+        <source>You had a small but acceptable amount of <i>major</i> mask leakage.</source>
+        <translation>Je had een korte, maar acceptabele hoeveelheid <i>'overmatige'</i> maskerlekkage.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="181"/>
+        <source>You had significant periods of <i>major</i> mask leakage.</source>
+        <translation>Je had flinke periodes met <i>'overmatige'</i> maskerlekkage.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="182"/>
+        <source>Your mask is leaking way too much.. Talk to your CPAP advisor.</source>
+        <translation>Je masker lekt veel te veel. Praat eens met je OSAS verpleegkundige.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="190"/>
+        <source>Your CPAP machine blasted you with a constant %1%2 of air</source>
+        <translation>Je CPAP blies met een constante %1%2 luchtdruk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="193"/>
+        <source>Your pressure was under %1%2 for %3% of the time.</source>
+        <translation>Je druk was %3% van de tijd beneden %1%2 (mediaan).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="197"/>
+        <source>Your machine blasted you with a constant %1-%2 %3 of air.</source>
+        <translation>Je apparaat blies met een constante %1-%2 %3 luchtdruk.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="201"/>
+        <source>Your machine was under %1-%2 %3 for %4% of the time.</source>
+        <translation>Je CPAP was beneden %1-%2 %3 gedurende %4% van de tijd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="206"/>
+        <source>Your EPAP pressure fixed at %1%2.</source>
+        <translation>Je EPAP druk stond vast op %1%2.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="212"/>
+        <source>Your EPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation>Je EPAP druk was beneden %1%2 gedurende %3% van de tijd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="207"/>
+        <location filename="../sleepyhead/welcome.cpp" line="213"/>
+        <source>Your IPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation>Je IPAP druk was beneden %1%2 gedurende %3% van de tijd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="164"/>
+        <source>You had an AHI of %1, which is considered %2</source>
+        <translation>Je had een AHI van %1, dat wordt beschouwd als %2.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="171"/>
+        <source>You machine was on for %1.</source>
+        <translation>Je apparaat stond gedurende %1 aan.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="220"/>
+        <source>No CPAP data has been imported yet.</source>
+        <translation>Er zijn nog geen CPAP gegevens geimporteerd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="226"/>
+        <source>Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> </source>
+        <translation>Meest recente oxymeterie gegevens: <a onclick='alert("daily=%2");'>%1</a> </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="227"/>
+        <source>(last night)</source>
+        <translation>(afgelopen nacht)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="228"/>
+        <source>(yesterday)</source>
+        <translation>(gisteren)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="229"/>
+        <source>(%2 day ago)</source>
+        <translation>(%2 dag(en) geleden)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="232"/>
+        <source>No oximetery data has been imported yet.</source>
+        <translation>Er zijn nog geen gegevens van de oxymeter geimporteerd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="238"/>
+        <source>Very Important Warning</source>
+        <translation>Erg belangrijk: Waarschuwing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="240"/>
+        <source><p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer.</source>
+        <translation><p>Je moet ALTIJD<font size=+1 color=red> de SD kaart van je CPAP <b>tegen schrijven beveiligen</b></font> voordat je hem in de computer steekt.</translation>
+    </message>
+    <message>
+        <source><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="vanished"><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Bepaalde operating systemen</font></span> schrijven zonder te vragen index-bestanden naar de kaart. Hierdoor kan de kaart voor jouw CPAP onleesbaar worden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>Contec</source>
+        <translation>Contec</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <source>CMS50</source>
+        <translation>CMS50</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>Fisher & Paykel</source>
+        <translation>Fisher & Paykell</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>ICON</source>
+        <translation>ICON</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>DeVilbiss</source>
+        <translation>DeVilbiss</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>Intellipap</source>
+        <translation>IntelliPap</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="81"/>
+        <source>SmartFlex Settings</source>
+        <translation>Instellingen SmartFlex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>ChoiceMMed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>MD300</source>
+        <translation>MD300</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>Respironics</source>
+        <translation>Respironics</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>M-Series</source>
+        <translation>M-series</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>Philips Respironics</source>
+        <translation>Philips Respironics</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>System One</source>
+        <translation>System One</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>ResMed</source>
+        <translation>ResMed</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>S9</source>
+        <translation>S9</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="395"/>
+        <source>EPR: </source>
+        <translation>EPR: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose</source>
+        <translation>SomnoPose</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose Software</source>
+        <translation>SomnoPose Programma</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Zeo</source>
+        <translation>Zeo</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Personal Sleep Coach</source>
+        <translation>Persoonlijke Slaap Trainer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gFlagsLine.cpp" line="195"/>
+        <source>Database Outdated
+Please Rebuild CPAP Data</source>
+        <translation>Verouderde database
+Gaarne gegevens opnieuw inlezen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="587"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="589"/>
+        <source>SmartFlex Mode</source>
+        <translation>SmartFlex instelling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="588"/>
+        <source>Intellipap pressure relief mode.</source>
+        <translation>IntelliPap drukhulp modus.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="594"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2639"/>
+        <source>Ramp Only</source>
+        <translation>Alleen tijdens aanloop</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="595"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2640"/>
+        <source>Full Time</source>
+        <translation>Continu</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="598"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="600"/>
+        <source>SmartFlex Level</source>
+        <translation>Instelling SmartFlex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="599"/>
+        <source>Intellipap pressure relief level.</source>
+        <translation>IntelliPap drukhulp instelling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1034"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1586"/>
+        <source>VPAP Adapt</source>
+        <translation>Aangepaste VPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2632"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2634"/>
+        <source>EPR</source>
+        <translation>EPR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2633"/>
+        <source>ResMed Exhale Pressure Relief</source>
+        <translation>ResMed uitademingsdrukhulp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2641"/>
+        <source>Patient???</source>
+        <translation>Patient???</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2644"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2646"/>
+        <source>EPR Level</source>
+        <translation>EPR niveau</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2645"/>
+        <source>Exhale Pressure Relief Level</source>
+        <translation>Niveau van uitademingsdrukhulp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2649"/>
+        <source>0cmH2O</source>
+        <translation>0 cmWK</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2650"/>
+        <source>1cmH2O</source>
+        <translation>1 cmWK</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2651"/>
+        <source>2cmH2O</source>
+        <translation>2 cmWK</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2652"/>
+        <source>3cmH2O</source>
+        <translation>3 cmWK</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>Weinmann</source>
+        <translation>Weinmann</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>SOMNOsoft2</source>
+        <translation>SOMNOsoft2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/MinutesAtPressure.cpp" line="234"/>
+        <source>(% of time)</source>
+        <translation>(% van de tijd)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>By Pressure</source>
+        <translation>Drukafhankelijkheid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>Statistics at Pressure</source>
+        <translation>Drukafhankelijke statistiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="923"/>
+        <source>%1 Session #%2</source>
+        <translation>%1 Sessie #%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1271"/>
+        <source>SleepyHead is proudly brought to you by JediMark.</source>
+        <translation>SleepyHead wordt u met trots aangeboden door JediMark</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1394"/>
+        <source>d MMM [ %1 - %2 ]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1930"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1983"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2058"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2075"/>
+        <source>%1</source>
+        <translation>%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2038"/>
+        <source>Hide All Events</source>
+        <translation>Verberg alle incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2039"/>
+        <source>Show All Events</source>
+        <translation>Toon alle incidenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2363"/>
+        <source>Unpin %1 Graph</source>
+        <translation>%1 grafiek losmaken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2438"/>
+        <source>Pin %1 Graph</source>
+        <translation>%1 grafiek vastzetten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="107"/>
+        <source>%1: %2</source>
+        <translation type="unfinished">%1% %2 {1:?}</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="150"/>
+        <source>Relief: %1</source>
+        <translation>Vermindering:%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="156"/>
+        <source>Hours: %1h, %2m, %3s</source>
+        <translation>Tijd: %1h, %2mm %3s</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="259"/>
+        <source>Machine Information</source>
+        <translation>Apparaat-informatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>Journal Data</source>
+        <translation>Dagboek gegevens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="43"/>
+        <source>SleepyHead found an old Journal folder, but it looks like it's been renamed:</source>
+        <translation>SleepyHead vond een oude dagboek, maar het schijnt dat de naam is gewijzigd:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="45"/>
+        <source>SleepyHead will not touch this folder, and will create a new one instead.</source>
+        <translation>SleepyHead zal niet doen met deze map, maar zal een nieuwe maken.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="46"/>
+        <source>Please be careful when playing in SleepyHead's profile folders :-P</source>
+        <translation>Weez voorzichtig met wijzigen van de profielmappen van SleepyHead :-P</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="53"/>
+        <source>For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.</source>
+        <translation>Om de een of andere reden heet SleepyHead geen dagboekgegevens in je profiel gevonden, maar wel meerdere mappen met dagboekgegevens.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="54"/>
+        <source>SleepyHead picked only the first one of these, and will use it in future:</source>
+        <translation>SleepyHead heeft de eerste gebruikt en zal deze blijven gebruiken.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="56"/>
+        <source>If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually.</source>
+        <translation>Als de oude gegevens ontbreken, copieer dan alle Journal_XXXXXXX mappen naar deze map.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F3.7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F</source>
+        <translation type="unfinished">CMS50F</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/machine.cpp" line="404"/>
+        <source>Loading %1 data...</source>
+        <translation>Gegevens van %1 laden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/progressdialog.cpp" line="14"/>
+        <source>PLease Wait...</source>
+        <translation>Even wachten...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="334"/>
+        <source>Snapshot %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QextSerialPort</name>
+    <message>
+        <source>No Error has occurred</source>
+        <translation type="vanished">Geen fouten</translation>
+    </message>
+    <message>
+        <source>Invalid file descriptor (port was not opened correctly)</source>
+        <translation type="vanished">Onjuiste bestandsbeschrijving (poort was niet correct geopend)</translation>
+    </message>
+    <message>
+        <source>Unable to allocate memory tables (POSIX)</source>
+        <translation type="vanished">Kan geen geheugentabellen toewijzen (POSIX)</translation>
+    </message>
+    <message>
+        <source>Caught a non-blocked signal (POSIX)</source>
+        <translation type="vanished">Ontving een niet-geblokkeerd signaal (POSIX)</translation>
+    </message>
+    <message>
+        <source>Operation timed out (POSIX)</source>
+        <translation type="vanished">Bewerkingstijd verlopen (POSIX)</translation>
+    </message>
+    <message>
+        <source>The file opened by the port is not a valid device</source>
+        <translation type="vanished">Het bestand verwijst naar een ongeldig apparaat</translation>
+    </message>
+    <message>
+        <source>The port detected a break condition</source>
+        <translation type="vanished">De poort werd afgesloten</translation>
+    </message>
+    <message>
+        <source>The port detected a framing error (usually caused by incorrect baud rate settings)</source>
+        <translation type="vanished">De poort gaf een foutmelding (waarschijnlijk de baudrate fout ingesteld)</translation>
+    </message>
+    <message>
+        <source>There was an I/O error while communicating with the port</source>
+        <translation type="vanished">I/O fout bij communicatie met de poort</translation>
+    </message>
+    <message>
+        <source>Character buffer overrun</source>
+        <translation type="vanished">Karakterbuffer overloop</translation>
+    </message>
+    <message>
+        <source>Receive buffer overflow</source>
+        <translation type="vanished">Ontving buffer overloop</translation>
+    </message>
+    <message>
+        <source>The port detected a parity error in the received data</source>
+        <translation type="vanished">De poort detecteerde een pariteitsfout in de gegevens</translation>
+    </message>
+    <message>
+        <source>Transmit buffer overflow</source>
+        <translation type="vanished">Zendbuffer overloop</translation>
+    </message>
+    <message>
+        <source>General read operation failure</source>
+        <translation type="vanished">Algemene leesfout</translation>
+    </message>
+    <message>
+        <source>General write operation failure</source>
+        <translation type="vanished">Algemene schrijffout</translation>
+    </message>
+    <message>
+        <source>The %1 file doesn't exists</source>
+        <translation type="vanished">Het bestand %1 bestaat niet</translation>
+    </message>
+    <message>
+        <source>Permission denied</source>
+        <translation type="vanished">Toegang geweigerd</translation>
+    </message>
+    <message>
+        <source>Device is already locked</source>
+        <translation type="vanished">Het apparaat is al afgesloten</translation>
+    </message>
+    <message>
+        <source>Unknown error: %1</source>
+        <translation type="vanished">Onbekende fout: %1</translation>
+    </message>
+</context>
+<context>
+    <name>QuaGzipFile</name>
+    <message>
+        <source>QIODevice::Append is not supported for GZIP</source>
+        <translation type="vanished">QIODevice::Append is not supported for GZIP</translation>
+    </message>
+    <message>
+        <source>Opening gzip for both reading and writing is not supported</source>
+        <translation type="vanished">Opening gzip for both reading and writing is not supported</translation>
+    </message>
+    <message>
+        <source>You can open a gzip either for reading or for writing. Which is it?</source>
+        <translation type="vanished">Je kunt een gzip bestand openen voor lezen of schrijven, wat wil je?</translation>
+    </message>
+    <message>
+        <source>Could not gzopen() file</source>
+        <translation type="vanished">Kan gzopen() bestand niet openen</translation>
+    </message>
+</context>
+<context>
+    <name>QuaZIODevice</name>
+    <message>
+        <source>QIODevice::Append is not supported for QuaZIODevice</source>
+        <translation type="vanished">QIODevice::Append is not supported for QuaZIODevice</translation>
+    </message>
+    <message>
+        <source>QIODevice::ReadWrite is not supported for QuaZIODevice</source>
+        <translation type="vanished">QIODevice::ReadWrite is not supported for QuaZIODevice</translation>
+    </message>
+</context>
+<context>
+    <name>QuaZipFilePrivate</name>
+    <message>
+        <location filename="../3rdparty/quazip/quazip/quazipfile.cpp" line="217"/>
+        <source>ZIP/UNZIP API error %1</source>
+        <translation>Fout bij in/uitpakken van %1</translation>
+    </message>
+</context>
+<context>
+    <name>Report</name>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulier</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="27"/>
+        <source>about:blank</source>
+        <translation type="unfinished">about:blank</translation>
+    </message>
+</context>
+<context>
+    <name>SessionBar</name>
+    <message>
+        <location filename="../sleepyhead/sessionbar.cpp" line="282"/>
+        <source>No Sessions Present</source>
+        <translation>Geen sessies gevonden</translation>
+    </message>
+</context>
+<context>
+    <name>Statistics</name>
+    <message>
+        <source>Please Import Some Data</source>
+        <translation type="vanished">Graag eerst enige gegevens importeren</translation>
+    </message>
+    <message>
+        <source>SleepyHead is pretty much useless without it.</source>
+        <translation type="vanished">SleepyHead is nogal nutteloos zonder gegevens.</translation>
+    </message>
+    <message>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="vanished">Het is een goed idee om eerst enige instellingen te controleren,
+er zijn enkele opties die de import beinvloeden.</translation>
+    </message>
+    <message>
+        <source>First import can take a few minutes.</source>
+        <translation type="vanished">De eerste keer kan enkele minuten duren.</translation>
+    </message>
+    <message>
+        <source>No CPAP Machine Data Imported</source>
+        <translation type="vanished">Geen CPAP gegevens geimporteerd</translation>
+    </message>
+    <message>
+        <source>CPAP Statistics as of</source>
+        <translation type="vanished">CPAP statistiek van </translation>
+    </message>
+    <message>
+        <source>No CPAP data available.</source>
+        <translation type="vanished">Geen CPAP-gegevens beschikbaar.</translation>
+    </message>
+    <message>
+        <source>%1 day of CPAP Data, on %2.</source>
+        <translation type="vanished">Dag %1 van CPAP-gegevens, op %2.</translation>
+    </message>
+    <message>
+        <source>%1 days of CPAP Data, between %2 and %3</source>
+        <translation type="vanished">%1 dagen met CPAP-gegevens, tussen %2 en %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="667"/>
+        <source>Details</source>
+        <translation>Details</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="607"/>
+        <source>Most Recent</source>
+        <translation>Laatste ingelezen dag</translation>
+    </message>
+    <message>
+        <source>Last 7 Days</source>
+        <translation type="vanished">Afgelopen 7 dagen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="609"/>
+        <source>Last 30 Days</source>
+        <translation>Afgelopen 30 dagen</translation>
+    </message>
+    <message>
+        <source>Last 6 months</source>
+        <translation type="vanished">Afgelopen 6 maanden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="611"/>
+        <source>Last Year</source>
+        <translation>Afgelopen jaar</translation>
+    </message>
+    <message>
+        <source>RERA Index</source>
+        <translation type="vanished">RERA-index</translation>
+    </message>
+    <message>
+        <source>Flow Limit Index</source>
+        <translation type="vanished">Stroom Beperking Index
+(FLI)</translation>
+    </message>
+    <message>
+        <source>Hours per Night</source>
+        <translation type="vanished">Uren per nacht</translation>
+    </message>
+    <message>
+        <source>Min EPAP</source>
+        <translation type="vanished">Min. EPAP</translation>
+    </message>
+    <message>
+        <source>Max IPAP</source>
+        <translation type="vanished">Max. IPAP</translation>
+    </message>
+    <message>
+        <source>Average Pressure</source>
+        <translation type="vanished">Gemiddelde druk</translation>
+    </message>
+    <message>
+        <source>%1% Pressure</source>
+        <translation type="obsolete">%1% Druk</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation type="vanished">Druk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="83"/>
+        <location filename="../sleepyhead/statistics.cpp" line="84"/>
+        <source>Average %1</source>
+        <translation>Gemiddelde %1</translation>
+    </message>
+    <message>
+        <source>%1% %2</source>
+        <translation type="obsolete">%1% %2</translation>
+    </message>
+    <message>
+        <source>Oximetry Statistics</source>
+        <translation type="vanished">Oxymeter statistiek</translation>
+    </message>
+    <message>
+        <source>%1 day of Oximetry Data, on %2.</source>
+        <translation type="obsolete">%1 dag van oxymetriegegevens, op %2 </translation>
+    </message>
+    <message>
+        <source>%1 days of Oximetry Data, between %2 and %3</source>
+        <translation type="vanished">%1 dagen van oxymetrie-gegevens, tussen %2 en %3</translation>
+    </message>
+    <message>
+        <source>Average SpO2</source>
+        <translation type="vanished">Gemiddelde SpO2</translation>
+    </message>
+    <message>
+        <source>Minimum SpO2</source>
+        <translation type="vanished">Minimum SpO2</translation>
+    </message>
+    <message>
+        <source>SpO2 Events / Hour</source>
+        <translation type="vanished">SpO2 incidenten per uur</translation>
+    </message>
+    <message>
+        <source>% of time in SpO2 Events</source>
+        <translation type="obsolete">Percentage tijd in SpO2 gebeurtenissen</translation>
+    </message>
+    <message>
+        <source>Average Pulse Rate</source>
+        <translation type="vanished">Gemiddelde polsslag</translation>
+    </message>
+    <message>
+        <source>Minimum Pulse Rate</source>
+        <translation type="vanished">Minumum polsslag</translation>
+    </message>
+    <message>
+        <source>Maximum Pulse Rate</source>
+        <translation type="vanished">Maximum polsslag</translation>
+    </message>
+    <message>
+        <source>Pulse Change Events / Hour</source>
+        <translation type="vanished">Polsslag-incidenten per uur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="30"/>
+        <source>CPAP Statistics</source>
+        <translation>CPAP statistiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="33"/>
+        <source>CPAP Usage</source>
+        <translation>CPAP gebruik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="34"/>
+        <source>Average Hours per Night</source>
+        <translation>Gemiddeld aantal uren per nacht</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="35"/>
+        <source>Compliance</source>
+        <translation>Therapietrouw</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="37"/>
+        <source>Therapy Efficiacy</source>
+        <translation>Therapie effectiviteit</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="47"/>
+        <source>Leak Statistics</source>
+        <translation>Lekstatistiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="52"/>
+        <source>Pressure Statistics</source>
+        <translation>Drukstatistiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="65"/>
+        <source>Oximeter Statistics</source>
+        <translation>Oxymeterstatistiek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="69"/>
+        <source>Blood Oxygen Saturation</source>
+        <translation>Bloedzuurstof saturatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="74"/>
+        <source>Pulse Rate</source>
+        <translation>Polsslag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="82"/>
+        <source>%1 Median</source>
+        <translation>%1 mediaan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="85"/>
+        <source>90% %1</source>
+        <translation>90% %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="86"/>
+        <source>Min %1</source>
+        <translation>Min. %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="87"/>
+        <source>Max %1</source>
+        <translation>Max. %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="88"/>
+        <source>%1 Index</source>
+        <translation>%1 index</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="89"/>
+        <source>% of time in %1</source>
+        <translation>Tijd in %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="90"/>
+        <source>% of time above %1 threshold</source>
+        <translation>Tijd boven de %1 grens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="91"/>
+        <source>% of time below %1 threshold</source>
+        <translation>Tijd onder de %1 grens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="550"/>
+        <source>I can haz data?!?</source>
+        <translatorcomment>haz = slang voor have</translatorcomment>
+        <translation>Ik wil DATA?!?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="551"/>
+        <source>This lonely sleepy sheep has no data :(</source>
+        <translation>Dit eenzame slaperige schaap heeft geen gegevens :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="608"/>
+        <source>Last Week</source>
+        <translation>Afgelopen week</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="610"/>
+        <source>Last 6 Months</source>
+        <translation>Afgelopen halfjaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="615"/>
+        <source>Last Session</source>
+        <translation>Laatste sessie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="681"/>
+        <source>No %1 data available.</source>
+        <translation>Geen %1 gegevens beschikbaar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="684"/>
+        <source>%1 day of %2 Data on %3</source>
+        <translation>%1 dagen met %2 gegevens van %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="690"/>
+        <source>%1 days of %2 Data, between %3 and %4</source>
+        <translation>%1 dagen met %2 gegevens tussen %3 en %4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="963"/>
+        <source>Usage Information</source>
+        <translation>Gebruiksinformatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="964"/>
+        <source>Total Days</source>
+        <translation>Totaal aantal dagen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="968"/>
+        <source>Compliant Days</source>
+        <translation>Therapietrouw-dagen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="980"/>
+        <source>Days AHI &gt;5.0</source>
+        <translation>Dagen met AHI &gt;5,0</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="985"/>
+        <source>Best&nbsp;%1</source>
+        <translation>Beste&nbsp;%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="998"/>
+        <source>Worst&nbsp;%1</source>
+        <translation>Slechtste&nbsp;%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1024"/>
+        <source>Best RX Setting</source>
+        <translation>Beste Rx instelling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1025"/>
+        <source>Worst RX Setting</source>
+        <translation>Slechtste Rx instelling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1095"/>
+        <source>Changes to Prescription Settings</source>
+        <translation>Wijzigingen in de voorgeschreven instellingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1103"/>
+        <source>Days</source>
+        <translation>Dagen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1110"/>
+        <source>Pressure Relief</source>
+        <translation>Drukvermindering</translation>
+    </message>
+    <message>
+        <source>Fixed %1 %2</source>
+        <translation type="vanished">%1 %2 gerepareerd</translation>
+    </message>
+    <message>
+        <source>%1 - %2 %3</source>
+        <translation type="vanished">%1 - %2 %3</translation>
+    </message>
+    <message>
+        <source>EPAP %1 %3 IPAP %2 %3</source>
+        <translation type="vanished">EPAP %1 %3 IPAP %2 %3</translation>
+    </message>
+    <message>
+        <source>PS %4 over %1 - %2 %3</source>
+        <translation type="vanished">PS %4 boven %1 - %2 %3</translation>
+    </message>
+    <message>
+        <source>EPAP %1, PS %2-%3 %4</source>
+        <translation type="vanished">EPAP %1, PS %2-%3 %4</translation>
+    </message>
+    <message>
+        <source>EPAP %1-%2, PS %3-%4 %5</source>
+        <translation type="vanished">EPAP %1-%2, PS %3-%4 %5</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation type="vanished">FL</translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="vanished">Drukvermindering</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1112"/>
+        <source>Pressure Settings</source>
+        <translation>Drukinstellingen</translation>
+    </message>
+    <message>
+        <source>EPAP %1</source>
+        <translation type="vanished">EPAP %1</translation>
+    </message>
+    <message>
+        <source>PS %1</source>
+        <translation type="vanished">PS %1</translation>
+    </message>
+    <message>
+        <source>IPAP %1</source>
+        <translation type="vanished">IPAP %1</translation>
+    </message>
+    <message>
+        <source>APAP %1 - %2</source>
+        <translation type="vanished">APAP %1 - %2</translation>
+    </message>
+    <message>
+        <source>CPAP %1</source>
+        <translation type="vanished">CPAP %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1123"/>
+        <source>Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.</source>
+        <translation>De markeringen betreffen uitsluitend periodes met meer dan %1 dagen aan opgeslagen gegevens.</translation>
+    </message>
+    <message>
+        <source>Fixed %1</source>
+        <translation type="vanished">%1 gerepareerd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1243"/>
+        <source>Machine Information</source>
+        <translation>Apparaat informatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1250"/>
+        <source>First Use</source>
+        <translation>Eerste gebruik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1251"/>
+        <source>Last Use</source>
+        <translation>Laatste gebruik</translation>
+    </message>
+</context>
+<context>
+    <name>Summary</name>
+    <message>
+        <source>Please Import Some Data</source>
+        <translation type="vanished">Graag eerst enige gegevens importeren</translation>
+    </message>
+    <message>
+        <source>SleepyHead is pretty much useless without it.</source>
+        <translation type="vanished">SleepyHead is nogal nutteloos zonder gegevens</translation>
+    </message>
+    <message>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="vanished">Het is een goed idee om eerst enige instellingen te controleren,
+er zijn enkele opties die de import beinvloeden</translation>
+    </message>
+    <message>
+        <source>First import can take a few minutes.</source>
+        <translation type="vanished">De eerste keer kan het even duren...</translation>
+    </message>
+    <message>
+        <source>No CPAP Machine Data Imported</source>
+        <translation type="vanished">Geen CPAP gegevens geimporteerd</translation>
+    </message>
+    <message>
+        <source>CPAP Statistics as of</source>
+        <translation type="vanished">CPAP statistiek van </translation>
+    </message>
+    <message>
+        <source>No CPAP data available.</source>
+        <translation type="vanished">Geen CPAP-gegevens beschikbaar.</translation>
+    </message>
+    <message>
+        <source>%1 day of CPAP Data, on %2.</source>
+        <translation type="vanished">Dag %1 van CPAP-gegevens, op %2.</translation>
+    </message>
+    <message>
+        <source>%1 days of CPAP Data, between %2 and %3</source>
+        <translation type="vanished">%1 dagen met CPAP-gegevens, tussen %2 en %3</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation type="vanished">Details</translation>
+    </message>
+    <message>
+        <source>Most Recent</source>
+        <translation type="vanished">Laatste ingelezen dag</translation>
+    </message>
+    <message>
+        <source>Last 7 Days</source>
+        <translation type="vanished">Afgelopen 7 dagen</translation>
+    </message>
+    <message>
+        <source>Last 30 Days</source>
+        <translation type="vanished">Afgelopen 30 dagen</translation>
+    </message>
+    <message>
+        <source>Last 6 months</source>
+        <translation type="vanished">Afgelopen 6 maanden</translation>
+    </message>
+    <message>
+        <source>Last Year</source>
+        <translation type="vanished">Afgelopen jaar</translation>
+    </message>
+    <message>
+        <source>RERA Index</source>
+        <translation type="vanished">RERA-index</translation>
+    </message>
+    <message>
+        <source>Flow Limit Index</source>
+        <translation type="vanished">Stroom Beperking Index
+(FLI)</translation>
+    </message>
+    <message>
+        <source>Hours per Night</source>
+        <translation type="vanished">Uren per nacht</translation>
+    </message>
+    <message>
+        <source>Min EPAP</source>
+        <translation type="vanished">Min. EPAP</translation>
+    </message>
+    <message>
+        <source>Max IPAP</source>
+        <translation type="vanished">Max. IPAP</translation>
+    </message>
+    <message>
+        <source>Average Pressure</source>
+        <translation type="vanished">Gemiddelde druk</translation>
+    </message>
+    <message>
+        <source>%1% Pressure</source>
+        <translation type="obsolete">%1% Druk</translation>
+    </message>
+    <message>
+        <source>Pressure</source>
+        <translation type="vanished">Druk</translation>
+    </message>
+    <message>
+        <source>Average %1</source>
+        <translation type="vanished">Gemiddelde %1</translation>
+    </message>
+    <message>
+        <source>%1% %2</source>
+        <translation type="obsolete">%1% %2</translation>
+    </message>
+    <message>
+        <source>Oximetry Summary</source>
+        <translation type="vanished">Oxymetrie overzicht</translation>
+    </message>
+    <message>
+        <source>%1 day of Oximetry Data, on %2.</source>
+        <translation type="vanished">%1 dag van oxymetriegegevens, op %2</translation>
+    </message>
+    <message>
+        <source>%1 days of Oximetry Data, between %2 and %3</source>
+        <translation type="vanished">%1 dagen van oxymetrie-gegevens, tussen %2 en %3</translation>
+    </message>
+    <message>
+        <source>Average SpO2</source>
+        <translation type="vanished">Gemiddelde SpO2</translation>
+    </message>
+    <message>
+        <source>Minimum SpO2</source>
+        <translation type="vanished">Minimum SpO2</translation>
+    </message>
+    <message>
+        <source>SpO2 Events / Hour</source>
+        <translation type="vanished">SpO2 incidenten per uur</translation>
+    </message>
+    <message>
+        <source>% of time in SpO2 Events</source>
+        <translation type="obsolete">Percentage tijd in SpO2 incidenten</translation>
+    </message>
+    <message>
+        <source>Average Pulse Rate</source>
+        <translation type="vanished">Gemiddelde polsslag</translation>
+    </message>
+    <message>
+        <source>Minimum Pulse Rate</source>
+        <translation type="vanished">Minumum polsslag</translation>
+    </message>
+    <message>
+        <source>Maximum Pulse Rate</source>
+        <translation type="vanished">Maximum polsslag</translation>
+    </message>
+    <message>
+        <source>Pulse Change Events / Hour</source>
+        <translation type="vanished">Polsslagincidenten per uur</translation>
+    </message>
+    <message>
+        <source>Usage Information</source>
+        <translation type="vanished">Gebruiksinformatie</translation>
+    </message>
+    <message>
+        <source>Total Days</source>
+        <translation type="vanished">Totaal aantal dagen</translation>
+    </message>
+    <message>
+        <source>Compliant Days</source>
+        <translation type="vanished">Therapietrouw-dagen</translation>
+    </message>
+    <message>
+        <source>Days AHI &gt;5.0</source>
+        <translation type="vanished">Dagen met AHI &gt;5,0</translation>
+    </message>
+    <message>
+        <source>Best&nbsp;%1</source>
+        <translation type="vanished">Beste &nbsp;%1</translation>
+    </message>
+    <message>
+        <source>Worst&nbsp;%1</source>
+        <translation type="vanished">Slechtste &nbsp;%1</translation>
+    </message>
+    <message>
+        <source>Best RX Setting</source>
+        <translation type="vanished">Beste Rx instelling</translation>
+    </message>
+    <message>
+        <source>Worst RX Setting</source>
+        <translation type="vanished">Slechtste Rx instelling</translation>
+    </message>
+    <message>
+        <source>Changes to Prescription Settings</source>
+        <translation type="vanished">Wijzigingen in de voorgeschreven instellingen</translation>
+    </message>
+    <message>
+        <source>PS Min</source>
+        <translation type="vanished">PS min.</translation>
+    </message>
+    <message>
+        <source>PS Max</source>
+        <translation type="vanished">PS max.</translation>
+    </message>
+    <message>
+        <source>Min Pres.</source>
+        <translation type="vanished">Min. druk</translation>
+    </message>
+    <message>
+        <source>Max Pres.</source>
+        <translation type="vanished">Max. druk</translation>
+    </message>
+    <message>
+        <source>Days</source>
+        <translation type="vanished">Dagen</translation>
+    </message>
+    <message>
+        <source>FL</source>
+        <translation type="vanished">FL</translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="vanished">Drukvermindering</translation>
+    </message>
+    <message>
+        <source>The above has a threshold which excludes day counts less than %1 from the best/worst highlighting</source>
+        <translation type="vanished">In het bovenstaande wordt een periode met  minder dan %1 dagen niet in de analyse meegenomen</translation>
+    </message>
+    <message>
+        <source>Machine Information</source>
+        <translation type="vanished">Apparaat informatie</translation>
+    </message>
+    <message>
+        <source>First Use</source>
+        <translation type="vanished">Eerste gebruik</translation>
+    </message>
+    <message>
+        <source>Last Use</source>
+        <translation type="vanished">Laatste gebruik</translation>
+    </message>
+</context>
+<context>
+    <name>UpdaterWindow</name>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="14"/>
+        <source>SleepyHead Updater</source>
+        <translation>SleepyHead Updater</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="51"/>
+        <source>A new version of $APP is available</source>
+        <translation>Er is een nieuwe versie van $APP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="97"/>
+        <source>Version Information</source>
+        <translation>Versie-informatie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="108"/>
+        <source>Release Notes</source>
+        <translation>Versie-opmerkingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="121"/>
+        <source>about:blank</source>
+        <translation type="unfinished">about:blank</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="130"/>
+        <source>Build Notes</source>
+        <translation>Build-opmerkingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="174"/>
+        <source>Maybe &Later</source>
+        <translation>Misschien &later</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="194"/>
+        <source>&Upgrade Now</source>
+        <translation>Nu &upgraden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="220"/>
+        <source>Please wait while updates are downloaded and installed...</source>
+        <translation>Wacht even tot de updates zijn gedownload en geïnstalleerd...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="234"/>
+        <source>Updates</source>
+        <translation>Updates</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="265"/>
+        <source>Component</source>
+        <translation>Onderdeel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="270"/>
+        <source>Version</source>
+        <translation>Versie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="275"/>
+        <source>Size</source>
+        <translation>Grootte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="280"/>
+        <source>Progress</source>
+        <translation>Voortgang</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="289"/>
+        <source>Log</source>
+        <translation>Log</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="317"/>
+        <source>Downloading & Installing Updates</source>
+        <translation>Bestanden worden gedownload en geïnstalleerd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="337"/>
+        <source>&Finished</source>
+        <translation>&Klaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="94"/>
+        <source>Checking for SleepyHead Updates</source>
+        <translation>Zoeken naar updates</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="109"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="171"/>
+        <source>Requesting </source>
+        <translation>Aanvragen </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="178"/>
+        <source>Saving as </source>
+        <translation>Opslaan als </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="256"/>
+        <source>XML update structure parsed cleanly</source>
+        <translation>XML updatestructuur werd juist ontleed</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <source>No updates were found for your platform.</source>
+        <translation>Er zijn geen updates gevonden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="322"/>
+        <source>SleepyHead Updates</source>
+        <translation>SleepyHead Updates</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="321"/>
+        <source>No new updates were found for your platform.</source>
+        <translation>Er zijn geen nieuwe updates gevonden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="339"/>
+        <source>SleepyHead v%1, codename "%2"</source>
+        <translation>SleepyHead versie %1, codename "%2"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="342"/>
+        <source>platform notes</source>
+        <translation>Opmerkingen over het platform</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="347"/>
+        <source>A new version of SleepyHead is available!</source>
+        <translation>Er is een nieuwe versie van SleepyHead beschikbaar!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="348"/>
+        <source>Shiny new <b>v%1</b> is available. You're running old and busted v%2</source>
+        <translation>Er is een splinternieuwe <b>versie %1</b> beschikbaar. Jij werkt nog met de oude en versleten versie %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="352"/>
+        <source>An update for SleepyHead is available.</source>
+        <translation>Er is een update voor SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="353"/>
+        <source>Version <b>%1</b> is available. You're currently running v%1</source>
+        <translation>Versie <b>%1</b> is beschikbaar. Je gebruikt nu versie %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="366"/>
+        <source>SleepyHead v%1 build notes</source>
+        <translation>Opmerkingen over SleepyHead versie %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="369"/>
+        <source>Update to QtLibs (v%1)</source>
+        <translation>Update naar QTlibs (versie %1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="379"/>
+        <source>There was an error parsing the XML Update file.</source>
+        <translation>Er is een fout opgetreden tijdens het ontleden van het bijgewerkte XML-bestand.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="400"/>
+        <source>%1 bytes received</source>
+        <translation>%1 bytes ontvangen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="430"/>
+        <source>Redirected to </source>
+        <translation>Doorgestuurd naar </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="444"/>
+        <source>File size mismatch for %1</source>
+        <translation>Bestandsgrootte van %1 klopt niet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="455"/>
+        <source>File integrity check failed for %1</source>
+        <translation>Fout in bestandsintegriteit van %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="485"/>
+        <source>Extracting </source>
+        <translation>Uitpakken </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="546"/>
+        <source>You might need to reinstall manually. Sorry :(</source>
+        <translation>Wellicht opnieuw installeren?! Sorry ;-((</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="547"/>
+        <source>Ugh.. Something went wrong with unzipping.</source>
+        <translation>Oef! Er ging iets fout bij het uitpakken.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="560"/>
+        <source>Failed</source>
+        <translation>Mislukt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="580"/>
+        <source>Download Complete</source>
+        <translation>Download klaar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="584"/>
+        <source>There was an error completing a network request:
+
+(</source>
+        <translation>Er was een fout bij een netwerkverzoek:
+
+:(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="629"/>
+        <source>Update Complete!</source>
+        <translation>Update klaar!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="632"/>
+        <source>Updates Complete. SleepyHead needs to restart now, click Finished to do so.</source>
+        <translation>Klaar met updaten. SleepyHead moet opnieuw worden opgestart, klik op Afsluiten.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="635"/>
+        <source>Update Failed :(</source>
+        <translation>Update mislukt :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="637"/>
+        <source>Download Error. Sorry, try again later.</source>
+        <translation>Fout met downloaden. Probeer het later nog eens.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="654"/>
+        <source>Downloading & Installing Updates...</source>
+        <translation>Updates downloaden en installeren...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="655"/>
+        <source>Please wait while downloading and installing updates.</source>
+        <translation>Wacht even terwijl we downloaden en installeren.</translation>
+    </message>
+</context>
+<context>
+    <name>gGraph</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="694"/>
+        <source>Snapshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraphView</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="361"/>
+        <source>100% zoom level</source>
+        <translation>100% zoomniveau</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="362"/>
+        <source>Restore X-axis zoom too 100% to view entire days data.</source>
+        <translation>Herstel het zoomniveau naar 100% om de hele grafiek te zien.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="364"/>
+        <source>Reset Graph Layout</source>
+        <translation>Herstel alle grafieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="365"/>
+        <source>Resets all graphs to a uniform height and default order.</source>
+        <translation>Herstelt alle grafieken naar standaard hoogte en volgorde.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="368"/>
+        <source>Y-Axis</source>
+        <translation>Y-as</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="369"/>
+        <source>Plots</source>
+        <translation>Grafieken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="374"/>
+        <source>CPAP Overlays</source>
+        <translation>apneu-markeringen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="377"/>
+        <source>Oximeter Overlays</source>
+        <translation>SpO2-markeringen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="380"/>
+        <source>Dotted Lines</source>
+        <translation>Stippellijnen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1854"/>
+        <source>Remove Clone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1858"/>
+        <source>Clone %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/Translations/Svenska.se.ts b/Translations/Svenska.se.ts
new file mode 100644
index 0000000..a79b1bb
--- /dev/null
+++ b/Translations/Svenska.se.ts
@@ -0,0 +1,8654 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="sv_SE" sourcelanguage="en_US">
+<context>
+    <name>CMS50Loader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Could not get data transmission from oximeter.</source>
+        <translation>Kan inte få data-anslutningen att fungera från pulsoximetern.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp" line="470"/>
+        <source>Please ensure you select 'upload' from the oximeter devices menu.</source>
+        <translation>Försäkra dig om att du valt "upload" från displayen på pulsoximetern.</translation>
+    </message>
+</context>
+<context>
+    <name>CMS50Serial</name>
+    <message>
+        <source>Processing...</source>
+        <translation type="vanished">Bearbetar...</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">Fråga</translation>
+    </message>
+    <message>
+        <source>Did you remember to start your oximeter recording at exactly the same time you started your CPAP machine?</source>
+        <translation type="vanished">Kom du ihåg att starta din puls/syremätare exakt samma tid som du startade din CPAP-maskin?</translation>
+    </message>
+    <message>
+        <source>Information</source>
+        <translation type="vanished">Information</translation>
+    </message>
+    <message>
+        <source>The most recent CPAP Session time has been selected as the start of your oximetry session.
+If you forgot to import todays CPAP data first, go and do that now, then import again from your oximeter.</source>
+        <translation type="vanished">Din sista användning av CPAP-maskinen används som start för din puls/syremätar inspelning.
+Om du glömt att importera senaste CPAP-data först, gör det nu, och importera sen igen från din puls/syremätare.</translation>
+    </message>
+    <message>
+        <source>No valid start time was provided for this oximeter session. You will likely have to adjust your oximeter sessions start time before saving.</source>
+        <translation type="vanished">Ingen giltig starttid lämnades för denna puls/syre-mätning. Du måste förmodligen justera start-tiden för senaste mätningen innan du sparar.</translation>
+    </message>
+    <message>
+        <source>Please Wait, Importing...</source>
+        <translation type="vanished">Var snäll och vänta en stund, importerar...</translation>
+    </message>
+    <message>
+        <source>Import Failed. Wait for oximeter and try again.</source>
+        <translation type="vanished">Import misslyckades. Vänta på puls/syremätaren och försök igen.</translation>
+    </message>
+    <message>
+        <source>Import Failed</source>
+        <translation type="vanished">Import misslyckades</translation>
+    </message>
+    <message>
+        <source>Set Oximeter to Upload</source>
+        <translation type="vanished">Ställ in puls/syremätaren att ladda upp</translation>
+    </message>
+</context>
+<context>
+    <name>Daily</name>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="435"/>
+        <source>Form</source>
+        <translation>Formulär</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="506"/>
+        <source>Go to the previous day</source>
+        <translation>Gå till föregående dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="525"/>
+        <source>Prev</source>
+        <translation>Föregående</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="551"/>
+        <source>Show or hide the calender</source>
+        <translation>Dölj eller visa kalender</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="574"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="614"/>
+        <source>Go to the next day</source>
+        <translation>Gå till nästa dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="636"/>
+        <source>Next</source>
+        <translation>Nästa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="674"/>
+        <source>Go to the most recent day with data records</source>
+        <translation>Gå till senaste dagen med data</translation>
+    </message>
+    <message>
+        <source>Details</source>
+        <translation type="vanished">Detaljer</translation>
+    </message>
+    <message>
+        <source>about:blank</source>
+        <translation type="vanished">om:tom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="852"/>
+        <source>Events</source>
+        <translation>Händelser</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="914"/>
+        <source>View Size</source>
+        <translation>Visa storlek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="959"/>
+        <location filename="../sleepyhead/daily.ui" line="1374"/>
+        <source>Notes</source>
+        <translation>Noteringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1013"/>
+        <source>Journal</source>
+        <translation>Journal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1099"/>
+        <source>Small</source>
+        <translation>Liten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1104"/>
+        <source>Medium</source>
+        <translation>Medium</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1109"/>
+        <source>Big</source>
+        <translation>Stor</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1079"/>
+        <source>Color</source>
+        <translation>Färg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1038"/>
+        <source> i </source>
+        <translation>i</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1041"/>
+        <source>Ctrl+I</source>
+        <translation>Ctrl+I</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1069"/>
+        <source>u</source>
+        <translation>u</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1054"/>
+        <source>B</source>
+        <translation>B</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1057"/>
+        <source>Ctrl+B</source>
+        <translation>Ctrl+B</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1168"/>
+        <source>Zombie</source>
+        <translation>Zombie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1181"/>
+        <source>I'm feeling...</source>
+        <translation>Jag känner mig ...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1197"/>
+        <source>Weight</source>
+        <translation>Vikt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1271"/>
+        <source>Awesome</source>
+        <translation>Toppen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1309"/>
+        <source>B.M.I.</source>
+        <translation>B.M.I.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1325"/>
+        <source>Bookmarks</source>
+        <translation>Bokmärken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1346"/>
+        <source>Add Bookmark</source>
+        <translation>Lägg till bokmärke</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1369"/>
+        <source>Starts</source>
+        <translation>Startar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1382"/>
+        <source>Remove Bookmark</source>
+        <translation>Ta bort bokmärke</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1475"/>
+        <source>Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1527"/>
+        <source>Graphs</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Zoom fully out</source>
+        <translation type="vanished">Zooma fullt ut</translation>
+    </message>
+    <message>
+        <source>100%</source>
+        <translation type="vanished">100%</translation>
+    </message>
+    <message>
+        <source>Reset the graph heights to uniform sizes</source>
+        <translation type="vanished">Återställ grafens höjd till enhetlig storlek</translation>
+    </message>
+    <message>
+        <source>Reset</source>
+        <translation type="vanished">Återställ</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.ui" line="1552"/>
+        <source>Drop down this list to show/hide available graphs.</source>
+        <translation>Släpp ner den här listen för att visa / dölja tillgängliga grafer.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>Breakdown</source>
+        <translation>Fördela</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="201"/>
+        <source>events</source>
+        <translation>händelser</translation>
+    </message>
+    <message>
+        <source>Selection AHI</source>
+        <translation type="vanished">Urval AHI</translation>
+    </message>
+    <message>
+        <source>U1</source>
+        <translation type="vanished">U1</translation>
+    </message>
+    <message>
+        <source>U2</source>
+        <translation type="vanished">U2</translation>
+    </message>
+    <message>
+        <source>U3</source>
+        <translation type="vanished">U3</translation>
+    </message>
+    <message>
+        <source>Events/hour</source>
+        <translation type="vanished">Händelser/timme</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="517"/>
+        <source>No %1 events are recorded this day</source>
+        <translation>Inga %1 händelser är registrerade denna dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="615"/>
+        <source>%1 event</source>
+        <translation>%1 händelse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="616"/>
+        <source>%1 events</source>
+        <translation>%1 händelser</translation>
+    </message>
+    <message>
+        <source>Oximetry data exists for this day, however it's timestamps are too different, so the Graphs will not be linked.</source>
+        <translation type="vanished">Oximetridata finns för denna dag, men dom är tidsstämplade alltför olika, så Grafer kommer inte att kopplas.</translation>
+    </message>
+    <message>
+        <source>No Graphs :(</source>
+        <translation type="vanished">Inga diagram :( </translation>
+    </message>
+    <message>
+        <source>ASV</source>
+        <translation type="vanished">ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Sleep</source>
+        <translation>Sömn</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1277"/>
+        <source>Wake</source>
+        <translation>Vakna</translation>
+    </message>
+    <message>
+        <source>Hypopnea</source>
+        <translation type="vanished">Hypopné</translation>
+    </message>
+    <message>
+        <source>Apnea</source>
+        <translation type="vanished">Apnea</translation>
+    </message>
+    <message>
+        <source>Obstructive</source>
+        <translation type="vanished">Obstruktiv</translation>
+    </message>
+    <message>
+        <source>Flow Limit</source>
+        <translation type="vanished">Flödesbegränsning</translation>
+    </message>
+    <message>
+        <source>Clear Airway</source>
+        <translation type="vanished">Öppna luftvägar</translation>
+    </message>
+    <message>
+        <source>User Flags</source>
+        <translation type="vanished">Egna flaggor</translation>
+    </message>
+    <message>
+        <source>VSnore</source>
+        <translation type="vanished">Snarkning</translation>
+    </message>
+    <message>
+        <source>VSnore2</source>
+        <translation type="vanished">Snarkning 2</translation>
+    </message>
+    <message>
+        <source>PB/CSR</source>
+        <translation type="vanished">PB/CSR</translation>
+    </message>
+    <message>
+        <source>Exh&nbsp;Puff</source>
+        <translation type="vanished">Exh&nbsp;Puff</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1523"/>
+        <source>Event Breakdown</source>
+        <translation>Händelser i detalj</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1558"/>
+        <source>Sessions all off!</source>
+        <translation>Alla sessioner av!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1560"/>
+        <source>Sessions exist for this day but are switched off.</source>
+        <translation>Sessioner finns för denna dag men är avstängda.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1563"/>
+        <source>Impossibly short session</source>
+        <translation>Onaturligt kort session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1564"/>
+        <source>Zero hours??</source>
+        <translation>0 timmar??</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1567"/>
+        <source>BRICK :(</source>
+        <translation>Tegelsten :-(</translation>
+    </message>
+    <message>
+        <source>Sorry, your machine does not record data.</source>
+        <translation type="vanished">Jag är ledsen, men din maskin registerar ingen data.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1569"/>
+        <source>Complain to your Equipment Provider!</source>
+        <translation>Klaga till återförsäljaren!</translation>
+    </message>
+    <message>
+        <source>Avg</source>
+        <translation type="vanished">Genomsnitt</translation>
+    </message>
+    <message>
+        <source>Med</source>
+        <translation type="vanished">Medium</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1135"/>
+        <source>Statistics</source>
+        <translation>Statistisk</translation>
+    </message>
+    <message>
+        <source>%1%</source>
+        <translation type="vanished">%1%</translation>
+    </message>
+    <message>
+        <source><b>Please Note:</b> This day just contains summary data, only limited information is available .</source>
+        <translation type="vanished"><b>Observera:</b> Den här dagen innehåller bara sammanfattningsdata, finns endast begränsad information.</translation>
+    </message>
+    <message>
+        <source>No data available</source>
+        <translation type="vanished">Inga data tillgängliga</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1057"/>
+        <source>Oximeter Information</source>
+        <translation>Oximeter information</translation>
+    </message>
+    <message>
+        <source>Int. Pulse</source>
+        <translation type="vanished">Int. Puls</translation>
+    </message>
+    <message>
+        <source>Int. SpO2</source>
+        <translation type="vanished">Int. SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="651"/>
+        <source>Session Start Times</source>
+        <translation>Periodens Start Tid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="652"/>
+        <source>Session End Times</source>
+        <translation>Periodens Slut Tid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="892"/>
+        <source>Duration</source>
+        <translation>Varaktighet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="872"/>
+        <source>Oximetery Sessions</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="212"/>
+        <source>UF1</source>
+        <translation type="unfinished">UF1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="213"/>
+        <source>UF2</source>
+        <translation type="unfinished">UF2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="878"/>
+        <source>Position Sensor Sessions</source>
+        <translation>Lägesgivaren Period</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="883"/>
+        <source>Unknown Session</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="949"/>
+        <source>Machine Settings Unavailable</source>
+        <translation>Maskin Inställningar Ej Tillgängliga</translation>
+    </message>
+    <message>
+        <source>EPR:%1 EPR_LEVEL:%2</source>
+        <translation type="vanished">EPR:%1 EPR_LEVEL:%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1061"/>
+        <source>SpO2 Desaturations</source>
+        <translation>Minskning av syrgasmättnad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1062"/>
+        <source>Pulse Change events</source>
+        <translation>Pulsförändringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1063"/>
+        <source>SpO2 Baseline Used</source>
+        <translation>Baslinje för syrgasmättnad används</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="945"/>
+        <source>Machine Settings</source>
+        <translation>Maskininställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="837"/>
+        <source>Session Information</source>
+        <translation>Sessions information</translation>
+    </message>
+    <message>
+        <source>SessionID</source>
+        <translation type="vanished">Session ID</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="869"/>
+        <source>CPAP Sessions</source>
+        <translation>CPAP Sessions</translation>
+    </message>
+    <message>
+        <source>Oximetry Sessions</source>
+        <translation type="vanished">Oximeter Sessions</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="875"/>
+        <source>Sleep Stage Sessions</source>
+        <translation>Sömnstadie Sessions</translation>
+    </message>
+    <message>
+        <source>Sleep Stage</source>
+        <translation type="vanished">Sömnstadie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="933"/>
+        <source>One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly.</source>
+        <translation>En eller flera flödeskurvor för den här sessionen hade felaktiga källdata. Vissa flödeskurvor kanske inte visas korrekt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1093"/>
+        <source>PAP Mode: %1<br/></source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1098"/>
+        <source>This day has missing pressure, mode and settings data.</source>
+        <translation>Den här dagen saknar tryck, läges, och inställningsdata.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1140"/>
+        <source>%1%2</source>
+        <translation>%1%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1206"/>
+        <source>This day just contains summary data, only limited information is available .</source>
+        <translation>Den här dagen innehåller bara sammanfattningsdata, endast begränsad information är tillgänglig.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1216"/>
+        <source>Total time in apnea</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1226"/>
+        <source>Time over leak redline</source>
+        <translation>Tid över röda läckage-linjen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1232"/>
+        <source>Total ramp time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1236"/>
+        <source>Time outside of ramp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1246"/>
+        <source>AHI excluding ramp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Hide all events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2457"/>
+        <source>Show all events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1568"/>
+        <source>Sorry, your machine only provides compliance data.</source>
+        <translation>Ledsen, men din maskin sparar bara tid som maskinen använts.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1587"/>
+        <source>"Nothing's here!"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1590"/>
+        <source>Bob is bored with this days lack of data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="1869"/>
+        <source>Pick a Colour</source>
+        <translation>Välj en färg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2131"/>
+        <source>This bookmarked is in a currently disabled area..</source>
+        <translation>
+Detta bokmärke är i ett för tillfället inaktiverat område ..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2174"/>
+        <source>Bookmark at %1</source>
+        <translation>Bokmärke på %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2365"/>
+        <source>Show all graphs</source>
+        <translation>Visa alla grafer</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">Inga grafer på!</translation>
+    </message>
+    <message>
+        <source>Summary Only :(</source>
+        <translation type="vanished">Endast Sammanfattning :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="2385"/>
+        <source>Hide all graphs</source>
+        <translation>Dölj alla grafer</translation>
+    </message>
+</context>
+<context>
+    <name>ExportCSV</name>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="14"/>
+        <source>Export as CSV</source>
+        <translation>Exportera som CSV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="24"/>
+        <source>Dates:</source>
+        <translation>Datum:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="37"/>
+        <source>Resolution:</source>
+        <translation>Upplösning:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="46"/>
+        <source>Details</source>
+        <translation>Detaljer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="53"/>
+        <source>Sessions</source>
+        <translation>Sessioner</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="60"/>
+        <source>Daily</source>
+        <translation>Daglig</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="85"/>
+        <source>Filename:</source>
+        <translation>Filnamn:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="107"/>
+        <source>Cancel</source>
+        <translation>Avbryt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="114"/>
+        <source>Export</source>
+        <translation>Exportera</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="131"/>
+        <source>Start:</source>
+        <translation>Börja:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="154"/>
+        <source>End:</source>
+        <translation>Sluta:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="192"/>
+        <source>Quick Range:</source>
+        <translation>SnabbIntervall:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="60"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="122"/>
+        <source>Most Recent Day</source>
+        <translation>Den senaste dagen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="205"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="125"/>
+        <source>Last Week</source>
+        <translation>Förra veckan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="210"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="128"/>
+        <source>Last Fortnight</source>
+        <translation>Senaste 2 veckorna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="215"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="131"/>
+        <source>Last Month</source>
+        <translation>Senaste månaden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="220"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="134"/>
+        <source>Last 6 Months</source>
+        <translation>Senaste 6 månaderna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="225"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="137"/>
+        <source>Last Year</source>
+        <translation>Senaste året</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="230"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="119"/>
+        <source>Everything</source>
+        <translation>Allt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="235"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="108"/>
+        <source>Custom</source>
+        <translation>Anpassa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.ui" line="248"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="73"/>
+        <source>SleepyHead_</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="76"/>
+        <source>Details_</source>
+        <translation>Detaljer_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="78"/>
+        <source>Sessions_</source>
+        <translation>Sessions_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="80"/>
+        <source>Summary_</source>
+        <translation>Sammanfattning_</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="87"/>
+        <source>Select file to export to</source>
+        <translation>Välj fil att exportera till</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="88"/>
+        <source>CSV Files (*.csv)</source>
+        <translation>CSV Filer (*.csv)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>DateTime</source>
+        <translatorcomment>???</translatorcomment>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Session</source>
+        <translation>Session</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Event</source>
+        <translation>Händelse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="196"/>
+        <source>Data/Duration</source>
+        <translation>Data/Varaktighet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <source>Session Count</source>
+        <translation>Session antal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>Start</source>
+        <translation>Börja</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="199"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="202"/>
+        <source>End</source>
+        <translation>Sluta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>Total Time</source>
+        <translation>Total tid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="200"/>
+        <location filename="../sleepyhead/exportcsv.cpp" line="203"/>
+        <source>AHI</source>
+        <translation>AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="207"/>
+        <source> Count</source>
+        <translation>Räkna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="211"/>
+        <source> Avg</source>
+        <translation>Genomsnitt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/exportcsv.cpp" line="215"/>
+        <source> %1%</source>
+        <translation> %1%</translation>
+    </message>
+</context>
+<context>
+    <name>FPIconLoader</name>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="128"/>
+        <source>Import Error</source>
+        <translation type="unfinished">Import-fel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>This Machine Record cannot be imported in this profile.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.cpp" line="129"/>
+        <source>The Day records overlap with already existing content.</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>MainWindow</name>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="441"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1007"/>
+        <source>&Statistics</source>
+        <translation>&Statistisk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="981"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html></source>
+        <translation><html><head/><body><p><span style=" font-weight:600;">Varning: </span>Det här är en förhands-vesion, och vissa funktioner fungerar inte som avsett ännu.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="998"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1035"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3050"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3107"/>
+        <source>about:blank</source>
+        <translation>om:tom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1073"/>
+        <source>Report Mode</source>
+        <translation>Rapport läge</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1080"/>
+        <source>Standard</source>
+        <translation>Standard</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1090"/>
+        <source>Monthly</source>
+        <translation>Månadsvis</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1097"/>
+        <source>Date Range</source>
+        <translation>Datumintervall</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1141"/>
+        <source>&Help Browser</source>
+        <translation>&Hjälp webbläsare</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1204"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1224"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="1244"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="2932"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1317"/>
+        <source>qrc:/docs/index.html</source>
+        <translation>qrc:/docs/index.html</translation>
+    </message>
+    <message>
+        <source>&Navigation</source>
+        <translation type="vanished">&Navigation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1633"/>
+        <source>Statistics</source>
+        <translation>Statistisk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1683"/>
+        <source>Daily</source>
+        <translation>Dagligen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1727"/>
+        <source>Overview</source>
+        <translation>Översikt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1771"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1096"/>
+        <source>Oximetry</source>
+        <translation>Oximetry</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1821"/>
+        <source>Import</source>
+        <translation>Import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1871"/>
+        <source>Help</source>
+        <translation>Hjälp</translation>
+    </message>
+    <message>
+        <source>&Bookmarks</source>
+        <translation type="vanished">&Bokmärke</translation>
+    </message>
+    <message>
+        <source>&Records</source>
+        <translation type="vanished">&Uppgifter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3136"/>
+        <source>&File</source>
+        <translation>&Fil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3154"/>
+        <source>&View</source>
+        <translation>&Vy</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3172"/>
+        <source>&Help</source>
+        <translation>&Hjälp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3188"/>
+        <source>&Data</source>
+        <translation>&Data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3192"/>
+        <source>&Advanced</source>
+        <translation>&Avancerad</translation>
+    </message>
+    <message>
+        <source>&Purge CPAP Data</source>
+        <translation type="vanished">&Rensa CPAP Data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3196"/>
+        <source>Purge Oximetery Data</source>
+        <translation>Radera Oximetry-data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3250"/>
+        <source>&Import Data</source>
+        <translation>&Importera Data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3253"/>
+        <source>Shift+F2</source>
+        <translation>Shift+F2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3258"/>
+        <source>&Preferences</source>
+        <translation>&Inställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3263"/>
+        <source>&Profiles</source>
+        <translation>&Profiler</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="276"/>
+        <source>E&xit</source>
+        <translation>G&å ur</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1606"/>
+        <source>Navigation</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="1993"/>
+        <source>Bookmarks</source>
+        <translation type="unfinished">Bokmärken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3077"/>
+        <source>Records</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3202"/>
+        <source>Purge ALL CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3212"/>
+        <source>Rebuild CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3268"/>
+        <source>Exit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3273"/>
+        <source>View &Daily</source>
+        <translation>Visa &Dagligen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3276"/>
+        <source>F5</source>
+        <translation>F5</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3281"/>
+        <source>View &Overview</source>
+        <translation>Vy &Översikt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3284"/>
+        <source>F6</source>
+        <translation>F6</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3289"/>
+        <source>View &Welcome</source>
+        <translation>View &Välkommen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3292"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3439"/>
+        <source>F4</source>
+        <translation>F4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3297"/>
+        <source>-</source>
+        <translation>-</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3300"/>
+        <source>Ctrl+Tab</source>
+        <translation>Ctrl+Tab</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3308"/>
+        <source>Use &AntiAliasing</source>
+        <translation>Använd &Antialias</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3313"/>
+        <source>&About SleepyHead</source>
+        <translation>&Om SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3321"/>
+        <source>&Fullscreen Toggle</source>
+        <translation>&Helskärm Växla</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3324"/>
+        <source>F11</source>
+        <translation>F11</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3332"/>
+        <source>Show Debug Pane</source>
+        <translation>Visa Felsöknings Fönster</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3337"/>
+        <source>&Reset Graph Layout</source>
+        <translation>&Återställ Graferna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3342"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="273"/>
+        <source>Check for &Updates</source>
+        <translation>Kontrollera om det finns nya &uppdateringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3347"/>
+        <source>Take &Screenshot</source>
+        <translation>Ta en &skärmdump</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3350"/>
+        <source>F12</source>
+        <translation>F12</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3355"/>
+        <source>O&ximetry Wizard</source>
+        <translation>O&ximetry Guiden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3381"/>
+        <source>Exp&ort Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3396"/>
+        <source>&Automatic Oximetry Cleanup</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3406"/>
+        <source>Purge &Current Selected Day</source>
+        <translation>Radera den &aktuella dagen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3425"/>
+        <source>F10</source>
+        <translation type="unfinished">F10</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3430"/>
+        <source>View S&tatistics</source>
+        <translation>Visa S&tatistik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3433"/>
+        <location filename="../sleepyhead/mainwindow.ui" line="3436"/>
+        <source>View Statistics</source>
+        <translation>Visa statistik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3454"/>
+        <source>&Support SleepyHead Development</source>
+        <translation>&Stöd SleepyHead:s utveckling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3464"/>
+        <source>Change &Language</source>
+        <translation>Ändra &Språk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3469"/>
+        <source>Change &Data Folder</source>
+        <translation>Ändra &Data-Mapp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3474"/>
+        <source>Import &Somnopose Data</source>
+        <translation>Importera &Somnopose Data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3479"/>
+        <source>Current Days</source>
+        <translation>Aktuella dagar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3520"/>
+        <source>Daily Calendar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3523"/>
+        <source>F9</source>
+        <translation type="unfinished">F9</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3528"/>
+        <source>Backup &Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>View O&ximetry</source>
+        <translation type="vanished">Visa O&ximetri</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3358"/>
+        <source>F7</source>
+        <translation>F7</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3363"/>
+        <source>Print &Report</source>
+        <translation>Skriv ut &Rapport</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3368"/>
+        <source>&Edit Profile</source>
+        <translation>&Redigera Profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3376"/>
+        <source>&Link Graph Groups</source>
+        <translation>&Länk Graf Grupp</translation>
+    </message>
+    <message>
+        <source>Exp&ort</source>
+        <translation type="vanished">Exp&ort</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3386"/>
+        <source>Online Users &Guide</source>
+        <translation>Online användar &Handbok</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3391"/>
+        <source>&Frequently Asked Questions</source>
+        <translation>&Återkommande frågor</translation>
+    </message>
+    <message>
+        <source>&Rebuild Oximetry Indices</source>
+        <translation type="vanished">&Uppdatera Oximetri Indexen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3401"/>
+        <source>Change &User</source>
+        <translation>Växla &Användare</translation>
+    </message>
+    <message>
+        <source>&Current Selected Day</source>
+        <translation type="vanished">&Aktuell vald dag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3411"/>
+        <source>All data for current CPAP machine</source>
+        <translation>Alla data för aktuell CPAP maskin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3422"/>
+        <source>Right &Sidebar</source>
+        <translation>Höger &meny</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3487"/>
+        <source>Toggle &Line Cursor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3490"/>
+        <source>Ctrl+L</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3506"/>
+        <source>Daily Sidebar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3509"/>
+        <source>F8</source>
+        <translation>F8</translation>
+    </message>
+    <message>
+        <source>View S&ummary</source>
+        <translation type="vanished">Visa S&ummering</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3444"/>
+        <source>Import &ZEO Data</source>
+        <translation>Import &ZEO Data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3449"/>
+        <source>Import RemStar &MSeries Data</source>
+        <translation>Import Remstar &MSeries Data</translation>
+    </message>
+    <message>
+        <source>&Support Sleepyhead Development</source>
+        <translation type="vanished">&Stöd SleepyHead Utveckling</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="3459"/>
+        <source>Sleep Disorder Terms &Glossary</source>
+        <translation>Sömnstörningar uttryck och &Ordlista</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="151"/>
+        <source>Profile</source>
+        <translation>Profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.ui" line="942"/>
+        <source>Welcome</source>
+        <translation>Välkommen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="272"/>
+        <source>&About</source>
+        <translation>&Om</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="300"/>
+        <source>Loading...</source>
+        <translation>Laddar...</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This pre-release build is meant for beta testers only. Please do <b>NOT</b> share outside the SleepyHead Testing Forum.</source>
+        <translation type="vanished"><b>Varning:</b> Denna förhands-version är avsedd endast för betatestare. Vänligen dela <b>INTE</b> detta program utanför SleepyHead Testing Forum.</translation>
+    </message>
+    <message>
+        <source>Please report bugs for this build to the SleepyHead Testing Forum, but first, check the release thread to ensure you are running the latest version.</source>
+        <translation type="vanished">Vänligen rapportera fel i denna version till SleepyHead Testing Forum, men börja med att spana in release tråden för att se till att du kör den senaste versionen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="318"/>
+        <source>When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model.</source>
+        <translation>Vid redovisning av buggar, vänligen se till att rapportera SleepyHead versionsnummer, operativsystem och CPAP maskinmodell.</translation>
+    </message>
+    <message>
+        <source><b>Warning:</b> This reports this software generates are not fit for compliance or medical diagnostic purposes.</source>
+        <translation type="vanished"><b>Varning:</b> Rapporterna som detta program genererar kan inte användas för användnings-rapportering eller för att ställa medicinska diagnoser.</translation>
+    </message>
+    <message>
+        <source>These messages are only a temporary feature. Some people thought they were an error.</source>
+        <translation type="vanished">Dom här meddelandena är bara en temporär funktion, En del personer har trott dom var felmeddelanden.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="609"/>
+        <source>Loading Data</source>
+        <translation>Laddar data</translation>
+    </message>
+    <message>
+        <source>CPAP data was recently purged and needs to be re-imported.</source>
+        <translation type="vanished">CPAP-data har nyligen rensats, och behöver åter importeras.</translation>
+    </message>
+    <message>
+        <source>Would you like this done automatically from the Backup Folder?</source>
+        <translation type="vanished">Vill du att detta görs automatiskt från Backup-mappen?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="720"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2062"/>
+        <source>Please wait, importing from backup folder(s)...</source>
+        <translation>Vänta, importerar från backup-mappen(s)...</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations:</source>
+        <translation type="vanished">Data-importen lyckades från:</translation>
+    </message>
+    <message>
+        <source>Couldn't find any new Machine Data at the locations given.</source>
+        <translation type="vanished">Kunde inte finna några nya maskin-data från den plats som angetts.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Import Problem</source>
+        <translation>Import problem</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="878"/>
+        <source>Please wait, scanning for CPAP data cards...</source>
+        <translation>Vänta, söker efter CPAP minnes-kort...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="821"/>
+        <source>Choose a folder</source>
+        <translation>Välj en mapp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="314"/>
+        <source><b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="315"/>
+        <source>If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="316"/>
+        <source>Make sure your keep your SleepyHead data folder backed up when trying testing versions.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="317"/>
+        <source>Please ensure you are running the latest version before reporting any bugs.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="319"/>
+        <source>Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="320"/>
+        <source>Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="321"/>
+        <source>This red message line is intentional, and will not be a feature in the final version...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Imported %1 CPAP session(s) from
+
+%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="682"/>
+        <source>Import Success</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Already up to date with CPAP data at
+
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="684"/>
+        <source>Up to date</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="686"/>
+        <source>Couldn't find any valid Machine Data at
+
+%1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="814"/>
+        <source>Please insert your CPAP data card...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="866"/>
+        <source>Access to Import has been blocked while recalculations are in progress.</source>
+        <translation>Tillgången till import har blockerats medan omräkning pågår.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="892"/>
+        <source>A %1 file structure for a %2 was located at:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="894"/>
+        <source>A %1 file structure was located at:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="899"/>
+        <source>CPAP Data Located</source>
+        <translation>CPAP-data hittades</translation>
+    </message>
+    <message>
+        <source>CPAP Datacard structures were detected at the following locations:</source>
+        <translation type="vanished">CPAP minneskort-data hittades på följande plats:</translation>
+    </message>
+    <message>
+        <source>Would you like to import from the path(s) shown above?</source>
+        <translation type="vanished">Vill du importera från den plats(s) som visas ovan?</translation>
+    </message>
+    <message>
+        <source>Select another folder</source>
+        <translation type="vanished">Välj en anna mapp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="916"/>
+        <source>Please wait, launching file dialog...</source>
+        <translation>Vänta, visar fil-hanteraren...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="922"/>
+        <source>No CPAP data card detected, launching file dialog...</source>
+        <translation>Inget CPAP minneskort hittades, visar fil-hanteraren...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="928"/>
+        <source>Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder.</source>
+        <translation>Kom ihåg att markera "roten" på det minneskort där du har CPAP-data, och inte en under-mapp. Tex: (G:).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="929"/>
+        <source>Import Reminder</source>
+        <translation>Import påminnelse</translation>
+    </message>
+    <message>
+        <source>Please wait, SleepyHead is importing data...</source>
+        <translation type="vanished">Vänta, SleepyHead importerar data...</translation>
+    </message>
+    <message>
+        <source>Data successfully imported from the following locations
+
+</source>
+        <translation type="vanished">Data-importen lyckades från följande plats
+
+</translation>
+    </message>
+    <message>
+        <source>Import from where?</source>
+        <translation type="vanished">Importera från vart?</translation>
+    </message>
+    <message>
+        <source>Do you just want to Import from the usual (remembered) locations?
+</source>
+        <translation type="vanished">Vill du importera från den vanliga platsen?</translation>
+    </message>
+    <message>
+        <source>The Usual</source>
+        <translation type="vanished">Den vanliga</translation>
+    </message>
+    <message>
+        <source>New Location</source>
+        <translation type="vanished">Ny plats</translation>
+    </message>
+    <message>
+        <source>Cancel</source>
+        <translation type="vanished">Avbryt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1017"/>
+        <source>Importing Data</source>
+        <translation>Importerar data</translation>
+    </message>
+    <message>
+        <source>Remember this Location?</source>
+        <translation type="vanished">Kom ihåg denna plats?</translation>
+    </message>
+    <message>
+        <source>Would you like to remember this import location for next time?</source>
+        <translation type="vanished">Vill du komma ihåg den här import platsen till nästa gång?</translation>
+    </message>
+    <message>
+        <source>Import Problem
+
+Couldn't find any new Machine Data at the locations given</source>
+        <translation type="vanished">Import Problem
+
+Det gick inte att hitta några nya maskindata på de platser som angetts</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="901"/>
+        <source>Would you like to import from this location?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="905"/>
+        <source>Specify</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1079"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Välkommen till SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1082"/>
+        <source>About SleepyHead</source>
+        <translation>Om SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1083"/>
+        <source>This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.</source>
+        <translation>Det här programmet har skapats för att hjälpa dig visa den data som samlas av CPAP-maskinen, för att underlätta i behandlingen av SömnApne.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1085"/>
+        <source>SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.</source>
+        <translation>SleepyHead har utvecklats av en programmerare med egen erfarenhet av sömnapne, tillsammans med många andra som använder programmet och hjälper till att utveckla det.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1087"/>
+        <source>This is a beta release, some features may not yet behave as expected.</source>
+        <translation>Det här är en test-version av programmet, och vissa funktioner kanske inte fungerar som förväntat.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1088"/>
+        <source>Please report any bugs you find to SleepyHead's SourceForge page.</source>
+        <translation>Rapportera fel och buggar du hittar till SleepyHead´s SourceForge page.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1090"/>
+        <source>Currenly supported machines:</source>
+        <translation>Maskiner som stöds för närvarande:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1091"/>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1092"/>
+        <source>Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)</source>
+        <translation>Philips Respironics System One (CPAP Pro, Auto, BIPAP & ASV models)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1093"/>
+        <source>ResMed S9 models (CPAP, Auto, VPAP)</source>
+        <translation>ResMed S9 models (CPAP, Auto, VPAP)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1094"/>
+        <source>DeVilbiss Intellipap (Auto)</source>
+        <translation>DeVilbiss Intellipap (Auto)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1095"/>
+        <source>Fisher & Paykel ICON (CPAP, Auto)</source>
+        <translation>Fisher & Paykel ICON (CPAP, Auto)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1097"/>
+        <source>Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters</source>
+        <translation>Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1098"/>
+        <source>ResMed S9 Oximeter Attachment</source>
+        <translation>ResMed S9 Oximeter Attachment</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1099"/>
+        <source>Online Help Resources</source>
+        <translation>Online Frågor och Svar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1100"/>
+        <source>Note:</source>
+        <translation>Notering:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1101"/>
+        <source>I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.</source>
+        <translation>Jag rekomenderar inte att använda denna webläsare till normal surfning på internet, den fungerar men är huvudsakligen avsedd för hjälpavsnittet.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1103"/>
+        <source>(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)</source>
+        <translation>(SSL kryptering stöds inte, så det är ingen bra ide att skriva lösenord och personlig information här.)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1106"/>
+        <source>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Users Guide</a><br/></source>
+        <translation>SleepyHead's Online <a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide">Användarmanual</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1108"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Frequently Asked Questions</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions">Vanliga frågor</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1110"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Glossary of Sleep Disorder Terms</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary">Ordlista för SömnApne</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1112"/>
+        <source><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></source>
+        <translation><a href="http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page">SleepyHead Wiki</a><br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1114"/>
+        <source>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/></source>
+        <translation>SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Hemsida</a> på SourceForge<br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1116"/>
+        <source>Further Information</source>
+        <translation>Vidare Information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1118"/>
+        <source>Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version.</source>
+        <translation>Här är <a href='qrc:/docs/release_notes.html'>nyheter</a> för denna vesion.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1120"/>
+        <source>Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users.</source>
+        <translation>Plus några <a href='qrc:/docs/usage.html'>bra att veta</a>, samt viktig information för MAC-användare.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1122"/>
+        <source>About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia</source>
+        <translation>Om <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>SömnApne</a> på Wikipedia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1125"/>
+        <source>Friendly forums to talk and learn about Sleep Apnea:</source>
+        <translation>Trevligt forum för att prata om och lära sig mer om SömnApne:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1126"/>
+        <source><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</source>
+        <translation><a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1127"/>
+        <source><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></source>
+        <translation><a href='http://www.apneaboard.com/forums/'>Apnea Board</a></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>Copyright:</source>
+        <translation>Copyright:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1135"/>
+        <source>&copy;2011-2014</source>
+        <translation>&copy;2011-2014</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1137"/>
+        <source>License:</source>
+        <translation>Licens:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1138"/>
+        <source>This software is released freely under the <a href="qrc:/COPYING">GNU Public License</a>.</source>
+        <translation>Det här programmet får användas fritt under <a href="qrc:/COPYING">GNU Public License</a>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1141"/>
+        <source>DISCLAIMER:</source>
+        <translation>ANSVARSFRISKRIVNING:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1143"/>
+        <source>This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.</source>
+        <translation>Det här är <font color='red'><u>INTE</u></font> medicinsk programvara. Det här programmet är enbart till för att visa data, och inga garantier ges på noggranhet och korrekthet hos beräkningar eller visade data.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1145"/>
+        <source>The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.</source>
+        <translation>Upphovsmannen eller översättarna kan INTE hållas ansvariga om någon skadar sig själv eller andra genom att använda denna programvara.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1147"/>
+        <source>Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.</source>
+        <translation>Din doktor ska alltid vara ditt första och bästa val av vägledning beträffande den viktiga frågan om att bäst hantera din egen hälsa.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1149"/>
+        <source>*** <u>Use at your own risk</u> ***</source>
+        <translation>*** <u>Använd på egen risk</u> ***</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1293"/>
+        <source>Loading</source>
+        <translation>Laddar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>Revision:</source>
+        <translation>Ändring:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1313"/>
+        <source>branch</source>
+        <translation>branch</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1327"/>
+        <source>Build Date: %1 %2</source>
+        <translation>Skapad: %1 %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1329"/>
+        <source>Graphics Engine: %1</source>
+        <translation>Grafik Motor: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1331"/>
+        <source>Data Folder Location: <a href="file://%1">%2</a></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1355"/>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1366"/>
+        <source>Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2037"/>
+        <source>Are you sure you want to rebuild all CPAP data for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2040"/>
+        <source>Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2048"/>
+        <source>For some reason, SleepyHead does not have internal backups for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2051"/>
+        <source>Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2052"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation type="unfinished">Är du verkligen säker på att du vill göra detta?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2065"/>
+        <source>Because there are no internal backups to rebuild from, you will have to restore from your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2066"/>
+        <source>Would you like to import from your own backups now? (you will have no data visible for this machine until you do)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2097"/>
+        <source>You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2100"/>
+        <source>Note as a precaution, the backup folder will be left in place.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2101"/>
+        <source>Are you <b>absolutely sure</b> you want to proceed?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2124"/>
+        <source>A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2649"/>
+        <source>%1's Journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>Choose where to save journal</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2651"/>
+        <source>XML Files (*.xml)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Data Folder Location: %1</source>
+        <translation type="vanished">Data-mapp sökväg: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1333"/>
+        <source>This software is released under the GNU Public License v3.0<br/></source>
+        <translation>Det här programmet är skapat under GNU Public License v3.0<br/></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1344"/>
+        <source>Don't forget to Like/+1 SleepyHead on <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</source>
+        <translation>Glöm inte att gilla/+1 SleepyHead på <a href="http://www.facebook.com/SleepyHeadCPAP">Facebook</a> or <a href="http://plus.google.com/u/0/b/101426655252362287937">Google+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1349"/>
+        <source>SleepyHead, brought to you by Jedimark</source>
+        <translation>SleepyHead, skapad för dig av Jedimark</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1353"/>
+        <source>Kudos & Credits</source>
+        <translation>Stort tack till medverkande</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1354"/>
+        <source>Bugfixes, Patches and Platform Help:</source>
+        <translation>Buggfixar, Uppdateringar och Utvecklingshjälp:</translation>
+    </message>
+    <message>
+        <source>James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone.</source>
+        <translation type="vanished">James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl and Roy Stone.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1358"/>
+        <source>Translators:</source>
+        <translation>Översättare:</translation>
+    </message>
+    <message>
+        <source>Arie Klerk (Dutch), Steffen Reitz (German), and others I've still to add here.</source>
+        <translation type="vanished">Arie Klerk (Holländska), Steffen Reitz (Tyska), Lars-Erik Söderström (Svenska), och andra som allt eftersom kommer att läggas in här.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1361"/>
+        <source>3rd Party Libaries:</source>
+        <translation>3:e parts bibliotek:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1362"/>
+        <source>SleepyHead is built using the <a href="http://qt-project.org">Qt Application Framework</a>.</source>
+        <translation>SleepyHead är utvecklad med hjälp av <a href="http://qt-project.org">Qt Application Framework</a>.</translation>
+    </message>
+    <message>
+        <source>It uses the cross platform <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> library for serial port access in the Oximetry module.</source>
+        <translation type="vanished">Det använder plattformen <a href="http://code.google.com/p/qextserialport">QExtSerialPort</a> bibliotek för seriell port-anslutning i Oximeter-modulen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1364"/>
+        <source>In the updater code, SleepyHead uses <a href="http://sourceforge.net/projects/quazip">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.</source>
+        <translation>I översättnings-koden, använder SleepyHead <a href="http://sourceforge.net/projects/quazip">QuaZip</a> av Sergey A. Tachenov, som är ett C++ omslag över Gilles Vollant's ZIP/UNZIP paket.</translation>
+    </message>
+    <message>
+        <source>Special thanks to Pugsy from <a href='http://cpaptalk.com'>CPAPTalk</a> for her help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.</source>
+        <translation type="vanished">Ett speciellt tack till Pugsy från <a href='http://cpaptalk.com'>CPAPTalk</a> för hennes hjälp med dokumentation och vägledning, likaså alla andra som hjälpt till med testning och med att delat sina personliga cpap-data.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1371"/>
+        <source>Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.</source>
+        <translation>Tack för att du använder SLeepyHead Om du finner SleepyHead användbart så överväg gärna att stödja framtida utveckling genom att skänka en slant via PayPal.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1376"/>
+        <source>This software comes with absolutely no warranty, either express of implied.</source>
+        <translation>Denna programvara levereras utan garanti, varken uttryckligen eller underförstått.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1377"/>
+        <source>It comes with no guarantee of fitness for any particular purpose.</source>
+        <translation>Den levereras utan garanti för dess lämplighet för ett visst ändamål.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1378"/>
+        <source>No guarantees are made regarding the accuracy of any data this program displays.</source>
+        <translation>Inga garantier kan lämnas för riktigheten av dom uppgifter detta program visar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1380"/>
+        <source>This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.</source>
+        <translation>Detta är inte en medicinsk programvara, det är bara ett forskningsverktyg som ger en visuell tolkning av uppgifter som registrerats av dom enheter som stöds.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1382"/>
+        <source>This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.</source>
+        <translation>Denna programvaras ändamål är inte lämplig för medicinsk diagnostik, inte heller är den lämplig för CPAP användnings-rapportering, eller någon annan medicinsk användning för den delen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1385"/>
+        <source>The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.</source>
+        <translation>Författaren och någon som är tillhörande med honom tar inte ansvar för skador, frågor eller icke-frågor till följd av användning eller felaktig användning av denna programvara.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1387"/>
+        <source>Use this software entirely at your own risk.</source>
+        <translation>Använd denna programvara helt på egen risk.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1545"/>
+        <source>There was an error saving screenshot to file "%1"</source>
+        <translation>Det uppstod ett fel när skärmdumpen skulle sparas till filen "%1"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1547"/>
+        <source>Screenshot saved to file "%1"</source>
+        <translation>Skärmdumpen sparades till filen "%1"</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:</source>
+        <translation type="vanished">Är du säker på att du vill rensa alla CPAP uppgifter för följande maskin:</translation>
+    </message>
+    <message>
+        <source>Not all session data could be removed, you have to delete the following folder manually.</source>
+        <translation type="vanished">Inte alla sovperiods-data kan tas bort, du måste ta bort följande mapp manuellt.</translation>
+    </message>
+    <message>
+        <source>Machine data has been successfully purged.</source>
+        <translation type="vanished">Maskin data har raderats.</translation>
+    </message>
+    <message>
+        <source>Would you like to reimport from the backup folder?</source>
+        <translation type="vanished">Vill du importera en gång till från säkerhetskopierings-mappen?</translation>
+    </message>
+    <message>
+        <source>Please wait, importing...</source>
+        <translation type="vanished">Vänta, importerar ...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2492"/>
+        <source>There was a problem opening Somnopose Data File: </source>
+        <translation>Det gick inte att öppna Somnopose datafil:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2496"/>
+        <source>Somnopause Data Import complete</source>
+        <translation>Somnopose Data-Import komplett</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2587"/>
+        <source>Are you sure you want to delete oximetry data for %1</source>
+        <translation>Är du säker på att du vill ta bort oximetridata för %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2589"/>
+        <source><b>Please be aware you can not undo this operation!</b></source>
+        <translation><b>Tänk på att du INTE kan ångra den här åtgärden!</b></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2609"/>
+        <source>Select the day with valid oximetry data in daily view first.</source>
+        <translation>Markera dagen med giltiga oximetridata i daglig vy först.</translation>
+    </message>
+    <message>
+        <source>Build Date</source>
+        <translation type="vanished">Skapad den</translation>
+    </message>
+    <message>
+        <source>Data Folder</source>
+        <translation type="vanished">Data katalog</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1332"/>
+        <source>Copyright</source>
+        <translation>Copyright</translation>
+    </message>
+    <message>
+        <source>This software is released under the GNU Public License v3.0<br></source>
+        <translation type="vanished">Denna programvara är släppt under GNU Public License v3.0 <br></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1337"/>
+        <source>SleepyHead Project Page</source>
+        <translation>SleepyHead projekt sida</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1340"/>
+        <source>SleepyHead Wiki</source>
+        <translation>SleepyHead Wiki</translation>
+    </message>
+    <message>
+        <source>Authors Twitter Feed</source>
+        <translation type="vanished">Författare till Twitter flöde</translation>
+    </message>
+    <message>
+        <source><p>The author wishes to express thanks to James Marshall and Rich Freeman for their assistance with this project.</p></source>
+        <translation type="vanished"><p> Författaren vill framföra tack till James Marshall och Rich Freeman för deras hjälp med det här projektet. </ p></translation>
+    </message>
+    <message>
+        <source>This software comes with absolutely no warranty, either express of implied. It comes with no guarantee of fitness for any particular purpose. No guarantees are made regarding the accuracy of any data this program displays.</source>
+        <translation type="vanished">
+Denna programvara levereras med absolut ingen garanti, vare sig uttryckligen eller underförstådd. Den kommerinte  med någon garanti för lämplighet för ett visst ändamål. Inga garantier kan lämnas beträffande giltigheten av data som programmet visar.</translation>
+    </message>
+    <message>
+        <source>This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices. This software is NOT suitable for medical diagnosis, CPAP complaince reporting and other similar purposes.</source>
+        <translation type="vanished">
+Detta är inte medicinsk programvara, utan det är bara ett forskningsverktyg som ger en visuell tolkning av uppgifter som registrerats av enheter som stöds. Denna programvara är inte lämplig för medicinsk diagnos, CPAP complaince rapportering och andra liknande ändamål.</translation>
+    </message>
+    <message>
+        <source>The author and any associates of his accept NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software<br/>Use this software entirely at your own risk.</source>
+        <translation type="vanished">
+Författaren och alla medarbetare tar inte ansvar för skador, problem eller icke-problem till följd av användning eller felaktig användning av denna programvara <br/> Använd denna programvara helt på egen risk.</translation>
+    </message>
+    <message>
+        <source>If you find this free software to be of use, please consider supporting the development efforts by making a paypal donation to the Author</source>
+        <translation type="vanished">Om du tycker den här fria programvaran är användbar, överväg att stödja utvecklingsarbetet genom att göra en paypal donation till författaren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1456"/>
+        <source>Access to Preferences has been blocked until recalculation completes.</source>
+        <translation>Tillgång till Preferences har blockerats tills omräkning avslutas.</translation>
+    </message>
+    <message>
+        <source>Question</source>
+        <translation type="vanished">Fråga</translation>
+    </message>
+    <message>
+        <source>Do you have a CMS50[x] Oximeter?
+One is required to use this section.</source>
+        <translation type="vanished">Har du en CMS50 [x] Oximeter?
+Den är nödvändig för att använda det här avsnittet.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1567"/>
+        <source>Printing Disabled</source>
+        <translation>Utskrift inaktiverad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1568"/>
+        <source>Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt</source>
+        <translation>
+Vänligen återuppbygg Sleepyhead med Qt 4.8.5 eller högre, eftersom utskriften orsakar en krasch med denna version av Qt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>Gah!</source>
+        <translation>Gah!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1901"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1922"/>
+        <source>If you can read this, the restart command didn't work. Your going to have to do it yourself manually.</source>
+        <translation>
+Om du kan läsa detta, fungerade inte kommandot omstart . Du kommer att behöva göra det själv manuellt.</translation>
+    </message>
+    <message>
+        <source>Are you sure?</source>
+        <translation type="vanished">Är du säker?</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to purge all CPAP data for the following machine:
+</source>
+        <translation type="vanished">Är du säker på att du vill rensa alla CPAP uppgifter till följande maskiner:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2287"/>
+        <source>Performance will be degraded during these recalculations.</source>
+        <translation>Prestandan försämras under dessa omräkningar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2288"/>
+        <source>Recalculating Indices</source>
+        <translation>Räknar om indexen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2300"/>
+        <source>Loading Event Data</source>
+        <translation>Laddar händelse data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2302"/>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2362"/>
+        <source>Recalculating Summaries</source>
+        <translation>Räknar om Sammanfattning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2374"/>
+        <source>Restart Required</source>
+        <translation>Omstart krävs</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2375"/>
+        <source>Recalculations are complete, the application now needs to restart to display the changes.</source>
+        <translation>Omräkningar är klar, programmet behöver nu starta om för att visa ändringarna.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Recalculations are now complete.</source>
+        <translation>Omräkningen är nu klar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2380"/>
+        <source>Task Completed</source>
+        <translation>Uppgiften är klar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2404"/>
+        <source>There was a problem opening ZEO File: </source>
+        <translation>Det var ett problem att öppna ZEO Fil: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2408"/>
+        <source>Zeo CSV Import complete</source>
+        <translation>Zeo CSV import är klar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2430"/>
+        <source>There was a problem opening MSeries block File: </source>
+        <translation>Det var ett problem att öppna MSeries block fil: </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="2434"/>
+        <source>MSeries Import complete</source>
+        <translation>MSeries Import är klar</translation>
+    </message>
+</context>
+<context>
+    <name>MinMaxWidget</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1773"/>
+        <source>Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1774"/>
+        <source>Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1775"/>
+        <source>Override</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1776"/>
+        <source>The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1782"/>
+        <source>The Minimum Y-Axis value.. Note this can be a negative number if you wish.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1783"/>
+        <source>The Maximum Y-Axis value.. Must be greater than Minimum to work.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1818"/>
+        <source>Scaling Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1840"/>
+        <source>This button resets the Min and Max to match the Auto-Fit</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>NewProfile</name>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="14"/>
+        <source>Edit User Profile</source>
+        <translation>Redigera användarprofil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="54"/>
+        <source>about:blank</source>
+        <translation type="unfinished">om:tom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="70"/>
+        <source>I agree to all the conditions above.</source>
+        <translation>Jag godkänner alla villkor ovan.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="111"/>
+        <source>User Information</source>
+        <translation>Användar-information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="137"/>
+        <source>User Name</source>
+        <translation>Användar-namn</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="152"/>
+        <source>Keep the kids out.. Nothing more.. This isn't meant to be uber security.</source>
+        <translation>Håll barnen ifrån programmet...inte mer... det här är inte tänkt att vara topphemligt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="155"/>
+        <source>Password Protect Profile</source>
+        <translation>Lösenordsskyddad profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="182"/>
+        <source>Password</source>
+        <translation>Lösenord</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="196"/>
+        <source>...twice...</source>
+        <translation>...2 gånger...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="213"/>
+        <source>Locale Settings</source>
+        <translation>Lokala inställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="285"/>
+        <source>Country</source>
+        <translation>Land</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="253"/>
+        <source>TimeZone</source>
+        <translation>Tids-zone</translation>
+    </message>
+    <message>
+        <source>qrc:/docs/update_notes.html</source>
+        <translation type="vanished">qrc:/docs/update_notes.html</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="240"/>
+        <source>DST Zone</source>
+        <translation>DST zone</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="320"/>
+        <source>Personal Information (for reports)</source>
+        <translation>Personlig information (för rapporter)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="344"/>
+        <source>First Name</source>
+        <translation>Förnamn</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="354"/>
+        <source>Last Name</source>
+        <translation>Efternamn</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="364"/>
+        <source>D.O.B.</source>
+        <translation>Födelsedatum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="380"/>
+        <source>Gender</source>
+        <translation>Kön</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="393"/>
+        <source>Male</source>
+        <translation>Man</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="398"/>
+        <source>Female</source>
+        <translation>Kvinna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="414"/>
+        <source>Height</source>
+        <translation>Längd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="453"/>
+        <source>metric</source>
+        <translation>Metrisk</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="458"/>
+        <source>archiac</source>
+        <translation>?????</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="471"/>
+        <source>Contact Information</source>
+        <translation>Kontakt information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="498"/>
+        <location filename="../sleepyhead/newprofile.ui" line="773"/>
+        <source>Address</source>
+        <translation>Adress</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="515"/>
+        <location filename="../sleepyhead/newprofile.ui" line="804"/>
+        <source>Email</source>
+        <translation>E-post</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="525"/>
+        <location filename="../sleepyhead/newprofile.ui" line="794"/>
+        <source>Phone</source>
+        <translation>Telefon</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="570"/>
+        <source>CPAP Treatment Information</source>
+        <translation>CPAP behandlingsinformation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="597"/>
+        <source>Date Diagnosed</source>
+        <translation>Datum för diagnos</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="611"/>
+        <source>Untreated AHI</source>
+        <translation>Obehandlad AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="625"/>
+        <source>CPAP Mode</source>
+        <translation>CPAP-inställning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="633"/>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="638"/>
+        <source>APAP</source>
+        <translation>APAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="643"/>
+        <source>Bi-Level</source>
+        <translation>Bi-Level</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="648"/>
+        <source>ASV</source>
+        <translation>ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="656"/>
+        <source>RX Pressure</source>
+        <translation>Föreskrivet tryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="702"/>
+        <source>Doctors / Clinic Information</source>
+        <translation>Doktors journalföring</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="729"/>
+        <source>Doctors Name</source>
+        <translation>Sömn-doktor</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="746"/>
+        <source>Practice Name</source>
+        <translation>Sjukhus/avd.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="756"/>
+        <source>Patient ID</source>
+        <translation>Patient ID</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="852"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="867"/>
+        <source>TextLabel</source>
+        <translation>Textfält</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="943"/>
+        <source>&Cancel</source>
+        <translation>&Avbryt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="959"/>
+        <source>&Back</source>
+        <translation>&tillbaka</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.ui" line="975"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="275"/>
+        <location filename="../sleepyhead/newprofile.cpp" line="284"/>
+        <source>&Next</source>
+        <translation>&nästa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="59"/>
+        <source>Select Country</source>
+        <translation>Välj land</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="109"/>
+        <source>Welcome to SleepyHead</source>
+        <translation>Välkommen till SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="111"/>
+        <source>This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.</source>
+        <translation>Denna programvara är utformad för att hjälpa dig att granska dom sömn-data som sparas av din CPAP-maskin varje natt och tillhörande utrustning.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="114"/>
+        <source>SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose.</source>
+        <translation>Sleepyhead har släppts fritt under <a href='qrc:/COPYING'> GNU Public License </a>, och kommer inte med någon garanti, och utan några anspråk på att vara lämpligt för något ändamål.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="116"/>
+        <source>PLEASE READ CAREFULLY</source>
+        <translation>VAR VÄNLIG OCH LÄS DETTA NOGA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="117"/>
+        <source>SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.</source>
+        <translation>Sleepyhead är avsedd enbart för att visa sömn-data, och är definitivt inte en ersättning för kompetent medicinsk rådgivning från din läkare.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="120"/>
+        <source>Accuracy of any data displayed is not and can not be guaranteed.</source>
+        <translation>Noggrannhet av alla data som visas är inte och kan inte garanteras.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="122"/>
+        <source>Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.</source>
+        <translation>Alla rapporter som genereras är FÖR PERSONLIG BRUK, och passar INTE PÅ NÅGOT SÄTT  för efterlevnad eller för  medicinska diagnostiska ändamål.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="125"/>
+        <source>The author will not be held liable for <u>anything</u> related to the use or misuse of this software.</source>
+        <translation>Författaren kan inte hållas ansvarig för <u>någonting</u> i samband med användning eller missbruk av denna programvara.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="129"/>
+        <source>Use of this software is entirely at your own risk.</source>
+        <translation>Användning av denna programvara sker helt på egen risk.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="132"/>
+        <source>SleepyHead is copyright &copy;2011-2014 Mark Watkins</source>
+        <translation>Sleepyhead är copyright &copy;2011-2014 Mark Watkins</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="157"/>
+        <source>Please provide a username for this profile</source>
+        <translation>Ange ett användarnamn för den här profilen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="167"/>
+        <source>Passwords don't match</source>
+        <translation>Lösenorden matchar inte</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Profile Changes</source>
+        <translation>Profil-ändringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="197"/>
+        <source>Accept and save this information?</source>
+        <translation>Acceptera och spara denna information?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="273"/>
+        <source>&Finish</source>
+        <translation>&Avsluta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/newprofile.cpp" line="449"/>
+        <source>&Close this window</source>
+        <translation>&Stäng detta fönster</translation>
+    </message>
+</context>
+<context>
+    <name>Overview</name>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulär</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="68"/>
+        <source>Range:</source>
+        <translation>Intervall:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="82"/>
+        <source>Last Week</source>
+        <translation>Förra veckan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="87"/>
+        <source>Last Two Weeks</source>
+        <translation>Senaste 2 veckorna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="92"/>
+        <source>Last Month</source>
+        <translation>Senaste månaden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="97"/>
+        <source>Last Two Months</source>
+        <translation>Senaste 2 månaderna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="102"/>
+        <source>Last Three Months</source>
+        <translation>Senaste 3 månaderna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="107"/>
+        <source>Last 6 Months</source>
+        <translation>Senaste 6 månaderna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="112"/>
+        <source>Last Year</source>
+        <translation>Senaste året</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="117"/>
+        <source>Everything</source>
+        <translation>Allt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="122"/>
+        <source>Custom</source>
+        <translation>Anpassa</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="130"/>
+        <source>Start:</source>
+        <translation>Börja:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="153"/>
+        <source>End:</source>
+        <translation>Avsluta:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="176"/>
+        <source>Reset view to selected date range</source>
+        <translation>Återställ vy till valt datum intervall</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="195"/>
+        <location filename="../sleepyhead/overview.ui" line="244"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="225"/>
+        <source>Toggle Graph Visibility</source>
+        <translation>Växla grafens synlighet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="260"/>
+        <source>Drop down to see list of graphs to switch on/off.</source>
+        <translation>Öppna meny för att se lista på grafer att visa/dölja.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.ui" line="264"/>
+        <source>Graphs</source>
+        <translation>Grafer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="121"/>
+        <source>Respiratory
+Disturbance
+Index</source>
+        <translation>Andnings (Respiratory)
+Störnings (Disturbance)
+Index</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="123"/>
+        <source>Apnea
+Hypopnea
+Index</source>
+        <translation>Apnea
+Hypopnea
+Index</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage</source>
+        <translation>Användning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="127"/>
+        <source>Usage
+(hours)</source>
+        <translation>Användning (timmar)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times</source>
+        <translation>Antal Perioder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="142"/>
+        <source>Session Times
+(hours)</source>
+        <translation>Periodens Timmar</translation>
+    </message>
+    <message>
+        <source>% in PB</source>
+        <translation type="vanished">% in PB</translation>
+    </message>
+    <message>
+        <source>Periodic
+Breathing
+(% of night)</source>
+        <translation type="vanished">Periodisk
+Andning
+(% av natten)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>% in %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="147"/>
+        <source>%1
+(% of night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="148"/>
+        <source>Large Leaks
+(% of night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI</source>
+        <translation>Högsta RDI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="151"/>
+        <source>Peak RDI
+Shows RDI Clusters
+(RDI/hr)</source>
+        <translation>Högsta RDI
+Visar RDI Kluster
+(RDI/tim)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI</source>
+        <translation>Högsta AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="153"/>
+        <source>Peak AHI
+Shows AHI Clusters
+(AHI/hr)</source>
+        <translation>Högsta AHI
+Visar AHI Kluster
+(AHI/tim)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="157"/>
+        <source>Tidal
+Volume
+(ml)</source>
+        <translation>Tidal
+Volym
+(ml)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="158"/>
+        <source>Minute
+Ventilation
+(L/min)</source>
+        <translation>Minut
+Ventilation
+(L/min)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="159"/>
+        <source>Target
+Ventilation
+(L/min)</source>
+        <translation>Mål
+Ventilation
+(L/min)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="160"/>
+        <source>Patient
+Triggered
+Breaths
+(%)</source>
+        <translation>Patient
+Triggade
+Andetag
+(%)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="161"/>
+        <source>
+(count)</source>
+        <translation>
+(räkna)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="163"/>
+        <source>Oxygen Saturation
+(%)</source>
+        <translation>Syremättnad
+(%)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="164"/>
+        <source>SensAwake
+(count)</source>
+        <translation>SensAwake
+(räkna)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="167"/>
+        <source>Body
+Mass
+Index</source>
+        <translation>Body
+Mass
+Index</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="168"/>
+        <source>How you felt
+(0-10)</source>
+        <translation>Hur du känner dig
+(0-10)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="185"/>
+        <source>Zombie Meter</source>
+        <translation>Zombis Mätare</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="254"/>
+        <source>breaths/min</source>
+        <translation>andetag/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="262"/>
+        <source>L/b</source>
+        <translation>L/b</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="284"/>
+        <source>%PTB</source>
+        <translation>%PTB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="311"/>
+        <source>% PB</source>
+        <translation>% PB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="314"/>
+        <source>% %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="670"/>
+        <source>Show all graphs</source>
+        <translation>Visa alla grafer</translation>
+    </message>
+    <message>
+        <source>No Graphs On!</source>
+        <translation type="vanished">Inga grafer på!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/overview.cpp" line="683"/>
+        <source>Hide all graphs</source>
+        <translation>Dölj alla grafer</translation>
+    </message>
+</context>
+<context>
+    <name>OximeterImport</name>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="14"/>
+        <source>Dialog</source>
+        <translation>Dialog</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="39"/>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="35"/>
+        <source>Oximeter Import Wizard</source>
+        <translation>Oximeter import-guid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(Translators, please don't touch this yet.. it will be split up)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:18pt;">Welcome to the Oximeter Import Wizard</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SleepyHead is currently compatible with Contec CMS50D+, CMS50E and CMS50F serial oximeters.<br />(Note: Direct importing from bluetooth models is <span style=" font-weight:600;">not</span> supported yet)</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">It also can read from ChoiceMMed MD300W1 oximeter .dat files.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Please remember: </span><span style=" font-weight:600; font-style:italic;">If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!</span></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Important Notes: </span>For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, <a href="http://sleepyhead.sf.net/">&l [...]
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="749"/>
+        <source>Skip this page next time.</source>
+        <translation>Hoppa över den här sidan nästa gång.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="789"/>
+        <source><html><head/><body><p>SleepyHead fully supports Contec CMS50D+/E/F serial oximeters, <br/>as well as data files made by ChoiceMMed MD300W1 oximeters' software.</p></body></html></source>
+        <translation><html><head/><body><p>SleepyHead stöder fullt ut Contec CMS50D+/E/F serial oximeters, <br/>och även data-filer gjorda av ChoiceMMed MD300W1 oximeters' mjukvara.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="823"/>
+        <source>Where would you like to import from?</source>
+        <translation>Vart vill du importera ifrån?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="846"/>
+        <source><html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html></source>
+        <translation><html><head/><body><p>Det här alternativet gör att du kan importera (via kabel) från dina oximetrars interna inspelningar. </p><p>När du har valt detta alternativ, kommer vissa oximetrar kräver att du väljer något på enhetsmenyn för att inleda uppladdningen. </p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="852"/>
+        <source>Directly from a recording on a device</source>
+        <translation>Direkt från en inspelning på en enhet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="872"/>
+        <source><html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html></source>
+        <translation><html><head/><body><p>Om du inte har något emot att vara ansluten till en dator som är påslagen över natten, kan detta alternativ ge en användbar plethysomogram kurva, vilket ger en indikation på hjärtrytmen, ovanpå den normala oximetri avläsningen.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="878"/>
+        <source>Record attached to computer overnight (provides plethysomogram)</source>
+        <translation>Registrering ansluten till datorn över natten (erbjuder plethysomogram)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="895"/>
+        <source><html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html></source>
+        <translation><html><head/><body><p>Det här alternativet tillåter dig att importera från datafiler som skapats av program som följde med pulsoximetern, tex: SpO2Review.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="901"/>
+        <source>Import from a datafile saved by another program, like SpO2Review</source>
+        <translation>Importera från en datafil som sparats av ett annat program, tex: SpO2Review</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="942"/>
+        <source><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?</span></p><p>If you forget, you won't have a valid time to sync this oximetry session to.<br/><br/>To a ensure good sync between devices, always try to start both at the same time.</p>& [...]
+        <translation><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Påminnelse för CPAP-användare: </span><span style=" color:#fb0000;">Kom du ihåg att importera dina CPAP inspelningar först?</span></p><p>Om du har glömt, har du inte en giltig tid att synkronisera denna oximetri inspelning med.<br/><br/>För att säkerställa god synkronisering mellan enheter, försök alltid  [...]
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="964"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1000"/>
+        <source>Please connect your oximeter device</source>
+        <translation>Anslut din oximeter enhet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1026"/>
+        <source>Press Start to commence recording</source>
+        <translation>Tryck på Start för att påbörja inspelningen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1072"/>
+        <source>Show Live Graphs</source>
+        <translation>Visa Live Diagram</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1103"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1357"/>
+        <source>Duration</source>
+        <translation>Varaktighet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1139"/>
+        <source>SpO2 %</source>
+        <translation>SpO2 %</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1221"/>
+        <source>Pulse Rate</source>
+        <translation>Puls</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1313"/>
+        <source>Multiple Sessions Detected</source>
+        <translation>Flera inspelningar upptäckta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1329"/>
+        <source>Please choose which one you want to import into SleepyHead</source>
+        <translation>Välj vilken du vill importera till SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1352"/>
+        <source>Start Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Import Time</source>
+        <translation type="vanished">Tid för import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1362"/>
+        <source>Details</source>
+        <translation>Detaljer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1379"/>
+        <source>Import Completed. When did the recording start?</source>
+        <translation>Importen är klar. När påbörjades inspelningen?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1403"/>
+        <source>Day recording (normally would of) started</source>
+        <translation>Inspelning (normalt ) startade</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1449"/>
+        <source>Oximeter Starting time</source>
+        <translation>Oximeter inspelning startade</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1461"/>
+        <source>I want to use the time reported by my oximeter's built in clock.</source>
+        <translation>Jag vill använda den tid som rapporteras av min oximeters inbyggda klocka.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1477"/>
+        <source>I started this oximeter recording at (or near) the same time as a session on my CPAP machine.</source>
+        <translation>Jag startade denna pulsoximeter inspelning samtidigt (eller nära) som jag startade min CPAP-maskin.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1506"/>
+        <source><html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html></source>
+        <translation><html><head/><body><p>Sleepyhead behöver en starttid för att veta var du vill spara den här oximetri inspelningen.</p><p>Välj ett av följande alternativ:</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1538"/>
+        <source><html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html></source>
+        <translation><html><head/><body><p>Observera: Synkronisera med CPAP-inspelningens starttid kommer alltid att vara mera exakt.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1559"/>
+        <source>Choose CPAP session to sync to:</source>
+        <translation>Välj CPAP-inspelning att synkronisera med:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1598"/>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1637"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1679"/>
+        <source>You can manually adjust the time here if required:</source>
+        <translation>Du kan manuellt justera tiden här om det behövs:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1700"/>
+        <source>HH:mm:ssap</source>
+        <translation>HH:mm:ssap</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1753"/>
+        <source>&Cancel</source>
+        <translation>&Avsluta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1760"/>
+        <source>&Information Page</source>
+        <translation>&Informationssida</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1780"/>
+        <source>&Retry</source>
+        <translation>&Försök igen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1787"/>
+        <source>&Choose Session</source>
+        <translation>&Välj inspelning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1794"/>
+        <source>&End Recording</source>
+        <translation>&Slut på inspelning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1801"/>
+        <source>&Sync and Save</source>
+        <translation>&Synka och spara</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1808"/>
+        <source>&Save and Finish</source>
+        <translation>&Spara och avsluta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.ui" line="1815"/>
+        <source>&Start</source>
+        <translation>&Start</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="170"/>
+        <source>Scanning for compatible oximeters</source>
+        <translation>Söker efter kompatibla Oximetrar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="202"/>
+        <source>Could not detect any connected oximeter devices.</source>
+        <translation>Kunde inte detektera någon ansluten Oximeter-enhet.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="209"/>
+        <source>Connecting to %1 Oximeter</source>
+        <translation>Ansluter till %1 Oximeter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="269"/>
+        <source>"%1", session %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="288"/>
+        <source>Waiting for %1 to start</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="289"/>
+        <source>Waiting for the device to start the upload process...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="291"/>
+        <source>Select upload option on %1</source>
+        <translation>Välj metod för uppladdning på %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="292"/>
+        <source>Waiting for you to start the upload process...</source>
+        <translation>Väntar på att du ska starta uppladdningen...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="323"/>
+        <source>%1 device is uploading data...</source>
+        <translation>%1 enheten laddar upp data...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="324"/>
+        <source>Please wait until oximeter upload process completes. Do not unplug your oximeter.</source>
+        <translation>Vänta tills oximeter-uppladdningsprocessen är klar. Koppla inte bort din oximeter.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="341"/>
+        <source>Oximeter import completed..</source>
+        <translation>Oximeter-import är färdig..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Select a valid oximetry data file</source>
+        <translation>Välj en giltig oximeter datafil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="368"/>
+        <source>Oximetry Files (*.spo *.spor *.spo2 *.dat)</source>
+        <translation>Oximeter filer (*.spo *.spor *.spo2 *.dat)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="391"/>
+        <source>No Oximetery module could parse the given file:</source>
+        <translation>Ingen Oximeter modul kunde tolka den valda filen:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="413"/>
+        <source>Oximeter not detected</source>
+        <translation>Ingen Oximeter ansluten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="420"/>
+        <source>Couldn't access oximeter</source>
+        <translation>Kunde inte ansluta till Oximetern</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="431"/>
+        <source>Live Oximetery Mode</source>
+        <translation>Oximeter-läge "LIVE"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="434"/>
+        <source>Starting up...</source>
+        <translation>Startar...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="435"/>
+        <source>If you can still read this after a few seconds, cancel and try again</source>
+        <translation>Om du fortfarande efter några sekunder kan läsa detta, avsluta och försök igen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="478"/>
+        <source>Live Import Stopped</source>
+        <translation>"LIVE" import stoppad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="479"/>
+        <source>Live Oximetery Stopped</source>
+        <translation>"LIVE" Oximeter stoppad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="480"/>
+        <source>Live Oximetery import has been stopped</source>
+        <translation>"LIVE" Oximeter-import har blivit stoppad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="527"/>
+        <source>%1 session(s) on %2, starting at %3</source>
+        <translation>%1 inspelning(s) på %2, startade %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="531"/>
+        <source>No CPAP data available on %1</source>
+        <translation>IngenCPAP-data tillgänglig på %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="537"/>
+        <source>%1</source>
+        <translation>%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="650"/>
+        <source>Recording...</source>
+        <translation>Spelar in...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="657"/>
+        <source>Finger not detected</source>
+        <translation>Inget finger detekterat</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="750"/>
+        <source>I want to use the time my computer recorded for this live oximetry session.</source>
+        <translation>Jag vill använda tiden datorn registrerat för denna "LIVE" oximetri inspelning.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="753"/>
+        <source>I need to set the time manually, because my oximeter doesn't have an internal clock.</source>
+        <translation>Jag vill sätta tiden manuellt, eftersom min oximeter inte har egen inbyggd klocka.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="764"/>
+        <source>Something went wrong getting session data</source>
+        <translation>Något gick fel vid mottagandet av inspelningsdata</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximeterimport.cpp" line="993"/>
+        <source>CMS50 Session %1</source>
+        <translation>CMS50 inspelning %1</translation>
+    </message>
+</context>
+<context>
+    <name>Oximetry</name>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulär</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="89"/>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="102"/>
+        <source>d/MM/yy h:mm:ss AP</source>
+        <translation>d/MM/yy h:mm:ss AP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="131"/>
+        <source>R&eset</source>
+        <translation>R&eset</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="160"/>
+        <source>SpO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="245"/>
+        <source>Pulse</source>
+        <translation>Puls</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="346"/>
+        <source>...</source>
+        <translation>...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="366"/>
+        <source>&Open .spo/R File</source>
+        <translation>&Öppna .spo/R Fil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="385"/>
+        <source>Serial &Import</source>
+        <translation>Seriell &Import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="398"/>
+        <source>&Start Live</source>
+        <translation>&Start Live</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="421"/>
+        <source>Serial Port</source>
+        <translation>Seriell Port</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/oximetry.ui" line="450"/>
+        <source>&Rescan Ports</source>
+        <translation>&Rescan Port</translation>
+    </message>
+</context>
+<context>
+    <name>PreferencesDialog</name>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="23"/>
+        <source>Preferences</source>
+        <translation>Inställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="58"/>
+        <source>&Import</source>
+        <translation>&Import</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="79"/>
+        <source>Session Settings</source>
+        <translation>Period Inställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="102"/>
+        <source>Combine Close Sessions </source>
+        <translation>Slå samman perioder med kort avbrott mellan </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="112"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="197"/>
+        <source>Minutes</source>
+        <translation>Minuter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="132"/>
+        <source>Multiple sessions closer together than this value will be kept on the same day.
+</source>
+        <translation>Flera sessioner närmare varandra än detta värde kommer att hållas samma dag.
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="187"/>
+        <source>Ignore Short Sessions</source>
+        <translation>Ignonera korta perioder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="211"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Perioder med kortare varaktighet än detta kommer inte att visas<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="252"/>
+        <source>Day Split Time</source>
+        <translation>Tidpunkt när dagar delas</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="262"/>
+        <source>Sessions starting before this time will go to the previous calendar day.</source>
+        <translation>Perioder som startar före den här tiden kommer att höra till föregående dag.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="282"/>
+        <source>Keep session data in memory to speed up revisiting days.</source>
+        <translation>Håll period-data i minnet för att få snabbare åtkomst senare.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="285"/>
+        <source>Cache Session Data (uses more system memory)</source>
+        <translation>Cache period-Data (använder mer systemminne)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="361"/>
+        <source>Summary only data is more accurate for ResMed users if this is left on.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="364"/>
+        <source>Don't Split Summary Days</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="395"/>
+        <source>Session Storage Options</source>
+        <translation>Period lagrings-option</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="428"/>
+        <source>Create SD Card Backups during Import (Turn this off at your own peril!)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="435"/>
+        <source>This makes SleepyHead's data take around half as much space.
+But it makes import and day changing take longer.. 
+If you've got a new computer with a small solid state disk, this is a good option.</source>
+        <translation>Detta gör att SleepyHead data tar ungefär hälften så mycket utrymme. 
+Men det gör att import och dag-förändringar tar längre tid .. 
+Om du har en ny dator med en liten solid state disk, är det här ett bra alternativ.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="440"/>
+        <source>Compress Session Data (makes SleepyHead data smaller, but day changing slower.)</source>
+        <translation>Komprimera period Data (gör SleepyHead:s data mindre, men skifta dag långsammare.)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="447"/>
+        <source>Compress ResMed (EDF) backups to save disk space.
+Backed up EDF files are stored in the .gz format, 
+which is common on Mac & Linux platforms.. 
+
+SleepyHead can import from this compressed backup directory natively.. 
+To use with ResScan will require the .gz files to be uncompressed first..</source>
+        <translation>Komprimera ResMed (EDF) säkerhetskopior för att spara diskutrymme. 
+Säkerhetskopierade EDF-filer lagras i .gz format, 
+vilket är vanligt på Mac & Linux-plattformar.. 
+
+Sleepyhead kan importera från denna komprimerade backup katalog.. 
+Om du vill använda med ResScan kräver de att .gz filerna är okomprimerade först..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="455"/>
+        <source>Compress SD Card Backups (slower first import, but makes backups smaller)</source>
+        <translation>Komprimera SD-kort:s säkerhetskopiering (långsammare första importen, men gör säkerhetskopior mindre)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="467"/>
+        <source>The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes.</source>
+        <translation>Följande alternativ påverkar hur mycket diskutrymme SleepyHead använder, och alla har en effekt på hur lång tid importen tar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="477"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data.  </span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Ändra SD Backup komprimeringsalternativ kommer inte att automatiskt komprimera säkerhetskopierade data.  </span></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="508"/>
+        <source>&CPAP</source>
+        <translation>&CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="535"/>
+        <source>CPAP Mask Information</source>
+        <translation>CPAP Mask Information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="562"/>
+        <source>Mask Type</source>
+        <translation>Mask Typ</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="569"/>
+        <source>Generic mask type. Select the one that's closest to your mask.</source>
+        <translation>Standard typ av mask. Välj den som är närmast din mask.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="587"/>
+        <source>Description</source>
+        <translation>Beskrivning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="594"/>
+        <source>The name of your mask, or at least the name you call it.</source>
+        <translation>Namnet på din mask, eller åtminstone namnet du kallar den.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="607"/>
+        <source>Method of unintentional leaks calculation if not provided by your machine.
+Note: Statistical Model is experimental.</source>
+        <translation>Metod för oavsiktliga läckage-beräkningar om det inte fås från din maskin. 
+Obs: Statistisk modell är experimentell.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="612"/>
+        <source>Mask Profile</source>
+        <translation>Mask Profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="617"/>
+        <source>Statistical Model</source>
+        <translation>Statistisk Modell</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="631"/>
+        <source>Leak calcs</source>
+        <translation>Läckage calcs</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="644"/>
+        <source>Started Using</source>
+        <translation>Började använda</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="657"/>
+        <source>The date you started using this mask</source>
+        <translation>Det datum du började använda din mask</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="673"/>
+        <source>Leak Profile</source>
+        <translation>Läckage Profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="687"/>
+        <source>Pressure</source>
+        <translation>Tryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="692"/>
+        <source>Leak</source>
+        <translation>Läcka</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="705"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Note: </span>Leak profiles currently does not work yet..</p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600; font-style:normal;">Notera: </span>Läckage-profiler fungerar för närvarande inte..</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="770"/>
+        <source>Show in Event Breakdown Piechart</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="777"/>
+        <source>#1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="784"/>
+        <source>#2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="905"/>
+        <source>This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="908"/>
+        <source>Resync Machine Detected Events (Experimental)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1153"/>
+        <source>Shows Respiratory Disturbance Index instead of Apnea/Hypopnea Index (RDI=AHI + RERA)</source>
+        <translation>Visar Respiratory Störning Index istället för Apnea/Hypopné Index (RDI=AHI + RERA)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1156"/>
+        <source>Use RDI instead of AHI (PRS1 only)</source>
+        <translation>Använd RDI istället för AHI (PRS1 only)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1069"/>
+        <source>Don't show any compliance information</source>
+        <translation>Visa inte någon compliance information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="318"/>
+        <source>Do not import sessions older than:</source>
+        <translation>Importera inte sessioner äldre än:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="325"/>
+        <source>Sessions older than this date will not be imported</source>
+        <translation>Sessioner äldre än detta datum kommer inte att importeras</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="351"/>
+        <source>dd MMMM yyyy</source>
+        <translation>dd MMMM yyyy</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="419"/>
+        <source>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+SleepyHead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</source>
+        <translation>Detta innebär backup av SD-kortdata för ResMed maskiner, 
+
+ResMed maskiner raderar högupplösta data äldre än 7 dagar, 
+och grafdata äldre än 30 dagar.. 
+
+Sleepyhead kan behålla en kopia av dessa uppgifter om du behöver installera om. 
+(Starkt rekommenderat, om du inte har ont om diskutrymme eller inte bryr dig om grafdata)</translation>
+    </message>
+    <message>
+        <source>Create SD Card Backups during Import (This is fairly important for ResMed and FP ICON)</source>
+        <translation type="vanished">Skapa SD Card Säkerhetskopior under Import (Detta är ganska viktigt för ResMed och FP ICON)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1072"/>
+        <source>Show Compliance</source>
+        <translation>Visa Compliance</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1105"/>
+        <source>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</source>
+        <translation>Betrakta dagar med mindre användning än detta som "uppfyller inte villkoren". 4 timmar brukar anses som "Compliant".</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1108"/>
+        <source> hours</source>
+        <translation>Timmar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1130"/>
+        <source>as over</source>
+        <translation>eftersom över</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1137"/>
+        <source>of usage per night</source>
+        <translation>användning per natt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="728"/>
+        <source>Enable/disable experimental event flagging enhancements. 
+It allows detecting borderline events, and some the machine missed.
+This option must be enabled before import, otherwise a purge is required.</source>
+        <translation>Aktivera/inaktivera experimentella händelse-flaggningar. 
+Det gör att man hittargränsfalls-händelser, och en del av dom maskinen missat. 
+Detta alternativ måste aktiveras innan import, annars behövs en rensning.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="733"/>
+        <source>Custom User Event Flagging</source>
+        <translation>Användardefinerad Händelse-Flaggning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="797"/>
+        <source>Flow Restriction</source>
+        <translation>Flödesbegränsning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="843"/>
+        <source>Percentage of restriction in airflow from the median value. 
+A value of 20% works well for detecting apneas. </source>
+        <translation>Procent av begränsning i luftflödet från medianvärdet. 
+Ett värde på 20% fungerar bra för att upptäcka apnéer. </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="760"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="847"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1432"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1487"/>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="875"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Användardefinerade flaggor är en experimentell metod för att detektera händelser som missats av maskinen. Dom är <span style=" text-decoration: underline;">inte</span> inräknade i AHI.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="821"/>
+        <source>Duration of airflow restriction</source>
+        <translation>Varaktighet luftflödesbegränsning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="804"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="824"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1377"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1406"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1477"/>
+        <source>s</source>
+        <translation>s</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="814"/>
+        <source>Event Duration</source>
+        <translation>Varaktighet Händelse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="857"/>
+        <source>Allow duplicates near machine events.</source>
+        <translation>Tillåt dubbletter nära maskinhändelser.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="947"/>
+        <source>AHI/Hour Graph Settings</source>
+        <translation>AHI/Timme Graf-inställning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="983"/>
+        <source>Window</source>
+        <translation>Fönster</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="990"/>
+        <source>Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.</source>
+        <translation>Justerar mängden data som behövs för varje punkt i AHI / Timme grafen. 
+Standardvärdet är 60 minuter .. Rekommenderas starkt att använda detta värdet.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="994"/>
+        <source> minutes</source>
+        <translation>Minuter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1010"/>
+        <source>Reset the counter to zero at beginning of each (time) window.</source>
+        <translation>Återställ räknaren till noll vid början av varje (tid) fönster.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1013"/>
+        <source>Zero Reset</source>
+        <translation>Återställ till noll</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2466"/>
+        <source>Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</source>
+        <translation>Pixmap caching är en grafikacceleration teknik. Kan orsaka problem med typsnittsvisning i grafvisningsområdet på din plattform.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2476"/>
+        <source><html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html></source>
+        <translation><html><head/><body><p>Dessa funktioner har nyligen beskurits. De kommer att komma tillbaka senare. </p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1029"/>
+        <source>CPAP Clock Drift</source>
+        <translation>CPAP klock avvikelse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1036"/>
+        <source>Don't touch this unless you know your CPAP clock is out.
+Try to sync it to your PC's clock (which should be synced to a timeserver)</source>
+        <translation>Rör inte detta om du inte vet att din CPAP klocka är fel.
+Försök att synkronisera den till din dators klocka (som bör synkroniseras till en tidsserver)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1040"/>
+        <source> seconds</source>
+        <translation>Sekunder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="934"/>
+        <source>User definable threshold considered large leak</source>
+        <translation>Användardefinerat tröskelvärde avseende stort läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="937"/>
+        <source> L/min</source>
+        <translation> L/min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="924"/>
+        <source>Whether to show the leak redline in the leak graph</source>
+        <translation>Huruvida den röda linjen ska visas i läckage-grafen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="927"/>
+        <source>Show Leak Redline</source>
+        <translation>Visa röda linjen för stort läckage</translation>
+    </message>
+    <message>
+        <source>&Events</source>
+        <translation type="vanished">&Händelse</translation>
+    </message>
+    <message>
+        <source>Not entirely sure if this will get to live or not..</source>
+        <translation type="vanished">Inte helt säker på om detta kommer att få leva eller inte..</translation>
+    </message>
+    <message>
+        <source>Show</source>
+        <translation type="vanished">Visa</translation>
+    </message>
+    <message>
+        <source>Colour</source>
+        <translation type="vanished">Färg</translation>
+    </message>
+    <message>
+        <source>Event</source>
+        <translation type="vanished">Händelse</translation>
+    </message>
+    <message>
+        <source>ID</source>
+        <translation type="vanished">ID</translation>
+    </message>
+    <message>
+        <source>Graphs</source>
+        <translation type="vanished">Graf</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1189"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1261"/>
+        <source>Search</source>
+        <translation>Sök</translation>
+    </message>
+    <message>
+        <source>Filters the graph list. Simply start typing the name of the graph your looking for.</source>
+        <translation type="vanished">Filtrerar graflistan. Börja helt enkelt med att skriva namnet på diagrammet du letar efter.</translation>
+    </message>
+    <message>
+        <source>&Defaults</source>
+        <translation type="vanished">&Förvalt</translation>
+    </message>
+    <message>
+        <source>Double click on the (Y-axis) min/max values to edit them</source>
+        <translation type="vanished">Dubbelklicka på (Y-axeln) min/max värden för att redigera dem</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1310"/>
+        <source>&Oximetry</source>
+        <translation>&Oximeter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1537"/>
+        <source>Type</source>
+        <translation>Typ</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1550"/>
+        <source>Tries to forces the oximetry data to link with CPAP when possible.</source>
+        <translation>Försöker att forcera att länka Oximeterdata med CPAP när det är möjligt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1553"/>
+        <source>Link Oximetry and CPAP graphs</source>
+        <translation>Länka Oximeter och CPAP grafer</translation>
+    </message>
+    <message>
+        <source>Flag changes in oximetry stats</source>
+        <translation type="vanished">Flagga förändringar i Oximeter-statistik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1367"/>
+        <source>SPO2</source>
+        <translation>SPO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1429"/>
+        <source>Percentage drop in oxygen saturation</source>
+        <translation>Procentuell minskning i syremättnaden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1422"/>
+        <source>Pulse</source>
+        <translation>Puls</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1387"/>
+        <source>Sudden change in Pulse Rate of at least this amount</source>
+        <translation>Plötslig förändring i puls på minst denna nivå</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1390"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1514"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1521"/>
+        <source> bpm</source>
+        <translation>Andetag per minut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1374"/>
+        <source>Minimum duration of drop in oxygen saturation</source>
+        <translation>Minsta tid för nedgång i syremättnad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1403"/>
+        <source>Minimum duration of pulse change event.</source>
+        <translation>Minsta tid för pulsändringshändelse.</translation>
+    </message>
+    <message>
+        <source>Discard chunks under</source>
+        <translation type="vanished">Kassera värden under</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1474"/>
+        <source>Small chunks of oximetry data under this amount will be discarded.</source>
+        <translation>Små bitar av oximetridata under detta värde kommer att raderas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1649"/>
+        <source>&General</source>
+        <translation>&Allmän</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1798"/>
+        <source>General Settings</source>
+        <translation>Allmänna Inställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1850"/>
+        <source>Daily view navigation buttons will skip over days without data records</source>
+        <translation>Dagliga vy/navigeringsknapparna hoppar över dagar utan dataposter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1853"/>
+        <source>Skip over Empty Days</source>
+        <translation>Hoppa över Tomma Dagar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1839"/>
+        <source>Allow use of multiple CPU cores where available to improve performance. 
+Mainly affects the importer.</source>
+        <translation>Tillåt användning av flera processorkärnor där sådana finns för att förbättra prestanda. 
+Drabbar främst importmodulen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1843"/>
+        <source>Enable Multithreading</source>
+        <translation>Aktivera Multithreading</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1829"/>
+        <source>Bypass the login screen and load the most recent User Profile</source>
+        <translation>Hoppa över inloggningsskärmen och ladda den senaste användarprofilen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1832"/>
+        <source>Skip Login Screen</source>
+        <translation>Hoppa över inloggningsskärmen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1679"/>
+        <source>Changes to the following settings needs a restart, but not a recalc.</source>
+        <translation>Ändras följande inställningar behövs en omstart, men inte en omräkning.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1331"/>
+        <source>Oximetery Settings</source>
+        <translation>Oximeter Inställningar</translation>
+    </message>
+    <message>
+        <source>Contec CMS50D+</source>
+        <translation type="vanished">Contec CMS50D+</translation>
+    </message>
+    <message>
+        <source>Contec CMS50E/F</source>
+        <translation type="vanished">Contec CMS50E/F</translation>
+    </message>
+    <message>
+        <source>Contec CMS50F v3.7</source>
+        <translation type="vanished">Contec CMS50F v3.7</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1629"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style= [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">t [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Synkronisering av Oximeter och CPAP-data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data importerad från SpO2Review (från .spoR filer) eller med seriellimport-metoden, har </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">inte</span><span [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live visnings-läget (med en seriell kabel) är ett sätt att åstadkomma en korrekt synk på CMS50 oximetrar, men justerar inte för CPAP klockans drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Om du startar din Oximeter-inspelning på </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exakt </span><span style=" font-family:'Sans'; font-size:10pt;">samma ti [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Serie importen tar starttiden från sista natten/första CPAP sessionen. (Kom ihåg att importera dina CPAP data först!)</span></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1682"/>
+        <source>Preferred Calculation Methods</source>
+        <translation>Prioriterade Beräkningsmetoder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1709"/>
+        <source>Middle Calculations</source>
+        <translation>Medel Beräkningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1716"/>
+        <source>Upper Percentile</source>
+        <translation>Övre Procenten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1723"/>
+        <source>For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.</source>
+        <translation>För konsekvensens skull bör ResMed användare använda 95% här,
+eftersom det är det enda värdet som finns på bara-översikts dagar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1737"/>
+        <source>Median is recommended for ResMed users.</source>
+        <translation>Median rekomenderas för ResMed-användare.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1741"/>
+        <source>Median</source>
+        <translation>Median</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1746"/>
+        <source>Weighted Average</source>
+        <translation>Vägt genomsnitt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1751"/>
+        <source>Normal Average</source>
+        <translation>Normal Genomsnitt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1771"/>
+        <source>ResMed users probably should use 99th Percentile for visual consistency.</source>
+        <translation>ResMed användare bör förmodligen använda 99: e percentilen för visuell konsekvens.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1775"/>
+        <source>True Maximum</source>
+        <translation>Sant maximal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1780"/>
+        <source>99% Percentile</source>
+        <translation>99% Percentile</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1788"/>
+        <source>Maximum Calcs</source>
+        <translation>Maximum Calcs</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1892"/>
+        <source>Automatically Check For Updates</source>
+        <translation>Kontrollera uppdateringar automatiskt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1909"/>
+        <source>Check for new version every</source>
+        <translation>Kolla efter ny version varje</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1916"/>
+        <source>Sourceforge hosts this project for free.. Please be considerate of their resources..</source>
+        <translation>Sourceforge är värd för detta projekt gratis .. Var omtänksam mot deras resurser..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1932"/>
+        <source>days.</source>
+        <translation>dagar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1997"/>
+        <source>&Check for Updates now</source>
+        <translation>&Sök efter uppdateringar nu</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2020"/>
+        <source>Last Checked For Updates: </source>
+        <translation>Senaste kontroll efter uppdateringar:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2033"/>
+        <source>TextLabel</source>
+        <translation>Textetikett</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2055"/>
+        <source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></source>
+        <translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Om du är intresserad av att hjälpa till med att testa nya funktioner och buggfixar tidigt, klicka här..</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Men varnar för det kommer ibland innebära dålig kod..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2064"/>
+        <source>I want to try experimental and test builds (Advanced users only please.)</source>
+        <translation>Jag vill prova experimentella och test-versioner (vänligen bara avancerade användare.)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2088"/>
+        <source>&Appearance</source>
+        <translation>&Utseende</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2120"/>
+        <source>Graph Settings</source>
+        <translation>Graf-inställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2127"/>
+        <source>Bar Tops</source>
+        <translation>Bar Tops</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2132"/>
+        <source>Line Chart</source>
+        <translation>Linjediagram</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2140"/>
+        <source>Overview Linecharts</source>
+        <translation>Översikt Linjediagram</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2165"/>
+        <source><html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html></source>
+        <translation><html><head/><body><p>Detta gör rullning när du har zoomat in lättare i känsliga dubbelriktade pekplattor</p><p>50ms rekommenderas som värde.</p></body></html></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2193"/>
+        <source>milliseconds</source>
+        <translation>millisekunder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2259"/>
+        <source>Scroll Dampening</source>
+        <translation>Scroll Dämpning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2304"/>
+        <source>Graph Tooltips</source>
+        <translation>Graf verktygstips</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2351"/>
+        <source>Overlay Flags</source>
+        <translation>Overlay Flagga</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2317"/>
+        <source>The visual method of displaying waveform overlay flags.
+</source>
+        <translation>Den visuella metoden att visa overlay vågformsflaggor.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2322"/>
+        <source>Standard Bars</source>
+        <translation>Standard Bars</translation>
+    </message>
+    <message>
+        <source>Top & Bottom Markers</source>
+        <translation type="vanished">Topp & Botten markörer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2335"/>
+        <source>Graph Height</source>
+        <translation>Graf-höjd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2285"/>
+        <source>Default display height of graphs in pixels</source>
+        <translation>Standard visning graf-höjd i pixlar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1166"/>
+        <source>Events</source>
+        <translation type="unfinished">Händelser</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1212"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1284"/>
+        <source>Reset &Defaults</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1225"/>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1297"/>
+        <source><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1238"/>
+        <source>Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1355"/>
+        <source>Flag rapid changes in oximetry stats</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1448"/>
+        <source>Other oximetry options</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1454"/>
+        <source>Flag SPO2 Desaturations Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1464"/>
+        <source>Discard segments under</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1494"/>
+        <source>Flag Pulse Rate Above</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1504"/>
+        <source>Flag Pulse Rate Below</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1574"/>
+        <source>Contec CMS50D+/E/F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1579"/>
+        <source>Contec CMS50F v3.7+</source>
+        <translation type="unfinished">Contec CMS50F v3.7+ {50F?}</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1584"/>
+        <source>ChoiceMMed MD300W1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1589"/>
+        <source>ResMed S9 Oximeter Module</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1610"/>
+        <source>If your oximeter supports it, SleepyHead will attempt to set your Oximeters clock from your computers time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1613"/>
+        <source>Update Oximeter Clock during import</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1819"/>
+        <source>Show flags for machine detected events that haven't been identified yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1822"/>
+        <source>Show Unknown Flags</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="1860"/>
+        <source>Import without nagging</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2213"/>
+        <source>How long you want the tooltips to stay visible.</source>
+        <translation>Hur länge du vill att verktygstips ska vara synliga.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2269"/>
+        <source>Tooltip Timeout</source>
+        <translation>Tooltip Timeout</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2327"/>
+        <source>Top Markers</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2361"/>
+        <source>Line Thickness</source>
+        <translation>Linje-tjocklek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2373"/>
+        <source>The pixel thickness of line plots</source>
+        <translation>Pixel tjocklek linjediagram</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2422"/>
+        <source>Other Visual Settings</source>
+        <translation>Andra Visuella inställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2428"/>
+        <source>Anti-Aliasing applies smoothing to graph plots.. 
+Certain plots look more attractive with this on. 
+This also affects printed reports.
+
+Try it and see if you like it.</source>
+        <translation>Anti-Aliasing Utjämnar grafer och utskrifter.. 
+Vissa grafer ser mer attraktiv ut med detta på. 
+Detta påverkar även utskrivna rapporter. 
+
+Prova och se om du gillar det.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2435"/>
+        <source>Use Anti-Aliasing</source>
+        <translation>Använd Anti-Aliasing</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2442"/>
+        <source>Makes certain plots look more "square waved".</source>
+        <translation>Gör vissa grafer mer som "fyrkantsvågor".</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2445"/>
+        <source>Square Wave Plots</source>
+        <translation>Fyrkantvågs-visning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2452"/>
+        <source>Allows graphs to be "screenshotted" for display purposes.
+The Event Breakdown PIE chart uses this method, as does
+the printing code.
+Unfortunately some older computers/versions of Qt can cause
+this application to be unstable with this feature enabled.</source>
+        <translation>Tillåter grafer att vara "screenshotted" för visning.
+Händelse-visningen via tårtdiagrammet använder denna metod, liksom 
+skrivarkoden.
+Tyvärr kan en del äldre datorer/versioner av Qt orsaka
+detta program för att vara instabilt med denna funktion aktiverad.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2459"/>
+        <source>Show event breakdown pie chart</source>
+        <translation>Visar händelse-uppdelning som tårtdiagram</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2469"/>
+        <source>Use Pixmap Caching</source>
+        <translation>Använd Pixmap Caching</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2479"/>
+        <source>Animations && Fancy Stuff</source>
+        <translation>Animationer & andra roliga saker</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2486"/>
+        <source>Whether to allow changing yAxis scales by double clicking on yAxis labels</source>
+        <translation>Om du vill tillåta att ändra yAxelns skala genom att dubbelklicka på yAxelns etikett</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2489"/>
+        <source>Allow YAxis Scaling</source>
+        <translation>Tillåt YAxel Skalning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2508"/>
+        <source>Application Fonts</source>
+        <translation>Applikations teckensnitt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2543"/>
+        <source>Font</source>
+        <translation>Teckensnitt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2562"/>
+        <source>Size</source>
+        <translation>Storlek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2581"/>
+        <source>Bold  </source>
+        <translation>Markerad..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2603"/>
+        <source>Italic</source>
+        <translation>Italic</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2616"/>
+        <source>Application</source>
+        <translation>Application</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2680"/>
+        <source>Graph Text</source>
+        <translation>Graf-text</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2741"/>
+        <source>Graph Titles</source>
+        <translation>Graf-rubrik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2802"/>
+        <source>Big  Text</source>
+        <translation>Stor  Text</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2863"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="410"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="530"/>
+        <source>Details</source>
+        <translation>Detaljer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2920"/>
+        <source>&Cancel</source>
+        <translation>&Avbryt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.ui" line="2927"/>
+        <source>&Ok</source>
+        <translation>&Ok</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="61"/>
+        <source>Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="62"/>
+        <source>Minor Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="63"/>
+        <source>Span</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="64"/>
+        <source>Always Minor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="68"/>
+        <source>Nasal Pillows</source>
+        <translation>Näs-kuddar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="406"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="525"/>
+        <source>Name</source>
+        <translation type="unfinished">Namn</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="407"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="526"/>
+        <source>Color</source>
+        <translation type="unfinished">Färg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="408"/>
+        <source>Flag Type</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="409"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="529"/>
+        <source>Label</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="425"/>
+        <source>CPAP Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="426"/>
+        <source>Oximeter Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="427"/>
+        <source>Positional Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="428"/>
+        <source>Sleep Stage Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="429"/>
+        <source>Unknown Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="468"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="589"/>
+        <source>Double click to change the descriptive name this channel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="476"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="596"/>
+        <source>Double click to change the default color for this channel plot/flag/data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="484"/>
+        <source>Here you can change the type of flag shown for this event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="489"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="612"/>
+        <source>This is the short-form label to indicate this channel on screen.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="495"/>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="618"/>
+        <source>This is a description of what this channel does.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="527"/>
+        <source>Lower</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="528"/>
+        <source>Upper</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="546"/>
+        <source>CPAP Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="547"/>
+        <source>Oximeter Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="548"/>
+        <source>Positional Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="549"/>
+        <source>Sleep Stage Waveforms</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="602"/>
+        <source>Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="607"/>
+        <source>Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="709"/>
+        <source>Data Reindex Required</source>
+        <translation>Data indexering krävs</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="710"/>
+        <source>A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.
+
+Are you sure you want to make these changes?</source>
+        <translation>En data omindexerings-procedur krävs för att tillämpa dessa ändringar. Denna operation kan ta ett par minuter att slutföra. 
+
+Är du säker på att du vill göra dessa förändringar?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="716"/>
+        <source>Restart Required</source>
+        <translation>Omstart krävs</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="717"/>
+        <source>One or more of the changes you have made will require this application to be restarted,
+in order for these changes to come into effect.
+
+Would you like do this now?</source>
+        <translation>En eller flera av de ändringar du har gjort kommer att kräva att det här programmet startas om,
+för att dessa ändringar skall träda i kraft.
+
+Vill du göra det nu?</translation>
+    </message>
+    <message>
+        <source>Daily Graphs</source>
+        <translation type="vanished">Dagliga grafer</translation>
+    </message>
+    <message>
+        <source>Overview Graphs</source>
+        <translation type="vanished">Översikt Grafer</translation>
+    </message>
+    <message>
+        <source>Graph</source>
+        <translation type="vanished">Graf</translation>
+    </message>
+    <message>
+        <source>N/A</source>
+        <translation type="vanished">Ej Tillgänglig</translation>
+    </message>
+    <message>
+        <source>Confirmation</source>
+        <translation type="vanished">Bekräftelse</translation>
+    </message>
+    <message>
+        <source>Are you sure you want to reset your graph preferences to the defaults?</source>
+        <translation type="vanished">Är du säker på att du vill återställa din grafinställningar till standardvärdena?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1095"/>
+        <source>This may not be a good idea</source>
+        <translation>Det här kanske inte är en bra idè</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1096"/>
+        <source>ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).</source>
+        <translation>ResMed S9 maskiner tar rutinmässigt bort vissa data från ditt SD-kort äldre än 7 och 30 dagar (beroende på upplösning).</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1097"/>
+        <source>If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.</source>
+        <translation>Om du någonsin behöver importera dessa data igen (antingen i Sleepyhead eller ResScan) dessa data kommer inte komma tillbaka.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1098"/>
+        <source>If you need to conserve disk space, please remember to carry out manual backups.</source>
+        <translation>Om du behöver för att spara diskutrymme, kom ihåg att utföra manuell säkerhetskopiering.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1099"/>
+        <source>Are you sure you want to disable these backups?</source>
+        <translation>Är du säker på att du vill inaktivera dessa säkerhetskopior?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1141"/>
+        <source>Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.</source>
+        <translation>Avstängning av automatiska säkerhetskopior är inte en bra idé, eftersom Sleepy behöver dessa för att bygga om databasen om fel hittas.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1142"/>
+        <source>Are you really sure you want to do this?</source>
+        <translation>Är du verkligen säker på att du vill göra detta?</translation>
+    </message>
+</context>
+<context>
+    <name>ProfileSelect</name>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="14"/>
+        <source>Select Profile</source>
+        <translation>Välj profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="115"/>
+        <source>Search:</source>
+        <translation>Sök:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="188"/>
+        <source>Start with the selected user profile.</source>
+        <translation>Starta med den valda användarprofilen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="212"/>
+        <source>Create a new user profile.</source>
+        <translation>Skapa en ny användar-profil.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="232"/>
+        <source>Choose a different SleepyHead data folder.</source>
+        <translation>Välj en annan data-mapp för SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="238"/>
+        <source>&Different Folder</source>
+        <translation>&Annan mapp</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="271"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="284"/>
+        <source>[version]</source>
+        <translation>[version]</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="307"/>
+        <source>Click here if you didn't want to start SleepyHead.</source>
+        <translation>Klicka här om du inte vill starta SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="310"/>
+        <source>&Quit</source>
+        <translation>&Avsluta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="367"/>
+        <source>Folder:</source>
+        <translation>Katalog:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="380"/>
+        <source>The current location of SleepyHead data store.</source>
+        <translation>Den aktuella platsen för SleepyHead.s datalagring.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="386"/>
+        <source>[data directory]</source>
+        <translation>[data bibliotek]</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="215"/>
+        <source>New Profile</source>
+        <translation>Ny profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.ui" line="191"/>
+        <source>&Select User</source>
+        <translation>&välj användare</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="94"/>
+        <source>Open Profile</source>
+        <translation>Öppna profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="95"/>
+        <source>Edit Profile</source>
+        <translation>Ändra profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="97"/>
+        <source>Delete Profile</source>
+        <translation>Radera profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="144"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="224"/>
+        <source>Enter Password for %1</source>
+        <translation>Skriv lösenord för %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="163"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="373"/>
+        <source>Incorrect Password</source>
+        <translation>Felaktigt lösenord</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="165"/>
+        <source>You entered the password wrong too many times.</source>
+        <translation>Du skrev fel lösenord för många gånger.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>You are about to destroy profile '%1'.</source>
+        <translation>Du är på väg att förstöra profil e '%1'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="187"/>
+        <source>Enter the word DELETE below to confirm.</source>
+        <translation>Skriv ordet DELETE här under för att bekräfta.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>Sorry</source>
+        <translation>Ledsen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="206"/>
+        <source>You need to enter DELETE in capital letters.</source>
+        <translation>Du måste skriva ordet DELETE med stora bokstäver.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="214"/>
+        <source>Could not open profile.. You will need to delete this profile directory manually</source>
+        <translation>Kunde inte öppna profil.. Du måste radera den här profilen manuellt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="215"/>
+        <source>You will find it under the following location:</source>
+        <translation>Du hittar det under följande plats:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="243"/>
+        <source>You entered an incorrect password</source>
+        <translation>Du skrev ett felaktigt lösenord</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="246"/>
+        <source>If you're trying to delete because you forgot the password, you need to delete it manually.</source>
+        <translation>Om du försöker ta bort eftersom du glömt lösenordet, måste du ta bort det manuellt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="259"/>
+        <source>There was an error deleting the profile directory, you need to manually remove it.</source>
+        <translation>Det uppstod ett fel när du raderade katalogen, du måste ta bort den manuellt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="263"/>
+        <source>Profile '%1' was succesfully deleted</source>
+        <translation>Profil '%1' raderades fullständigt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="292"/>
+        <source>Create new profile</source>
+        <translation>Skapa ny profil</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="357"/>
+        <source>Enter Password</source>
+        <translation>Skriv lösenordet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="376"/>
+        <source>You entered an Incorrect Password too many times. Exiting!</source>
+        <translation>Du har skrivit in fel lösenord för många gånger. Spännande!</translation>
+    </message>
+</context>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1276"/>
+        <source>No Data</source>
+        <translation>Ingen data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="496"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="86"/>
+        <source>On</source>
+        <translation>På</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="497"/>
+        <location filename="../sleepyhead/SleepLib/common.h" line="87"/>
+        <source>Off</source>
+        <translation>Av</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="321"/>
+        <source>cm</source>
+        <translation>cm</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="322"/>
+        <source>"</source>
+        <translation>"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="323"/>
+        <source>ft</source>
+        <translation>ft</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="324"/>
+        <source>lb</source>
+        <translation>lb</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="325"/>
+        <source>oz</source>
+        <translation>oz</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="326"/>
+        <source>Kg</source>
+        <translation>Kg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="327"/>
+        <source>cmH2O</source>
+        <translation>cmH2O</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="328"/>
+        <source>Hours</source>
+        <translation>Timmar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="329"/>
+        <source>Minutes</source>
+        <translation>Minuter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="330"/>
+        <source>Seconds</source>
+        <translation>Sekunder</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="331"/>
+        <source>Events/hr</source>
+        <translation>Händelser/Timme</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="332"/>
+        <source>%</source>
+        <translation>%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="333"/>
+        <source>Hz</source>
+        <translation>Hz</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="334"/>
+        <source>bpm</source>
+        <translation>Andetag per minut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="345"/>
+        <source>Error</source>
+        <translation>Fel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="346"/>
+        <source>Warning</source>
+        <translation>Varning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="365"/>
+        <source>BMI</source>
+        <translation>BMI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="366"/>
+        <source>Weight</source>
+        <translation>Vikt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="367"/>
+        <source>Zombie</source>
+        <translation>Zombie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="368"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="259"/>
+        <source>Pulse Rate</source>
+        <translation>Puls</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="369"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="266"/>
+        <source>SpO2</source>
+        <translation>SpO2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="370"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="273"/>
+        <source>Plethy</source>
+        <translation>Plethy</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="371"/>
+        <source>Pressure</source>
+        <translation>Tryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="373"/>
+        <source>Daily</source>
+        <translation>Dagligen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="374"/>
+        <source>Overview</source>
+        <translation>Översikt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="375"/>
+        <source>Oximetry</source>
+        <translation>Oximetri</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="377"/>
+        <source>Oximeter</source>
+        <translation>Oximeter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="378"/>
+        <source>Event Flags</source>
+        <translation>Händelseflagga</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="381"/>
+        <source>CPAP</source>
+        <translation>CPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="382"/>
+        <source>BiPAP</source>
+        <translation>BiPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="383"/>
+        <source>Bi-Level</source>
+        <translation>Bi-Level</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="384"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1065"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1072"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1076"/>
+        <source>EPAP</source>
+        <translation>EPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="387"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1066"/>
+        <source>IPAP</source>
+        <translation>IPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="335"/>
+        <source>L/min</source>
+        <translation>Liter/minut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="336"/>
+        <source>Litres</source>
+        <translation>Liter</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="337"/>
+        <source>ml</source>
+        <translation>ml</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="338"/>
+        <source>Breaths/min</source>
+        <translation>Andetag/minut</translation>
+    </message>
+    <message>
+        <source>??</source>
+        <translation type="vanished">??</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="340"/>
+        <source>ratio</source>
+        <translation>förhållande</translation>
+    </message>
+    <message>
+        <source>Severety (0-1)</source>
+        <translation type="vanished">Allvarlighetsgrad (0-1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="342"/>
+        <source>Degrees</source>
+        <translation>Grader</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="344"/>
+        <source>Question</source>
+        <translation>Fråga</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="347"/>
+        <source>Information</source>
+        <translation>Information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="348"/>
+        <source>Busy</source>
+        <translation>Upptagen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="349"/>
+        <source>Please Note</source>
+        <translation>Notera</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="352"/>
+        <source>Compliance Only :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="353"/>
+        <source>Graphs Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="354"/>
+        <source>Summary Only :(</source>
+        <translation type="unfinished">Endast Sammanfattning :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="355"/>
+        <source>Sessions Switched Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="359"/>
+        <source>&Yes</source>
+        <translation>&Ja</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="360"/>
+        <source>&No</source>
+        <translation>&Nej</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="361"/>
+        <source>&Cancel</source>
+        <translation>&Avbryt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="362"/>
+        <source>&Destroy</source>
+        <translation>&Förstöra</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="363"/>
+        <source>&Save</source>
+        <translation>&Spara</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="385"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1068"/>
+        <source>Min EPAP</source>
+        <translation>Min EPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="386"/>
+        <source>Max EPAP</source>
+        <translation>Max EPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="388"/>
+        <source>Min IPAP</source>
+        <translation>Min IPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="389"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1069"/>
+        <source>Max IPAP</source>
+        <translation>Max IPAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="390"/>
+        <source>APAP</source>
+        <translation>APAP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="391"/>
+        <source>ASV</source>
+        <translation>ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="392"/>
+        <source>ST/ASV</source>
+        <translation>ST/ASV</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="394"/>
+        <source>Humidifier</source>
+        <translation>Befuktare</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="396"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="187"/>
+        <source>H</source>
+        <translation>H</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="397"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="181"/>
+        <source>OA</source>
+        <translation>OA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="398"/>
+        <source>A</source>
+        <translation>A</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="399"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="175"/>
+        <source>CA</source>
+        <translation>CA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="400"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="197"/>
+        <source>FL</source>
+        <translation>FL</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="401"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="238"/>
+        <source>SA</source>
+        <translation>SA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="402"/>
+        <source>LE</source>
+        <translation>LE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="403"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="233"/>
+        <source>EP</source>
+        <translation>EP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="404"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="206"/>
+        <source>VS</source>
+        <translation>VS</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="406"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="211"/>
+        <source>VS2</source>
+        <translation>VS2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="407"/>
+        <source>RERA</source>
+        <translation>RERA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="408"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2078"/>
+        <source>PP</source>
+        <translation>PP</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="409"/>
+        <source>P</source>
+        <translation>P</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="410"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="202"/>
+        <source>RE</source>
+        <translation>RE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="411"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="228"/>
+        <source>NR</source>
+        <translation>NR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="412"/>
+        <source>NRI</source>
+        <translation>NRI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="413"/>
+        <source>O2</source>
+        <translation>O2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="414"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="283"/>
+        <source>PC</source>
+        <translation>PC</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="243"/>
+        <source>UF1</source>
+        <translation>UF1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="416"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="248"/>
+        <source>UF2</source>
+        <translation>UF2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="417"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="253"/>
+        <source>UF3</source>
+        <translation>UF3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="419"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1070"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1073"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1077"/>
+        <source>PS</source>
+        <translation>PS</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>AHI</source>
+        <translation>AHI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="421"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>RDI</source>
+        <translation>RDI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="422"/>
+        <source>AI</source>
+        <translation>AI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="423"/>
+        <source>HI</source>
+        <translation>HI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="424"/>
+        <source>UAI</source>
+        <translation>UAI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="425"/>
+        <source>CAI</source>
+        <translation>CAI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="426"/>
+        <source>FLI</source>
+        <translation>FLI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="428"/>
+        <source>REI</source>
+        <translation>REI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="429"/>
+        <source>EPI</source>
+        <translation>EPI</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="430"/>
+        <source>ÇSR</source>
+        <translation>CSR</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="431"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="169"/>
+        <source>PB</source>
+        <translation>PB</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="435"/>
+        <source>IE</source>
+        <translation>IE</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="371"/>
+        <source>Insp. Time</source>
+        <translation>Inandningstid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="437"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="367"/>
+        <source>Exp. Time</source>
+        <translation>Utandningstid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="438"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>Resp. Event</source>
+        <translation>Andningshändelser</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="439"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="195"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="379"/>
+        <source>Flow Limitation</source>
+        <translation>Flödesbegränsning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="440"/>
+        <source>Flow Limit</source>
+        <translation>Flödesgräns</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="441"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="236"/>
+        <source>SensAwake</source>
+        <translation>SensAwake</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="442"/>
+        <source>Pat. Trig. Breath</source>
+        <translation>Patient triggat andetag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="443"/>
+        <source>Tgt. Min. Vent</source>
+        <translation>Mål minventilation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="444"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Vent.</source>
+        <translation>Målventilation.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="445"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Minute Vent.</source>
+        <translation>Minutventilation.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="446"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="329"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Tidal Volume</source>
+        <translation>Tidalvolym</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="447"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Resp. Rate</source>
+        <translation>Andningsfrekvens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="448"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="334"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Snore</source>
+        <translation>Snarkning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="449"/>
+        <source>Leak</source>
+        <translation>Läcka</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="450"/>
+        <source>Leaks</source>
+        <translation>Läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="451"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="221"/>
+        <source>Large Leak</source>
+        <translation>Stor läcka</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="452"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="223"/>
+        <source>LL</source>
+        <translation>LL</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="453"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Total Leaks</source>
+        <translation>Totalt läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="454"/>
+        <source>Unintentional Leaks</source>
+        <translation>Oavsiktlig Läcka</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="455"/>
+        <source>MaskPressure</source>
+        <translation>Masktryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="456"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="314"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Flow Rate</source>
+        <translation>Flödeshastighet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="457"/>
+        <source>Sleep Stage</source>
+        <translation>Sömnstadie</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="458"/>
+        <source>Usage</source>
+        <translation>Användning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="459"/>
+        <source>Sessions</source>
+        <translation>Sessioner</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="460"/>
+        <source>Pr. Relief</source>
+        <translation>Trycklättnad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="351"/>
+        <source>No Data Available</source>
+        <translation>Ingen data tillgänglig</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="339"/>
+        <source>?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="341"/>
+        <source>Severity (0-1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="462"/>
+        <source>Bookmarks</source>
+        <translation>Bokmärken</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="463"/>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>SleepyHead</source>
+        <translation>SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="465"/>
+        <source>Mode</source>
+        <translation>Läge</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="466"/>
+        <source>Model</source>
+        <translation>Modell</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="467"/>
+        <source>Brand</source>
+        <translation>Fabrikat</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="468"/>
+        <source>Serial</source>
+        <translation>Serienummer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="469"/>
+        <source>Series</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="470"/>
+        <source>Machine</source>
+        <translation>Maskin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="471"/>
+        <source>Channel</source>
+        <translation>Kanal</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="472"/>
+        <source>Settings</source>
+        <translation>Inställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="474"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="420"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Inclination</source>
+        <translation>Dragning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="475"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="415"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Orientation</source>
+        <translation>Inriktning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="477"/>
+        <source>Name</source>
+        <translation>Namn</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="478"/>
+        <source>DOB</source>
+        <translation>Födelsedatum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="479"/>
+        <source>Phone</source>
+        <translation>Telefon</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="480"/>
+        <source>Address</source>
+        <translation>Adress</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="481"/>
+        <source>Email</source>
+        <translation>E-post</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="482"/>
+        <source>Patient ID</source>
+        <translation>Patient ID</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="483"/>
+        <source>Date</source>
+        <translation>Datum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="485"/>
+        <source>Bedtime</source>
+        <translation>Sängdags</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="486"/>
+        <source>Wake-up</source>
+        <translation>Vakna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="487"/>
+        <source>Mask Time</source>
+        <translation>Mask på</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="488"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="124"/>
+        <source>Unknown</source>
+        <translation>Okänd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="489"/>
+        <source>None</source>
+        <translation>Ingen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="490"/>
+        <source>Ready</source>
+        <translation>Färdig</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="492"/>
+        <source>First</source>
+        <translation>Först</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="493"/>
+        <source>Last</source>
+        <translation>Sist</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="494"/>
+        <source>Start</source>
+        <translation>Börja</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="495"/>
+        <source>End</source>
+        <translation>Sluta</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="498"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2124"/>
+        <source>Yes</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="499"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2125"/>
+        <source>No</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="501"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1062"/>
+        <source>Min</source>
+        <translation>Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="502"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1063"/>
+        <source>Max</source>
+        <translation>Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="503"/>
+        <source>Med</source>
+        <translation>Medium</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="505"/>
+        <source>Average</source>
+        <translation>Genomsnitt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="506"/>
+        <source>Median</source>
+        <translation>Median</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="507"/>
+        <source>Avg</source>
+        <translation>Genomsnitt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/common.cpp" line="508"/>
+        <source>W-Avg</source>
+        <translation>W-Avg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="262"/>
+        <source>Import Error</source>
+        <translation>Import-fel</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="263"/>
+        <source>This Machine Record cannot be imported in this profile.
+The Day records overlap with already existing content.</source>
+        <translation>Denna maskins inspelning kan inte importeras i denna profil.
+Inspelningen överlappar existerande innehåll.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="384"/>
+        <source>Non Data Capable Machine</source>
+        <translation>EJ data-kapabel maskin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="385"/>
+        <source>Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.</source>
+        <translation>Din Philips Respironics CPAP-maskin (Model %1) är tyvärr inte en data kapabel modell.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="386"/>
+        <source>I'm sorry to report that SleepyHead can only track hours of use for this machine.</source>
+        <translation>Jag är ledsen att rapportera att Sleepyhead bara kan visa timmars användning för denna maskin.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2169"/>
+        <source>15mm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="1198"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2168"/>
+        <source>22mm</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2076"/>
+        <source>Pressure Pulse</source>
+        <translation>Tryck Puls</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2077"/>
+        <source>A pulse of pressure 'pinged' to detect a closed airway.</source>
+        <translation>En puls av lufttryck ivägskickad för att upptäcka en stängd luftväg.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2082"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2084"/>
+        <source>Flex Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2083"/>
+        <source>PRS1 pressure relief mode.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2089"/>
+        <source>C-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2090"/>
+        <source>C-Flex+</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2091"/>
+        <source>A-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2092"/>
+        <source>Rise Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2093"/>
+        <source>Bi-Flex</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2097"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2099"/>
+        <source>Flex Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2098"/>
+        <source>PRS1 pressure relief setting.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2103"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2134"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2156"/>
+        <source>x1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2104"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2135"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2157"/>
+        <source>x2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2105"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2136"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2158"/>
+        <source>x3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2106"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2137"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2159"/>
+        <source>x4</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2107"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2138"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2160"/>
+        <source>x5</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2111"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2113"/>
+        <source>Humidifier Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2112"/>
+        <source>PRS1 humidifier connected?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2115"/>
+        <source>Disconnected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2116"/>
+        <source>Connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2120"/>
+        <source>Heated Tubing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2121"/>
+        <source>Heated Tubing Connected</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2122"/>
+        <source>Headed Tubing</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2129"/>
+        <source>Humidification Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2130"/>
+        <source>PRS1 Humidification level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2131"/>
+        <source>Humid. Lvl.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2142"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2143"/>
+        <source>System One Resistance Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2144"/>
+        <source>Sys1 Resist. Status</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2151"/>
+        <source>System One Resistance Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2152"/>
+        <source>System One Mask Resistance Setting</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2153"/>
+        <source>Sys1 Resist. Set</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2164"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2166"/>
+        <source>Hose Diameter</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2165"/>
+        <source>Diameter of primary CPAP hose</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2173"/>
+        <source>System One Resistance Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2174"/>
+        <source>Whether System One resistance settings are available to you.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2175"/>
+        <source>Sys1 Resist. Lock</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2182"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2184"/>
+        <source>Auto On</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2183"/>
+        <source>A few breaths automatically starts machine</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2191"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2193"/>
+        <source>Auto Off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2192"/>
+        <source>Machine automatically switches off</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2200"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2202"/>
+        <source>Mask Alert</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2201"/>
+        <source>Whether or not machine allows Mask checking.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2209"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2211"/>
+        <source>Show AHI</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2210"/>
+        <source>Whether or not machine shows AHI via LCD panel.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2223"/>
+        <source>Unknown PRS1 Code %1</source>
+        <translation>Okänd PRS1 Code %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2224"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2225"/>
+        <source>PRS1_%1</source>
+        <translation>PRS1_%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2290"/>
+        <source>Timed Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2291"/>
+        <source>Machine Initiated Breath</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp" line="2292"/>
+        <source>TB</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/preferences.cpp" line="33"/>
+        <source>Windows User</source>
+        <translation>Windows-användare</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="256"/>
+        <source>Launching Windows Explorer failed</source>
+        <translation>Starta Utforskaren misslyckades</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="257"/>
+        <source>Could not find explorer.exe in path to launch Windows Explorer.</source>
+        <translation>Det gick inte att hitta explorer.exe i datorn för att starta Utforskaren.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="308"/>
+        <source>SleepyHead (%1) needs to upgrade its database for %2 %3 %4</source>
+        <translation>Sleepyhead (%1) måste uppgradera sin databas för %2 %3 %4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="321"/>
+        <source><b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b></source>
+        <translation><b>Sleepyhead har en säkerhetskopia av dina enheters minneskort som den använder för detta ändamål.</b></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="322"/>
+        <source><i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i></source>
+        <translation><i>Dina gamla maskindata bör regenereras förutsatt att denna backup funktion inte har inaktiverats i inställningarna under en tidigare dataimport.</i></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="325"/>
+        <source>SleepyHead does not yet have any automatic card backups stored for this device.</source>
+        <translation>Sleepyhead har ännu inte några automatiska kortsäkerhetskopior som sparats för denna enhet.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="326"/>
+        <source>This means you will need to import this machine data again afterwards from your own backups or data card.</source>
+        <translation>Detta innebär att du kommer att behöva importera denna maskindata igen efteråt från dina egna säkerhetskopior eller datakort.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Important:</source>
+        <translation>Viktigt:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="329"/>
+        <source>Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore.</source>
+        <translation>Efter du har uppgraderat, du <font size=+1>kan inte</font>använda denna profil med den tidigare versionen längre.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="330"/>
+        <source>If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.</source>
+        <translation>Om du är orolig, klicka på Nej för att avsluta, och säkerhetskopiera din profil manuellt innan du startar SleepyHead igen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="331"/>
+        <source>Are you ready to upgrade, so you can run the new version of SleepyHead?</source>
+        <translation>Är du redo att uppgradera, så du kan använda den nya versionen av SleepyHead?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="334"/>
+        <source>Machine Database Changes</source>
+        <translation>Maskindatabas Förändringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="345"/>
+        <source>Sorry, the purge operation failed, which means this version of SleepyHead can't start.</source>
+        <translation>Tyvärr, rensningen misslyckades, vilket innebär att den här versionen av Sleepyhead inte kan starta.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="346"/>
+        <source>The machine data folder needs to be removed manually.</source>
+        <translation>Maskinens data-katalog måste raderas manuellt.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="347"/>
+        <source>This folder currently resides at the following location:</source>
+        <translation>Denna mapp är för närvarande på följande plats:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="353"/>
+        <source>Rebuilding from %1 Backup</source>
+        <translation>Återskapar från %1 Säkerhetskopia</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="358"/>
+        <source>Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?</source>
+        <translation>Vill du slå på automatisk säkerhetskopiering, så nästa gång en ny version av SleepyHead behöver göra det, kan återskapa från dessa?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="365"/>
+        <source>SleepyHead will now start the import wizard so you can reinstall your %1 data.</source>
+        <translation>SleepyHead startar nu import-guiden så du kan återinstallera dina %1 data.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="375"/>
+        <source>SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:</source>
+        <translation>Sleepyhead kommer nu att avslutas, starta sen om din filhanterare så att du kan säkerhetskopiera din profil manuellt:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/profiles.cpp" line="377"/>
+        <source>Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.</source>
+        <translation>Använd filhanteraren för att göra en kopia av din profilmapp, sedan det är klart, starta om Sleepyhead och slutför uppgraderingen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="81"/>
+        <source>Release Notes</source>
+        <translation>Nyheter i denna version</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="92"/>
+        <source>&Ok, get on with it..</source>
+        <translation>&Ok, gå vidare med det..</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="164"/>
+        <source>Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.</source>
+        <translation>Leta efter denna version i <a href='%1'>SleepyHead's filer som är lagrade hos Sourceforge</a>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="171"/>
+        <source>A faster build of SleepyHead may be available</source>
+        <translation>En snabbare version av SleepyHead kan vara tillgänglig</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="172"/>
+        <source>You will not be bothered with this message again.</source>
+        <translation>Du kommer inte bli störd av det här meddelandet igen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="173"/>
+        <source>This version will run fine, but a "<b>%1</b>" tagged build of SleepyHead will likely run much smoother on your computer.</source>
+        <translation>Denna version kommer att fungera bra, men en "<b>%1</b>" märkt version av Sleepyhead kommer sannolikt köras mycket smidigare på din dator.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="178"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.</source>
+        <translation>Denna version av SleepyHead var utformad för att fungera med äldre datorer som saknar OpenGL 2.0 stöd, men det ser ut som din dator har fullt stöd för det.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="189"/>
+        <source>This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.</source>
+        <translation>Denna version av SleepyHead var utformad för att fungera med äldre datorer som saknar OpenGL 2.0 stöd, vilket din har, så det kan finnas en bättre version för din dator.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="191"/>
+        <source>If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.</source>
+        <translation>Om du kör detta i en virtuell maskin som VirtualBox eller VMware, vänligen bortse från detta meddelande, eftersom ingen bättre version är tillgänglig.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="201"/>
+        <source>Incompatible Graphics Hardware</source>
+        <translation>Ej lämplig grafik-hårdvara</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="202"/>
+        <source>This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.</source>
+        <translation>Denna version av SleepyHead kräver OpenGL 2.0 stöd för att kunna fungera fullständigt, och tyvärr så saknar din dator denna funktion.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="203"/>
+        <source>You may need to update your computers graphics drivers from the GPU makers website. %1</source>
+        <translation>Du kan behöva uppdatera din dators grafikdrivrutiner från tillverkarens webbplats. %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="204"/>
+        <source>(<a href='http://intel.com/support'>Intel's support site</a>)</source>
+        <translation>(<a href='http://intel.com/support'>Intel's support site</a>)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="205"/>
+        <source>Because graphs will not render correctly, and it may cause crashes, this build will now exit.</source>
+        <translation>Eftersom grafer inte kommer att visas på rätt sätt och kanske orsaka krasher, så avslutas denna version nu.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="206"/>
+        <source>Don't be disheartened, there is another build available tagged "<b>-BrokenGL</b>" that should work on your computer.</source>
+        <translation>Bli inte nedslagen, det finns en annan version tillgänglig märkt "<b>-BrokenGL</b>" som bör fungera på din dator.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>No SleepyHead data folder was found.</source>
+        <translation>Ingen SleepyHead data-mapp hittades.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="234"/>
+        <source>Would you like SleepyHead to use the default location for storing its data?</source>
+        <translation>Vill du att SleepyHead använder standardplatsen för att lagra sina data?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="245"/>
+        <source>Choose or create new folder for SleepyHead data</source>
+        <translation>Välj eller skapa en ny mapp för SleepyHead:s data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="250"/>
+        <source>Exiting</source>
+        <translation>Spännande</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>As you did not select a data folder, SleepyHead will exit.</source>
+        <translation>Eftersom du inte valt en data-mapp så avslutas SleepyHead.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="251"/>
+        <source>Next time you run, you will be asked again.</source>
+        <translation>Nästa gång du kör detta, så blir du tillfrågad igen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>You did not select a directory.</source>
+        <translation>Du valde inte en katalog.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="255"/>
+        <source>SleepyHead will now start with your old one.</source>
+        <translation>SleepyHead startar nu med din gamla.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="266"/>
+        <source>The folder you chose is not empty, nor does it already contain valid SleepyHead data.</source>
+        <translation>Mappen du väljer inte är tom, inte innehåller den giltiga SleepyHead data heller.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/main.cpp" line="267"/>
+        <source>Are you sure you want to use this folder?</source>
+        <translation>Är du säker du vill använda den här mappen?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1393"/>
+        <source>About SleepyHead</source>
+        <translation>Om SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1409"/>
+        <source>&Close</source>
+        <translation>&Stäng</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/mainwindow.cpp" line="1413"/>
+        <source>&Donate</source>
+        <translation>&Skänk en slant</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="40"/>
+        <source>Unspecified</source>
+        <translation>Ospecifierad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="41"/>
+        <source>Nasal Pillows</source>
+        <translation>Näs-kuddar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="42"/>
+        <source>Hybrid F/F Mask</source>
+        <translation>Hybrid FullFace mask</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="43"/>
+        <source>Nasal Interface</source>
+        <translation>Näs-masker</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="44"/>
+        <source>Full-Face Mask</source>
+        <translation>Full-Face Mask</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/preferencesdialog.cpp" line="1132"/>
+        <source>Are you sure you want to reset all your channel colors and settings to defaults?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="39"/>
+        <source>There are no graphs visible to print</source>
+        <translation>Det finns inga grafer synliga för utskrift</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="56"/>
+        <source>Would you like to show bookmarked areas in this report?</source>
+        <translation>Vill du visa bokmärkta områden i denna rapport?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="96"/>
+        <source>This make take some time to complete..
+Please don't touch anything until it's done.</source>
+        <translation>Detta gör att det tar tid att slutföra...
+Rör ingenting förrän det är klart.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="97"/>
+        <source>Printing %1 Report</source>
+        <translation>Skriver %1 rapport</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="130"/>
+        <source>%1 Report</source>
+        <translation>%1 Rapport</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="180"/>
+        <source>: %1 hours, %2 minutes, %3 seconds
+</source>
+        <translation>: %1 timme, %2 minuter, %3 sekunder
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Range</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="215"/>
+        <source>Fixed %1</source>
+        <translation type="unfinished">Fast %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="270"/>
+        <source>RDI	%1
+</source>
+        <translation>RDI	%1
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="272"/>
+        <source>AHI	%1
+</source>
+        <translation>AHI	%1
+</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="306"/>
+        <source>AI=%1 HI=%2 CAI=%3 </source>
+        <translation>AI=%1 HI=%2 CAI=%3 </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="310"/>
+        <source>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</source>
+        <translation>REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="314"/>
+        <source>UAI=%1 </source>
+        <translation>UAI=%1 </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="316"/>
+        <source>NRI=%1 LKI=%2 EPI=%3</source>
+        <translation>NRI=%1 LKI=%2 EPI=%3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="384"/>
+        <source>Reporting from %1 to %2</source>
+        <translation>Rapporterar från %1 till %2</translation>
+    </message>
+    <message>
+        <source>Reporting data goes here</source>
+        <translation type="vanished">Rapportera uppgifter kan göras här</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="451"/>
+        <source>Entire Day's Flow Waveform</source>
+        <translation>Dagens alla flödes-data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="457"/>
+        <source>Current Selection</source>
+        <translation>Aktuell markering</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="467"/>
+        <source>Entire Day</source>
+        <translation>Hela dagen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="586"/>
+        <source>SleepyHead v%1 - http://sleepyhead.sourceforge.net</source>
+        <translation>SleepyHead v%1 - http://sleepyhead.sourceforge.net</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="592"/>
+        <source>Page %1 of %2</source>
+        <translation>Sida %1 av %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/reports.cpp" line="659"/>
+        <source>SleepyHead has finished sending the job to the printer.</source>
+        <translation>SleepyHead har skickat utskriften till skrivaren.</translation>
+    </message>
+    <message>
+        <source>No Waveform Available</source>
+        <translation type="vanished">Ingen flödes-data tillgänglig</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="404"/>
+        <source>Events</source>
+        <translation>Händelser</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="402"/>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="405"/>
+        <source>Duration</source>
+        <translation>Varaktighet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineOverlay.cpp" line="419"/>
+        <source>(% %1 in events)</source>
+        <translation>(% %1 i händelser)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1029"/>
+        <source>Days: %1</source>
+        <translation>Dagar. %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1033"/>
+        <source>Low Usage Days: %1</source>
+        <translation>Dagar med låg användning: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1034"/>
+        <source>(%1% compliant, defined as > %2 hours)</source>
+        <translation>(%1% användning, definerad som > %2 timmar)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1148"/>
+        <source>(Sess: %1)</source>
+        <translation>(Sess: %1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1156"/>
+        <source>Bedtime: %1</source>
+        <translation>Sängdags: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1158"/>
+        <source>Waketime: %1</source>
+        <translation>Uppvakningstid: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1198"/>
+        <source>90%</source>
+        <translation>90%</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gSummaryChart.cpp" line="1270"/>
+        <source>(Summary Only)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jan</source>
+        <translation>Jan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Feb</source>
+        <translation>Feb</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Mar</source>
+        <translation>Mar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Apr</source>
+        <translation>Apr</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>May</source>
+        <translation>Maj</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="58"/>
+        <source>Jun</source>
+        <translation>Jun</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Jul</source>
+        <translation>Jul</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Aug</source>
+        <translation>Aug</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Sep</source>
+        <translation>Sep</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Oct</source>
+        <translation>Okt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Nov</source>
+        <translation>Nov</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gXAxis.cpp" line="59"/>
+        <source>Dec</source>
+        <translation>Dec</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="92"/>
+        <source>Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!</source>
+        <translation>Gick inte att analysera Channels.xml, denna version är på allvar borked, inget annat val än att avbryta !!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="104"/>
+        <source>Therapy Pressure</source>
+        <translation>Terapi tryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="108"/>
+        <source>Inspiratory Pressure</source>
+        <translation>Inandningstryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="112"/>
+        <source>Lower Inspiratory Pressure</source>
+        <translation>Lägre Inandningstryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="116"/>
+        <source>Higher Inspiratory Pressure</source>
+        <translation>Högre inandningstryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="120"/>
+        <source>Expiratory Pressure</source>
+        <translation>Utandningstryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="124"/>
+        <source>Lower Expiratory Pressure</source>
+        <translation>Lägre utandningstryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="128"/>
+        <source>Higher Expiratory Pressure</source>
+        <translation>Högre utandningstryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="132"/>
+        <source>Pressure Support</source>
+        <translation>Tryckstöd</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="137"/>
+        <source>PS Min</source>
+        <translation>PS Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="136"/>
+        <source>Pressure Support Minimum</source>
+        <translation>Tryckstöd minimum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="141"/>
+        <source>PS Max</source>
+        <translation>PS Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="140"/>
+        <source>Pressure Support Maximum</source>
+        <translation>Tryckstöd Maximum</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Min Pressure</source>
+        <translation>Min Tryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="144"/>
+        <source>Minimum Therapy Pressure</source>
+        <translation>Minimum Terapi Tryck</translation>
+    </message>
+    <message>
+        <source>Pr. Min</source>
+        <translation type="vanished">Pr. Min</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Max Pressure</source>
+        <translation>Max Tryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="148"/>
+        <source>Maximum Therapy Pressure</source>
+        <translation>Maximum Terapi Tryck</translation>
+    </message>
+    <message>
+        <source>Pr. Max</source>
+        <translation type="vanished">Pr. Max</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="153"/>
+        <source>Ramp Time</source>
+        <translation>Ramp Tid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="152"/>
+        <source>Ramp Delay Period</source>
+        <translation>Ramp fördröjnings period</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="157"/>
+        <source>Ramp Pressure</source>
+        <translation>Ramptryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="156"/>
+        <source>Starting Ramp Pressure</source>
+        <translation>Start Ramptryck</translation>
+    </message>
+    <message>
+        <source>Ramp Pr.</source>
+        <translation type="vanished">Ramp Pr.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="145"/>
+        <source>Pressure Min</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="149"/>
+        <source>Pressure Max</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="161"/>
+        <source>Ramp Event</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="162"/>
+        <source>Ramp</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="167"/>
+        <source>Periodic Breathing</source>
+        <translation>Periodisk Andning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="168"/>
+        <source>A period of periodic breathing</source>
+        <translation>En period av periodisk andning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="173"/>
+        <source>Clear Airway Apnea</source>
+        <translation>Central Apne</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="174"/>
+        <source>An apnea where the airway is open</source>
+        <translation>Ett andningsuppehåll där luftvägarna är öppna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="179"/>
+        <source>Obstructive Apnea</source>
+        <translation>Obstruktiv Apne</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="180"/>
+        <source>An apnea caused by airway obstruction</source>
+        <translation>Ett andningsuppehåll där luftvägarna är blockerade</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="185"/>
+        <source>Hypopnea</source>
+        <translation>Hypopné</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="186"/>
+        <source>A partially obstructed airway</source>
+        <translation>En delvis blockerad luftväg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="190"/>
+        <source>Unclassified Apnea</source>
+        <translation>Ospecifierat andningsuppehåll</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="191"/>
+        <source>An apnea that could not fit into a category</source>
+        <translation>Ett andningsuppehåll som inte kan placeras i någon kategori</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="192"/>
+        <source>UA</source>
+        <translation>UA</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="196"/>
+        <source>An restriction in breathing from normal, causing a flattening of the flow waveform.</source>
+        <translation>En begränsning i andningen från normalt, vilket orsakar en utplaning av flödes vågformen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="200"/>
+        <source>Respiratory Effort Related Arousal</source>
+        <translation>Andningsrelaterat uppvaknande</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="201"/>
+        <source>An restriction in breathing that causes an either an awakening or sleep disturbance.</source>
+        <translation>En begränsning att andas som orsakar en antingen ett uppvaknande eller sömnstörningar.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>Vibratory Snore</source>
+        <translation>Snarkning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="205"/>
+        <source>A vibratory snore</source>
+        <translation>En snarkning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="209"/>
+        <source>Vibratory Snore (VS2) </source>
+        <translation>Snarkning (VS2) </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="210"/>
+        <source>A vibratory snore as detcted by a System One machine</source>
+        <translation>En snarkning som registreras av Philips System One maskin</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="215"/>
+        <source>Leak Flag</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="216"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="222"/>
+        <source>A large mask leak affecting machine performance.</source>
+        <translation>En stor mask läcka som påverkar maskinens prestanda.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="217"/>
+        <source>LF</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="226"/>
+        <source>Non Responding Event</source>
+        <translation>En händelse som inte reageras på</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="227"/>
+        <source>A type of respiratory event that won't respond to a pressure increase.</source>
+        <translation>En typ av andnings händelse som inte kommer att ge någon tryckökning.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="231"/>
+        <source>Expiratory Puff</source>
+        <translation>Utandnings puff</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="232"/>
+        <source>Intellipap event where you breathe out your mouth.</source>
+        <translation>Intellipap händelse där du andas ut genom munnen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="237"/>
+        <source>SensAwake feature will reduce pressure when waking is detected.</source>
+        <translation>SensAwake funktion minskar trycket när uppvaknande upptäcks.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="241"/>
+        <source>User Flag #1</source>
+        <translation>Användar flagga#1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="242"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="252"/>
+        <source>A user definable event detected by SleepyHead's flow waveform processor.</source>
+        <translation>En användardefinierad händelse som upptäcks av SleepyHead:s flödes-vågform processor.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="246"/>
+        <source>User Flag #2</source>
+        <translation>Användar flagga #2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="251"/>
+        <source>User Flag #3</source>
+        <translation>Användar flagga #3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="258"/>
+        <source>Heart rate in beats per minute</source>
+        <translation>Puls i slag per minut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>SpO2 %</source>
+        <translation>SpO2 %</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="265"/>
+        <source>Blood-oxygen saturation percentage</source>
+        <translation>Blod-syremättnadsprocent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="271"/>
+        <source>Plethysomogram</source>
+        <translation>Plethysomogram</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="272"/>
+        <source>An optical Photo-plethysomogram showing heart rhythm</source>
+        <translation>En optisk foto-plethysomogram visande hjärtrytmen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="276"/>
+        <source>Perfusion Index</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="277"/>
+        <source>A relative assessment of the pulse strength at the monitoring site</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="278"/>
+        <source>Perf. Index %</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="281"/>
+        <source>Pulse Change</source>
+        <translation>Puls förändring</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="282"/>
+        <source>A sudden (user definable) change in heart rate</source>
+        <translation>En plötslig (användardefinierad) förändring av hjärtfrekvensen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="286"/>
+        <source>SpO2 Drop</source>
+        <translation>SpO2 Nedgång</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="287"/>
+        <source>A sudden (user definable) drop in blood oxygen saturation</source>
+        <translation>En plötslig (användardefinierad) nedgång i blodets syremättnad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="288"/>
+        <source>SD</source>
+        <translation>SD</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="315"/>
+        <source>Breathing flow rate waveform</source>
+        <translation>Andning flödesvågform</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="319"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="320"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="324"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure</source>
+        <translation>Mask Tryck</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="325"/>
+        <source>Mask Pressure (High resolution)</source>
+        <translation>Mask Tryck (Hög upplösning)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="330"/>
+        <source>Amount of air displaced per breath</source>
+        <translation>Mängden luft visad per andetag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="335"/>
+        <source>Graph displaying snore volume</source>
+        <translation>Graf som visar omfattningen av snarkning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="339"/>
+        <source>Minute Ventilation</source>
+        <translation>Minut Ventilation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="340"/>
+        <source>Amount of air displaced per minute</source>
+        <translation>Mängden luft visad per minut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="344"/>
+        <source>Respiratory Rate</source>
+        <translation>Andningsfrekvens</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="345"/>
+        <source>Rate of breaths per minute</source>
+        <translation>Andningsfrekvens per minut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="349"/>
+        <source>Patient Triggered Breaths</source>
+        <translation>Patient Triggade Andetag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Percentage of breaths triggered by patient</source>
+        <translation>Procentandel av andetag utlösta av patienten</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="350"/>
+        <source>Pat. Trig. Breaths</source>
+        <translation>Patient triggade andetag</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="354"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Leak Rate</source>
+        <translation>Storlek på Läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="355"/>
+        <source>Rate of detected mask leakage</source>
+        <translation>Storlek på upptäckta mask-läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="361"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>I:E Ratio</source>
+        <translation>I:E förhållande</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="362"/>
+        <source>Ratio between Inspiratory and Expiratory time</source>
+        <translation>Förhållande mellan inandningstid och utandningstid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Expiratory Time</source>
+        <translation>Utandningstid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="366"/>
+        <source>Time taken to breathe out</source>
+        <translation>Tid för att andas ut</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Inspiratory Time</source>
+        <translation>Inandningstid</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="370"/>
+        <source>Time taken to breathe in</source>
+        <translation>Tid för att andas in</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="374"/>
+        <source>Respiratory Event</source>
+        <translation>Andnings händelse</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="375"/>
+        <source>A ResMed data source showing Respiratory Events</source>
+        <translation>En ResMed datakälla som visar Andnings händelser</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Graph showing severity of flow limitations</source>
+        <translation>Diagram som visar svårighetsgraden av flödesbegränsningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="380"/>
+        <source>Flow Limit.</source>
+        <translation>Flödesbegränsning.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="384"/>
+        <source>Target Minute Ventilation</source>
+        <translation>Mål Minut Ventilation</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="385"/>
+        <source>Target Minute Ventilation?</source>
+        <translation>Mål Minut Ventilation?</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="389"/>
+        <source>Maximum Leak</source>
+        <translation>Maximum läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>The maximum rate of mask leakage</source>
+        <translation>Största uppmätta mask-läckaget</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="390"/>
+        <source>Max Leaks</source>
+        <translation>Max läcka</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="394"/>
+        <source>Apnea Hypopnea Index</source>
+        <translation>Apnea Hypopnea Index</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="395"/>
+        <source>Graph showing running AHI for the past hour</source>
+        <translation>Diagram som visar rullande AHI den senaste timmen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="399"/>
+        <source>Total Leak Rate</source>
+        <translation>Totalt läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="400"/>
+        <source>Detected mask leakage including natural Mask leakages</source>
+        <translation>Upptäckta mask läckage inkluderande naturligt Mask läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="404"/>
+        <source>Median Leak Rate</source>
+        <translation>Median Läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median rate of detected mask leakage</source>
+        <translation>Median upptäckta mask läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="405"/>
+        <source>Median Leaks</source>
+        <translation>Median Läckage</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="409"/>
+        <source>Respiratory Disturbance Index</source>
+        <translation>Andningsstörningsindex</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="410"/>
+        <source>Graph showing running RDI for the past hour</source>
+        <translation>Diagram som visar rullande RDI den senaste timmen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="416"/>
+        <source>Sleep position in degrees</source>
+        <translation>Sovposition i grader</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="421"/>
+        <source>Upright angle in degrees</source>
+        <translation>Upprätt vinkel i grader</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="425"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Mask On Time</source>
+        <translation>Tid för mask på</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="426"/>
+        <source>Time started according to str.edf</source>
+        <translation>Tiden började enligt str.edf</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="430"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>Summary Only</source>
+        <translation>Sammanställning enbart</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="431"/>
+        <source>CPAP Session contains summary data only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="436"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="438"/>
+        <source>PAP Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="437"/>
+        <source>PAP Device Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="443"/>
+        <source>APAP (Variable)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="447"/>
+        <source>ASV (Fixed EPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="448"/>
+        <source>ASV (Variable EPAP)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="922"/>
+        <source>Zero</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="925"/>
+        <source>Upper Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="928"/>
+        <source>Lower Threshold</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>CPAP Session contains summary data onlyf</source>
+        <translation type="vanished">CPAP period innehåller sammanfattningsdata enbart</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="315"/>
+        <source>There is a lockfile already present for profile '%1'.</source>
+        <translation>Det finns en lockfile redan för profil '%1'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="316"/>
+        <location filename="../sleepyhead/profileselect.cpp" line="326"/>
+        <source>You can only work with one instance of an individual SleepyHead profile at a time.</source>
+        <translation>Du kan bara arbeta med en instans av en enskild Sleepyhead-profil åt gången.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="317"/>
+        <source>Please close any other instances of SleepyHead running with this profile before proceeding.</source>
+        <translation>Stäng alla andra instanser av Sleepyhead som kör med den här profilen innan du fortsätter.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="318"/>
+        <source>If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message.</source>
+        <translation>Om inga andra instanser av Sleepyhead körs (t.ex. kraschade det förra gången!), Är det säkert att ignorera detta meddelande.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="325"/>
+        <source>There is a lockfile already present for this profile '%1', claimed on '%2'.</source>
+        <translation>Det finns en lockfile redan för den här profilen '%1', hävdade på '%2'.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/profileselect.cpp" line="327"/>
+        <source>If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding.</source>
+        <translation>Om du använder moln lagring, se till SleepyHead är stängd och synkronisering har slutfört först på den andra datorn innan du fortsätter.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="112"/>
+        <source>Name: %1, %2</source>
+        <translation>Namn: %1, %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="114"/>
+        <source>DOB: %1</source>
+        <translation>Födelsedatum: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="117"/>
+        <source>Phone: %1</source>
+        <translation>Telefon: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="120"/>
+        <source>Email: %1</source>
+        <translation>E-post: %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="123"/>
+        <source>Address:</source>
+        <translation>Adress:</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="165"/>
+        <source>Usage Statistics</source>
+        <translation>Användningsstatistik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="179"/>
+        <source>This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>.</source>
+        <translation>Denna rapport har genererats av en förhandsversion av Sleepyhead (%1), <b> och har inte godkänts på något sätt för efterlevnad eller medicinska diagnostiska ändamål</b>.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="181"/>
+        <source>SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead</source>
+        <translation>Sleepyhead är fri programvara med öppen källkod tillgänglig från http://sourceforge.net/projects/SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1039"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1041"/>
+        <source>Auto Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1045"/>
+        <source>ASV Auto EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/MinutesAtPressure.cpp" line="234"/>
+        <source>(% of time)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gFlagsLine.cpp" line="195"/>
+        <source>Database Outdated
+Please Rebuild CPAP Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1271"/>
+        <source>SleepyHead is proudly brought to you by JediMark.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1394"/>
+        <source>d MMM [ %1 - %2 ]</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1930"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1983"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2058"/>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2075"/>
+        <source>%1</source>
+        <translation type="unfinished">%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2038"/>
+        <source>Hide All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2039"/>
+        <source>Show All Events</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2363"/>
+        <source>Unpin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="2438"/>
+        <source>Pin %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1066"/>
+        <source>Plots Disabled</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1148"/>
+        <source>Duration %1:%2:%3</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gLineChart.cpp" line="1149"/>
+        <source>AHI %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="107"/>
+        <source>%1: %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="150"/>
+        <source>Relief: %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="156"/>
+        <source>Hours: %1h, %2m, %3s</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gdailysummary.cpp" line="259"/>
+        <source>Machine Information</source>
+        <translation type="unfinished">Maskin Information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="129"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="131"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="133"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>%1 %2</source>
+        <translation type="unfinished">%1 %2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="138"/>
+        <source>Peak</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="142"/>
+        <source>%1% %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1241"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1060"/>
+        <source>Fixed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1243"/>
+        <source>Auto</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1245"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="444"/>
+        <source>Fixed Bi-Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1247"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="445"/>
+        <source>Auto Bi-Level (Fixed PS)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1249"/>
+        <location filename="../sleepyhead/SleepLib/schema.cpp" line="446"/>
+        <source>Auto Bi-Level (Variable PS)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1251"/>
+        <location filename="../sleepyhead/statistics.cpp" line="1043"/>
+        <source>ASV Fixed EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1253"/>
+        <source>ASV Variable EPAP</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1274"/>
+        <source>%1%2</source>
+        <translation type="unfinished">%1%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1294"/>
+        <source>Fixed %1 (%2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1296"/>
+        <source>Min %1 Max %2 (%3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1298"/>
+        <source>EPAP %1 IPAP %2 (%3)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1300"/>
+        <source>PS %1 over %2-%3 (%4)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1302"/>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1306"/>
+        <source>Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/day.cpp" line="1304"/>
+        <source>EPAP %1 PS %2-%3 (%6)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="25"/>
+        <source>Journal Data</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="43"/>
+        <source>SleepyHead found an old Journal folder, but it looks like it's been renamed:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="45"/>
+        <source>SleepyHead will not touch this folder, and will create a new one instead.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="46"/>
+        <source>Please be careful when playing in SleepyHead's profile folders :-P</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="53"/>
+        <source>For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="54"/>
+        <source>SleepyHead picked only the first one of these, and will use it in future:</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/journal.cpp" line="56"/>
+        <source>If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>Contec</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50_loader.h" line="39"/>
+        <source>CMS50</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F3.7</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h" line="41"/>
+        <source>CMS50F</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>Fisher & Paykel</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/icon_loader.h" line="76"/>
+        <source>ICON</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="587"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="589"/>
+        <source>SmartFlex Mode</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="588"/>
+        <source>Intellipap pressure relief mode.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="594"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2639"/>
+        <source>Ramp Only</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="595"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2640"/>
+        <source>Full Time</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="598"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="600"/>
+        <source>SmartFlex Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp" line="599"/>
+        <source>Intellipap pressure relief level.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>DeVilbiss</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="73"/>
+        <source>Intellipap</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/intellipap_loader.h" line="81"/>
+        <source>SmartFlex Settings</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>ChoiceMMed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/md300w1_loader.h" line="41"/>
+        <source>MD300</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>Respironics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/mseries_loader.h" line="66"/>
+        <source>M-Series</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>Philips Respironics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/prs1_loader.h" line="171"/>
+        <source>System One</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1034"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="1586"/>
+        <source>VPAP Adapt</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2632"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2634"/>
+        <source>EPR</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2633"/>
+        <source>ResMed Exhale Pressure Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2641"/>
+        <source>Patient???</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2644"/>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2646"/>
+        <source>EPR Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2645"/>
+        <source>Exhale Pressure Relief Level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2649"/>
+        <source>0cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2650"/>
+        <source>1cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2651"/>
+        <source>2cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp" line="2652"/>
+        <source>3cmH2O</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>ResMed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="386"/>
+        <source>S9</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/resmed_loader.h" line="395"/>
+        <source>EPR: </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/somnopose_loader.h" line="36"/>
+        <source>Somnopose Software</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>Weinmann</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/weinmann_loader.h" line="116"/>
+        <source>SOMNOsoft2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Zeo</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/loader_plugins/zeo_loader.h" line="37"/>
+        <source>Personal Sleep Coach</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/machine.cpp" line="404"/>
+        <source>Loading %1 data...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/SleepLib/progressdialog.cpp" line="14"/>
+        <source>PLease Wait...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>By Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="272"/>
+        <source>Statistics at Pressure</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/daily.cpp" line="923"/>
+        <source>%1 Session #%2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="90"/>
+        <source>Welcome to SleepyHead</source>
+        <translation type="unfinished">Välkommen till SleepyHead</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>What would you like to do?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="99"/>
+        <source>Please Import Some Data</source>
+        <translation type="unfinished">Vänligen Importera Vissa Data</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="104"/>
+        <source>CPAP<br/>Importer</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="109"/>
+        <source>Oximetery<br/>Wizard</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="113"/>
+        <source>or</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="116"/>
+        <source>View<br/>Statistics</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="122"/>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="unfinished">Det kan vara en god idé att kolla inställningarna först,</br>eftersom det finns några alternativ som kan påverka importen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="123"/>
+        <source>First import can take a few minutes.</source>
+        <translation type="unfinished">Första importen kan ta några minuter.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="139"/>
+        <source>Click this box to see this in daily view.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="141"/>
+        <source>The last time you used your %1...</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="145"/>
+        <source>last night</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="146"/>
+        <source>yesterday</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="147"/>
+        <source>%2 days ago</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="149"/>
+        <source>was %1 (on %2)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="157"/>
+        <source>perfect :)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="158"/>
+        <source>pretty darn good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="159"/>
+        <source>reasonably good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="160"/>
+        <source>technically "treated"</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="161"/>
+        <source>not very good</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="162"/>
+        <source>horrible, please consult your doctor</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="164"/>
+        <source>You had an AHI of %1, which is considered %2</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="169"/>
+        <source>%1 hours, %2 minutes and %3 seconds</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="171"/>
+        <source>You machine was on for %1.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="172"/>
+        <source><font color = red>You only had the mask on for %1.</font></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="179"/>
+        <source>You had no <i>major</i> mask leaks (maximum was %1 %2).</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="180"/>
+        <source>You had a small but acceptable amount of <i>major</i> mask leakage.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="181"/>
+        <source>You had significant periods of <i>major</i> mask leakage.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="182"/>
+        <source>Your mask is leaking way too much.. Talk to your CPAP advisor.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="190"/>
+        <source>Your CPAP machine blasted you with a constant %1%2 of air</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="193"/>
+        <source>Your pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="197"/>
+        <source>Your machine blasted you with a constant %1-%2 %3 of air.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="201"/>
+        <source>Your machine was under %1-%2 %3 for %4% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="206"/>
+        <source>Your EPAP pressure fixed at %1%2.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="207"/>
+        <location filename="../sleepyhead/welcome.cpp" line="213"/>
+        <source>Your IPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="212"/>
+        <source>Your EPAP pressure was under %1%2 for %3% of the time.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="220"/>
+        <source>No CPAP data has been imported yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="226"/>
+        <source>Most recent Oximetery data: <a onclick='alert("daily=%2");'>%1</a> </source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="227"/>
+        <source>(last night)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="228"/>
+        <source>(yesterday)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="229"/>
+        <source>(%2 day ago)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="232"/>
+        <source>No oximetery data has been imported yet.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="238"/>
+        <source>Very Important Warning</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="240"/>
+        <source><p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="241"/>
+        <source><p><span title="Mac OSX and Win8.1"  onmouseover='ChangeColor(this, "#eeeeee");' onmouseout='ChangeColor(this, "#ffffff");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/welcome.cpp" line="242"/>
+        <source><p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p></source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="334"/>
+        <source>Snapshot %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>QuaZipFilePrivate</name>
+    <message>
+        <location filename="../3rdparty/quazip/quazip/quazipfile.cpp" line="217"/>
+        <source>ZIP/UNZIP API error %1</source>
+        <translation>ZIP/UNZIP API error %1</translation>
+    </message>
+</context>
+<context>
+    <name>Report</name>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="14"/>
+        <source>Form</source>
+        <translation>Formulär</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/report.ui" line="27"/>
+        <source>about:blank</source>
+        <translation>om:tom</translation>
+    </message>
+</context>
+<context>
+    <name>SessionBar</name>
+    <message>
+        <location filename="../sleepyhead/sessionbar.cpp" line="282"/>
+        <source>No Sessions Present</source>
+        <translation>Ingen Period finns för närvarande</translation>
+    </message>
+</context>
+<context>
+    <name>Statistics</name>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="30"/>
+        <source>CPAP Statistics</source>
+        <translation>CPAP Statistik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="33"/>
+        <source>CPAP Usage</source>
+        <translation>CPAP Användning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="34"/>
+        <source>Average Hours per Night</source>
+        <translation>Genomsnitt timmar per natt</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="35"/>
+        <source>Compliance</source>
+        <translation>Användning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="37"/>
+        <source>Therapy Efficiacy</source>
+        <translation>Terapi Effektivitet</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="47"/>
+        <source>Leak Statistics</source>
+        <translation>Läckage Statistik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="52"/>
+        <source>Pressure Statistics</source>
+        <translation>Tryck Statistik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="65"/>
+        <source>Oximeter Statistics</source>
+        <translation>Oximeter Statistik</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="69"/>
+        <source>Blood Oxygen Saturation</source>
+        <translation>Blod Syremättnad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="74"/>
+        <source>Pulse Rate</source>
+        <translation>Puls</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="82"/>
+        <source>%1 Median</source>
+        <translation>%1 Median</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="83"/>
+        <location filename="../sleepyhead/statistics.cpp" line="84"/>
+        <source>Average %1</source>
+        <translation>Genomsnitt %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="85"/>
+        <source>90% %1</source>
+        <translation>90% %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="86"/>
+        <source>Min %1</source>
+        <translation>Min %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="87"/>
+        <source>Max %1</source>
+        <translation>Max %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="88"/>
+        <source>%1 Index</source>
+        <translation>%1 Index</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="89"/>
+        <source>% of time in %1</source>
+        <translation>% av tiden i %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="90"/>
+        <source>% of time above %1 threshold</source>
+        <translation>% av tiden ovan %1 linjen</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="91"/>
+        <source>% of time below %1 threshold</source>
+        <translation>% av tiden under %1 linjen</translation>
+    </message>
+    <message>
+        <source>Please Import Some Data</source>
+        <translation type="vanished">Vänligen Importera Vissa Data</translation>
+    </message>
+    <message>
+        <source>SleepyHead is pretty much useless without it.</source>
+        <translation type="vanished">Sleepyhead är ganska meningslöst utan den.</translation>
+    </message>
+    <message>
+        <source>It might be a good idea to check preferences first,</br>as there are some options that affect import.</source>
+        <translation type="vanished">Det kan vara en god idé att kolla inställningarna först,</br>eftersom det finns några alternativ som kan påverka importen.</translation>
+    </message>
+    <message>
+        <source>First import can take a few minutes.</source>
+        <translation type="vanished">Första importen kan ta några minuter.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="550"/>
+        <source>I can haz data?!?</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="551"/>
+        <source>This lonely sleepy sheep has no data :(</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="607"/>
+        <source>Most Recent</source>
+        <translation>Nyaste</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="608"/>
+        <source>Last Week</source>
+        <translation>Förra veckan</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="609"/>
+        <source>Last 30 Days</source>
+        <translation>Sista 30 dagarna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="610"/>
+        <source>Last 6 Months</source>
+        <translation>Senaste 6 månaderna</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="611"/>
+        <source>Last Year</source>
+        <translation>Senaste året</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="615"/>
+        <source>Last Session</source>
+        <translation>Sista perioden</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="667"/>
+        <source>Details</source>
+        <translation>Detaljer</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="681"/>
+        <source>No %1 data available.</source>
+        <translation>Ingen %1 data tillgänglig.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="684"/>
+        <source>%1 day of %2 Data on %3</source>
+        <translation>%1 dag av %2 Data på %3</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="690"/>
+        <source>%1 days of %2 Data, between %3 and %4</source>
+        <translation>%1 dagar av %2 Data, mellan %3 och %4</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="963"/>
+        <source>Usage Information</source>
+        <translation>Användnings Information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="964"/>
+        <source>Total Days</source>
+        <translation>Totalt dagar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="968"/>
+        <source>Compliant Days</source>
+        <translation>Användnings-dagar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="980"/>
+        <source>Days AHI &gt;5.0</source>
+        <translation>Dagar AHI &gt;5.0</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="985"/>
+        <source>Best&nbsp;%1</source>
+        <translation>Bäst&nbsp;%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="998"/>
+        <source>Worst&nbsp;%1</source>
+        <translation>Sämsta&nbsp;%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1024"/>
+        <source>Best RX Setting</source>
+        <translation>Bästa Tryck Inställning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1025"/>
+        <source>Worst RX Setting</source>
+        <translation>Sämsta Tryck Inställning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1095"/>
+        <source>Changes to Prescription Settings</source>
+        <translation>Ändringar av Tryck-inställningar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1103"/>
+        <source>Days</source>
+        <translation>Dagar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1110"/>
+        <source>Pressure Relief</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <source>Pr. Rel.</source>
+        <translation type="vanished">Tryck-lättnad.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1112"/>
+        <source>Pressure Settings</source>
+        <translation>Tryck Inställning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1123"/>
+        <source>Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.</source>
+        <translation>Markering av Bästa/Sämsta ignorerar inställningar med mindre än %1 dagar av samma inställning.</translation>
+    </message>
+    <message>
+        <source>EPAP %1</source>
+        <translation type="vanished">EPAP %1</translation>
+    </message>
+    <message>
+        <source>PS %1</source>
+        <translation type="vanished">PS %1</translation>
+    </message>
+    <message>
+        <source>IPAP %1</source>
+        <translation type="vanished">IPAP %1</translation>
+    </message>
+    <message>
+        <source>APAP %1 - %2</source>
+        <translation type="vanished">APAP %1 - %2</translation>
+    </message>
+    <message>
+        <source>Fixed %1</source>
+        <translation type="vanished">Fast %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1243"/>
+        <source>Machine Information</source>
+        <translation>Maskin Information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1250"/>
+        <source>First Use</source>
+        <translation>Första användning</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/statistics.cpp" line="1251"/>
+        <source>Last Use</source>
+        <translation>Sista användning</translation>
+    </message>
+</context>
+<context>
+    <name>UpdaterWindow</name>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="14"/>
+        <source>SleepyHead Updater</source>
+        <translation>SleepyHead Uppdateraren</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="51"/>
+        <source>A new version of $APP is available</source>
+        <translation>En ny version av $APP är tillgänglig</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="97"/>
+        <source>Version Information</source>
+        <translation>Versions Information</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="108"/>
+        <source>Release Notes</source>
+        <translation>Nyheter i denna version</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="121"/>
+        <source>about:blank</source>
+        <translation>om:tom</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="130"/>
+        <source>Build Notes</source>
+        <translation>Versions noteringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="174"/>
+        <source>Maybe &Later</source>
+        <translation>Kanske &Senare</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="194"/>
+        <source>&Upgrade Now</source>
+        <translation>&Uppgradera nu</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="220"/>
+        <source>Please wait while updates are downloaded and installed...</source>
+        <translation>Vänta medan uppdateringar hämtas och installeras ...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="234"/>
+        <source>Updates</source>
+        <translation>Uppdateringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="265"/>
+        <source>Component</source>
+        <translation>Komponent</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="270"/>
+        <source>Version</source>
+        <translation>Version</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="275"/>
+        <source>Size</source>
+        <translation>Storlek</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="280"/>
+        <source>Progress</source>
+        <translation>Framsteg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="289"/>
+        <source>Log</source>
+        <translation>Logg</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="317"/>
+        <source>Downloading & Installing Updates</source>
+        <translation>Laddar ned och installerar uppdateringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.ui" line="337"/>
+        <source>&Finished</source>
+        <translation>&Avslutad</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="94"/>
+        <source>Checking for SleepyHead Updates</source>
+        <translation>Söker efter SleepyHead uppdateringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="109"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="171"/>
+        <source>Requesting </source>
+        <translation>Begära </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="178"/>
+        <source>Saving as </source>
+        <translation>Sparar som </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="256"/>
+        <source>XML update structure parsed cleanly</source>
+        <translation>XML uppdateringsstruktur analyserad OK</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <source>No updates were found for your platform.</source>
+        <translation>Ingen uppdatering hittades för din plattform.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="283"/>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="322"/>
+        <source>SleepyHead Updates</source>
+        <translation>SleepyHead Uppdateringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="321"/>
+        <source>No new updates were found for your platform.</source>
+        <translation>Ingen ny uppdatering hittades för din plattform.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="339"/>
+        <source>SleepyHead v%1, codename "%2"</source>
+        <translation>SleepyHead v%1, kodnamn "%2"</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="342"/>
+        <source>platform notes</source>
+        <translation>Plattforms noteringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="347"/>
+        <source>A new version of SleepyHead is available!</source>
+        <translation>En ny version av SleepyHead är tillgänglig!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="348"/>
+        <source>Shiny new <b>v%1</b> is available. You're running old and busted v%2</source>
+        <translation>Skinande nya <b>v%1</b> är tillgänglig. Du kör gamla och sämre v%2</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="352"/>
+        <source>An update for SleepyHead is available.</source>
+        <translation>En uppdatering för SleepyHead är tillgänglig.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="353"/>
+        <source>Version <b>%1</b> is available. You're currently running v%1</source>
+        <translation>Version <b>%1</b> är tillgänglig. Du använder v%1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="366"/>
+        <source>SleepyHead v%1 build notes</source>
+        <translation>SleepyHead v%1 versions noteringar</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="369"/>
+        <source>Update to QtLibs (v%1)</source>
+        <translation>Uppdatera till QtLibs (v%1)</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="379"/>
+        <source>There was an error parsing the XML Update file.</source>
+        <translation>Det uppstod ett fel vid granskningen av XML Uppdaterings-filen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="400"/>
+        <source>%1 bytes received</source>
+        <translation>%1 bytes mottaget</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="430"/>
+        <source>Redirected to </source>
+        <translation>Omdirigerad till </translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="444"/>
+        <source>File size mismatch for %1</source>
+        <translation>Filstorlek misstämmer för %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="455"/>
+        <source>File integrity check failed for %1</source>
+        <translation>Integritetskontrollen misslyckades för %1</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="485"/>
+        <source>Extracting </source>
+        <translation>Extraktera</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="546"/>
+        <source>You might need to reinstall manually. Sorry :(</source>
+        <translation>Du måste kanske återinstallera manuellt. Förlåt :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="547"/>
+        <source>Ugh.. Something went wrong with unzipping.</source>
+        <translation>Ugh.. Något gick snett under upp-packningen.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="560"/>
+        <source>Failed</source>
+        <translation>Misslyckades</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="580"/>
+        <source>Download Complete</source>
+        <translation>Nerladdning fullständig</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="584"/>
+        <source>There was an error completing a network request:
+
+(</source>
+        <translation>Det uppstod ett fel vid utförandet av en nätverksbegäran:
+
+(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="629"/>
+        <source>Update Complete!</source>
+        <translation>Uppdatering Slutförd!</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="632"/>
+        <source>Updates Complete. SleepyHead needs to restart now, click Finished to do so.</source>
+        <translation>Uppdatering färdig. SleepyHead måste startas om, klicka Avsluta för att starta om.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="635"/>
+        <source>Update Failed :(</source>
+        <translation>Uppdatering misslyckades :(</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="637"/>
+        <source>Download Error. Sorry, try again later.</source>
+        <translation>Nerladdningsfel. Sorry, försök igen senare.</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="654"/>
+        <source>Downloading & Installing Updates...</source>
+        <translation>Laddar ner & installerar uppdateringar...</translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/UpdaterWindow.cpp" line="655"/>
+        <source>Please wait while downloading and installing updates.</source>
+        <translation>Vänta medan du hämtar och installerar uppdateringar.</translation>
+    </message>
+</context>
+<context>
+    <name>gGraph</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraph.cpp" line="694"/>
+        <source>Snapshot</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>gGraphView</name>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="361"/>
+        <source>100% zoom level</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="362"/>
+        <source>Restore X-axis zoom too 100% to view entire days data.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="364"/>
+        <source>Reset Graph Layout</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="365"/>
+        <source>Resets all graphs to a uniform height and default order.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="368"/>
+        <source>Y-Axis</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="369"/>
+        <source>Plots</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="374"/>
+        <source>CPAP Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="377"/>
+        <source>Oximeter Overlays</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="380"/>
+        <source>Dotted Lines</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1854"/>
+        <source>Remove Clone</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../sleepyhead/Graphs/gGraphView.cpp" line="1858"/>
+        <source>Clone %1 Graph</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/configure b/configure
new file mode 100755
index 0000000..9c72fe2
--- /dev/null
+++ b/configure
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+command_exists() {
+	type "$1" &> /dev/null
+}
+
+# Get the base directory of the source distribution (where this script is)
+DIR="$(cd "$(dirname $0)" && pwd)"
+
+# Attempt distro-specific Qt5 QMake detection.
+if command_exists qmake-qt5; then
+	QMAKE=qmake-qt5
+elif command_exists qt5-qmake; then
+	QMAKE=qt5-qmake
+elif command_exists qmake; then
+	QMAKE=qmake
+fi
+
+# If no qmake found, fail.
+if [[ -z ${QMAKE} ]]; then
+	echo "Missing QMake for Qt5 on system."
+	exit 1
+fi
+
+# Finally, configure the build.
+${QMAKE} "${DIR}"
diff --git a/history/README b/history/README
new file mode 100644
index 0000000..5b28e6e
--- /dev/null
+++ b/history/README
@@ -0,0 +1,9 @@
+This folder contains the python/GTK script I (jedimark) wrote that eventually turned into SleepyHead
+
+I can't honestly tell you if this is the latest version, because the computer I originally wrote this on died.
+
+I put it here for project history, reference (and humour at how sad it is.) 
+
+It requires matplotlib and pygtk to run.. Probably pytz too, I honestly can't remember if it needed any other libs.
+
+I've mostly forgotten python since then.
diff --git a/history/cpap.py b/history/cpap.py
new file mode 100644
index 0000000..d844790
--- /dev/null
+++ b/history/cpap.py
@@ -0,0 +1,1783 @@
+#!/usr/bin/env python
+'''
+     This python script is free software; you can redistribute it and/or
+     modify it under the terms of the GNU Lesser General Public
+     License as published by the Free Software Foundation; either
+     version 2.1 of the License, or (at your option) any later version.
+
+     This python script 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
+     Lesser General Public License for more details.
+
+     You should have received a copy of the GNU Lesser General Public
+     License along with this script; if not, write to the Free Software
+     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+'''
+
+#  Author: Mark Watkins <jedimark64[at]users.sourceforge.net>
+#    Date: 09/03/2011
+# Purpose: CPAP Support
+# License: GPL
+
+#Attempt at faster CPAP Loader
+
+import sys
+import os
+from struct import *
+from datetime import datetime as DT
+from datetime import timedelta,date,time  #,datetime,date,time
+import time
+from matplotlib.dates import drange
+from matplotlib.figure import Figure
+from matplotlib.backends.backend_gtkagg import FigureCanvasGTKAgg as FigureCanvas
+from pylab import *
+
+#from pytz import timezone
+import pytz
+import gobject
+import gtk
+
+MYTIMEZONE="Australia/Queensland";
+
+
+localtz=pytz.timezone(MYTIMEZONE)
+utc = pytz.utc
+utcoff=time.timezone / -(60*60)
+
+Device_Types={
+    "Unknown":0,
+    "PAP":1,
+    "Oximeter":2,
+    "ZEO":3
+    }
+
+def LookupDeviceType(type):
+    for k,v in Device_Types.iteritems():
+        if type.lower()==k.lower():
+            return v
+    return 0
+
+
+class Event:
+    code=0
+    time=None
+    data=[]
+    def __init__(self,time,code,data):
+        self.time=time
+        self.code=code
+        self.data=data
+
+class Waveform:
+    time=None
+    def __init__(self,time,waveform,size,duration,format,rate):
+        self.time=time
+        self.waveform=waveform
+        self.size=size
+        self.duration=duration
+        self.format=format
+        self.rate=rate
+
+       
+class Machine:
+    def __init__(self,brand,model,type):
+        self.brand=brand
+        self.model=model
+        self.type=LookupDeviceType(type)
+
+    def Open(self):
+        print "in Machine.Open()";
+
+class OxiMeter(Machine):
+    CodeTypes=['Error','Pulse','SpO2']
+
+    def __init__(self,brand,model):
+        Machine.__init__(self,brand,model,"Oximeter")
+
+import serial
+class CMS50X(OxiMeter):
+    Baudrate=19200
+    Timeout=5
+    Home=os.path.expanduser('~')
+    
+    #LogDirectory=Home+os.sep+"CMS50"
+    #os.system("mkdir "+LogDirectory)
+
+    def __init__(self):
+        OxiMeter.__init__(self,"Contec","CMS50X")
+        self.Device=None
+        self.devopen=False
+        # Borrowed from PySerial
+        if (os.name=="nt") or (sys.platform=="win32"):
+            self.ports = []
+            for i in range(256):
+                try:
+                    s = serial.Serial(i)
+                    self.ports.append( (i, s.portstr))
+                    s.close()   # explicit close 'cause of delayed GC in java
+                except serial.SerialException:
+                    pass
+            self.Device=self.ports[5]
+        elif os.name=='posix':
+            import glob
+
+            self.ports=glob.glob('/dev/ttyUSB*')
+            if (len(self.ports)>0):
+                self.Device=self.ports[0]
+
+    def Open(self):
+        if not self.Device:
+            print "No serial device detected"
+            return False
+
+        if self.devopen: 
+            print "Device is already open"
+            return True
+
+        try:
+            self.ser=serial.Serial(self.Device,self.Baudrate,timeout=self.Timeout)
+        except:
+            print "Couldn't open",self.Device
+            return False
+
+        self.ser.flushInput()
+
+        self.lastpulse=0
+        self.lastspo2=0
+        self.devopen=True
+        return True
+
+    def Close(self):
+        if (self.devopen):
+            ser.close()
+            self.devopen=False
+
+    def Read(self):
+        while self.devopen:
+            while self.devopen:
+                h=self.ser.read(1)
+                if len(h)>0:
+                    if (ord(h[0]) & 0x80): # Sync Bit
+                        break
+                else:
+                    #print "Timeout!";
+                    self.devopen=False
+                    return None
+
+            c=self.ser.read(4)
+            if len(c)==4:
+                break
+            else:
+                #print "Sync error";
+                self.devopen=False
+                return None
+        
+
+        hdr=ord(h)
+        if (hdr & 0x10):
+            alarm=True
+        else: alarm=False
+
+        if (hdr & 0x8):# or (hdr & 0x20): # (hdr & 0x10)==alarm
+            signal=True
+        else: signal=False
+
+        wave1=ord(c[0]) 
+        wave2=ord(c[1])
+        pulse=ord(c[2])
+        spo2=ord(c[3])
+
+        return [signal,alarm,wave1,wave2,pulse,spo2]
+
+    def Save(self,time,code,value):
+        if (not self.start): return
+
+        delta=time-self.lasttime
+        s=int(((delta.seconds*1000)+delta.microseconds/1000))
+
+        self.events[self.start].append(s>>8)
+        self.events[self.start].append(s&255)
+        self.events[self.start].append(code)
+        self.events[self.start].append(value)
+        self.evcnt+=1
+ 
+        self.lasttime=time
+
+    def Record(self,path):
+        if self.devopen: return (None,None)
+
+        self.starttime=DT.utcnow()
+        self.lasttime=self.starttime
+        lt=self.lasttime
+
+        self.Open()
+
+        lastpulse=0
+        lastspo2=0
+        lastalarm=True
+        lastsignal=True
+        self.evcnt=0
+
+        wave=[dict(),dict()]
+        wavestart=None
+        self.start=None
+        self.events=dict()
+        
+        while self.devopen:
+            D=self.Read()
+            if not D: continue
+
+            t=DT.utcnow();
+            d=t-lt
+
+            if D[0]!=lastsignal or ((t-self.lasttime)>timedelta(seconds=64)):
+                self.Save(t,0,D[0])
+                lastsignal=D[0]
+
+            if D[1]!=lastalarm or ((t-self.lasttime)>timedelta(seconds=64)):
+                self.Save(t,1,D[1])
+                lastalarm=D[1]
+
+            if (not self.start or (d>timedelta(microseconds=30000))): #Lost serial sync for wavefom
+                self.start=t
+                print "Starting new event chunk",self.start
+                self.events[self.start]=bytearray()
+
+            lt=t
+
+            if D[1]: continue
+
+            if (not wavestart or (d>timedelta(microseconds=30000))): #Lost serial sync for wavefom
+                wavestart=t
+                wave[0][wavestart]=bytearray()
+                wave[1][wavestart]=bytearray()
+                print "Starting new wave chunk",wavestart
+
+            wave[0][wavestart].append(D[2])
+            wave[1][wavestart].append(D[3])
+
+            if (D[4]!=lastpulse) or ((t-self.lasttime)>timedelta(seconds=64)):
+                self.Save(t,2,D[4])
+                lastpulse=D[4]
+
+            if (D[5]!=lastspo2) or ((t-self.lasttime)>timedelta(seconds=64)):
+                self.Save(t,3,D[5])
+                lastspo2=D[5]
+
+
+        self.Close()
+
+        if (path[-1]!=os.sep): path+=os.sep
+
+        ed=sorted(self.events.keys())
+        basename=path+ed[0].strftime("CMS50-%Y%m%d-%H%M%S")
+        efname=basename+".001"
+        
+        magic=0x35534d43 #CMS5
+        f=open(efname,"wb");
+        j=0
+        for k,v in self.events.iteritems():
+            header=bytearray(16)
+            timestamp=time.mktime(k.timetupple())
+            l=len(v)
+            struct.pack_into('<IHIIH',header,4,magic,1,timestamp,l,j)
+            f.write(header)
+            f.write(v)
+            j+=1
+
+        fclose(f)
+
+        wfname=basename+".002"
+        f=open(wfname,"wb");
+        j=0
+        for k,v in wave[0].iteritems():
+            header=bytearray(16)
+            timestamp=time.mktime(k.timetupple())
+            l=len(v)
+            struct.pack_into('<IHIIH',header,4,magic,2,timestamp,l,j)
+            f.write(header)
+            f.write(v)
+            j+=1
+            
+        fclose(f)
+
+        wfname=basename+".003"
+        f=open(wffname,"wb");
+        j=0
+        for k,v in wave[0].iteritems():
+            header=bytearray(16)
+            timestamp=time.mktime(k.timetupple())
+            l=len(v)
+            struct.pack_into('<IHIIH',header,4,magic,3,timestamp,l,j)
+            f.write(header)
+            f.write(v)
+            j+=1
+
+        fclose(f)
+
+
+        return (self.events,wave)
+        
+            
+class CPAP(Machine):
+    CodeTypes=['UN','PR','BP','PP','RE','OA','CA','H','FL','CSR','VS','LR']
+
+    def __init__(self,brand,model):
+        Machine.__init__(self,brand,model,"PAP")
+        self.session=dict()
+        self.sessiontimes=dict()
+        self.flowrate=dict()
+        self.flowtimes=dict();
+        self.machine=dict()
+
+    def GetBedtime(self,dt,hr=13):
+        if (type(dt).__name__=='date'):
+            
+            start=DT(dt.year,dt.month,dt.day,hr,0,0)
+            
+        elif (type(dt).__name__=='datetime'):
+            start=dt.replace(hour=hr,minute=0,second=0,microsecond=0)
+        else:
+            return (None,None)
+        
+        end=localtz.localize(start,is_dst=False)
+        #start=utc.localize(start)
+        start=end-timedelta(hours=24)
+
+        sess=self.GetEvSessions(start,end)
+
+
+        if len(sess):
+            start=self.sessiontimes[sess[0]][0];
+            end=self.sessiontimes[sess[-1]][1];
+            return (start,end)
+        else:
+            return (None,None)
+
+    def GetEvSessions(self,start=None,end=None):
+        A=[]
+        for sess,time in self.sessiontimes.iteritems():
+            if not start or not end:
+                A.append(sess)
+            else:
+                if (start>time[1]): continue
+                if (end<time[0]): continue
+                A.append(sess)
+
+        return sorted(A)
+
+    def GetFlowSessions(self,start=None,end=None):
+        A=[]
+        for sess,time in self.flowtimes.iteritems():
+            if not start or not end:
+                A.append(sess)
+            else:
+                if (start>time[1]): continue
+                if (end<time[0]): continue
+                A.append(sess)
+
+        return sorted(A)
+
+    def CountEvents(self,type,start,end):
+        if type not in self.CodeTypes:
+            print "Unrecognized cpap code",field
+            return None
+
+        #print "Searching",type,"between",start.astimezone(localtz),"and",end.astimezone(localtz)
+        sesslist=self.GetEvSessions(start,end)
+        val=0
+        #print sesslist
+        for s in sesslist:
+            if type not in self.session[s].keys():
+                break;
+            if (start<self.sessiontimes[s][0]) and (end>self.sessiontimes[s][1]):
+                val+=len(self.session[s][type]);
+
+            else:
+                for e in self.session[s][type]:
+                    if (e.time>=start) and (e.time<=end):
+                        val+=1
+        return val
+
+    def FirstLastEventTime(self,field,start,end):
+        sess=self.GetEvSessions(start,end)
+
+        a1=self.sessiontimes[sess[0]][0]
+        a2=self.sessiontimes[sess[-1]][1]
+        #if (a1>=start):
+        #    st=a1
+        #else:
+        st=a1
+        for e in self.session[sess[0]][field]:
+            if (e.time>=start):
+                st=e.time
+                break;
+
+        #if (a2<=end):
+            #et=a2
+        #else:
+        et=a2
+        for e in self.session[sess[-1]][field]:
+            if (e.time>=end):
+                et=e.time
+                break;
+
+        return (st,et)
+
+                
+
+    def GetTotalTime(self,start,end):
+        t=timedelta(seconds=0)
+        sess=self.GetEvSessions(start,end)
+        for s in sess:
+            #print self.sessiontimes[s]
+            a1=self.sessiontimes[s][0]
+            a2=self.sessiontimes[s][1]
+
+            d=a2-a1
+
+            if a1<start:
+                d-=start-a1
+
+            if a2>end:
+                d-=a2-end
+
+            #print s,a2-a1
+            t+=d
+
+        return t
+
+    def GetEvents(self,type,start,end):
+        if type not in self.CodeTypes:
+            print "Unrecognized cpap code",field
+            return None
+
+        sess=self.GetEvSessions(start,end)
+        E=[]
+        for s in sess:
+            for e in self.session[s][type]:
+                if e.time>=start and e.time<=end:
+                    E.append(e)
+        return E
+
+    def GetEventsPlot(self,type,start,end,dc=None,di=0,padsession=False):
+        if type not in self.CodeTypes:
+            print "Unrecognized cpap code",field
+            return None
+
+        sess=self.GetEvSessions(start,end)
+        T=[]
+        D=[]
+        laste=None
+        firste=None
+        for s in sess:
+            for e in self.session[s][type]:
+                if e.time>=start and e.time<=end:
+                    if not firste and padsession: 
+                        firste=e
+                        D.append(0)
+                        T.append(e.time)
+                    T.append(e.time)
+                    if dc:
+                        D.append(dc)
+                    else:
+                        D.append(e.data[di])
+                    laste=e
+
+            if padsession:
+                if laste:
+                    D.append(0)
+                    T.append(laste.time)
+
+        return (T,D)
+
+    def GetFlowPlots(self,start,end):
+        sess=self.GetFlowSessions(start,end)
+        T=[]
+        D=[]
+        for s in sess:
+            X=[]
+            Y=[]
+            for w in self.flowrate[s]:
+                d=timedelta(microseconds=w.rate*1000000.0)
+                t=w.time
+                for i in w.waveform:
+                    if t>=start and t<=end:
+                        Y.append(i)
+                        X.append(t)
+                    t+=d
+            T.append(X)
+            D.append(Y)
+        return (T,D)
+
+    def ScanMachines(self,path):
+        print "Pure virtual function"
+        exit(1)
+
+    def OpenSD(self):
+        self.machine=dict()
+        self.session=dict()
+        self.sessiontimes=dict()
+        self.flowrate=dict()
+        self.flowtimes=dict();
+
+        if os.name=="posix":
+            posix_mountpoints=["/media","/mnt"]
+            d=[]
+            for i in posix_mountpoints:
+                try:
+                    a=os.listdir(i)
+                    for j in range(0,len(a)): 
+                        a[j]=i+os.sep+a[j]
+                        #print j
+                    d.extend(a)
+                except:
+                    1
+
+        elif (os.name=="nt") or (sys.platform=="win32"):
+            #Meh.. i'll figure this out later.
+            d=['D:','E:','F:','G:','H:','I:','J:']
+        #elif sys.platform=="darwin": #Darwin is posix aswell, but where?
+        #    d=[]
+
+        r=0
+        if not len(d):
+            print "I've have no idea where for an SDCard on",os.name,sys.platform
+            return 0
+
+        print "Looking for CPAP data in",d
+        for i in d:
+            if self.ScanMachines(i): 
+                r+=1
+
+        return r
+
+    def GetDays(self,numdays=7,date=None):
+        DAYS=[]
+        if (not date):
+            dt=DT.now()#localtz.localize(DT.utcnow())-timedelta(hours=24);
+        else:
+            dt=date
+
+        for i in range(0,numdays):
+            d=dt.date();
+            
+            (sleep,wake)=cpap.GetBedtime(dt)
+            if sleep!=None: 
+                ln=wake-sleep
+                b=cpap.GetTotalTime(sleep,wake)
+                DAYS.append([d,sleep,wake,ln,b])
+            dt-=timedelta(hours=24)
+        return DAYS
+
+
+class PRS1(CPAP):
+    codes=dict()
+    codes[0]=['UN1',[2,1]]
+    codes[1]=['UN2',[2,1]]
+    codes[2]=['PR',[2,1]]
+    codes[3]=['BP',[2,1,1]]
+    codes[4]=['PP',[2,1]]
+    codes[5]=['RE',[2,1]]
+    codes[6]=['OA',[2,1]]
+    codes[7]=['CA',[2,1]]
+    codes[0xa]=['H',[2,1]]
+    codes[0xb]=['UNB',[2,2]]
+    codes[0xc]=['FL',[2,1]]
+    codes[0xd]=['VS',[2]]
+    codes[0xe]=['UNE',[2,1,1,1]]
+    codes[0xf]=['CSR',[2,2,1]]
+    codes[0x10]=['UN10',[2,2,1]]
+    codes[0x11]=['LR',[2,1,1]]
+    codes[0x12]=['SUM',[1,1,2]]
+    
+    def __init__(self):
+        CPAP.__init__(self,"Philips Respironics","System One")
+    
+    def ScanMachines(self,path):
+        try:
+            d=os.listdir(path);
+            r=d.index("P-Series");
+        except:
+            return False
+
+        path+=os.sep+d[r];
+        try:
+            d=os.listdir(path);
+        except:
+            print "Path",path,"unreadable"
+            return False
+
+        prs1unit=[]
+        l=0
+        for f in d:
+            if (f[0]!='P'): continue
+            if (f[1].isdigit()):
+                if f not in self.machine.keys():
+                    self.machine[f]=[]
+                self.machine[f].append(path+os.sep+f)
+                l+=1
+
+        if not l:
+            print "No",self.model,"machine data stored under",path
+            return False
+
+        return True
+
+    def OpenMachine(self,serial):
+        if serial not in self.machine.keys():
+            print "Couldn't open device!"
+            return False
+        
+        self.session=dict()
+        self.sessiontimes=dict()
+        self.flowrate=dict()
+        self.flowtimes=dict();
+
+        for path in self.machine[serial]:
+            self.ReadMachineData(path,serial)
+
+
+    def ReadMachineData(self,path,serial):
+        try:
+            d=os.listdir(path);
+            r=d.index("p0");
+        except:
+            print "Expected PRS1's p0 directory, and couldn't find it",path
+            return False
+
+        path+=os.sep+"p0"
+        try:
+            df=os.listdir(path);
+        except:
+            print "Couldn't read directory"
+            return False
+       
+
+        r=0
+        for f in df:
+            filename=f
+            e2=f.rfind('.')
+            if (e2<0): continue
+            ext=int(f[e2+1:])
+            seq=int(f[0:e2])
+
+            if (ext==2) and (not seq in self.session.keys()): 
+                if self.Read002(path,filename):
+                    r+=1
+            elif (ext==5) and (not seq in self.flowrate.keys()):
+                if self.Read005(path,filename):
+                    r+=1
+        if (r>0):
+            print "Loaded",r,"files for",serial
+        return True
+
+    def Read002(self,path,filename):
+        fn=path+os.sep+filename
+        try:
+            f=open(fn,'rb');
+        except:
+            print "Couldn't Open File",fn
+            return False
+
+        header=f.read(16)
+        if (len(header)<16):
+            print "Not enough header data in",filename
+            f.close()
+            return False
+
+        sm=0
+        for i in range(0,15): sm+=ord(header[i])
+        sm&=0xff
+
+        h1=ord(header[0]);
+        filesize,=unpack_from('<I',header,1)
+        h2=ord(header[5]);
+        filetype=ord(header[6]);
+        sequence,=unpack_from('<I',header,7)
+        timestamp,=unpack_from('<I',header,11)
+        checksum=ord(header[15])
+
+        if (checksum!=sm):
+            print "Header checksum error"
+            f.close();
+            return False
+
+        if (filetype!=2):
+            print "Dodgy File",filename
+            f.close()
+            return False
+
+        if (sequence in self.session.keys()):
+            f.close()
+            return False;
+
+        starttime=utc.localize(DT.utcfromtimestamp(timestamp))
+        
+        bytes=16;
+        done=0
+       
+        datasize=filesize-16-2
+        data=f.read(datasize);
+        if len(data)<datasize:
+            print "Short file",filename
+            f.close();
+            return False
+        chksum=f.read(2)
+        f.close()
+
+        offsets=[5,6,7,0x0a,0x0c]
+        td=starttime
+        i=0
+        #print "Opening",filename
+
+        self.session[sequence]=dict()
+        self.sessiontimes[sequence]=dict()
+
+        for j in self.CodeTypes:
+            self.session[sequence][j]=[]
+
+        while (i<datasize):
+            c=ord(data[i])
+            i+=1
+            if c not in self.codes.keys():
+                print "Unknown PRS1 code",hex(c),"in file",filename
+                exit(1)
+            gc=0
+            if self.codes[c][0] in self.CodeTypes:
+                gc=self.CodeTypes.index(self.codes[c][0]);
+            fields=[]
+            
+            for j in self.codes[c][1]:
+                if (j==1):
+                    val,=unpack_from('!B',data,i) 
+                elif (j==2):
+                    val,=unpack_from('<h',data,i)
+                else:
+                    val=0
+                i+=j
+                fields.append(val)
+
+            if c!=0x12: #0x12 is a pressure summary and doesn't have a time field
+                td+=timedelta(seconds=fields.pop(0))
+
+            d=td
+            if c in offsets: #Don't adjust the actual time with these offsets or things will break
+                d-=timedelta(seconds=fields[0])
+
+            if (c==0x11 and fields[1]>0): #These events are also classed as vibratory snore
+                E=Event(td,c,fields)
+                self.session[sequence]['VS'].append(E);
+
+            if (c==2) or (c==3): #CPAP Pressure
+                fields[0]/=10.0
+                if c==3: fields[1]/=10.0 #Bipap 
+
+            E=Event(d,c,fields)
+            #print E.time.astimezone(localtz),self.CodeTypes[gc],fields
+            self.session[sequence][self.CodeTypes[gc]].append(E);
+            
+        self.sessiontimes[sequence]=[starttime,td]
+        return True
+
+    def Read005(self,path,filename):
+        #print "Importing file",filename
+        fn=path+os.sep+filename
+        try:
+            f=open(fn,'rb');
+        except:
+            print "Couldn't Open File",fn
+            return False
+
+        done=0
+        blocks=0;
+
+        starts=None
+        while not done:
+            header=f.read(24)
+            if (len(header)<24):
+                if (blocks==0):
+                    print "Not enough header data in",filename
+                    f.close()
+                    return False
+                done=1
+                break;
+
+            sm=0
+            for i in range(0,23): sm+=ord(header[i])
+            sm&=0xff
+
+            h1=ord(header[0]);
+            blocksize,=unpack_from('<h',header,1)
+            h2=ord(header[5]);
+            filetype=ord(header[6]);
+            sequence,=unpack_from('<I',header,7)
+            timestamp,=unpack_from('<I',header,11)
+            seconds,=unpack_from('<h',header,15)
+            checksum=ord(header[23])
+
+            if (checksum!=sm):
+                print filename,"Header checksum error",hex(checksum),hex(sm)
+                f.close();
+                return False
+
+            if (filetype!=5):
+                print "Dodgy File",filename
+                f.close()
+                return False
+
+            if (blocks==0):
+                if sequence in self.flowrate.keys():
+                    f.close()
+                    print "early close"
+                    return False
+
+            starttime=utc.localize(DT.utcfromtimestamp(timestamp))
+
+            if not starts: starts=starttime
+
+            readsize=(blocksize-24)-2; #blocksize-header-checksum
+            wfdata=f.read(readsize);
+            chksum=f.read(2)
+
+            l=len(wfdata)
+            if (l<readsize):
+                print "Short data in file",filename
+                done=1
+                # not sure whether to quit or let it add a dodge record.??
+
+            SampleRate=(5.0*60.0)/1500.0 #or seconds/readsize
+            if (blocks==0):
+                self.flowrate[sequence]=[]
+
+#                def __init__(self,time,waveform,size,duration,format,rate):
+
+            wave=[]
+            for i in wfdata: 
+                wave.append((ord(i)^128)-128)
+
+            w=Waveform(starttime,wave,l,timedelta(seconds=seconds),1,SampleRate)
+            self.flowrate[sequence].append(w) 
+
+            blocks+=1
+        
+        ends=starttime+timedelta(seconds=seconds)
+        self.flowtimes[sequence]=[starts,ends]
+        return True
+
+
+
+class Graph:
+    xlimits=[];
+    ylimits=[];
+    name=""
+    HL=dict();
+
+    def __init__(self,name):
+        self.name=name
+
+    def Create(self,w=15,h=1.5,width=600,height=150):
+        self.fig=Figure(figsize=(w,h),facecolor='w',dpi=100)
+        self.canvas=FigureCanvas(self.fig) 
+        self.canvas.set_size_request(width,height)
+        self.ax=self.fig.add_axes([0.05, 0.15, 0.93, 0.7])
+
+    def Redraw(self):
+        self.canvas.draw()
+    def SetAxis(self,ax):
+        self.ax=ax
+
+    def SetTitle(self,name=None,size=12,weight='bold',ha='left',va='bottom'):
+        if name:
+            self.name=name
+        self.ax.set_title(name,ha=ha,va=va,position=[0,1],size=size,weight=weight)
+
+    def Highlight(self,start,end,color,index=0):
+        try:
+            self.ax.patches.remove(self.HL[index])
+            #self.ax.draw_patches(self.HL[index])
+        except: 1
+
+        if (start<self.xlimits[0]) or (end>self.xlimits[1]):        #check start and end are within xlimits
+            print "Creating Highlights out of xlimit area is a sucky idea in matplotlib";
+
+        self.HL[index]=self.ax.axvspan(start,end,facecolor=color,alpha=0.5)
+        #self.ax.draw_patches(self.HL[index])
+        self.ResetLimits()
+
+    def SetXLim(self,start,end):
+        self.xlimits=[start,end]
+        self.ax.set_xlim(self.xlimits)
+
+    def SetYLim(self,bottom,top):
+        self.ylimits=[bottom,top]
+        self.ax.set_ylim(self.ylimits)
+
+    def ResetLimits(self):
+        self.ax.set_xlim(self.xlimits)
+        self.ax.set_ylim(self.ylimits)
+
+    def SetDateTicks(self):
+        e=self.xlimits[1]-self.xlimits[0]
+        self.ax.xaxis.set_major_formatter(DateFormatter("%H:%M",tz=localtz))
+        if e>=timedelta(hours=10):
+            self.ax.xaxis.set_major_locator(HourLocator(range(0,100,2),tz=localtz))
+            self.ax.xaxis.set_minor_locator(MinuteLocator(range( 0,100,10),tz=localtz))
+        elif e>=timedelta(hours=4):
+            self.ax.xaxis.set_major_locator(HourLocator(range(0,100,1),tz=localtz))
+            self.ax.xaxis.set_minor_locator(MinuteLocator(range( 0,100,5),tz=localtz))
+        elif e>=timedelta(seconds=3600):
+            self.ax.xaxis.set_major_locator(MinuteLocator(range(0,100,30),tz=localtz))
+            self.ax.xaxis.set_minor_locator(MinuteLocator(range( 0,100,1),tz=localtz))
+        elif e>=timedelta(seconds=1200):
+            self.ax.xaxis.set_major_locator(MinuteLocator(range(0,100,5),tz=localtz))
+            self.ax.xaxis.set_minor_locator(SecondLocator(range( 0,100,15),tz=localtz))
+        elif e>=timedelta(seconds=300):
+            self.ax.xaxis.set_major_locator(MinuteLocator(range(0,100,1),tz=localtz))
+            self.ax.xaxis.set_minor_locator(SecondLocator(range(0,100,5),tz=localtz))
+        else:
+            self.ax.xaxis.set_major_locator(SecondLocator(range(0,100,30),tz=localtz))
+            self.ax.xaxis.set_minor_locator(SecondLocator(range(0,100,1),tz=localtz))
+            self.ax.xaxis.set_major_formatter(DateFormatter("%H:%M:%S",tz=localtz))
+
+
+class LeaksGraph(Graph):
+    def __init__(self,cpap,xlim=[0,0],ylim=[0,129],grid=True):
+        Graph.__init__(self,"Leak Rate")
+        #self.ax=ax
+        self.machine=cpap
+        self.Create()
+        self.ylimits=ylim
+        self.grid=grid
+        self.xlimits=xlim
+        self.T=[]
+        self.D=[]
+
+    def Update(self,start,end):
+        if self.xlimits:
+            if (start==self.xlimits[0]) and (end==self.xlimits[1]):
+                return
+        
+        #(start,end)=self.machine.FirstLastEventTime('LR',start,end)
+        
+        (self.T,self.D)=self.machine.GetEventsPlot('LR',start=start,end=end,padsession=True)
+        self.xlimits=[self.T[0],self.T[-1]]
+       
+        avg=sum(self.D)/len(self.D)
+        for i in range(0,len(self.D)):
+            self.D[i]-=avg;
+
+        print "Average Leaks:",avg
+
+    def Plot(self):
+        self.ax.cla()
+        self.SetTitle(self.name)
+        if (self.grid): self.ax.grid(True);
+        
+        
+        if len(self.T)>0:
+            self.ax.plot_date(self.T,self.D,'black',aa=True,tz=localtz)
+            self.ax.fill_between(self.T,self.D,0,color='gray')
+
+        
+        self.SetDateTicks()
+        self.ax.yaxis.set_major_locator(MultipleLocator(20))
+        self.ax.yaxis.set_minor_locator(MultipleLocator(5))
+
+        self.ResetLimits()
+
+
+class PressureGraph(Graph):
+    def __init__(self,cpap,xlim=[0,0],ylim=[1,20],grid=True):
+        self.name="Pressure"
+        #self.ax=ax
+        self.machine=cpap
+        self.Create()
+        self.ylimits=ylim
+        self.grid=grid
+        self.xlimits=xlim
+        self.T=[]
+        self.D=[]
+
+    def Update(self,start,end):
+        if self.xlimits:
+            if (start==self.xlimits[0]) and (end==self.xlimits[1]):
+                return
+        
+        #(start,end)=self.machine.FirstLastEventTime('LR',start,end)
+        self.xlimits=[start,end]
+
+        (self.T,self.D)=self.machine.GetEventsPlot('PR',start=start,end=end)
+        (self.T1,self.D1)=self.machine.GetEventsPlot('BP',start=start,end=end,di=0)
+        (self.T2,self.D2)=self.machine.GetEventsPlot('BP',start=start,end=end,di=1)
+        
+        #for i in range(0,len(self.D)):
+        #    self.D[i]/=10.0;
+        #avg=sum(self.D)/len(self.D)
+
+        #print "Average Pressure:",avg
+
+    def Plot(self):
+        self.ax.cla()
+        self.SetTitle(self.name)
+        if (self.grid): self.ax.grid(True);
+
+        if len(self.T)>0:
+            self.ax.plot_date(self.T,self.D,'green',aa=True,tz=localtz)
+        if (len(self.T1)>0):
+            self.ax.plot_date(self.T1,self.D2,'orange',aa=True,tz=localtz)
+        if (len(self.T2)>0):
+            self.ax.plot_date(self.T2,self.D2,'purple',aa=True,tz=localtz)
+
+        self.SetDateTicks()
+        self.ax.yaxis.set_major_locator(MultipleLocator(5))
+        self.ax.yaxis.set_minor_locator(MultipleLocator(1))
+
+        self.ResetLimits()
+
+
+class SleepFlagsGraph(Graph):
+    colours=['','y','r','k','b','c','m','g']
+    flags=['','RE','VS','FL','H','OA','CA','CSR']
+    barcolors=['w','#ffffd0','#ffdfdf','#efefef','#d0d0ff','#cfefff','#ebcdef','#dfffdf','w'];
+
+    marker='.'
+
+    def __init__(self,cpap,waveform,xlim=[0,0],ylim=[0,10],grid=True):
+        self.name="Sleep Flags"
+        self.waveform=waveform
+        #self.ax=ax
+        self.machine=cpap
+        self.Create(height=175)
+        self.ylimits=[0,len(self.flags)]
+        self.grid=grid
+        self.xlimits=xlim
+        self.T=dict()
+        self.D=dict()
+        self.canvas.mpl_connect('pick_event', self.onpick)
+        self.canvas.mpl_connect('button_press_event', self.on_press)
+        self.canvas.mpl_connect('button_release_event', self.on_release)
+        #self.canvas.mpl_connect('scroll_event', self.on_scroll)
+        self.lastscroll=DT.now()
+        self.scrollsteps=0
+
+        #self.canvas.mpl_connect('motion_notify_event', self.on_motion)
+
+    def onpick(self,event):
+        N = len(event.ind)
+        if not N: return True
+        return True
+        thisline = event.artist
+        xdata, ydata = thisline.get_data()
+        ind = event.ind
+        wavedelta=timedelta(seconds=300) #self.waveform.xlimits[1]-self.waveform.xlimits[0]
+
+        d=timedelta(seconds=wavedelta.seconds/2)
+        self.waveform.xlimits[0]=xdata[ind][0]-d
+        if (self.waveform.xlimits[0]<self.xlimits[0]): self.waveform.xlimits[0]=self.xlimits[0]
+        if (self.waveform.xlimits[0]>(self.xlimits[1]-wavedelta)): self.waveform.xlimits[0]=self.xlimits[1]-wavedelta
+        self.waveform.xlimits[1]=self.waveform.xlimits[0]+wavedelta;
+
+        self.Highlight(self.waveform.xlimits[0],self.waveform.xlimits[1],'orange')
+        self.Redraw()
+        self.waveform.ResetLimits()
+        self.waveform.SetDateTicks()
+        self.waveform.Redraw()
+
+    def do_scroll(self,steps,event):
+        ct=DT.now()
+        if (ct<self.scrolltime): 
+            return 
+
+        if steps!=self.scrollsteps: 
+            return False
+
+        #print "Do Scroll...",steps,event
+        centre=self.WaveStart+timedelta(seconds=self.WaveDelta.seconds/2,microseconds=self.WaveDelta.microseconds/2)
+
+        ZoomValue=60;
+
+        s=self.WaveDelta.seconds
+        steps=-steps
+        self.WaveDelta+=timedelta(seconds=ZoomValue*steps)
+        if (self.WaveDelta<timedelta(seconds=60)):
+            self.WaveDelta=timedelta(seconds=60)
+        self.WaveStart=centre-timedelta(seconds=self.WaveDelta.seconds/2)
+        self.WaveEnd=self.WaveStart+self.WaveDelta
+
+        self.Highlight(self.WaveStart,self.WaveEnd,'orange')
+        self.Redraw()
+        self.waveform.SetXLim(self.WaveStart,self.WaveEnd)
+        self.waveform.SetDateTicks()
+        self.waveform.Redraw()
+        
+
+        return False
+
+    def on_scroll(self,event):
+        if event.inaxes != self.ax: return False
+
+        ct=DT.now()
+        lt=ct-self.lastscroll;
+        self.lastscroll=ct
+        if (self.scrollsteps==0 or lt<timedelta(microseconds=200000)):
+            self.scrollsteps+=event.step
+            self.scrolltime=ct+timedelta(microseconds=400000);
+            self.scrolltimer=gobject.timeout_add(500, self.do_scroll,self.scrollsteps,event)
+            #callback in 500ms
+            return
+
+
+        self.scrollsteps=0
+        return True
+
+    def on_press(self,event):
+        if event.inaxes != self.ax: return
+ 
+        contains, attrd = self.ax.patch.contains(event)
+        if not contains: return
+        #print 'event contains', self.ax.patch.xy
+        x0, y0 = self.ax.patch.xy
+        self.press = event.xdata, event.ydata
+
+    def on_release(self,event):
+        if event.inaxes != self.ax: return
+        #if event.inaxes != self.ax: return
+        minx=min(event.xdata,self.press[0]);
+        maxx=max(event.xdata,self.press[0]);
+        d1=num2date(minx,tz=localtz)
+        d2=num2date(maxx,tz=localtz)
+
+        wd=self.waveform.xlimits[1]-self.waveform.xlimits[0]
+
+        if (d2-d1)<timedelta(seconds=120):
+            if (wd>timedelta(seconds=3600)): wd=timedelta(seconds=300)
+            self.waveform.xlimits[0]=d1-timedelta(seconds=wd.seconds/2);
+            self.waveform.xlimits[1]=self.waveform.xlimits[0]+wd
+        else:
+            self.waveform.xlimits[0]=d1
+            self.waveform.xlimits[1]=d2
+
+        if (self.waveform.xlimits[0]<self.xlimits[0]):
+            self.waveform.xlimits[0]=self.xlimits[0]
+            self.waveform.xlimits[1]=self.xlimits[0]+wd
+
+        if (self.waveform.xlimits[1]>self.xlimits[1]):
+            self.waveform.xlimits[1]=self.xlimits[1]
+            self.waveform.xlimits[0]=self.xlimits[1]-wd
+
+        self.Highlight(self.waveform.xlimits[0],self.waveform.xlimits[1],'orange')
+        self.Redraw()
+
+        self.waveform.ResetLimits();
+        self.waveform.SetDateTicks()
+        self.waveform.Redraw()
+
+    def Update(self,start,end):
+        if self.xlimits:
+            if (start==self.xlimits[0]) and (end==self.xlimits[1]):
+                return
+        
+        #(start,end)=self.machine.FirstLastEventTime('LR',start,end)
+        self.xlimits=[start,end]
+
+        #if self.waveform:
+            #self.waveform.xlimits[0]=start
+            #self.WaveDelta=timedelta(seconds=300)
+            #self.waveform.xlimits[1]=start+self.WaveDelta
+
+        j=0
+        for i in self.flags:
+            if (i=="CSR"):
+                self.T[i]=[]
+                E=self.machine.GetEvents(i,start=start,end=end)
+                for e in E:
+                    r=e.time-timedelta(seconds=e.data[1])-timedelta(seconds=e.data[0]/2)
+                    self.T[i].append(r)
+                self.D[i]=[j]*len(self.T[i])
+            elif (i!=""):
+                (self.T[i],self.D[i])=self.machine.GetEventsPlot(i,start=start,end=end,dc=j)
+                
+            j+=1
+
+    def Plot(self):
+        self.ax.cla()
+        self.SetTitle(self.name)
+        if (self.grid): self.ax.grid(True);
+      
+        j=0;
+        for i in self.flags:
+            if (i!=""):
+                if (len(self.T[i])>0):
+                    self.ax.plot_date(self.T[i],self.D[i],self.colours[j]+self.marker,picker=5,aa=False,tz=localtz,alpha=1)
+            j+=1
+
+        self.SetDateTicks()
+        self.ax.yaxis.set_major_locator(MultipleLocator(1))
+        self.ax.set_yticklabels(self.flags)
+
+        yTicks=[0]
+        yTicks.extend(self.ax.get_yticks())
+        h=(yTicks[1]-yTicks[0])
+        for i in range(1,len(yTicks)):
+            yTicks[i]-=h/2
+        a1=date2num(self.xlimits[0])
+        a2=date2num(self.xlimits[1])
+        self.ax.barh(yTicks, [a2-a1]*len(yTicks), height=h, left=a1, color=self.barcolors,alpha=0.5) 
+
+        self.ResetLimits()
+
+
+class WaveformGraph(Graph):
+    colours=['y','r','k','b','c','m','g']
+    flags=['RE','VS','FL','H','OA','CA']
+
+    def __init__(self,cpap,xlim=[0,0],ylim=[-69,69],grid=True):
+        self.name="Flow Rate Waveform"
+        #self.ax=ax
+        self.machine=cpap
+        self.Create()
+        self.ylimits=ylim
+        self.grid=grid
+        self.xlimits=xlim
+        self.T=[]
+        self.D=[]
+        self.FT=dict()
+        self.FD=dict()
+        self.canvas.mpl_connect('button_press_event', self.on_press)
+        self.canvas.mpl_connect('button_release_event', self.on_release)
+        self.canvas.mpl_connect('scroll_event', self.on_scroll)
+        self.lastscroll=DT.now()
+        self.scrollsteps=0
+        self.sg=None
+
+    def set_sleepgraph(self,sg):
+        self.sg=sg
+    
+    def on_press(self,event):
+        if event.inaxes != self.ax: return
+ 
+        contains, attrd = self.ax.patch.contains(event)
+        if not contains: return
+        #print 'event contains', self.ax.patch.xy
+        x0, y0 = self.ax.patch.xy
+        self.press = event.xdata, event.ydata
+
+    def on_release(self,event):
+        if event.inaxes != self.ax: return
+        #if event.inaxes != self.ax: return
+        #minx=min(event.xdata,self.press[0]);
+        #maxx=max(event.xdata,self.press[0]);
+        d1=num2date(self.press[0],tz=localtz)
+        d2=num2date(event.xdata,tz=localtz)
+        d=d2-d1
+        self.xlimits[0]-=d
+        self.xlimits[1]-=d
+        if self.xlimits[0]<self.sg.xlimits[0]:
+            self.xlimits[0]=self.sg.xlimits[0]
+        if self.xlimits[1]>self.sg.xlimits[1]:
+            self.xlimits[1]=self.sg.xlimits[1]
+            self.xlimits[0]=self.xlimits[1]-d
+
+        #update SleepGraph
+        if (self.sg):
+            self.sg.Highlight(self.xlimits[0],self.xlimits[1],'orange')
+            self.sg.Redraw()
+
+        self.ResetLimits()
+        self.SetDateTicks()
+        self.Redraw()
+
+    def do_scroll(self,steps,event):
+        ct=DT.now()
+        if (ct<self.scrolltime): 
+            return 
+
+        if steps!=self.scrollsteps: 
+            return False
+
+        #print "Do Scroll...",steps,event
+        
+        wavedelta=self.xlimits[1]-self.xlimits[0];
+        centre=self.xlimits[0]+timedelta(seconds=wavedelta.seconds/2,microseconds=wavedelta.microseconds/2)
+        #centre=num2date(event.xdata,tz=localtz)
+        ZoomValue=60;
+
+        steps=-steps
+        wavedelta+=timedelta(seconds=ZoomValue*steps)
+        if (wavedelta<timedelta(seconds=60)):
+            wavedelta=timedelta(seconds=60)
+        self.xlimits[0]=centre-timedelta(seconds=wavedelta.seconds/2)
+        self.xlimits[1]=self.xlimits[0]+wavedelta
+
+        if (self.sg):
+            self.sg.Highlight(self.xlimits[0],self.xlimits[1],'orange')
+            self.sg.Redraw()
+        self.SetDateTicks()
+        self.ResetLimits();
+        self.Redraw()
+        
+
+        return False
+
+    def on_scroll(self,event):
+        if event.inaxes != self.ax: return False
+
+        ct=DT.now()
+        lt=ct-self.lastscroll;
+        self.lastscroll=ct
+        if (self.scrollsteps==0 or lt<timedelta(microseconds=200000)):
+            self.scrollsteps+=event.step
+            self.scrolltime=ct+timedelta(microseconds=400000);
+            self.scrolltimer=gobject.timeout_add(500, self.do_scroll,self.scrollsteps,event)
+            #callback in 500ms
+            return
+
+
+        self.scrollsteps=0
+        return True
+
+
+    def Update(self,start,end):
+        if self.xlimits:
+            if (start==self.xlimits[0]) and (end==self.xlimits[1]):
+                return
+        
+        self.xlimits=[start,end]
+        (self.T,self.D)=self.machine.GetFlowPlots(start=start,end=end)
+
+        for i in self.flags:
+            (self.FT[i],self.FD[i])=self.machine.GetEventsPlot(i,start=start,end=end,dc=50)
+        
+        self.FT['CSR']=self.machine.GetEvents('CSR',start=start,end=end)
+
+        (self.FT['PP'],self.FD['PP'])=self.machine.GetEventsPlot('PP',start=start,end=end,dc=20)
+
+        (self.FT['PR'],self.FD['PR'])=self.machine.GetEventsPlot('PR',start=start,end=end)
+
+        self.FD['PUP']=[]
+        self.FT['PUP']=[]
+        self.FD['PDN']=[]
+        self.FT['PDN']=[]
+
+        lastpressure=0
+        for i in range(0,len(self.FD['PR'])):
+            cod=None
+            p=self.FD['PR'][i]
+            if p>lastpressure: cod="PUP"
+            elif p<lastpressure: cod="PDN"
+            
+            if (cod):
+                self.FT[cod].append(self.FT['PR'][i])
+                self.FD[cod].append(-65)
+
+            lastpressure=p
+
+    def Plot(self):
+        self.ax.cla()
+        self.SetTitle(self.name)
+        if (self.grid): self.ax.grid(True);
+
+        j=0
+        for i in self.flags:
+            if (len(self.FT[i])>0):
+                self.ax.plot_date(self.FT[i],self.FD[i],self.colours[j]+'d',aa=True,alpha=.8,tz=localtz)
+                self.ax.vlines(self.FT[i],50,-50,self.colours[j],lw=1,alpha=0.4)
+            j+=1
+
+        j=0
+
+        for i in range(0,len(self.T)):
+            self.ax.plot_date(self.T[i],self.D[i],'green',aa=True,tz=localtz,alpha=0.7)
+
+        self.SetDateTicks()
+        self.ax.yaxis.set_major_locator(MultipleLocator(20))
+        self.ax.yaxis.set_minor_locator(MultipleLocator(5))
+
+        if (len(self.FT['PUP'])):
+            self.ax.plot_date(self.FT['PUP'],self.FD['PUP'],'k^',aa=True,alpha=.8,tz=localtz)
+        if (len(self.FT['PDN'])):
+            self.ax.plot_date(self.FT['PDN'],self.FD['PDN'],'kv',aa=True,alpha=.8,tz=localtz)
+
+        if (len(self.FT['PP'])):
+            self.ax.plot_date(self.FT['PP'],self.FD['PP'],'r.',aa=True,alpha=.8,tz=localtz)
+
+        for E in self.FT['CSR']:
+            e=E.time-timedelta(seconds=E.data[1]);
+            s=e-timedelta(seconds=E.data[0])
+            self.ax.axvspan(s,e,facecolor='#d0ffd0');
+            #self.Highlight(s,e,color="#d0ffd0",index=j)
+
+        self.ResetLimits()
+
+def AboutBox(a):
+    txt='''<big>SleepyHead v0.02</big>
+
+<b>Details:</b>
+Author: Mark Watkins (jedimark)
+Homepage: <a href='http://sleepyhead.sourceforge.net'>http://sleepyhead.sourceforge.net</a>
+Please report any bugs <a href='https://sourceforge.net/projects/sleepyhead/support'>on sourceforge</a>.
+
+<b>License:</b>
+This software is released under the <i>GNU Public Licence</i>.
+
+<b>Disclaimer:</b>
+This is <b>not</b> medical software. Any output this program
+produces should <b>not</b> be used to make medical decisions.
+
+<b>Special Thanks:</b>
+Mike Hoolehan - Check out his awesome <a href='http://www.hoolehan.com/onkor/'>Onkor Project</a>
+Troy Schultz - For great technical advice
+Mark Bruscke - For encouragement and advice
+
+and to the very awesome <a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>
+'''
+    msg=gtk.MessageDialog(flags=gtk.DIALOG_MODAL,type=gtk.MESSAGE_INFO,buttons=gtk.BUTTONS_CLOSE)
+    msg.set_markup(txt)
+
+    msg.run()
+    msg.destroy()
+
+def CreateMenu():
+    file_menu = gtk.Menu()
+    open_item = gtk.MenuItem("_Backup SD Card")
+    save_item = gtk.MenuItem("_Print")
+    quit_item = gtk.MenuItem("E_xit")
+    file_menu.append(open_item)
+    file_menu.append(save_item)
+    file_menu.append(quit_item)
+    quit_item.connect_object ("activate", lambda x: gtk.main_quit(), "file.quit")
+    open_item.show()
+    save_item.show()
+    quit_item.show()
+
+    help_menu = gtk.Menu()
+    about_item = gtk.MenuItem("_About")
+    about_item.connect_object("activate",AboutBox,"help.about")
+    help_menu.append(about_item)
+    about_item.show()
+
+    file_item = gtk.MenuItem("_File")
+    file_item.show()
+    help_item = gtk.MenuItem("_Help")
+    help_item.show()
+
+    menu_bar = gtk.MenuBar()
+    menu_bar.show()
+    file_item.set_submenu(file_menu)
+    menu_bar.append(file_item)
+
+    help_item.set_submenu(help_menu)
+    menu_bar.append(help_item)
+    
+    return menu_bar
+
+
+class DailyGraphs:
+    def __init__(self,cpap):
+        self.cpap=cpap
+        self.layout=gtk.ScrolledWindow()
+        self.layout.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
+        self.vbox = gtk.VBox()
+        self.layout.add_with_viewport(self.vbox)
+
+        self.graph=dict();
+        self.graph['Waveform']=WaveformGraph(cpap)
+        self.graph['Leaks']=LeaksGraph(cpap)
+        self.graph['Pressure']=PressureGraph(cpap)
+        self.graph['SleepFlags']=SleepFlagsGraph(cpap,self.graph['Waveform'])
+        self.graph['Waveform'].set_sleepgraph(self.graph['SleepFlags'])
+
+        self.vbox.pack_start(self.graph['SleepFlags'].canvas,expand=False)
+        self.vbox.pack_start(self.graph['Waveform'].canvas,expand=False)
+        self.vbox.pack_start(self.graph['Leaks'].canvas,expand=False)
+        self.vbox.pack_start(self.graph['Pressure'].canvas,expand=False)
+        
+        self.machines=gtk.combo_box_new_text()
+
+        for mach in cpap.machine.keys():
+            self.machines.append_text(mach)
+
+        self.datesel=gtk.Calendar()
+
+        self.textbox=gtk.TextView(buffer=None)
+        self.textbox.set_editable(False)
+
+        self.datesel.connect('month_changed',self.cal_month_selected,cpap)
+        self.datesel.connect('day_selected',self.cal_day_selected)
+
+        self.machines.connect("changed",self.select_machine,cpap)
+
+        self.databox = gtk.VBox(homogeneous=False)
+        self.rescanbutton=gtk.Button("_Rescan Media")
+        self.rescanbutton.connect('pressed',self.pushed_rescan)
+        #self.zeobutton=gtk.Button("Load _ZEO Data")
+        #self.oxibutton=gtk.Button("Load _Oximeter Data")
+        self.databox.pack_start(self.machines,expand=False,padding=2)
+        self.databox.pack_start(self.datesel,expand=False,padding=2)
+        self.databox.pack_start(self.rescanbutton,expand=False,padding=0)
+        #self.databox.pack_start(self.zeobutton,expand=False,padding=0)
+        #self.databox.pack_start(self.oxibutton,expand=False,padding=0)
+        self.databox.pack_start(self.textbox,expand=True,padding=2)
+
+        self.machines.set_active(0)
+        #self.cal_month_selected(self.datesel,cpap)
+        #self.cal_day_selected(self.datesel)
+
+    def select_machine(self,combo,cpap):
+        msg=gtk.MessageDialog(type=gtk.MESSAGE_INFO,buttons=gtk.BUTTONS_NONE,message_format="Please wait, Loading CPAP Data")
+        msg.show_all()
+        gtk.gdk.window_process_all_updates() 
+
+        mach=combo.get_active_text();
+        cpap.OpenMachine(mach)
+        msg.destroy()
+        self.cal_month_selected(self.datesel,self.cpap)
+        self.cal_day_selected(self.datesel)
+
+    def pushed_rescan(self,event):
+
+        self.cpap.OpenSD()
+
+        mach=self.machines.get_active_text();
+        self.machines.get_model().clear()
+        j=0
+        cmi=-1
+        for m in cpap.machine.keys():
+            i=self.machines.insert_text(j,m)
+            if (m==mach): cmi=j
+            j+=1
+
+        if (cmi>=0):
+            self.machines.set_active(cmi)
+        else:
+            self.machines.set_active(0)
+
+        
+        #cpap.OpenMachine(mach)
+
+        self.cal_month_selected(self.datesel,self.cpap)
+        #self.cal_day_selected(self.datesel)
+
+    def Draw(self):
+        for k,v in self.graph.iteritems():
+            v.Redraw()
+
+    def ShowGraphs(self,show):
+        if show: 
+            vis=True
+        else:
+            vis=False
+
+        for i in self.graph.keys():
+            self.graph[i].canvas.set_visible(vis)
+
+    def Update(self,start,end):
+        for k,v in self.graph.iteritems():
+            v.Update(start,end)
+        sess=cpap.GetFlowSessions(start,end)
+        if (len(sess)>0):
+            wvis=True;
+        else: wvis=False;
+        self.graph['Waveform'].canvas.set_visible(wvis)
+        text="Date: "+start.astimezone(localtz).strftime("%Y-%m-%d")+"\n\n"
+        text+="Bedtime: "+start.astimezone(localtz).strftime("%H:%M:%S")+"\n"
+        text+="Waketime: "+end.astimezone(localtz).strftime("%H:%M:%S")+"\n\n"
+
+        tt=cpap.GetTotalTime(start,end)
+        text+="Total Time: "+str(tt)+"\n\n"
+
+        if not wvis:
+            text+="No Waveform Data Available\n\n"
+        oa=cpap.CountEvents('OA',start,end)
+        h=cpap.CountEvents('H',start,end)
+        ah=oa+h
+        ca=cpap.CountEvents('CA',start,end)
+        fl=cpap.CountEvents('FL',start,end)
+        vs=cpap.CountEvents('VS',start,end)
+        re=cpap.CountEvents('RE',start,end)
+
+        PR=cpap.GetEvents('PR',start,end)
+        
+        if (len(PR)>0):
+            avgp=0
+            laste=PR[0]
+            lastp=int(PR[0].data[0]*10)
+            lastt=PR[0].time
+            TPR=[timedelta(seconds=0)]*256
+            don=False
+            totalptime=timedelta(0)
+            for e in PR[1:]: 
+                p=int(e.data[0]*10)
+                TPR[lastp]+=(e.time-lastt)
+                totalptime+=(e.time-lastt)
+                lastt=e.time
+                lastp=p
+
+       
+        #if (not don):
+        #    TPR[lastp]+=lastt-
+
+            np=timedelta(seconds=totalptime.seconds*.9)
+            npc=timedelta(seconds=0)
+            npp=0
+            lastp=0
+            for i in range(0,256):
+                lpc=npc
+                npc+=TPR[i]
+                if (npc>=np):
+                    s2=1-(float(lpc.seconds)/float(npc.seconds))
+                    d=(i-lastp)/10.0
+                    npp=(lastp/10.0)+(s2*d)
+                    break
+
+                if TPR[i]>timedelta(seconds=0):
+                    lastp=i
+
+            avgp=0
+
+            sm1=0
+            sm2=0
+            sm3=0
+            for i in range(0,256):
+                if TPR[i]>timedelta(seconds=0):
+                    s=float(TPR[i].seconds)/float(totalptime.seconds)
+                    sm1+=s*float(i)
+                    sm2+=s
+                    sm3=(float(i)/10.0)*TPR[i].seconds
+
+            #avgp=sm3/totalptime.seconds
+            avgp=sm1/sm2/10.0   #Weighted Average
+        else:
+            avgp=0
+            npp=0
+
+        LK=cpap.GetEvents('LR',start,end);
+        avgl=0
+        for e in LK: avgl+=e.data[0]-19
+        avgl/=len(LK)
+            
+           
+
+        CSR=cpap.GetEvents('CSR',start,end);
+        dur=0
+        for e in CSR: dur+=e.data[0];
+        csr=(100.0/tt.seconds)*dur
+
+        text+="Average Pressure=%(#)0.2f\n"%{'#':avgp}
+        text+="90%% Pressure=%(#)0.2f\n\n"%{'#':npp}
+
+        text+="CSR %% of night=%(#)0.2f\n" % {"#":csr}
+
+        s=tt.seconds/3600.0
+        text+="OA=%(#)0.2f\n"%{'#':oa/s}
+        text+="H=%(#)0.2f\n"%{'#':h/s}
+        text+="CA=%(#)0.2f\n"%{'#':ca/s}
+        text+="FL=%(#)0.2f\n"%{'#':fl/s}
+        text+="VS=%(#)0.2f\n"%{'#':vs/s}
+        text+="RE=%(#)0.2f\n"%{'#':re/s}
+        text+="AHI=%(#)0.2f\n\n"%{'#':ah/s}
+
+        text+="Leak=%(#)0.2f\n"%{'#':avgl}
+
+
+        buf=self.textbox.get_buffer()
+        buf.set_text(text)
+            #self.date.set_text())
+#        self.bedtime.set_text("Bedtime: "+start.astimezone(localtz).strftime("%H:%M:%S"))
+#        self.waketime.set_text("Waketime: "+end.astimezone(localtz).strftime("%H:%M:%S"))
+
+    def Plot(self):
+        for k,v in self.graph.iteritems():
+            v.Plot()
+        self.graph['Waveform'].ResetLimits()
+
+    def cal_month_selected(self,cal,cpap):
+        (y,m,d)=cal.get_date();
+
+        d=1
+        m+=2
+    
+        if (m>11):
+            y+=1
+            m%=12
+
+        ldom=DT(y,m,d,0,0,0)-timedelta(hours=1)
+        #print "Getting",ldom.day,"days back from",ldom
+        D=cpap.GetDays(ldom.day,date=ldom)
+        cal.freeze()
+        for i in range(0,ldom.day-1):
+            cal.unmark_day(i)
+
+        for i in D:
+            cal.mark_day(i[0].day)
+
+        cal.thaw()
+
+    def cal_day_selected(self,cal):
+        (y,m,d)=cal.get_date()
+        dat=DT(y,m+1,d,0,0,0)
+        (st,et)=cpap.GetBedtime(dat)
+
+        if st:
+            msg=gtk.MessageDialog(type=gtk.MESSAGE_INFO,buttons=gtk.BUTTONS_NONE,message_format="Updating Plots - Please wait")
+            msg.show_all()
+            gtk.gdk.window_process_all_updates() 
+
+            self.ShowGraphs(True)
+            #print "Bedtime",st.astimezone(localtz),"Wakeup",et.astimezone(localtz)
+            self.Update(st,et)
+            self.Plot()
+            self.Draw()
+            msg.destroy()
+        else:
+            self.ShowGraphs(False)
+            text="No data available for selected date"
+            buf=self.textbox.get_buffer()
+            buf.set_text(text)
+            
+
+path="/home/mark/.sleepyhead/CMS50"
+#cms50=CMS50X()
+#(event,wave)=cms50.Record(path)
+
+#exit(1)
+
+cpap=PRS1()
+cpap.OpenSD()
+
+win=gtk.Window()
+win.connect("destroy", lambda x: gtk.main_quit())
+win.set_default_size(1200,680)
+win.set_title("SleepyHead v0.02")
+
+mainbox=gtk.VBox()
+mainbox.pack_start(CreateMenu(),expand=False)
+
+notebook=gtk.Notebook()
+notebook.unset_flags(gtk.CAN_FOCUS)
+
+dailybox=gtk.HBox()
+
+spo2box=gtk.HBox()
+
+
+mainbox.pack_start(notebook,expand=True)
+
+DG=DailyGraphs(cpap)
+dailybox.pack_start(DG.databox,expand=False)
+dailybox.pack_start(DG.layout,expand=True)
+
+page1=notebook.insert_page(dailybox,gtk.Label("Daily"))
+#page2=notebook.insert_page(dailybox,gtk.Label("Overview"))
+#page3=notebook.insert_page(spo2box,gtk.Label("SpO2"))
+notebook.set_current_page(page1)
+
+win.add(mainbox)
+
+
+win.show_all()
+gtk.main()
+
+
+
diff --git a/innosetup/installer-angle.iss b/innosetup/installer-angle.iss
new file mode 100644
index 0000000..95b1d81
--- /dev/null
+++ b/innosetup/installer-angle.iss
@@ -0,0 +1,52 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+
+#define MyAppName "SleepyHead"
+#define MyAppVersion "0.9.6"
+#define MyAppPublisher "Jedimark"
+#define MyAppURL "http://sleepyhead.sourceforge.net"
+#define MyAppExeName "SleepyHead.exe"
+
+[Setup]
+; NOTE: The value of AppId uniquely identifies this application.
+; Do not use the same AppId value in installers for other applications.
+; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
+AppId={{AF23DDE0-E745-456E-AA06-014BB6DEB63F}
+AppName={#MyAppName}
+AppVersion={#MyAppVersion}
+;AppVerName={#MyAppName} {#MyAppVersion}
+AppPublisher={#MyAppPublisher}
+AppPublisherURL={#MyAppURL}
+AppSupportURL={#MyAppURL}
+AppUpdatesURL={#MyAppURL}
+DefaultDirName={pf}\{#MyAppName}
+DefaultGroupName={#MyAppName}
+LicenseFile=C:\Users\Mark\Documents\src\COPYING.txt
+OutputDir=C:\Users\Mark\Documents\src\sleepyhead-code\innosetup
+OutputBaseFilename=SleepyHead-{#MyAppVersion}-ANGLE-Setup-32bit
+SetupIconFile=C:\Users\Mark\Documents\src\sleepyhead-code\sleepyhead\icons\bob-v3.0.ico
+Compression=lzma
+SolidCompression=yes
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl"
+Name: "french"; MessagesFile: "compiler:Languages\French.isl"
+Name: "german"; MessagesFile: "compiler:Languages\German.isl"
+
+[Tasks]
+Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
+
+[Files]
+Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MSVC2012-ANGLE-32bit\SleepyHead.exe"; DestDir: "{app}"; Flags: ignoreversion
+Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MSVC2012-ANGLE-32bit\*.dll"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
+Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MSVC2012-ANGLE-32bit\Translations\*.qm"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
+; NOTE: Don't use "Flags: ignoreversion" on any shared system files
+
+[Icons]
+Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
+Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
+
+[Run]
+Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
+
diff --git a/innosetup/installer-opengl.iss b/innosetup/installer-opengl.iss
new file mode 100644
index 0000000..f1e8cb7
--- /dev/null
+++ b/innosetup/installer-opengl.iss
@@ -0,0 +1,52 @@
+; Script generated by the Inno Setup Script Wizard.
+; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
+
+#define MyAppName "SleepyHead"
+#define MyAppVersion "0.9.6"
+#define MyAppPublisher "Jedimark"
+#define MyAppURL "http://sleepyhead.sourceforge.net"
+#define MyAppExeName "SleepyHead.exe"
+
+[Setup]
+; NOTE: The value of AppId uniquely identifies this application.
+; Do not use the same AppId value in installers for other applications.
+; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
+AppId={{AF23DDE0-E745-456E-AA06-014BB6DEB63F}
+AppName={#MyAppName}
+AppVersion={#MyAppVersion}
+;AppVerName={#MyAppName} {#MyAppVersion}
+AppPublisher={#MyAppPublisher}
+AppPublisherURL={#MyAppURL}
+AppSupportURL={#MyAppURL}
+AppUpdatesURL={#MyAppURL}
+DefaultDirName={pf}\{#MyAppName}
+DefaultGroupName={#MyAppName}
+LicenseFile=C:\Users\Mark\Documents\src\COPYING.txt
+OutputDir=C:\Users\Mark\Documents\src\sleepyhead-code\innosetup
+OutputBaseFilename=SleepyHead-{#MyAppVersion}-OpenGL-Setup-32bit
+SetupIconFile=C:\Users\Mark\Documents\src\sleepyhead-code\sleepyhead\icons\bob-v3.0.ico
+Compression=lzma
+SolidCompression=yes
+
+[Languages]
+Name: "english"; MessagesFile: "compiler:Default.isl"
+Name: "dutch"; MessagesFile: "compiler:Languages\Dutch.isl"
+Name: "french"; MessagesFile: "compiler:Languages\French.isl"
+Name: "german"; MessagesFile: "compiler:Languages\German.isl"
+
+[Tasks]
+Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
+
+[Files]
+Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MingW-OpenGL-32bit\SleepyHead.exe"; DestDir: "{app}"; Flags: ignoreversion
+Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MingW-OpenGL-32bit\*.dll"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
+Source: "C:\Users\Mark\Desktop\SleepyHead-0.9.6-testing-Qt5.2.1-MingW-OpenGL-32bit\Translations\*.qm"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
+; NOTE: Don't use "Flags: ignoreversion" on any shared system files
+
+[Icons]
+Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
+Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
+
+[Run]
+Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
+
diff --git a/sleepyhead/COPYING b/sleepyhead/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/sleepyhead/COPYING
@@ -0,0 +1,674 @@
+                    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/sleepyhead/Graphs/MinutesAtPressure.cpp b/sleepyhead/Graphs/MinutesAtPressure.cpp
new file mode 100644
index 0000000..907126f
--- /dev/null
+++ b/sleepyhead/Graphs/MinutesAtPressure.cpp
@@ -0,0 +1,674 @@
+/* MinutesAtPressure Graph Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <cmath>
+#include <QApplication>
+#include <QThreadPool>
+#include <QMutexLocker>
+
+#include "MinutesAtPressure.h"
+#include "Graphs/gGraph.h"
+#include "Graphs/gGraphView.h"
+#include "SleepLib/profiles.h"
+
+#include "Graphs/gXAxis.h"
+#include "Graphs/gYAxis.h"
+
+
+
+MinutesAtPressure::MinutesAtPressure() :Layer(NoChannel)
+{
+    m_remap = nullptr;
+    m_minpressure = 3;
+    m_maxpressure = 30;
+    m_minimum_height = 0;
+}
+MinutesAtPressure::~MinutesAtPressure()
+{
+    while (recalculating()) {};
+}
+
+RecalcMAP::~RecalcMAP()
+{
+}
+void RecalcMAP::quit() {
+    m_quit = true;
+    map->mutex.lock();
+    map->mutex.unlock();
+}
+
+
+void MinutesAtPressure::SetDay(Day *day)
+{
+    Layer::SetDay(day);
+
+    // look at session summaryValues.
+    Machine * cpap = nullptr;
+    if (day) cpap = day->machine(MT_CPAP);
+    if (cpap) {
+        QList<Session *>::iterator sit;
+        EventDataType minpressure = 40;
+        EventDataType maxpressure = 0;
+
+        QMap<QDate, Day *>::iterator it;
+        QMap<QDate, Day *>::iterator day_end = cpap->day.end();
+        // look at overall pressure ranges and find the max
+
+        for (it = cpap->day.begin(); it != day_end; ++it) {
+            Day * d = it.value();
+            QList<Session *>::iterator sess_end = d->end();
+            for (sit = d->begin(); sit != sess_end; ++sit) {
+                Session * sess = (*sit);
+                if (sess->channelExists(CPAP_Pressure)) {
+                    minpressure = qMin(sess->Min(CPAP_Pressure), minpressure);
+                    maxpressure = qMax(sess->Max(CPAP_Pressure), maxpressure);
+                }
+                if (sess->channelExists(CPAP_EPAP)) {
+                    minpressure = qMin(sess->Min(CPAP_EPAP), minpressure);
+                    maxpressure = qMax(sess->Max(CPAP_EPAP), maxpressure);
+                }
+                if (sess->channelExists(CPAP_IPAP)) {
+                    minpressure = qMin(sess->Min(CPAP_IPAP), minpressure);
+                    maxpressure = qMax(sess->Max(CPAP_IPAP), maxpressure);
+                }
+            }
+        }
+
+        m_minpressure = qMax(float(4), floor(minpressure));
+        m_maxpressure = ceil(maxpressure);
+
+        const int minimum_cells = 12;
+        int c = m_maxpressure - m_minpressure;
+
+
+        if (c < minimum_cells) {
+            int v = minimum_cells - c;
+            m_minpressure -= v/2.0;
+            m_minpressure = qMax((EventStoreType)4, m_minpressure);
+
+            m_maxpressure = m_minpressure + minimum_cells;
+        }
+        QFontMetrics FM(*defaultfont);
+        QList<ChannelID> chans = day->getSortedMachineChannels(schema::SPAN | schema::FLAG | schema::MINOR_FLAG);
+        m_minimum_height = (chans.size()+3) * FM.height() - 5;
+    }
+
+
+    m_empty = false;
+    m_recalculating = false;
+    m_lastminx = 0;
+    m_lastmaxx = 0;
+    m_empty = !m_day || !(m_day->channelExists(CPAP_Pressure) || m_day->channelExists(CPAP_EPAP));
+}
+
+ int MinutesAtPressure::minimumHeight()
+{
+    return m_minimum_height;
+}
+
+
+
+bool MinutesAtPressure::isEmpty()
+{
+
+    return m_empty;
+}
+
+
+void MinutesAtPressure::paint(QPainter &painter, gGraph &graph, const QRegion &region)
+{
+    QRect rect = region.boundingRect();
+
+
+    int cells = m_maxpressure-m_minpressure+1;
+
+
+    int top = rect.top()-10;
+    float width = rect.width();
+    float height = rect.height();
+    float left = rect.left();
+    float pix = width / float(cells);
+
+
+    int numchans = chans.size();
+
+    int cells_high = numchans + 2;
+
+    //height += 10;
+    float hix = height / cells_high;
+
+    m_minx = graph.min_x;
+    m_maxx = graph.max_x;
+
+    if (graph.printing() || ((m_lastminx != m_minx) || (m_lastmaxx != m_maxx))) {
+        recalculate(&graph);
+    }
+
+
+    m_lastminx = m_minx;
+    m_lastmaxx = m_maxx;
+
+    QMap<EventStoreType, int>::iterator it;
+    if (graph.printing()) {
+        // lock the other mutex...
+//        while (recalculating()) {};
+//        recalculate(&graph);
+        while (recalculating()) {};
+
+    }
+
+    if (!painter.isActive()) return;
+
+    // Lock the stuff we need to draw
+    timelock.lock();
+    painter.setFont(*defaultfont);
+    painter.setPen(Qt::black);
+
+    QMap<EventStoreType, int>::iterator times_end = times.end();
+    QPoint mouse = graph.graphView()->currentMousePos();
+
+    float ypos = top;
+
+    int titleWidth = graph.graphView()->titleWidth;
+    int marginWidth = gYAxis::Margin;
+
+    QString text = schema::channel[m_presChannel].label();
+    QRectF rec(titleWidth-4, ypos, marginWidth, hix);
+    rec.moveRight(left - 4);
+//    graph.renderText(text, rec, Qt::AlignRight | Qt::AlignVCenter);
+
+    if (rec.contains(mouse)) {
+        QString text = schema::channel[m_presChannel].description();
+        graph.ToolTip(text, mouse.x() + 10, mouse.y(), TT_AlignLeft);
+    }
+    int w,h;
+    GetTextExtent(text, w,h);
+    graph.renderText(text, (left-4) - w, ypos + hix/2.0 + float(h)/2.0);
+
+    text = STR_UNIT_Minutes;
+    rec = QRectF(titleWidth-4, ypos+hix, marginWidth, hix);
+    rec.moveRight(left - 4);
+
+    GetTextExtent(text, w,h);
+    graph.renderText(text, (left-4) - w, ypos + hix + hix/2.0 + float(h)/2.0);
+//    graph.renderText(text, rec, Qt::AlignRight | Qt::AlignVCenter);
+
+    float xpos = left;
+    for (it = times.begin(); it != times_end; ++it) {
+        QString text = QString::number(it.key());
+        QString value = QString("%1").arg(float(it.value()) / 60.0, 5, 'f', 1);
+        QRectF rec(xpos, top, pix-1, hix);
+
+        GetTextExtent(text, w,h);
+
+        painter.fillRect(rec, QColor("orange"));
+        graph.renderText(text, xpos + pix/2 - w/2, top + hix /2 + h/2);
+
+        GetTextExtent(value, w,h);
+
+//        rec.moveTop(top + hix);
+        graph.renderText(value, xpos + pix/2 - w/2, top + hix+ hix /2+ h/2);
+
+        xpos += pix;
+    }
+
+    ypos += hix * 2;
+  //  left = rect.left();
+
+    QHash<ChannelID, QMap<EventStoreType, EventDataType> >::iterator eit;
+    QHash<ChannelID, QMap<EventStoreType, EventDataType> >::iterator ev_end = events.end();
+    QMap<EventStoreType, EventDataType>::iterator vit;
+
+
+    int row = 0;
+    for (int i=0; i< numchans; ++i) {
+        ChannelID code = chans.at(i);
+
+        schema::Channel & chan = schema::channel[code];
+        if (!chan.enabled())
+            continue;
+        schema::ChanType type = chan.type();
+        eit = events.find(code);
+
+        xpos = left;
+
+        QMap<EventStoreType, EventDataType>::iterator eit_end = eit.value().end();
+
+        QString text = chan.label();
+        rec = QRectF(titleWidth, ypos, marginWidth, hix);
+        rec.moveRight(xpos - 4);
+
+        if (rec.contains(mouse)) {
+                QString text = chan.fullname();
+                if (type == schema::SPAN) {
+                    text += "\n"+QObject::tr("(% of time)");
+                }
+                graph.ToolTip(text, mouse.x() + 10, mouse.y(), TT_AlignLeft);
+        }
+
+        GetTextExtent(text, w,h);
+
+        graph.renderText(text, (left-4) - w, ypos + hix/2.0 + float(h)/2.0);
+
+        for (it = times.begin(), vit = eit.value().begin(); vit != eit_end; ++vit, ++it) {
+            float minutes = float(it.value()) / 60.0;
+            float value = vit.value();
+
+            QString fmt = "%1";
+            if (type != schema::SPAN) {
+                //fmt = "%1";
+                value = (minutes > 0.000001) ? (value * 60.0) / minutes : 0;
+            } else {
+                //fmt = "%1%";
+                value = (minutes > 0.000001) ? (100/minutes) * (value / 60.0) : 0;
+            }
+
+            QRectF rec(xpos, ypos, pix-1, hix);
+            if ((row & 1) == 0) {
+                painter.fillRect(rec, QColor(245,245,255,240));
+            }
+
+            text = QString(fmt).arg(value,5,'f',2);
+
+            GetTextExtent(text, w,h);
+
+            graph.renderText(text, xpos + pix/2 - w/2, ypos + hix /2 + h/2);
+          //  painter.drawText(rec, Qt::AlignCenter, QString(fmt).arg(value,5,'f',2));
+            xpos += pix;
+
+        }
+        ypos += hix;
+        row++;
+    }
+
+
+
+    float maxmins = float(maxtime) / 60.0;
+    float ymult = height / maxmins;
+
+
+    row = 0;
+
+    xpos = left ;//+ pix / 2;
+
+    float y1, y2;
+    it = times.begin();
+    float bottom = top+height;
+    if (it != times_end) {
+        float minutes = float(it.value()) / 60.0;
+        y1 = minutes * ymult;
+
+        painter.setPen(QPen(QColor(Qt::gray), 2));
+        it++;
+        for (;  it != times_end; ++it) {
+            float minutes = float(it.value()) / 60.0;
+            y2 = minutes * ymult;
+
+            painter.drawLine(xpos, bottom-y1, xpos+pix, bottom-y2);
+            y1 = y2;
+            xpos += pix;
+        }
+
+
+        float maxev = 0;
+        for (int i=0; i< numchans; ++i) {
+            ChannelID code = chans.at(i);
+            if (code == CPAP_AHI) continue;
+
+
+            schema::Channel & chan = schema::channel[code];
+            if (!chan.enabled())
+                continue;
+            schema::ChanType type = chan.type();
+            if (type == schema::SPAN)
+                continue;
+            eit = events.find(code);
+            QMap<EventStoreType, EventDataType>::iterator eit_end = eit.value().end();
+            for (it = times.begin(), vit = eit.value().begin(); vit != eit_end; ++vit, ++it) {
+                //float minutes = float(it.value()) / 60.0;
+                float value = vit.value();
+                maxev = qMax(value, maxev);
+            }
+        }
+        float emult = height / float(maxev);
+        if (maxev < 0.00001) emult = 0;
+
+
+        for (int i=0; i< numchans; ++i) {
+            ChannelID code = chans.at(i);
+            if (code == CPAP_AHI) continue;
+
+
+            schema::Channel & chan = schema::channel[code];
+            if (!chan.enabled())
+                continue;
+            schema::ChanType type = chan.type();
+            if (type == schema::SPAN)
+                continue;
+            painter.setPen(QPen(QColor(chan.defaultColor()), 2));
+            eit = events.find(code);
+            xpos = left;//+pix/2;
+
+            y1 = 0;
+            QMap<EventStoreType, EventDataType>::iterator eit_end = eit.value().end();
+            for (it = times.begin(), vit = eit.value().begin(); vit != eit_end; ++vit, ++it) {
+                //float minutes = float(it.value()) / 60.0;
+                float value = vit.value();
+
+                y2 = value * emult;
+                //painter.drawPoint(xpos, bottom-y1);
+
+                painter.drawLine(xpos, bottom-y1, xpos+pix, bottom-y2);
+
+                xpos += pix;
+                y1 = y2;
+
+            }
+        }
+    }
+//    QString txt=QString("%1 %2").arg(maxmins).arg(float(maxevents * 60.0) / maxmins);
+//    graph.renderText(txt, rect.left(), rect.top()-10);
+
+    timelock.unlock();
+
+    if (m_recalculating) {
+//        painter.setFont(*defaultfont);
+//        painter.setPen(QColor(0,0,0,125));
+//        painter.drawText(region.boundingRect(), Qt::AlignCenter, QObject::tr("Recalculating..."));
+    }
+
+
+//    painter.setPen(QPen(Qt::black,1));
+//    painter.drawRect(rect);
+
+
+    // Draw the goodies...
+}
+
+
+void RecalcMAP::run()
+{
+    QMutexLocker locker(&map->mutex);
+    map->m_recalculating = true;
+    Day * day = map->m_day;
+    if (!day) return;
+
+    QList<Session *>::iterator sit;
+    QList<Session *>::iterator sess_end = day->end();
+
+
+    QMap<EventStoreType, int> times;
+
+    QHash<ChannelID, QMap<EventStoreType, EventDataType> > events;
+
+    QList<ChannelID> chans = day->getSortedMachineChannels(schema::SPAN | schema::FLAG | schema::MINOR_FLAG);
+
+    ChannelID code;
+
+    QList<ChannelID> badchans;
+    for (int i=0 ; i < chans.size(); ++i) {
+        code = chans.at(i);
+      //  if (!day->channelExists(code)) badchans.push_back(code);
+    }
+
+    for (int i=0; i < badchans.size(); ++i) {
+        code = badchans.at(i);
+        chans.removeAll(code);
+    }
+
+
+    int numchans = chans.size();
+    // Zero the pressure counts
+    for (int i=map->m_minpressure; i <= map->m_maxpressure; i++) {
+        times[i] = 0;
+
+        for (int c = 0; c < numchans; ++c) {
+            code = chans.at(c);
+            events[code].insert(i, 0);
+        }
+    }
+
+    ChannelID prescode = CPAP_Pressure;
+
+//    if (day->channelExists(CPAP_IPAP)) {
+//        prescode = CPAP_IPAP;
+//    } else
+    if (day->channelExists(CPAP_EPAP)) {
+        prescode = CPAP_EPAP;
+    }
+
+    qint64 minx, maxx;
+    map->m_graph->graphView()->GetXBounds(minx, maxx);
+
+    for (sit = day->begin(); sit != sess_end; ++sit) {
+        Session * sess = (*sit);
+        QHash<ChannelID, QVector<EventList *> >::iterator ei = sess->eventlist.find(prescode);
+        if (ei == sess->eventlist.end())
+            continue;
+
+        const QVector<EventList *> & evec = ei.value();
+        int esize = evec.size();
+        for (int ei = 0; ei < esize; ++ei) {
+            const EventList *EL = evec.at(ei);
+            EventDataType gain = EL->gain();
+            quint32 ELsize = EL->count();
+            if (ELsize < 1)  return;
+            qint64 lasttime = 0; //EL->time(0);
+            EventStoreType lastdata = 0; // EL->raw(0);
+
+            bool first = true;
+            if ((EL->first() > maxx) || (EL->last() < minx)) {
+                continue;
+            }
+
+            for (quint32 e = 0; e < ELsize; ++e) {
+                qint64 time = EL->time(e);
+                EventStoreType data = EL->raw(e);
+
+                if ((time < minx)) {
+                    lasttime = time;
+                    lastdata = data;
+                    first = false;
+                    goto skip;
+                }
+
+                if (first) {
+                    lasttime = time;
+                    lastdata = data;
+                    first = false;
+                }
+
+                if (lastdata != data) {
+                    qint64 d1 = qMax(minx, lasttime);
+                    qint64 d2 = qMin(maxx, time);
+
+
+                    int duration = (d2 - d1) / 1000L;
+                    EventStoreType key = floor(lastdata * gain);
+                    if (key <= 30) {
+                        times[key] += duration;
+                        for (int c = 0; c < chans.size(); ++c) {
+                            ChannelID code = chans.at(c);
+                            schema::Channel & chan = schema::channel[code];
+                            if (chan.type() == schema::SPAN) {
+                                events[code][key] += sess->rangeSum(code, d1, d2);
+                            } else {
+                                events[code][key] += sess->rangeCount(code, d1, d2);
+                            }
+                        }
+                    }
+                    lasttime = time;
+                    lastdata = data;
+                }
+                if (time > maxx) {
+
+                    break;
+                }
+skip:
+                if (m_quit) {
+                    m_done = true;
+                    return;
+                }
+            }
+            if (lasttime < maxx) {
+                qint64 d1 = qMax(lasttime, minx);
+                qint64 d2 = qMin(maxx, EL->last());
+
+                int duration = (d2 - d1) / 1000L;
+                EventStoreType key = floor(lastdata * gain);
+                if (key <= 30) {
+                    times[key] += duration;
+                    for (int c = 0; c < chans.size(); ++c) {
+                        ChannelID code = chans.at(c);
+                        schema::Channel & chan = schema::channel[code];
+                        if (chan.type() == schema::SPAN) {
+                            events[code][key] += sess->rangeSum(code, d1, d2);
+                        } else {
+                            events[code][key] += sess->rangeCount(code, d1, d2);
+                        }
+                    }
+                }
+
+            }
+
+
+        }
+    }
+
+
+    QMap<EventStoreType, int>::iterator it;
+    QMap<EventStoreType, int>::iterator times_end = times.end();
+    int maxtime = 0;
+
+    QList<EventStoreType> trash;
+    for (it = times.begin(); it != times_end; ++it) {
+        EventStoreType key = it.key();
+        int value = it.value();
+//        if (value == 0) {
+//            trash.append(key);
+//        } else {
+            maxtime = qMax(value, maxtime);
+//        }
+    }
+    chans.push_front(CPAP_AHI);
+
+    int maxevents = 0, val;
+
+    for (int i = map->m_minpressure; i <= map->m_maxpressure; i++) {
+        val = events[CPAP_Obstructive][i] + events[CPAP_Hypopnea][i] + events[CPAP_Apnea][i] + events[CPAP_ClearAirway][i];
+        events[CPAP_AHI].insert(i, val);
+     //   maxevents = qMax(val, maxevents);
+    }
+
+    for (int i = map->m_minpressure; i <= map->m_maxpressure; i++) {
+        for (int j=0 ; j < chans.size(); ++j) {
+            code = chans.at(j);
+            if ((code == CPAP_AHI) || (schema::channel[code].type() == schema::SPAN)) continue;
+            val = events[code][i];
+            maxevents = qMax(val, maxevents);
+        }
+    }
+    QHash<ChannelID, QMap<EventStoreType, EventDataType> >::iterator eit;
+
+//    for (int i=0; i< trash.size(); ++i) {
+//        EventStoreType key = trash.at(i);
+
+//        times.remove(key);
+//        for (eit = events.begin(); eit != events.end(); ++eit) {
+//            eit.value().remove(key);
+//        }
+//    }
+
+
+    QMutexLocker timelock(&map->timelock);
+    map->times = times;
+    map->events = events;
+    map->maxtime = maxtime;
+    map->maxevents = maxevents;
+    map->chans = chans;
+    map->m_presChannel = prescode;
+    timelock.unlock();
+
+    map->recalcFinished();
+    m_done = true;
+}
+
+void MinutesAtPressure::recalculate(gGraph * graph)
+{
+
+    while (recalculating())
+        m_remap->quit();
+
+    m_remap = new RecalcMAP(this);
+    m_remap->setAutoDelete(true);
+
+    m_graph = graph;
+
+    QThreadPool * tp = QThreadPool::globalInstance();
+//    tp->reserveThread();
+
+    if (graph->printing()) {
+        m_remap->run();
+    } else {
+        while(!tp->tryStart(m_remap));
+    }
+
+
+    // Start recalculating in another thread, organize a callback to redraw when done..
+
+
+}
+
+void MinutesAtPressure::recalcFinished()
+{
+    if (m_graph) {
+        m_graph->timedRedraw(0);
+    }
+    m_recalculating = false;
+    m_remap = nullptr;
+//    QThreadPool * tp = QThreadPool::globalInstance();
+//    tp->releaseThread();
+
+}
+
+
+bool MinutesAtPressure::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+//    int y = event->y() - m_rect.top();
+//    int x = event->x() - graph->graphView()->titleWidth;
+
+//    double w = m_rect.width() - gYAxis::Margin;
+
+//    double xmult = (graph->blockZoom() ? double(graph->rmax_x - graph->rmin_x) : double(graph->max_x - graph->min_x)) / w;
+
+//    double a = x - gYAxis::Margin;
+//    if (a < 0) a = 0;
+//    if (a > w) a = w;
+
+//    double b = a * xmult;
+//    double c= b + (graph->blockZoom() ? graph->rmin_x : graph->min_x);
+
+//    graph->graphView()->setCurrentTime(c);
+
+    graph->timedRedraw(0);
+    return false;
+}
+
+bool MinutesAtPressure::mousePressEvent(QMouseEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event);
+    Q_UNUSED(graph);
+    return false;
+}
+
+bool MinutesAtPressure::mouseReleaseEvent(QMouseEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event);
+    Q_UNUSED(graph);
+    return false;
+}
diff --git a/sleepyhead/Graphs/MinutesAtPressure.h b/sleepyhead/Graphs/MinutesAtPressure.h
new file mode 100644
index 0000000..48e0f17
--- /dev/null
+++ b/sleepyhead/Graphs/MinutesAtPressure.h
@@ -0,0 +1,107 @@
+/* Minutes At Pressure Graph Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef MINUTESATPRESSURE_H
+#define MINUTESATPRESSURE_H
+
+#include "Graphs/layer.h"
+#include "SleepLib/day.h"
+
+class MinutesAtPressure;
+class RecalcMAP:public QRunnable
+{
+    friend class MinutesAtPressure;
+public:
+    explicit RecalcMAP(MinutesAtPressure * map) :map(map), m_quit(false), m_done(false) {}
+    virtual ~RecalcMAP();
+    virtual void run();
+    void quit();
+protected:
+    MinutesAtPressure * map;
+    volatile bool m_quit;
+    volatile bool m_done;
+};
+
+class MinutesAtPressure:public Layer
+{
+    friend class RecalcMAP;
+public:
+    MinutesAtPressure();
+    virtual ~MinutesAtPressure();
+
+    virtual void recalculate(gGraph * graph);
+
+    virtual void SetDay(Day *d);
+
+    virtual bool isEmpty();
+    virtual int minimumHeight();
+
+    //! Draw filled rectangles behind Event Flag's, and an outlines around them all, Calls the individual paint for each gFlagLine
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+
+    bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+    bool mousePressEvent(QMouseEvent *event, gGraph *graph);
+    bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph);
+
+    virtual void recalcFinished();
+    virtual Layer * Clone() {
+        MinutesAtPressure * map = new MinutesAtPressure();
+        Layer::CloneInto(map);
+        CloneInto(map);
+        return map;
+    }
+
+    void CloneInto(MinutesAtPressure * layer) {
+        mutex.lock();
+        timelock.lock();
+        layer->m_empty = m_empty;
+        layer->m_minimum_height = m_minimum_height;
+        layer->m_lastminx = m_lastminx;
+        layer->m_lastmaxx = m_lastmaxx;
+        layer->times = times;
+        layer->chans = chans;
+        layer->events = events;
+        layer->maxtime = maxtime;
+        layer->maxevents = maxevents;
+        layer->m_presChannel = m_presChannel;
+        layer->m_minpressure = m_minpressure;
+        layer->m_maxpressure = m_maxpressure;
+        layer->max_mins = max_mins;
+
+        layer->ahis = ahis;
+
+        mutex.unlock();
+        timelock.unlock();
+    }
+protected:
+    QMutex timelock;
+    QMutex mutex;
+
+    bool m_empty;
+    int m_minimum_height;
+
+    qint64 m_lastminx;
+    qint64 m_lastmaxx;
+    gGraph * m_graph;
+    RecalcMAP * m_remap;
+    QMap<EventStoreType, int> times;
+    QList<ChannelID> chans;
+    QHash<ChannelID, QMap<EventStoreType, EventDataType> > events;
+    int maxtime;
+    int maxevents;
+    ChannelID m_presChannel;
+    EventStoreType m_minpressure;
+    EventStoreType m_maxpressure;
+
+    EventDataType max_mins;
+
+    QMap<EventStoreType, EventDataType> ahis;
+};
+
+#endif // MINUTESATPRESSURE_H
diff --git a/sleepyhead/Graphs/gFlagsLine.cpp b/sleepyhead/Graphs/gFlagsLine.cpp
new file mode 100644
index 0000000..a95867c
--- /dev/null
+++ b/sleepyhead/Graphs/gFlagsLine.cpp
@@ -0,0 +1,435 @@
+/* gFlagsLine Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <cmath>
+#include <QVector>
+#include "SleepLib/profiles.h"
+#include "gFlagsLine.h"
+#include "gYAxis.h"
+
+gLabelArea::gLabelArea(Layer * layer)
+    : gSpacer(20)
+{
+    m_layertype = LT_Spacer;
+    m_mainlayer = layer;
+}
+bool gLabelArea::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+    if (m_mainlayer) {
+        return m_mainlayer->mouseMoveEvent(event, graph);
+    }
+
+    return false;
+}
+int gLabelArea::minimumWidth()
+{
+    return gYAxis::Margin;
+}
+
+
+
+gFlagsGroup::gFlagsGroup()
+{
+    m_barh = 0;
+    m_empty = true;
+}
+gFlagsGroup::~gFlagsGroup()
+{
+}
+
+
+qint64 gFlagsGroup::Minx()
+{
+    if (m_day) {
+        return m_day->first();
+    }
+
+    return 0;
+}
+qint64 gFlagsGroup::Maxx()
+{
+    if (m_day) {
+        return m_day->last();
+    }
+
+    return 0;
+}
+void gFlagsGroup::SetDay(Day *d)
+{
+    LayerGroup::SetDay(d);
+    int cnt = 0;
+
+    if (!d) {
+        m_empty = true;
+        return;
+    }
+
+
+    quint32 z = schema::FLAG | schema::SPAN;
+    if (p_profile->general->showUnknownFlags()) z |= schema::UNKNOWN;
+    availableChans = d->getSortedMachineChannels(z);
+
+    m_rebuild_cpap = (availableChans.size() == 0);
+
+    if (m_rebuild_cpap) {
+        QHash<ChannelID, schema::Channel *> chans;
+
+        for (int i=0; i< m_day->size(); ++i) {
+            Session * sess = m_day->sessions.at(i);
+            QHash<ChannelID, QVector<EventList *> >::iterator it;
+            for (it = sess->eventlist.begin(); it != sess->eventlist.end(); ++it) {
+                ChannelID code = it.key();
+                if (chans.contains(code)) continue;
+
+                schema::Channel * chan = &schema::channel[code];
+
+                if (chan->type() == schema::FLAG) {
+                    availableChans.push_back(code);
+                } else if (chan->type() == schema::MINOR_FLAG) {
+                    availableChans.push_back(code);
+                } else if (chan->type() == schema::SPAN) {
+                    availableChans.push_back(code);
+                } else if (chan->type() == schema::UNKNOWN) {
+                    availableChans.push_back(code);
+                }
+            }
+        }
+        availableChans = chans.keys();
+    }
+
+    lvisible.clear();
+    for (int i=0; i < availableChans.size(); ++i) {
+        ChannelID code = availableChans.at(i);
+//        const schema::Channel & chan = schema::channel[code];
+
+        gFlagsLine * fl = new gFlagsLine(code);
+        fl->SetDay(d);
+        lvisible.push_back(fl);
+    }
+
+
+    cnt = lvisible.size();
+
+//    for (int i = 0; i < layers.size(); i++) {
+//        gFlagsLine *f = dynamic_cast<gFlagsLine *>(layers[i]);
+
+//        if (!f) { continue; }
+
+//        bool e = f->isEmpty();
+
+//        if (!e || f->isAlwaysVisible()) {
+//            lvisible.push_back(f);
+
+//            if (!e) {
+//                cnt++;
+//            }
+//        }
+//    }
+
+    m_empty = (cnt == 0);
+
+    if (m_empty) {
+        if (d) {
+            m_empty = !d->hasEvents();
+        }
+    }
+
+    m_barh = 0;
+}
+bool gFlagsGroup::isEmpty()
+{
+    if (m_day) {
+        if (m_day->hasEnabledSessions() && m_day->hasEvents())
+            return false;
+    }
+    return true;
+}
+
+void gFlagsGroup::paint(QPainter &painter, gGraph &g, const QRegion &region)
+{
+    int left = region.boundingRect().left();
+    int top = region.boundingRect().top();
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    if (!m_visible) { return; }
+
+    if (!m_day) { return; }
+
+
+    QVector<gFlagsLine *> visflags;
+
+    for (int i = 0; i < lvisible.size(); i++) {
+        if (schema::channel[lvisible.at(i)->code()].enabled())
+            visflags.push_back(lvisible.at(i));
+    }
+
+    int vis = visflags.size();
+    m_barh = float(height) / float(vis);
+    float linetop = top;
+
+    QColor barcol;
+
+    for (int i = 0; i < visflags.size(); i++) {
+        schema::Channel & chan = schema::channel[visflags.at(i)->code()];
+
+        // Alternating box color
+        if (i & 1) { barcol = COLOR_ALT_BG1; }
+        else { barcol = COLOR_ALT_BG2; }
+
+        painter.fillRect(left, floor(linetop), width-1, ceil(m_barh), QBrush(barcol));
+
+//        barcol = chan.defaultColor();
+//        barcol.setAlpha(16);
+//        painter.fillRect(left, floor(linetop), width-1, ceil(m_barh), QBrush(barcol));
+
+        // Paint the actual flags
+        QRect rect(left, linetop, width, m_barh);
+        visflags[i]->m_rect = rect;
+        visflags[i]->paint(painter, g, QRegion(rect));
+        linetop += m_barh;
+    }
+
+    painter.setPen(COLOR_Outline);
+    painter.drawLine(left - 1, top, left - 1, top + height);
+    painter.drawLine(left - 1, top + height, left + width, top + height);
+    painter.drawLine(left + width, top + height, left + width, top);
+    painter.drawLine(left + width, top, left - 1, top);
+
+    if (m_rebuild_cpap) {
+
+        QString txt = QObject::tr("Database Outdated\nPlease Rebuild CPAP Data");
+        painter.setFont(*bigfont);
+        painter.setPen(QPen(QColor(0,0,0,32)));
+        painter.drawText(region.boundingRect(), Qt::AlignCenter | Qt::AlignVCenter, txt);
+    }
+}
+
+bool gFlagsGroup::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+
+    //if (p_profile->appearance->lineCursorMode()) {
+        graph->timedRedraw(0);
+   // }
+
+    if (!p_profile->appearance->graphTooltips()) {
+        return false;
+    }
+
+    for (int i = 0; i < lvisible.size(); i++) {
+        gFlagsLine *fl = lvisible[i];
+
+        if (fl->m_rect.contains(event->x(), event->y())) {
+            if (fl->mouseMoveEvent(event, graph)) { return true; }
+        } else {
+            // Inside main graph area?
+            if ((event->y() > fl->m_rect.y()) && (event->y()) < (fl->m_rect.y() + fl->m_rect.height())) {
+                if (event->x() < lvisible[i]->m_rect.x()) {
+                    // Display tooltip
+                    QString ttip = schema::channel[fl->code()].fullname() + "\n" +
+                                   schema::channel[fl->code()].description();
+                    graph->ToolTip(ttip, event->x()+15, event->y(), TT_AlignLeft);
+                    graph->timedRedraw(0);
+                }
+            }
+
+        }
+    }
+    return false;
+}
+
+
+gFlagsLine::gFlagsLine(ChannelID code)
+    : Layer(code)
+{
+}
+gFlagsLine::~gFlagsLine()
+{
+}
+void gFlagsLine::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    int left = region.boundingRect().left();
+    int top = region.boundingRect().top();
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    if (!m_visible) { return; }
+
+    if (!m_day) { return; }
+
+    double minx;
+    double maxx;
+
+    if (w.blockZoom()) {
+        minx = w.rmin_x;
+        maxx = w.rmax_x;
+    } else {
+        minx = w.min_x;
+        maxx = w.max_x;
+    }
+
+    double xx = maxx - minx;
+
+    if (xx <= 0) { return; }
+
+    double xmult = width / xx;
+
+    schema::Channel & chan = schema::channel[m_code];
+
+    GetTextExtent(chan.label(), m_lx, m_ly);
+
+    // Draw text label
+    w.renderText(chan.label(), left - m_lx - 10, top + (height / 2) + (m_ly / 2));
+
+    float x1, x2;
+
+    float bartop = top + 2;
+    float bottom = top + height - 2;
+    qint64 X, X2, L;
+
+    qint64 start;
+    quint32 *tptr;
+    EventStoreType *dptr, * eptr;
+    int idx;
+    QHash<ChannelID, QVector<EventList *> >::iterator cei;
+
+    qint64 clockdrift = qint64(p_profile->cpap->clockDrift()) * 1000L;
+    qint64 drift = 0;
+
+    QVector<QLine> vlines;
+
+    QColor color=schema::channel[m_code].defaultColor();
+    QBrush brush(color);
+
+    bool hover = false;
+    for (QList<Session *>::iterator s = m_day->begin(); s != m_day->end(); s++) {
+        if (!(*s)->enabled()) {
+            continue;
+        }
+
+        drift = ((*s)->type() == MT_CPAP) ? clockdrift : 0;
+
+        cei = (*s)->eventlist.find(m_code);
+
+        if (cei == (*s)->eventlist.end()) {
+            continue;
+        }
+
+        QVector<EventList *> &evlist = cei.value();
+
+        for (int k = 0; k < evlist.size(); k++) {
+            EventList &el = *(evlist[k]);
+            start = el.first() + drift;
+            tptr = el.rawTime();
+            dptr = el.rawData();
+            int np = el.count();
+            eptr = dptr + np;
+
+            for (idx = 0; dptr < eptr; dptr++, tptr++, idx++) {
+                X = start + *tptr;
+                L = *dptr * 1000;
+
+                if (X >= minx) {
+                    break;
+                }
+
+                X2 = X - L;
+
+                if (X2 >= minx) {
+                    break;
+                }
+
+            }
+
+            np -= idx;
+
+            if (chan.type() == schema::SPAN) {
+                ///////////////////////////////////////////////////////////////////////////
+                // Draw Event Flag Spans
+                ///////////////////////////////////////////////////////////////////////////
+
+                for (; dptr < eptr; dptr++) {
+                    X = start + * tptr++;
+
+
+                    L = *dptr * 1000L;
+                    X2 = X - L;
+                    if (X2 > maxx) {
+                        break;
+                    }
+
+                    x1 = double(X - minx) * xmult + left;
+                    x2 = double(X2 - minx) * xmult + left;
+
+                    brush = QBrush(color);
+                    painter.fillRect(x2, bartop, x1-x2, bottom-bartop, brush);
+                    if (!w.selectingArea() && !hover && QRect(x2, bartop, x1-x2, bottom-bartop).contains(w.graphView()->currentMousePos())) {
+                        hover = true;
+                        painter.setPen(QPen(Qt::red,1));
+
+                        painter.drawRect(x2, bartop, x1-x2, bottom-bartop);
+                        int x,y;
+                        int s = *dptr;
+                        int m = s / 60;
+                        s %= 60;
+                        QString lab = QString("%1").arg(schema::channel[m_code].fullname());
+                        if (m>0) {
+                            lab += QObject::tr(" (%2 min, %3 sec)").arg(m).arg(s);
+                        } else {
+                            lab += QObject::tr(" (%3 sec)").arg(m).arg(s);
+                        }
+                        GetTextExtent(lab, x, y);
+                        w.ToolTip(lab, x2 - 10, bartop + (3 * w.printScaleY()), TT_AlignRight, p_profile->general->tooltipTimeout());
+
+                    }
+                }
+
+            } else { //if (chan.type() == schema::FLAG) {
+                ///////////////////////////////////////////////////////////////////////////
+                // Draw Event Flag Bars
+                ///////////////////////////////////////////////////////////////////////////
+
+                for (int i = 0; i < np; i++) {
+                    X = start + *tptr++;
+
+                    if (X > maxx) {
+                        break;
+                    }
+
+                    x1 = (X - minx) * xmult + left;
+
+                    if (!w.selectingArea() && !hover && QRect(x1-3, bartop-2, 6, bottom-bartop+4).contains(w.graphView()->currentMousePos())) {
+                        hover = true;
+                        painter.setPen(QPen(Qt::red,1));
+
+                        painter.drawRect(x1-2, bartop-2, 4, bottom-bartop+4);
+                        int x,y;
+                        QString lab = QString("%1 (%2)").arg(schema::channel[m_code].fullname()).arg(*dptr);
+                        GetTextExtent(lab, x, y);
+
+                        w.ToolTip(lab, x1 - 10, bartop + (3 * w.printScaleY()), TT_AlignRight, p_profile->general->tooltipTimeout());
+                    }
+
+                    vlines.append(QLine(x1, bartop, x1, bottom));
+                }
+            }
+        }
+    }
+
+    painter.setPen(color);
+    painter.drawLines(vlines);
+}
+
+bool gFlagsLine::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    //  qDebug() << code() << event->x() << event->y() << graph->rect();
+
+    return false;
+}
diff --git a/sleepyhead/Graphs/gFlagsLine.h b/sleepyhead/Graphs/gFlagsLine.h
new file mode 100644
index 0000000..b0ae4d1
--- /dev/null
+++ b/sleepyhead/Graphs/gFlagsLine.h
@@ -0,0 +1,164 @@
+/* gFlagsLine Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GFLAGSLINE_H
+#define GFLAGSLINE_H
+
+#include "gGraphView.h"
+#include "gspacer.h"
+
+class gFlagsGroup;
+
+/*! \class gYSpacer
+    \brief A dummy vertical spacer object
+   */
+class gLabelArea: public gSpacer
+{
+  public:
+    gLabelArea(Layer * layer);
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region) {
+        Q_UNUSED(w);
+        Q_UNUSED(painter);
+        Q_UNUSED(region);
+    }
+    virtual int minimumWidth();
+  protected:
+    Layer *m_mainlayer;
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+
+    virtual Layer * Clone() {
+        gLabelArea * layer = new gLabelArea(nullptr);  //ouchie..
+        Layer::CloneInto(layer);
+        CloneInto(layer);
+        return layer;
+    }
+
+    void CloneInto(gLabelArea * ) {
+    }
+
+};
+
+
+/*! \class gFlagsLine
+    \brief One single line of event flags in the Event Flags chart
+    */
+class gFlagsLine: public Layer
+{
+    friend class gFlagsGroup;
+  public:
+    /*! \brief Constructs an individual gFlagsLine object
+        \param code  The Channel the data is sourced from
+        \param col   The colour to draw this flag
+        \param label The label to show to the left of the Flags line.
+        \param always_visible  Whether to always show this line, even if empty
+        \param Type of Flag, either FT_Bar, or FT_Span
+        */
+    gFlagsLine(ChannelID code);
+    virtual ~gFlagsLine();
+
+    //! \brief Drawing code to add the flags and span markers to the Vertex buffers.
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+    void setTotalLines(int i) { total_lines = i; }
+    void setLineNum(int i) { line_num = i; }
+
+    virtual Layer * Clone() {
+        gFlagsLine * layer = new gFlagsLine(nullptr);  //ouchie..
+        Layer::CloneInto(layer);
+        CloneInto(layer);
+        return layer;
+    }
+
+    void CloneInto(gFlagsLine * layer ) {
+        layer->m_always_visible = m_always_visible;
+        layer->total_lines = total_lines;
+        layer->line_num = line_num;
+        layer->m_lx = m_lx;
+        layer->m_ly = m_ly;
+    }
+
+  protected:
+
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+
+    bool m_always_visible;
+    int total_lines, line_num;
+    int m_lx, m_ly;
+
+};
+
+/*! \class gFlagsGroup
+    \brief Contains multiple gFlagsLine entries for the Events Flag graph
+    */
+class gFlagsGroup: public LayerGroup
+{
+    friend class gFlagsLabelArea;
+
+  public:
+    gFlagsGroup();
+    virtual ~gFlagsGroup();
+
+    //! Draw filled rectangles behind Event Flag's, and an outlines around them all, Calls the individual paint for each gFlagLine
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+    //! Returns the first time represented by all gFlagLine layers, in milliseconds since epoch
+    virtual qint64 Minx();
+    //! Returns the last time represented by all gFlagLine layers, in milliseconds since epoch.
+    virtual qint64 Maxx();
+
+    //! Checks if each flag has data, and adds valid gFlagLines to the visible layers list
+    virtual void SetDay(Day *);
+
+    //! Returns true if none of the gFlagLine objects contain any data for this day
+    virtual bool isEmpty();
+
+    //! Returns the count of visible flag line entries
+    int count() { return lvisible.size(); }
+
+    //! Returns the height in pixels of each bar
+    int barHeight() { return m_barh; }
+
+    //! Returns a list of Visible gFlagsLine layers to draw
+    QVector<gFlagsLine *> &visibleLayers() { return lvisible; }
+
+    void alwaysVisible(ChannelID code) { m_alwaysvisible.push_back(code); }
+
+    virtual Layer * Clone() {
+        gFlagsGroup * layer = new gFlagsGroup();  //ouchie..
+        Layer::CloneInto(layer);
+        CloneInto(layer);
+        return layer;
+    }
+
+    void CloneInto(gFlagsGroup * layer) {
+        layer->m_alwaysvisible = m_alwaysvisible;
+        layer->availableChans = availableChans;
+
+        for (int i=0; i<lvisible.size(); i++) {
+            layer->lvisible.append(dynamic_cast<gFlagsLine *>(lvisible.at(i)->Clone()));
+        }
+        layer->m_barh = m_barh;
+        layer->m_empty = m_empty;
+        layer->m_rebuild_cpap = m_rebuild_cpap;
+    }
+
+
+  protected:
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+
+    QList<ChannelID> m_alwaysvisible;
+
+    QList<ChannelID> availableChans;
+
+    QVector<gFlagsLine *> lvisible;
+    float m_barh;
+    bool m_empty;
+    bool m_rebuild_cpap;
+};
+
+#endif // GFLAGSLINE_H
diff --git a/sleepyhead/Graphs/gFooBar.cpp b/sleepyhead/Graphs/gFooBar.cpp
new file mode 100644
index 0000000..de53aa4
--- /dev/null
+++ b/sleepyhead/Graphs/gFooBar.cpp
@@ -0,0 +1,135 @@
+/* gFooBar Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "Graphs/gFooBar.h"
+
+#include <cmath>
+
+#include "Graphs/gGraph.h"
+#include "Graphs/gYAxis.h"
+
+gShadowArea::gShadowArea(QColor shadow_color, QColor line_color)
+    : Layer(NoChannel), m_shadow_color(shadow_color), m_line_color(line_color)
+{
+}
+gShadowArea::~gShadowArea()
+{
+}
+void gShadowArea::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    int left = region.boundingRect().left();
+    int top = region.boundingRect().top();
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    if (!m_visible) { return; }
+
+    double xx = w.max_x - w.min_x;
+
+    if (xx == 0) {
+        return;
+    }
+
+    int start_px = left - 1;
+    int end_px = left + width;
+
+    double rmx = w.rmax_x - w.rmin_x;
+    double px = ((1.0 / rmx) * (w.min_x - w.rmin_x)) * width;
+    double py = ((1.0 / rmx) * (w.max_x - w.rmin_x)) * width;
+
+    painter.fillRect(start_px, top, px, height, QBrush(m_shadow_color));
+    painter.fillRect(start_px + py, top, end_px-start_px-py, height, QBrush(m_shadow_color));
+
+    painter.setPen(m_line_color);
+    painter.drawLine(start_px + px, top, start_px + py, top);
+    painter.drawLine(start_px + px, top + height + 1, start_px + py, top + height + 1);
+}
+
+gFooBar::gFooBar(int offset, QColor handle_color, QColor line_color)
+    : Layer(NoChannel), m_offset(offset), m_handle_color(handle_color), m_line_color(line_color)
+{
+}
+
+gFooBar::~gFooBar()
+{
+}
+
+void gFooBar::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    Q_UNUSED(painter);
+    Q_UNUSED(region);
+
+    if (!m_visible) { return; }
+
+    double xx = w.max_x - w.min_x;
+
+    if (xx == 0) {
+        return;
+    }
+
+    //int start_px=left;
+    //int end_px=left+width;
+
+    //float h=top;
+
+    /*  glLineWidth(1);
+      glBegin(GL_LINES);
+      w.qglColor(m_line_color);
+      glVertex2f(start_px, h);
+      glVertex2f(start_px+width, h);
+      glEnd();
+
+      double rmx=w.rmax_x-w.rmin_x;
+      double px=((1/rmx)*(w.min_x-w.rmin_x))*width;
+      double py=((1/rmx)*(w.max_x-w.rmin_x))*width;
+
+      int extra=0;
+      if (fabs(px-py)<2) extra=2;
+
+      int hh=25;
+      glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+      glEnable(GL_BLEND);
+      glBegin(GL_QUADS);
+
+      w.qglColor(m_handle_color);
+      glVertex2f(start_px+px-extra,top-hh);
+      glVertex2f(start_px+py+extra,top-hh);
+      //glColor4ub(255,255,255,128);
+      glColor4ub(255,255,255,128);
+      glVertex2f(start_px+py+extra,top-hh/2.0);
+      glVertex2f(start_px+px-extra,top-hh/2.0);
+    //    glColor4ub(255,255,255,128);
+      glColor4ub(255,255,255,128);
+      glVertex2f(start_px+px-extra,top-hh/2.0);
+      glVertex2f(start_px+py+extra,top-hh/2.0);
+      w.qglColor(m_handle_color);
+    //    glColor4ub(192,192,192,128);
+      glVertex2f(start_px+py+extra,h);
+      glVertex2f(start_px+px-extra,h);
+      glEnd();
+      glDisable(GL_BLEND);
+
+      w.qglColor(m_handle_color);
+      glBegin(GL_LINE_LOOP);
+      glVertex2f(start_px+px-extra,top-hh);
+      glVertex2f(start_px+py+extra,top-hh);
+      glVertex2f(start_px+py+extra,h);
+      glVertex2f(start_px+px-extra,h);
+      glEnd();
+
+      glLineWidth(3);
+      glBegin(GL_LINES);
+      w.qglColor(m_handle_color);
+      glVertex2f(start_px+px-extra,h);
+      glVertex2f(start_px+py+extra,h);
+      glEnd();
+
+      glLineWidth(1);  */
+
+}
+
diff --git a/sleepyhead/Graphs/gFooBar.h b/sleepyhead/Graphs/gFooBar.h
new file mode 100644
index 0000000..a82f04e
--- /dev/null
+++ b/sleepyhead/Graphs/gFooBar.h
@@ -0,0 +1,52 @@
+/* gFooBar Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GFOOBAR_H
+#define GFOOBAR_H
+
+#include "Graphs/layer.h"
+
+/*! \class gShadowArea
+    \brief Displays a Shadow for all graph areas not highlighted (used in Event Flags)
+    */
+class gShadowArea: public Layer
+{
+  public:
+    gShadowArea(QColor shadow_color = QColor(40, 40, 40, 40), QColor line_color = Qt::blue);
+    virtual ~gShadowArea();
+
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+  protected:
+    QColor m_shadow_color;
+    QColor m_line_color;
+};
+
+/*! \class gFooBar
+    \brief Was a kind of scrollbar thingy that used to be used for representing the overall graph areas.
+    Currently Unused and empty.
+    */
+class gFooBar: public Layer
+{
+  public:
+    static const int Margin = 15;
+
+  public:
+    gFooBar(int offset = 10, QColor handle_color = QColor("orange"),
+            QColor line_color = QColor("dark grey"));
+    virtual ~gFooBar();
+
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+  protected:
+    int m_offset;
+    QColor m_handle_color;
+    QColor m_line_color;
+};
+
+#endif // GFOOBAR_H
diff --git a/sleepyhead/Graphs/gGraph.cpp b/sleepyhead/Graphs/gGraph.cpp
new file mode 100644
index 0000000..08b381d
--- /dev/null
+++ b/sleepyhead/Graphs/gGraph.cpp
@@ -0,0 +1,1474 @@
+/* gGraph Implemntation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "Graphs/gGraph.h"
+
+#include <QLabel>
+#include <QTimer>
+#include <cmath>
+#include <exception>
+
+#include "mainwindow.h"
+#include "Graphs/gGraphView.h"
+#include "Graphs/layer.h"
+#include "SleepLib/profiles.h"
+
+extern MainWindow *mainwin;
+
+// Graph globals.
+QFont *defaultfont = nullptr;
+QFont *mediumfont = nullptr;
+QFont *bigfont = nullptr;
+QHash<QString, QImage *> images;
+
+static bool globalsInitialized = false;
+
+// Graph constants.
+static const double zoom_hard_limit = 500.0;
+
+ // Must be called from a thread inside the application.
+bool InitGraphGlobals()
+{
+    if (globalsInitialized) {
+        return true;
+    }
+
+    if (!PREF.contains("Fonts_Graph_Name")) {
+        PREF["Fonts_Graph_Name"] = "Sans Serif";
+        PREF["Fonts_Graph_Size"] = 10;
+        PREF["Fonts_Graph_Bold"] = false;
+        PREF["Fonts_Graph_Italic"] = false;
+    }
+
+    if (!PREF.contains("Fonts_Title_Name")) {
+        PREF["Fonts_Title_Name"] = "Sans Serif";
+        PREF["Fonts_Title_Size"] = 14;
+        PREF["Fonts_Title_Bold"] = true;
+        PREF["Fonts_Title_Italic"] = false;
+    }
+
+    if (!PREF.contains("Fonts_Big_Name")) {
+        PREF["Fonts_Big_Name"] = "Serif";
+        PREF["Fonts_Big_Size"] = 35;
+        PREF["Fonts_Big_Bold"] = false;
+        PREF["Fonts_Big_Italic"] = false;
+    }
+
+    defaultfont = new QFont(PREF["Fonts_Graph_Name"].toString(),
+                            PREF["Fonts_Graph_Size"].toInt(),
+                            PREF["Fonts_Graph_Bold"].toBool() ? QFont::Bold : QFont::Normal,
+                            PREF["Fonts_Graph_Italic"].toBool()
+                           );
+    mediumfont = new QFont(PREF["Fonts_Title_Name"].toString(),
+                           PREF["Fonts_Title_Size"].toInt(),
+                           PREF["Fonts_Title_Bold"].toBool() ? QFont::Bold : QFont::Normal,
+                           PREF["Fonts_Title_Italic"].toBool()
+                          );
+    bigfont = new QFont(PREF["Fonts_Big_Name"].toString(),
+                        PREF["Fonts_Big_Size"].toInt(),
+                        PREF["Fonts_Big_Bold"].toBool() ? QFont::Bold : QFont::Normal,
+                        PREF["Fonts_Big_Italic"].toBool()
+                       );
+
+    defaultfont->setStyleHint(QFont::AnyStyle, QFont::OpenGLCompatible);
+    mediumfont->setStyleHint(QFont::AnyStyle, QFont::OpenGLCompatible);
+    bigfont->setStyleHint(QFont::AnyStyle, QFont::OpenGLCompatible);
+
+    //images["mask"] = new QImage(":/icons/mask.png");
+    images["oximeter"] = new QImage(":/icons/cubeoximeter.png");
+    images["smiley"] = new QImage(":/icons/smileyface.png");
+    //images["sad"] = new QImage(":/icons/sadface.png");
+
+    images["sheep"] = new QImage(":/icons/sheep.png");
+    images["brick"] = new QImage(":/icons/brick.png");
+    images["nographs"] = new QImage(":/icons/nographs.png");
+    images["nodata"] = new QImage(":/icons/nodata.png");
+
+    globalsInitialized = true;
+    return true;
+}
+
+void DestroyGraphGlobals()
+{
+    if (!globalsInitialized) {
+        return;
+    }
+
+    delete defaultfont;
+    delete bigfont;
+    delete mediumfont;
+
+    for (QHash<QString, QImage *>::iterator i = images.begin(); i != images.end(); i++) {
+        delete i.value();
+    }
+
+    globalsInitialized = false;
+}
+
+gGraph::gGraph(QString name, gGraphView *graphview, QString title, QString units, int height, short group)
+    : m_name(name),
+      m_graphview(graphview),
+      m_title(title),
+      m_units(units),
+      m_visible(true)
+{
+    if (height == 0) {
+        height = p_profile->appearance->graphHeight();
+    }
+    if (graphview && graphview->contains(name)) {
+        qDebug() << "Trying to duplicate " << name << " when a graph with the same name already exists";
+        name+="-1";
+    }
+    m_min_height = 60;
+    m_width = 0;
+
+    m_layers.clear();
+
+    m_snapshot = false;
+    f_miny = f_maxy = 0;
+    rmin_x = rmin_y = 0;
+    rmax_x = rmax_y = 0;
+    max_x = max_y = 0;
+    min_x = min_y = 0;
+    rec_miny = rec_maxy = 0;
+    rphysmax_y = rphysmin_y = 0;
+    m_zoomY = 0;
+    m_selectedDuration = 0;
+
+    if (graphview) {
+        graphview->addGraph(this, group);
+        timer = new QTimer(graphview);
+        connect(timer, SIGNAL(timeout()), SLOT(Timeout()));
+    } else {
+        timer = new QTimer();
+        connect(timer, SIGNAL(timeout()), SLOT(Timeout()));
+        // know what I'm doing now.. ;)
+     //   qWarning() << "gGraph created without a gGraphView container.. Naughty programmer!! Bad!!!";
+    }
+
+    m_margintop = 14;
+    m_marginbottom = 5;
+    m_marginleft = 0;
+    m_marginright = 15;
+    m_selecting_area = m_blockzoom = false;
+    m_pinned = false;
+    m_lastx23 = 0;
+
+    invalidate_yAxisImage = true;
+    invalidate_xAxisImage = true;
+
+    m_block_select = false;
+
+    m_enforceMinY = m_enforceMaxY = false;
+    m_showTitle = true;
+    m_printing = false;
+}
+gGraph::~gGraph()
+{
+    for (int i = 0; i < m_layers.size(); i++) {
+        if (m_layers[i]->unref()) {
+            delete m_layers[i];
+        }
+    }
+
+    m_layers.clear();
+
+    if (timer) {
+        timer->stop();
+        disconnect(timer, 0, 0, 0);
+        delete timer;
+    }
+}
+void gGraph::Trigger(int ms)
+{
+    if (timer->isActive()) { timer->stop(); }
+
+    timer->setSingleShot(true);
+    timer->start(ms);
+}
+void gGraph::Timeout()
+{
+    deselect();
+    m_graphview->timedRedraw(0);
+}
+
+void gGraph::deselect()
+{
+    for (QVector<Layer *>::iterator l = m_layers.begin(); l != m_layers.end(); l++) {
+        (*l)->deselect();
+    }
+}
+bool gGraph::isSelected()
+{
+    bool res = false;
+
+    for (QVector<Layer *>::iterator l = m_layers.begin(); l != m_layers.end(); l++) {
+        res = (*l)->isSelected();
+
+        if (res) { break; }
+    }
+
+    return res;
+}
+
+bool gGraph::isEmpty()
+{
+    bool empty = true;
+
+    for (QVector<Layer *>::iterator l = m_layers.begin(); l != m_layers.end(); l++) {
+        if (!(*l)->isEmpty()) {
+            empty = false;
+            break;
+        }
+    }
+
+
+    return empty;
+}
+
+
+float gGraph::printScaleX() { return m_graphview->printScaleX(); }
+float gGraph::printScaleY() { return m_graphview->printScaleY(); }
+
+
+//void gGraph::drawGLBuf()
+//{
+
+//    float linesize = 1;
+
+//    if (m_printing) { linesize = 4; } //ceil(m_graphview->printScaleY());
+
+//    for (int i = 0; i < m_layers.size(); i++) {
+//        m_layers[i]->drawGLBuf(linesize);
+//    }
+
+//}
+void gGraph::setDay(Day *day)
+{
+    // Don't update for snapshots..
+    if (m_snapshot) return;
+
+    m_day = day;
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        m_layers[i]->SetDay(day);
+    }
+
+    rmin_y = rmax_y = 0;
+    ResetBounds();
+}
+
+void gGraph::setZoomY(short zoom)
+{
+    m_zoomY = zoom;
+    timedRedraw(0);
+}
+
+void gGraph::renderText(QString text, int x, int y, float angle, QColor color, QFont *font, bool antialias)
+{
+    m_graphview->AddTextQue(text, x, y, angle, color, font, antialias);
+}
+
+void gGraph::renderText(QString text, QRectF rect, quint32 flags, float angle, QColor color, QFont *font, bool antialias)
+{
+    m_graphview->AddTextQue(text, rect, flags, angle, color, font, antialias);
+}
+
+
+void gGraph::paint(QPainter &painter, const QRegion &region)
+{
+    m_rect = region.boundingRect();
+    int originX = m_rect.left();
+    int originY = m_rect.top();
+    int width = m_rect.width();
+    int height = m_rect.height();
+
+    int fw, font_height;
+    GetTextExtent("Wg@", fw, font_height);
+
+    if (m_margintop > 0) {
+        m_margintop = font_height + (2*printScaleY());
+    }
+
+    //m_marginbottom=5;
+
+    left = marginLeft()*printScaleX(), right = marginRight()*printScaleX(), top = marginTop(), bottom = marginBottom() * printScaleY();
+    int x = 0, y = 0;
+
+    if (m_showTitle) {
+        int title_x, yh;
+
+        painter.setFont(*mediumfont);
+        QFontMetrics fm(*mediumfont);
+
+        yh = fm.height();
+        //GetTextExtent("Wy@",x,yh,mediumfont); // This gets a better consistent height. should be cached.
+        y = yh;
+        x = fm.width(title());
+        //GetTextExtent(title(),x,y,mediumfont);
+        title_x = float(yh) ;
+
+        QString & txt = title();
+        graphView()->AddTextQue(txt, marginLeft() + title_x + 8*printScaleX(), originY + height / 2 - y / 2, 90, Qt::black, mediumfont);
+
+        left += graphView()->titleWidth*printScaleX();
+    } else { left = 0; }
+
+
+    if (m_snapshot) {
+        QLinearGradient linearGrad(QPointF(100, 100), QPointF(width / 2, 100));
+        linearGrad.setColorAt(0, QColor(255, 150, 150,40));
+        linearGrad.setColorAt(1, QColor(255,255,255,20));
+
+        painter.fillRect(m_rect, QBrush(linearGrad));
+        painter.setFont(*defaultfont);
+        painter.setPen(QColor(0,0,0,255));
+
+        QString t = name().section(";", -1);
+
+        QString txt = QObject::tr("Snapshot %1").arg(t);
+        QRectF rec = QRect(m_rect.left(),m_rect.top()+6*printScaleY(), m_rect.width(), 0);
+        rec = painter.boundingRect(rec, Qt::AlignCenter, txt);
+
+        painter.drawText(rec, Qt::AlignCenter, txt);
+        m_margintop += rec.height();
+        top = m_margintop;
+    }
+
+
+#ifdef DEBUG_LAYOUT
+    QColor col = Qt::red;
+    painter.setPen(col);
+    painter.drawLine(0, originY, 0, originY + height);
+    painter.drawLine(left, originY, left, originY + height);
+#endif
+    int tmp;
+
+   // left = 0;
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        Layer *ll = m_layers[i];
+
+        if (!ll->visible()) { continue; }
+
+        tmp = ll->minimumHeight();// * m_graphview->printScaleY();
+
+        if (ll->position() == LayerTop) { top += tmp; }
+        if (ll->position() == LayerBottom) { bottom += tmp * printScaleY(); }
+    }
+
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        Layer *ll = m_layers[i];
+
+        if (!ll->visible()) { continue; }
+
+        tmp = ll->minimumWidth();
+        tmp *= m_graphview->printScaleX();
+        tmp *= m_graphview->devicePixelRatio();
+
+        if (ll->position() == LayerLeft) {
+            QRect rect(originX + left, originY + top, tmp, height - top - bottom);
+            ll->m_rect = rect;
+          //  ll->paint(painter, *this, QRegion(rect));
+            left += tmp;
+#ifdef DEBUG_LAYOUT
+            QColor col = Qt::red;
+            painter.setPen(col);
+            painter.drawLine(originX + left - 1, originY, originX + left - 1, originY + height);
+#endif
+        }
+
+        if (ll->position() == LayerRight) {
+            right += tmp;
+            QRect rect(originX + width - right, originY + top, tmp, height - top - bottom);
+            ll->m_rect = rect;
+            //ll->paint(painter, *this, QRegion(rect));
+#ifdef DEBUG_LAYOUT
+            QColor col = Qt::red;
+            painter.setPen(col);
+            painter.drawLine(originX + width - right, originY, originX + width - right, originY + height);
+#endif
+        }
+    }
+
+    bottom = marginBottom() * printScaleY();
+    top = marginTop();
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        Layer *ll = m_layers[i];
+
+        if (!ll->visible()) { continue; }
+
+        tmp = ll->minimumHeight();
+
+        if (ll->position() == LayerTop) {
+            QRect rect(originX + left, originY + top, width - left - right, tmp);
+            ll->m_rect = rect;
+            ll->paint(painter, *this, QRegion(rect));
+            top += tmp;
+        }
+
+        if (ll->position() == LayerBottom) {
+            bottom += tmp * printScaleY();
+            QRect rect(originX + left, originY + height - bottom, width - left - right, tmp);
+            ll->m_rect = rect;
+            ll->paint(painter, *this, QRegion(rect));
+        }
+    }
+
+    if (isPinned()) {
+        // Fill the background on pinned graphs
+        painter.fillRect(originX + left, originY + top, width - right, height - bottom - top, QBrush(QColor(Qt::white)));
+    }
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        Layer *ll = m_layers[i];
+
+        if (!ll->visible()) { continue; }
+
+        if (ll->position() == LayerCenter) {
+            QRect rect(originX + left, originY + top, width - left - right, height - top - bottom);
+            ll->m_rect = rect;
+            ll->paint(painter, *this, QRegion(rect));
+        }
+    }
+
+    // Draw anything like the YAxis labels afterwards, in case the graph scale was updated during draw
+    for (int i = 0; i < m_layers.size(); i++) {
+        Layer *ll = m_layers[i];
+
+        if (!ll->visible()) { continue; }
+        if ((ll->position() == LayerLeft) || (ll->position() == LayerRight)) {
+            ll->paint(painter, *this, QRegion(ll->m_rect));
+        }
+    }
+
+    if (m_selection.width() > 0 && m_selecting_area) {
+        QColor col(128, 128, 255, 128);
+        painter.fillRect(originX + m_selection.x(), originY + top, m_selection.width(), height - bottom - top,QBrush(col));
+//        quads()->add(originX + m_selection.x(), originY + top,
+//                     originX + m_selection.x() + m_selection.width(), originY + top, col.rgba());
+//        quads()->add(originX + m_selection.x() + m_selection.width(), originY + height - bottom,
+//                     originX + m_selection.x(), originY + height - bottom, col.rgba());
+    }
+
+    if (isPinned() && !printing()) {
+        painter.drawPixmap(-5, originY-10, m_graphview->pin_icon);
+    }
+
+}
+
+QPixmap gGraph::renderPixmap(int w, int h, bool printing)
+{
+
+    QFont *_defaultfont = defaultfont;
+    QFont *_mediumfont = mediumfont;
+    QFont *_bigfont = bigfont;
+
+    QFont fa = *defaultfont;
+    QFont fb = *mediumfont;
+    QFont fc = *bigfont;
+
+
+    m_printing = printing;
+
+    if (printing) {
+        fa.setPixelSize(28);
+        fb.setPixelSize(32);
+        fc.setPixelSize(70);
+        graphView()->setPrintScaleX(2.5);
+        graphView()->setPrintScaleY(2.2);
+    } else {
+        graphView()->setPrintScaleX(1);
+        graphView()->setPrintScaleY(1);
+    }
+
+    defaultfont = &fa;
+    mediumfont = &fb;
+    bigfont = &fc;
+
+    QPixmap pm(w,h);
+
+
+    bool pixcaching = p_profile->appearance->usePixmapCaching();
+    graphView()->setUsePixmapCache(false);
+    p_profile->appearance->setUsePixmapCaching(false);
+    QPainter painter(&pm);
+    painter.fillRect(0,0,w,h,QBrush(QColor(Qt::white)));
+    QRegion region(0,0,w,h);
+    paint(painter, region);
+    DrawTextQue(painter);
+    painter.end();
+
+    graphView()->setUsePixmapCache(pixcaching);
+    p_profile->appearance->setUsePixmapCaching(pixcaching);
+    graphView()->setPrintScaleX(1);
+    graphView()->setPrintScaleY(1);
+
+
+    defaultfont = _defaultfont;
+    mediumfont = _mediumfont;
+    bigfont = _bigfont;
+    m_printing = false;
+
+    return pm;
+}
+
+// Sets a new Min & Max X clipping, refreshing the graph and all it's layers.
+void gGraph::SetXBounds(qint64 minx, qint64 maxx)
+{
+    invalidate_xAxisImage = true;
+    min_x = minx;
+    max_x = maxx;
+
+    //repaint();
+    //m_graphview->redraw();
+}
+
+int gGraph::flipY(int y)
+{
+    return m_graphview->height() - y;
+}
+
+void gGraph::ResetBounds()
+{
+    if (m_snapshot) return;
+    invalidate_xAxisImage = true;
+    min_x = MinX();
+    max_x = MaxX();
+    min_y = MinY();
+    max_y = MaxY();
+}
+
+void gGraph::ToolTip(QString text, int x, int y, ToolTipAlignment align, int timeout)
+{
+    if (timeout <= 0) {
+        timeout = p_profile->general->tooltipTimeout();
+    }
+
+    m_graphview->m_tooltip->display(text, x, y, align, timeout);
+}
+
+// YAxis Autoscaling code
+void gGraph::roundY(EventDataType &miny, EventDataType &maxy)
+{
+
+    if (zoomY() == 2) {
+        miny = rec_miny;
+        maxy = rec_maxy;
+        if (maxy > miny) return;
+    } else if (zoomY() ==1) {
+        miny = physMinY();
+        maxy = physMaxY();
+        if (maxy > miny) return;
+    }
+    miny = MinY();
+    maxy = MaxY();
+
+    int m, t;
+    bool ymin_good = false, ymax_good = false;
+
+    // Have no minx/miny reference, have to create one
+    if (maxy == miny) {
+        m = ceil(maxy / 2.0);
+        t = m * 2;
+
+        if (maxy == t) {
+            t += 2;
+        }
+
+        if (!ymax_good) {
+            maxy = t;
+        }
+
+        m = floor(miny / 2.0);
+        t = m * 2;
+
+        if (miny == t) {
+            t -= 2;
+        }
+
+        if (miny >= 0 && t < 0) {
+            t = 0;
+        }
+
+        if (!ymin_good) {
+            miny = t;
+        }
+
+
+        if (miny < 0) {
+            EventDataType tmp = qMax(qAbs(miny), qAbs(maxy));
+            maxy = tmp;
+            miny = -tmp;
+        }
+
+        return;
+    }
+
+    if (maxy >= 400) {
+        m = ceil(maxy / 50.0);
+        t = m * 50;
+
+        if (!ymax_good) {
+            maxy = t;
+        }
+
+        m = floor(miny / 50.0);
+
+        if (!ymin_good) {
+            miny = m * 50;
+        }
+    } else if (maxy >= 30) {
+        m = ceil(maxy / 5.0);
+        t = m * 5;
+
+        if (!ymax_good) {
+            maxy = t;
+        }
+
+        m = floor(miny / 5.0);
+
+        if (!ymin_good) {
+            miny = m * 5;
+        }
+    } else {
+        if (maxy == miny && maxy == 0) {
+            maxy = 0.5;
+        } else {
+            //maxy*=4.0;
+            //miny*=4.0;
+            if (!ymax_good) {
+                maxy = ceil(maxy);
+            }
+
+            if (!ymin_good) {
+                miny = floor(miny);
+            }
+
+            //maxy/=4.0;
+            //miny/=4.0;
+        }
+    }
+
+    if (miny < 0) {
+        EventDataType tmp = qMax(qAbs(miny), qAbs(maxy));
+        maxy = tmp;
+        miny = -tmp;
+    }
+
+
+    //if (m_enforceMinY) { miny=f_miny; }
+    //if (m_enforceMaxY) { maxy=f_maxy; }
+}
+
+void gGraph::AddLayer(Layer *l, LayerPosition position, short width, short height, short order, bool movable, short x, short y)
+{
+    l->setLayout(position, width, height, order);
+    l->setMovable(movable);
+    l->setPos(x, y);
+    l->addref();
+    m_layers.push_back(l);
+}
+
+void gGraph::dataChanged()
+{
+    int size = m_layers.size();
+    for (int i=0; i < size; i++) {
+        m_layers[i]->dataChanged();
+    }
+}
+
+void gGraph::redraw()
+{
+    m_graphview->redraw();
+}
+void gGraph::timedRedraw(int ms)
+{
+    m_graphview->timedRedraw(ms);
+}
+
+double gGraph::currentTime() const
+{
+    return m_graphview->currentTime();
+}
+double gGraph::screenToTime(int xpos)
+{
+    double w = m_rect.width() - left - right;
+    double xx = m_blockzoom ? rmax_x - rmin_x : max_x - min_x;
+    double xmult = xx / w;
+    double x = xpos - m_rect.left() - left;
+    double res = xmult * x;
+    res += m_blockzoom ? rmin_x : min_x;
+    return res;
+}
+
+void gGraph::mouseMoveEvent(QMouseEvent *event)
+{
+    // qDebug() << m_title << "Move" << event->pos() << m_graphview->pointClicked();
+    if (m_rect.width() == 0) return;
+    int y = event->y();
+    int x = event->x();
+
+    bool doredraw = false;
+
+    timedRedraw(0);
+
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        if (m_layers[i]->m_rect.contains(x, y))
+            if (m_layers[i]->mouseMoveEvent(event, this)) {
+                return;
+//                doredraw = true;
+            }
+    }
+
+    y -= m_rect.top();
+    x -= m_rect.left();
+
+    int x2 = m_graphview->pointClicked().x() - m_rect.left();
+
+    int w = m_rect.width() - left - right;
+
+
+    double xx = max_x - min_x;
+    double xmult = xx / double(w);
+
+    {
+        xmult = (m_blockzoom ? double(rmax_x - rmin_x) : double(max_x - min_x)) / double(w);
+
+        double  a = x;
+
+        if (a < left) a = left;
+        if (a > left+w) a = left+w;
+
+        a -= left;
+        a *= xmult;
+        a += m_blockzoom ? rmin_x : min_x;
+
+        m_currentTime = a;
+        m_graphview->setCurrentTime(a);
+    }
+
+    if (m_graphview->m_selected_graph == this) {  // Left Mouse button dragging
+        if (event->buttons() & Qt::LeftButton) {
+
+            //qDebug() << m_title << "Moved" << x << y << left << right << top << bottom << m_width << h;
+            int a1 = MIN(x, x2);
+            int a2 = MAX(x, x2);
+
+            if (a1 < left) { a1 = left; }
+
+            if (a2 > left + w) { a2 = left + w; }
+
+            m_selecting_area = true;
+            m_selection = QRect(a1 - 1, 0, a2 - a1, m_rect.height());
+            double w2 = m_rect.width() - right - left;
+
+            if (m_blockzoom) {
+                xmult = (rmax_x - rmin_x) / w2;
+            } else {
+                xmult = (max_x - min_x) / w2;
+            }
+
+            qint64 a = double(a2 - a1) * xmult;
+            m_selectedDuration = a;
+            float d = double(a) / 86400000.0;
+            int h = a / 3600000;
+            int m = (a / 60000) % 60;
+            int s = (a / 1000) % 60;
+            int ms(a % 1000);
+
+            if (d > 1) {
+                m_selDurString.sprintf("%1.0f days", d);
+            } else {
+
+                m_selDurString.sprintf("%02i:%02i:%02i:%03i", h, m, s, ms);
+            }
+
+            ToolTipAlignment align = x >= x2 ? TT_AlignLeft : TT_AlignRight;
+            int offset = (x >= x2) ? 20 : - 20;
+            ToolTip(m_selDurString, m_rect.left() + x + offset, m_rect.top() + y + 20, align);
+
+            doredraw = true;
+        } else if (event->buttons() & Qt::RightButton) {    // Right Mouse button dragging
+            m_graphview->setPointClicked(event->pos());
+            x -= left;
+            x2 -= left;
+
+            if (!m_blockzoom) {
+                xx = max_x - min_x;
+                xmult = xx / double(w);
+                qint64 j1 = xmult * x;
+                qint64 j2 = xmult * x2;
+                qint64 jj = j2 - j1;
+                min_x += jj;
+                max_x += jj;
+
+                if (min_x < rmin_x) {
+                    min_x = rmin_x;
+                    max_x = rmin_x + xx;
+                }
+
+                if (max_x > rmax_x) {
+                    max_x = rmax_x;
+                    min_x = rmax_x - xx;
+                }
+
+                m_graphview->SetXBounds(min_x, max_x, m_group, false);
+                doredraw = true;
+            } else {
+                qint64 qq = rmax_x - rmin_x;
+                xx = max_x - min_x;
+
+                if (xx == qq) { xx = 1800000; }
+
+                xmult = qq / double(w);
+                qint64 j1 = (xmult * x);
+                min_x = rmin_x + j1 - (xx / 2);
+                max_x = min_x + xx;
+
+                if (min_x < rmin_x) {
+                    min_x = rmin_x;
+                    max_x = rmin_x + xx;
+                }
+
+                if (max_x > rmax_x) {
+                    max_x = rmax_x;
+                    min_x = rmax_x - xx;
+                }
+
+                m_graphview->SetXBounds(min_x, max_x, m_group, false);
+                doredraw = true;
+            }
+        }
+    }
+
+    //if (!nolayer) { // no mouse button
+//    if (doredraw) {
+//        m_graphview->timedRedraw(0);
+//    }
+
+    //}
+    //if (x>left+m_marginleft && x<m_lastbounds.width()-(right+m_marginright) && y>top+m_margintop && y<m_lastbounds.height()-(bottom+m_marginbottom)) { // main area
+    //        x-=left+m_marginleft;
+    //        y-=top+m_margintop;
+    //        //qDebug() << m_title << "Moved" << x << y << left << right << top << bottom << m_width << m_height;
+    //    }
+}
+
+bool gGraph::selectingArea() { return m_selecting_area || m_graphview->metaSelect(); }
+
+void gGraph::mousePressEvent(QMouseEvent *event)
+{
+    int y = event->pos().y();
+    int x = event->pos().x();
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        if (m_layers[i]->m_rect.contains(x, y))
+            if (m_layers[i]->mousePressEvent(event, this)) {
+                return;
+            }
+    }
+
+    /*
+    int w=m_lastbounds.width()-(right+m_marginright);
+    //int h=m_lastbounds.height()-(bottom+m_marginbottom);
+    //int x2,y2;
+    double xx=max_x-min_x;
+    //double xmult=xx/w;
+    if (x>left+m_marginleft && x<m_lastbounds.width()-(right+m_marginright) && y>top+m_margintop && y<m_lastbounds.height()-(bottom+m_marginbottom)) { // main area
+        x-=left+m_marginleft;
+        y-=top+m_margintop;
+    }*/
+    //qDebug() << m_title << "Clicked" << x << y << left << right << top << bottom << m_width << m_height;
+}
+
+void gGraph::mouseReleaseEvent(QMouseEvent *event)
+{
+
+    int y = event->pos().y();
+    int x = event->pos().x();
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        if (m_layers[i]->m_rect.contains(x, y))
+            if (m_layers[i]->mouseReleaseEvent(event, this)) {
+                return;
+            }
+    }
+
+    x -= m_rect.left();
+    y -= m_rect.top();
+
+
+    int w = m_rect.width() - left - right; //(m_marginleft+left+right+m_marginright);
+    int h = m_rect.height() - bottom; //+m_marginbottom);
+
+    int x2 = m_graphview->pointClicked().x() - m_rect.left();
+    int y2 = m_graphview->pointClicked().y() - m_rect.top();
+
+
+    m_selDurString = QString();
+
+    //qDebug() << m_title << "Released" << min_x << max_x << x << y << x2 << y2 << left << right << top << bottom << m_width << m_height;
+    if (m_selecting_area) {
+        m_selecting_area = false;
+        m_selection.setWidth(0);
+
+        if (m_graphview->horizTravel() > mouse_movement_threshold) {
+            x -= left; //+m_marginleft;
+            y -= top; //+m_margintop;
+            x2 -= left; //+m_marginleft;
+            y2 -= top; //+m_margintop;
+
+            if (x < 0) { x = 0; }
+
+            if (x2 < 0) { x2 = 0; }
+
+            if (x > w) { x = w; }
+
+            if (x2 > w) { x2 = w; }
+
+            double xx;
+            double xmult;
+
+            if (!m_blockzoom) {
+                xx = max_x - min_x;
+                xmult = xx / double(w);
+                qint64 j1 = min_x + xmult * x;
+                qint64 j2 = min_x + xmult * x2;
+                qint64 a1 = MIN(j1, j2)
+                            qint64 a2 = MAX(j1, j2)
+
+                                        //if (a1<rmin_x) a1=rmin_x;
+                if (a2 > rmax_x) { a2 = rmax_x; }
+
+                if (a1 <= rmin_x && a2 <= rmin_x) {
+                    //qDebug() << "Foo??";
+                } else {
+                    if (a2 - a1 < zoom_hard_limit) { a2 = a1 + zoom_hard_limit; }
+
+                    m_graphview->SetXBounds(a1, a2, m_group);
+                }
+            } else {
+                xx = rmax_x - rmin_x;
+                xmult = xx / double(w);
+                qint64 j1 = rmin_x + xmult * x;
+                qint64 j2 = rmin_x + xmult * x2;
+                qint64 a1 = MIN(j1, j2)
+                qint64 a2 = MAX(j1, j2)
+
+                //if (a1<rmin_x) a1=rmin_x;
+                if (a2 > rmax_x) { a2 = rmax_x; }
+
+                if (a1 <= rmin_x && a2 <= rmin_x) {
+                    qDebug() << "Foo2??";
+                } else  {
+                    if (a2 - a1 < zoom_hard_limit) { a2 = a1 + zoom_hard_limit; }
+                    m_graphview->SetXBounds(a1, a2, m_group);
+                }
+            }
+
+            return;
+        } else { m_graphview->redraw(); }
+    }
+
+    if ((m_graphview->horizTravel() < mouse_movement_threshold) && (x > left && x < w + left
+            && y > top && y < h)) {
+        // normal click in main area
+        if (!m_blockzoom) {
+            double zoom;
+
+            if (event->button() & Qt::RightButton) {
+                zoom = 1.33;
+
+                if (event->modifiers() & Qt::ControlModifier) { zoom *= 1.5; }
+
+                ZoomX(zoom, x); // Zoom out
+                return;
+            } else if (event->button() & Qt::LeftButton) {
+                zoom = 0.75;
+
+                if (event->modifiers() & Qt::ControlModifier) { zoom /= 1.5; }
+
+                ZoomX(zoom, x); // zoom in.
+                return;
+            }
+        } else {
+            x -= left;
+            y -= top;
+            //w-=m_marginleft+left;
+            double qq = rmax_x - rmin_x;
+            double xmult;
+
+            double xx = max_x - min_x;
+            //if (xx==qq) xx=1800000;
+
+            xmult = qq / double(w);
+
+            if ((xx == qq) || (x == m_lastx23)) {
+                double zoom = 1;
+
+                if (event->button() & Qt::RightButton) {
+                    zoom = 1.33;
+
+                    if (event->modifiers() & Qt::ControlModifier) { zoom *= 1.5; }
+                } else if (event->button() & Qt::LeftButton) {
+                    zoom = 0.75;
+
+                    if (event->modifiers() & Qt::ControlModifier) { zoom /= 1.5; }
+                }
+
+                xx *= zoom;
+
+                if (xx < qq / zoom_hard_limit) { xx = qq / zoom_hard_limit; }
+
+                if (xx > qq) { xx = qq; }
+            }
+
+            double j1 = xmult * x;
+            min_x = rmin_x + j1 - (xx / 2.0);
+            max_x = min_x + xx;
+
+            if (min_x < rmin_x) {
+                min_x = rmin_x;
+                max_x = rmin_x + xx;
+            } else if (max_x > rmax_x) {
+                max_x = rmax_x;
+                min_x = rmax_x - xx;
+            }
+
+            m_graphview->SetXBounds(min_x, max_x, m_group);
+            m_lastx23 = x;
+        }
+    }
+
+    //m_graphview->redraw();
+}
+
+
+void gGraph::wheelEvent(QWheelEvent *event)
+{
+    //qDebug() << m_title << "Wheel" << event->x() << event->y() << event->delta();
+    //int y=event->pos().y();
+    if (event->orientation() == Qt::Horizontal) {
+
+        return;
+    }
+
+    int x = event->pos().x() - m_graphview->titleWidth; //(left+m_marginleft);
+
+    if (event->delta() > 0) {
+        ZoomX(0.75, x);
+    } else {
+        ZoomX(1.5, x);
+    }
+
+    int y = event->pos().y();
+    x = event->pos().x();
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        if (m_layers[i]->m_rect.contains(x, y)) {
+            m_layers[i]->wheelEvent(event, this);
+        }
+    }
+
+}
+void gGraph::mouseDoubleClickEvent(QMouseEvent *event)
+{
+    //mousePressEvent(event);
+    //mouseReleaseEvent(event);
+    int y = event->pos().y();
+    int x = event->pos().x();
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        if (m_layers[i]->m_rect.contains(x, y)) {
+            m_layers[i]->mouseDoubleClickEvent(event, this);
+        }
+    }
+
+    //int w=m_lastbounds.width()-(m_marginleft+left+right+m_marginright);
+    //int h=m_lastbounds.height()-(bottom+m_marginbottom);
+    //int x2=m_graphview->pointClicked().x(),y2=m_graphview->pointClicked().y();
+    //    if ((m_graphview->horizTravel()<mouse_movement_threshold) && (x>left+m_marginleft && x<w+m_marginleft+left && y>top+m_margintop && y<h)) { // normal click in main area
+    //        if (event->button() & Qt::RightButton) {
+    //            ZoomX(1.66,x);  // Zoon out
+    //            return;
+    //        } else if (event->button() & Qt::LeftButton) {
+    //            ZoomX(0.75/2.0,x); // zoom in.
+    //            return;
+    //        }
+    //    } else {
+    // Propagate the events to graph Layers
+    //    }
+    //mousePressEvent(event);
+    //mouseReleaseEvent(event);
+    //qDebug() << m_title << "Double Clicked" << event->x() << event->y();
+}
+void gGraph::keyPressEvent(QKeyEvent *event)
+{
+    for (QVector<Layer *>::iterator i = m_layers.begin(); i != m_layers.end(); i++) {
+        (*i)->keyPressEvent(event, this);
+    }
+
+    //qDebug() << m_title << "Key Pressed.. implement me" << event->key();
+}
+
+void gGraph::keyReleaseEvent(QKeyEvent *event)
+{
+    if (!m_graphview) return;
+
+    if (m_graphview->selectionInProgress() && m_graphview->metaSelect()) {
+        if (!(event->modifiers() & Qt::AltModifier)) {
+
+        }
+    }
+}
+
+
+void gGraph::ZoomX(double mult, int origin_px)
+{
+
+    int width = m_rect.width() - left - right; //(m_marginleft+left+right+m_marginright);
+
+    if (origin_px == 0) { origin_px = (width / 2); }
+    else { origin_px -= left; }
+
+    if (origin_px < 0) { origin_px = 0; }
+
+    if (origin_px > width) { origin_px = width; }
+
+
+    // Okay, I want it to zoom in centered on the mouse click area..
+    // Find X graph position of mouse click
+    // find current zoom width
+    // apply zoom
+    // center on point found in step 1.
+
+    qint64 min = min_x;
+    qint64 max = max_x;
+
+    double hardspan = rmax_x - rmin_x;
+    double span = max - min;
+    double ww = double(origin_px) / double(width);
+    double origin = ww * span;
+    //double center=0.5*span;
+    //double dist=(origin-center);
+
+    double q = span * mult;
+
+    if (q > hardspan) { q = hardspan; }
+
+    if (q < hardspan / zoom_hard_limit) { q = hardspan / zoom_hard_limit; }
+
+    min = min + origin - (q * ww);
+    max = min + q;
+
+    if (min < rmin_x) {
+        min = rmin_x;
+        max = min + q;
+    }
+
+    if (max > rmax_x) {
+        max = rmax_x;
+        min = max - q;
+    }
+
+    extern const int max_history;
+
+    m_graphview->SetXBounds(min, max, m_group);
+    //updateSelectionTime(max-min);
+}
+
+void gGraph::DrawTextQue(QPainter &painter)
+{
+    m_graphview->DrawTextQue(painter);
+}
+
+// margin recalcs..
+void gGraph::resize(int width, int height)
+{
+    invalidate_xAxisImage = true;
+    invalidate_yAxisImage = true;
+
+    Q_UNUSED(width);
+    Q_UNUSED(height);
+    //m_height=height;
+    //m_width=width;
+}
+
+qint64 gGraph::MinX()
+{
+    qint64 val = 0, tmp;
+
+    for (QVector<Layer *>::iterator l = m_layers.begin(); l != m_layers.end(); l++) {
+        if ((*l)->isEmpty()) {
+            continue;
+        }
+
+        tmp = (*l)->Minx();
+
+        if (!tmp) {
+            continue;
+        }
+
+        if (!val || tmp < val) {
+            val = tmp;
+        }
+    }
+
+    if (val) { rmin_x = val; }
+
+    return val;
+}
+qint64 gGraph::MaxX()
+{
+    //bool first=true;
+    qint64 val = 0, tmp;
+
+    for (QVector<Layer *>::iterator l = m_layers.begin(); l != m_layers.end(); l++) {
+        if ((*l)->isEmpty()) {
+            continue;
+        }
+
+        tmp = (*l)->Maxx();
+
+        //if (!tmp) continue;
+        if (!val || tmp > val) {
+            val = tmp;
+        }
+    }
+
+    if (val) { rmax_x = val; }
+
+    return val;
+}
+
+EventDataType gGraph::MinY()
+{
+    bool first = true;
+    EventDataType val = 0, tmp;
+
+    if (m_enforceMinY) {
+        return rmin_y = f_miny;
+    }
+
+    for (QVector<Layer *>::iterator l = m_layers.begin(); l != m_layers.end(); l++) {
+        if ((*l)->isEmpty() || ((*l)->layerType() == LT_Other)) {
+            continue;
+        }
+
+        tmp = (*l)->Miny();
+
+//        if (tmp == 0 && tmp == (*l)->Maxy()) {
+//            continue;
+//        }
+
+        if (first) {
+            val = tmp;
+            first = false;
+        } else {
+            if (tmp < val) {
+                val = tmp;
+            }
+        }
+    }
+
+    return rmin_y = val;
+}
+EventDataType gGraph::MaxY()
+{
+    bool first = true;
+    EventDataType val = 0, tmp;
+
+    if (m_enforceMaxY) {
+        return rmax_y = f_maxy;
+    }
+
+    QVector<Layer *>::const_iterator iterEnd = m_layers.constEnd();
+    for (QVector<Layer *>::const_iterator iter = m_layers.constBegin(); iter != iterEnd; ++iter) {
+        Layer *layer = *iter;
+        if (layer->isEmpty() || (layer->layerType() == LT_Other)) {
+            continue;
+        }
+
+        tmp = layer->Maxy();
+//        if (tmp == 0 && layer->Miny() == 0) {
+//            continue;
+//        }
+
+        if (first) {
+            val = tmp;
+            first = false;
+        } else {
+            if (tmp > val) {
+                val = tmp;
+            }
+        }
+    }
+
+    return rmax_y = val;
+}
+
+EventDataType gGraph::physMinY()
+{
+    bool first = true;
+    EventDataType val = 0, tmp;
+
+    //if (m_enforceMinY) return rmin_y=f_miny;
+
+    QVector<Layer *>::const_iterator iterEnd = m_layers.constEnd();
+    for (QVector<Layer *>::const_iterator iter = m_layers.constBegin(); iter != iterEnd; ++iter) {
+        Layer *layer = *iter;
+        if (layer->isEmpty()) {
+            continue;
+        }
+
+        tmp = layer->physMiny();
+        if (tmp == 0 && layer->physMaxy() == 0) {
+            continue;
+        }
+
+        if (first) {
+            val = tmp;
+            first = false;
+        } else {
+            if (tmp < val) {
+                val = tmp;
+            }
+        }
+    }
+
+    return rphysmin_y = val;
+}
+EventDataType gGraph::physMaxY()
+{
+    bool first = true;
+    EventDataType val = 0, tmp;
+
+    // if (m_enforceMaxY) return rmax_y=f_maxy;
+
+    QVector<Layer *>::const_iterator iterEnd = m_layers.constEnd();
+    for (QVector<Layer *>::const_iterator iter = m_layers.constBegin(); iter != iterEnd; ++iter) {
+        Layer *layer = *iter;
+        if (layer->isEmpty()) {
+            continue;
+        }
+
+        tmp = layer->physMaxy();
+        if (tmp == 0 && layer->physMiny() == 0) {
+            continue;
+        }
+
+        if (first) {
+            val = tmp;
+            first = false;
+        } else {
+            if (tmp > val) {
+                val = tmp;
+            }
+        }
+    }
+
+    return rphysmax_y = val;
+}
+
+void gGraph::SetMinX(qint64 v)
+{
+    rmin_x = min_x = v;
+}
+
+void gGraph::SetMaxX(qint64 v)
+{
+    rmax_x = max_x = v;
+}
+
+void gGraph::SetMinY(EventDataType v)
+{
+    rmin_y = min_y = v;
+}
+
+void gGraph::SetMaxY(EventDataType v)
+{
+    rmax_y = max_y = v;
+}
+
+Layer *gGraph::getLineChart()
+{
+    gLineChart *lc;
+
+    for (int i = 0; i < m_layers.size(); i++) {
+        lc = dynamic_cast<gLineChart *>(m_layers[i]);
+
+        if (lc) { return lc; }
+    }
+
+    return nullptr;
+}
+int gGraph::minHeight()
+{
+    int minheight = m_min_height;
+
+    int top = 0;
+    int center = 0;
+    int bottom = 0;
+    for (int i=0; i<m_layers.size(); ++i) {
+        int mh = m_layers[i]->minimumHeight();
+        mh += m_margintop + m_marginbottom;
+        if (mh > minheight) minheight = mh;
+    }
+    // layers need to set their own too..
+    return minheight;
+}
+
+void GetTextExtent(QString text, int &width, int &height, QFont *font)
+{
+#ifdef ENABLE_THREADED_DRAWING
+    static QMutex mut;
+    mut.lock();
+#endif
+    QFontMetrics fm(*font);
+    //#ifdef Q_OS_WIN32
+    QRect r = fm.boundingRect(text);
+    width = r.width();
+    height = r.height();
+    //#else
+    //    width=fm.width(text);
+    //    height=fm.xHeight()+2; // doesn't work properly on windows..
+    //#endif
+#ifdef ENABLE_THREADED_DRAWING
+    mut.unlock();
+#endif
+}
+
+int GetXHeight(QFont *font)
+{
+    QFontMetrics fm(*font);
+    return fm.xHeight();
+}
+
+void gGraph::dumpInfo() {
+    for (int i = 0; i < m_layers.size(); i++) {
+        Layer *ll = m_layers[i];
+
+        if (!ll->visible()) { continue; }
+
+        if (ll->position() == LayerCenter) {
+            gLineChart *lc = dynamic_cast<gLineChart *>(ll);
+            if (lc != nullptr) {
+                QString text = lc->getMetaString(currentTime());
+                if (!text.isEmpty()) {
+                    mainwin->log(text);
+                }
+            }
+        }
+    }
+}
+
+
diff --git a/sleepyhead/Graphs/gGraph.h b/sleepyhead/Graphs/gGraph.h
new file mode 100644
index 0000000..3bf46e0
--- /dev/null
+++ b/sleepyhead/Graphs/gGraph.h
@@ -0,0 +1,410 @@
+/* gGraph Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef graphs_ggraph_h
+#define graphs_ggraph_h
+
+//#define DEBUG_LAYOUT
+
+#include <QFont>
+#include <QObject>
+#include <QPixmap>
+#include <QResizeEvent>
+#include <QString>
+#include <QPainter>
+
+#include "Graphs/glcommon.h"
+#include "Graphs/layer.h"
+
+class gGraphView;
+
+// Graph globals.
+extern QFont *defaultfont;
+extern QFont *mediumfont;
+extern QFont *bigfont;
+extern QHash<QString, QImage *> images;
+
+bool InitGraphGlobals();
+void DestroyGraphGlobals();
+
+const int mouse_movement_threshold = 6;
+
+/*! \class gGraph
+    \brief Single Graph object, containing multiple layers and Layer layout code
+    */
+class gGraph : public QObject
+{
+    Q_OBJECT
+  public:
+    friend class gGraphView;
+
+    /*! \brief Creates a new graph object
+        \param gGraphView * graphview if not null, links the graph to that object
+        \param QString title containing the graph Title which is rendered vertically
+        \param int height containing the opening height for this graph
+        \param short group containing which graph-link group this graph belongs to
+        */
+    gGraph(QString name, gGraphView *graphview = nullptr, QString title = "", QString units = "",
+           int height = 0, short group = 0);
+    virtual ~gGraph();
+
+    //! \brief Tells all Layers to deselect any highlighting
+    void deselect();
+
+    //! \brief Returns true if any Layers have anything highlighted
+    bool isSelected();
+
+    //! \brief Starts the singleshot Timer running, for ms milliseconds
+    void Trigger(int ms);
+
+    /*! \fn QPixmap renderPixmap(int width, int height, float fontscale=1.0);
+        \brief Returns a QPixmap containing a snapshot of the graph rendered at size widthxheight
+        \param int width    Width of graph 'screenshot'
+        \param int height   Height of graph 'screenshot'
+        \param float fontscale Scaling value to adjust DPI (when used for HighRes printing)
+
+        Note if width or height is more than the OpenGL system allows, it could result in a crash
+        Keeping them under 2048 is a reasonably safe value.
+        */
+    QPixmap renderPixmap(int width, int height, bool printing = false);
+
+    //! \brief Set Graph visibility status
+    void setVisible(bool b) { m_visible = b; }
+
+    //! \brief Return Graph visibility status
+    bool visible() { return m_visible; }
+
+    //! \brief Returns true if Graph is currently being snapshotted for printing
+    bool printing() { return m_printing; }
+
+    //! \brief Return height element. This is used by the scaler in gGraphView.
+    inline const float & height() { return m_height; }
+
+    //! \brief Set the height element. (relative to the total of all heights)
+    void setHeight(float height) {
+        m_height = height;
+        invalidate_yAxisImage = true;
+    }
+
+    //! \brief Return minimum height this graph is allowed to (considering layer preferences too)
+    int minHeight();
+    void setMinHeight(int height) { m_min_height = height; }
+
+    int maxHeight() { return m_max_height; }
+    void setMaxHeight(int height) { m_max_height = height; }
+
+    //! \brief Returns true if the vertical graph title is shown
+    bool showTitle() { return m_showTitle; }
+
+    //! \brief Set whether or not to render the vertical graph title
+    void setShowTitle(bool b) { m_showTitle = b; }
+
+    //! \brief Returns printScaleX, used for DPI scaling in report printing
+    float printScaleX();
+
+    //! \brief Returns printScaleY, used for DPI scaling in report printing
+    float printScaleY();
+
+    //! \brief Returns true if none of the included layers have data attached
+    bool isEmpty();
+
+    //! \brief Returns true if the user is currently dragging the mouse to select an area
+    bool selectingArea();
+
+    double currentTime() const;
+    void setCurrentTime(double value) { m_currentTime = value; }
+
+
+
+    //! \brief Add Layer l to graph object, allowing you to specify position,
+    //         margin sizes, order, movability status and offsets
+    void AddLayer(Layer *l, LayerPosition position = LayerCenter,
+                  short pixelsX = 0, short pixelsY = 0, short order = 0,
+                  bool movable = false, short x = 0, short y = 0);
+
+    //! \brief Queues text for gGraphView object to draw it.
+    void renderText(QString text, int x, int y, float angle = 0.0, QColor color = Qt::black, QFont *font = defaultfont, bool antialias = true);
+
+    //! \brief Queues text for gGraphView object to draw it, using given rect.
+    void renderText(QString text, QRectF rect, quint32 flags = Qt::AlignCenter, float angle = 0.0, QColor color = Qt::black, QFont *font = defaultfont, bool antialias = true);
+
+    //! \brief Rounds Y scale values to make them look nice..
+    //         Applies the Graph Preference min/max settings.
+    void roundY(EventDataType &miny, EventDataType &maxy);
+
+//    //! \brief Process all Layers GLBuffer (Vertex) objects, drawing the actual OpenGL stuff.
+//    void drawGLBuf();
+
+    //! \brief Returns the Graph's (vertical) title
+    inline QString & title() { return m_title; }
+
+    //! \brief Returns the Graph's internal name
+    inline QString & name() { return m_name; }
+
+
+    //! \brief Sets the Graph's (vertical) title
+    void setTitle(const QString title) { m_title = title; }
+
+    //! \brief Returns the measurement Units the Y scale is referring to
+    QString units() { return m_units; }
+
+    //! \brief Sets the measurement Units the Y scale is referring to
+    void setUnits(const QString units) { m_units = units; }
+
+    //virtual void repaint(); // Repaint individual graph..
+
+    //! \brief Resets the graphs X & Y dimensions based on the Layer data
+    virtual void ResetBounds();
+
+    //! \brief Sets the time range selected for this graph (in milliseconds since 1970 epoch)
+    virtual void SetXBounds(qint64 minx, qint64 maxx);
+
+    //! \brief Returns the physical Minimum time for all layers contained (in milliseconds since epoch)
+    virtual qint64 MinX();
+
+    //! \brief Returns the physical Maximum time for all layers contained (in milliseconds since epoch)
+    virtual qint64 MaxX();
+
+    //! \brief Returns the physical Minimum Y scale value for all layers contained
+    virtual EventDataType MinY();
+
+    //! \brief Returns the physical Maximum Y scale value for all layers contained
+    virtual EventDataType MaxY();
+
+    //! \brief Returns the physical Minimum Y scale value for all layers contained
+    virtual EventDataType physMinY();
+
+    //! \brief Returns the physical Maximum Y scale value for all layers contained
+    virtual EventDataType physMaxY();
+
+    //! \brief Sets the physical start of this graphs time range (in milliseconds since epoch)
+    virtual void SetMinX(qint64 v);
+
+    //! \brief Sets the physical end of this graphs time range (in milliseconds since epoch)
+    virtual void SetMaxX(qint64 v);
+
+    //! \brief Sets the physical Minimum Y scale value used while drawing this graph
+    virtual void SetMinY(EventDataType v);
+
+    //! \brief Sets the physical Maximum Y scale value used while drawing this graph
+    virtual void SetMaxY(EventDataType v);
+
+    //! \brief Forces Y Minimum to always select this value
+    virtual void setForceMinY(EventDataType v) { f_miny = v; m_enforceMinY = true; }
+    //! \brief Forces Y Maximum to always select this value
+    virtual void setForceMaxY(EventDataType v) { f_maxy = v; m_enforceMaxY = true; }
+
+
+    virtual EventDataType forceMinY() { return rec_miny; }
+    virtual EventDataType forceMaxY() { return rec_maxy; }
+
+    //! \brief Set recommended Y minimum.. It won't go under this unless the data does.
+    //         It won't go above this.
+    virtual void setRecMinY(EventDataType v) { rec_miny = v; }
+    //! \brief Set recommended Y minimum.. It won't go above this unless the data does.
+    //         It won't go under this.
+    virtual void setRecMaxY(EventDataType v) { rec_maxy = v; }
+
+    //! \brief Returns the recommended Y minimum.. It won't go under this unless the data does.
+    //         It won't go above this.
+    virtual EventDataType RecMinY() { return rec_miny; }
+    //! \brief Returns the recommended Y maximum.. It won't go under this unless the data does.
+    //         It won't go above this.
+    virtual EventDataType RecMaxY() { return rec_maxy; }
+
+    //! \brief Called when main graph area is resized
+    void resize(int width, int height);      // margin recalcs..
+
+    qint64 max_x, min_x, rmax_x, rmin_x;
+    EventDataType max_y, min_y, rmax_y, rmin_y, f_miny, f_maxy, rec_miny, rec_maxy;
+    EventDataType rphysmin_y, rphysmax_y;
+
+    // not sure why there's two.. I can't remember
+    void setEnforceMinY(bool b) { m_enforceMinY = b; }
+    void setEnforceMaxY(bool b) { m_enforceMaxY = b; }
+
+    //! \brief Returns whether this graph shows overall timescale, or a zoomed area
+    bool blockZoom() { return m_blockzoom; }
+    //! \brief Sets whether this graph shows an overall timescale, or a zoomed area.
+    void setBlockZoom(bool b) { m_blockzoom = b; }
+
+    //! \brief Flips the GL coordinates from the graphs perspective.. Used in Scissor calculations
+    int flipY(int y); // flip GL coordinates
+
+    //! \brief Returns the graph-linking group this Graph belongs in
+    short group() { return m_group; }
+
+    //! \brief Sets the graph-linking group this Graph belongs in
+    void setGroup(short group) { m_group = group; }
+
+    //! \brief Forces the main gGraphView object to draw all Text Components
+    void DrawTextQue(QPainter &painter);
+
+    //! \brief Sends supplied day object to all Graph layers so they can precalculate stuff
+    void setDay(Day *day);
+
+    //! \brief Returns the current day object
+    Day *day() { return m_day; }
+
+    //! \brief The Layer, layout and title drawing code
+    virtual void paint(QPainter &painter, const QRegion &region);
+
+    //! \brief Gives the supplied data to the main ToolTip object for display
+    void ToolTip(QString text, int x, int y, ToolTipAlignment align = TT_AlignCenter, int timeout = 0);
+
+    //! \brief Public version of updateGL(), to redraw all graphs.. Not for normal use
+    void redraw();
+
+    //! \brief Asks the main gGraphView to redraw after ms milliseconds
+    void timedRedraw(int ms);
+
+    double screenToTime(int xpos);
+
+    void dataChanged();
+
+    //! \brief Sets the margins for the four sides of this graph.
+    void setMargins(short left, short right, short top, short bottom) {
+        m_marginleft = left;
+        m_marginright = right;
+        m_margintop = top;
+        m_marginbottom = bottom;
+    }
+
+    //! \brief Returns this graphs left margin
+    inline short marginLeft() { return m_marginleft; }
+    //! \brief Returns this graphs right margin
+    inline short marginRight() { return m_marginright; }
+    //! \brief Returns this graphs top margin
+    inline short marginTop() { return m_margintop; }
+    //! \brief Returns this graphs bottom margin
+    inline short marginBottom() { return m_marginbottom; }
+
+    const inline QRect &rect() const { return m_rect; }
+
+    bool isPinned() { return m_pinned; }
+    void setPinned(bool b) { m_pinned = b; }
+
+    bool isSnapshot() { return m_snapshot; }
+    void setSnapshot(bool b) { m_snapshot = b; }
+
+    short left, right, top, bottom; // dirty magin hacks..
+
+    Layer *getLineChart();
+    QTimer *timer;
+
+    // This gets set to true to force a redraw of the yAxis tickers when graphs are resized.
+    bool invalidate_yAxisImage;
+    bool invalidate_xAxisImage;
+
+    //! \brief Returns a Vector reference containing all this graphs layers
+    QVector<Layer *> &layers() { return m_layers; }
+
+    gGraphView *graphView() { return m_graphview; }
+    short m_marginleft, m_marginright, m_margintop, m_marginbottom;
+
+    inline short zoomY() { return m_zoomY; }
+    void setZoomY(short zoom);
+
+    static const short maxZoomY = 2;
+
+    inline qint64 selectedDuration() const { return m_selectedDuration; }
+    inline QString selDurString() const { return m_selDurString; }
+
+    inline bool blockSelect() const { return m_block_select; }
+    void setBlockSelect(bool b) { m_block_select = b; }
+
+    inline bool printing() const { return m_printing; }
+
+  protected:
+    //! \brief Mouse Wheel events
+    virtual void wheelEvent(QWheelEvent *event);
+
+    //! \brief Mouse Movement events
+    virtual void mouseMoveEvent(QMouseEvent *event);
+
+    //! \brief Mouse Button Pressed events
+    virtual void mousePressEvent(QMouseEvent *event);
+
+    //! \brief Mouse Button Released events
+    virtual void mouseReleaseEvent(QMouseEvent *event);
+
+    //! \brief Mouse Button Double Clicked events
+    virtual void mouseDoubleClickEvent(QMouseEvent *event);
+
+    //! \brief Key Pressed event
+    virtual void keyPressEvent(QKeyEvent *event);
+
+    //! \brief Key Pressed event
+    virtual void keyReleaseEvent(QKeyEvent *event);
+
+    void cancelSelection() {
+        m_selecting_area = false;
+        m_selection = QRect(0,0,0,0);
+    }
+
+    void dumpInfo();
+
+    //! \brief Change the current selected time boundaries by mult, from origin position origin_px
+    void ZoomX(double mult, int origin_px);
+
+    //! \brief The Main gGraphView object holding this graph
+    //         (this can be pinched temporarily by print code)
+    QString m_name;
+
+    gGraphView *m_graphview;
+    QString m_title;
+    QString m_units;
+
+    //! \brief Vector containing all this graphs Layers
+    QVector<Layer *> m_layers;
+    float m_height, m_width;
+
+    int m_min_height;
+    int m_max_height;
+    bool m_visible;
+    bool m_blockzoom;
+    QRect m_selection;
+    bool m_selecting_area;
+    QPoint m_current;
+    short m_group;
+    short m_lastx23;
+    Day *m_day;
+    bool m_enforceMinY, m_enforceMaxY;
+    bool m_showTitle;
+    bool m_printing;
+    bool m_pinned;
+    short m_zoomY;
+    bool m_block_select;
+    QRect m_rect;
+
+    qint64 m_selectedDuration;
+
+    double m_currentTime;
+    qint64 m_clickTime;
+
+    QString m_selDurString;
+
+    bool m_snapshot;
+
+  protected slots:
+    //! \brief Deselects any highlights, and schedules a main gGraphView redraw
+    void Timeout();
+};
+
+/*! \brief Gets the width and height parameters for supplied text
+    \param QString text - The text string in question
+    \param int & width
+    \param int & height
+    \param QFont * font - The selected font used in the size calculations
+    */
+void GetTextExtent(QString text, int &width, int &height, QFont *font = defaultfont);
+
+//! \brief Return the height of the letter x for the selected font.
+int GetXHeight(QFont *font = defaultfont);
+
+#endif // graphs_ggraph_h
diff --git a/sleepyhead/Graphs/gGraphView.cpp b/sleepyhead/Graphs/gGraphView.cpp
new file mode 100644
index 0000000..db40325
--- /dev/null
+++ b/sleepyhead/Graphs/gGraphView.cpp
@@ -0,0 +1,3385 @@
+/* gGraphView Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "Graphs/gGraphView.h"
+
+#include <QDir>
+#include <QFontMetrics>
+#include <QLabel>
+#include <QPixmapCache>
+#include <QTimer>
+#include <QFontMetrics>
+#include <QWidgetAction>
+#include <QGridLayout>
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+# include <QWindow>
+#endif
+
+#ifdef DEBUG_EFFICIENCY
+// Only works in 4.8
+# include <QElapsedTimer>
+#endif
+
+#include <cmath>
+
+#include "mainwindow.h"
+#include "Graphs/glcommon.h"
+#include "Graphs/gLineChart.h"
+#include "Graphs/gSummaryChart.h"
+#include "Graphs/gSessionTimesChart.h"
+#include "Graphs/gYAxis.h"
+#include "Graphs/gFlagsLine.h"
+#include "SleepLib/profiles.h"
+
+extern MainWindow *mainwin;
+
+#include <QApplication>
+
+MyLabel::MyLabel(QWidget * parent)
+    : QWidget(parent) {
+    m_font = QApplication::font();
+    time.start();
+}
+MyLabel::~MyLabel()
+{
+}
+void MyLabel::setText(QString text) {
+    m_text = text;
+    update();
+}
+void MyLabel::setFont(QFont & font)
+{
+    m_font=font;
+}
+void MyLabel::doRedraw()
+{
+    update();
+}
+
+void MyLabel::setAlignment(Qt::Alignment alignment) {
+    m_alignment = alignment;
+    doRedraw();
+}
+
+
+void MyLabel::paintEvent(QPaintEvent * /*event*/)
+{
+    QPainter painter(this);
+    painter.setFont(m_font);
+    painter.drawText(rect(), m_alignment, m_text);
+}
+
+gToolTip::gToolTip(gGraphView *graphview)
+    : m_graphview(graphview)
+{
+
+    m_pos.setX(0);
+    m_pos.setY(0);
+    m_visible = false;
+    m_alignment = TT_AlignCenter;
+    m_spacer = 8; // pixels around text area
+    timer = new QTimer(graphview);
+    connect(timer, SIGNAL(timeout()), SLOT(timerDone()));
+}
+
+gToolTip::~gToolTip()
+{
+    disconnect(timer, 0, 0, 0);
+    delete timer;
+}
+//void gToolTip::calcSize(QString text,int &w, int &h)
+//{
+/*GetTextExtent(text,w,h);
+w+=m_spacer*2;
+h+=m_spacer*2; */
+//}
+
+void gToolTip::display(QString text, int x, int y, ToolTipAlignment align, int timeout)
+{
+    if (timeout <= 0) {
+        timeout = p_profile->general->tooltipTimeout();
+    }
+    m_alignment = align;
+
+    m_text = text;
+    m_visible = true;
+    // TODO: split multiline here
+    //calcSize(m_text,tw,th);
+
+    m_pos.setX(x);
+    m_pos.setY(y);
+
+    //tw+=m_spacer*2;
+    //th+=m_spacer*2;
+    //th*=2;
+    if (timer->isActive()) {
+        timer->stop();
+    }
+
+    timer->setSingleShot(true);
+    timer->start(timeout);
+    m_invalidate = true;
+}
+
+void gToolTip::cancel()
+{
+    m_visible = false;
+    timer->stop();
+}
+
+void gToolTip::paint(QPainter &painter)     //actually paints it.
+{
+    if (!m_visible) { return; }
+
+    int x = m_pos.x();
+    int y = m_pos.y();
+
+    QRect rect(x, y, 0, 0);
+
+    painter.setFont(*defaultfont);
+
+    rect = painter.boundingRect(rect, Qt::AlignCenter, m_text);
+
+    int w = rect.width() + m_spacer * 2;
+    int xx = rect.x() - m_spacer;
+
+    if (xx < 0) { xx = 0; }
+
+    rect.setLeft(xx);
+    rect.setTop(rect.y() - 15);
+    rect.setWidth(w);
+
+    int z = rect.x() + rect.width();
+
+    if (z > m_graphview->width() - 10) {
+        rect.setLeft(m_graphview->width() - 2 - rect.width());
+        rect.setRight(m_graphview->width() - 2);
+    }
+
+    int h = rect.height();
+
+    if (rect.y() < 0) {
+        rect.setY(0);
+        rect.setHeight(h);
+    }
+
+    if (m_alignment == TT_AlignRight) {
+        rect.moveTopRight(m_pos);
+        if ((x-w) < 0) {
+            rect.moveLeft(0);
+        }
+    } else if (m_alignment == TT_AlignLeft) {
+        rect.moveTopLeft(m_pos);
+    }
+
+
+    QBrush brush(QColor(255, 255, 128, 230));
+    brush.setStyle(Qt::SolidPattern);
+    painter.setBrush(brush);
+    painter.setPen(QColor(0, 0, 0, 255));
+
+    painter.drawRoundedRect(rect, 5, 5);
+    painter.setBrush(Qt::black);
+
+    painter.setFont(*defaultfont);
+
+    painter.drawText(rect, Qt::AlignCenter, m_text);
+}
+
+void gToolTip::timerDone()
+{
+    m_visible = false;
+    m_graphview->redraw();
+    m_graphview->resetMouse();
+}
+
+#ifdef ENABLE_THREADED_DRAWING
+
+gThread::gThread(gGraphView *g)
+{
+    graphview = g;
+    mutex.lock();
+}
+gThread::~gThread()
+{
+    if (isRunning()) {
+        m_running = false;
+        mutex.unlock();
+        wait();
+        terminate();
+    }
+}
+
+void gThread::run()
+{
+    m_running = true;
+    gGraph *g;
+
+    while (m_running) {
+        mutex.lock();
+
+        //mutex.unlock();
+        if (!m_running) { break; }
+
+        do {
+            g = graphview->popGraph();
+
+            if (g) {
+                g->paint(QRegion(g->m_lastbounds));
+                //int i=0;
+            } else {
+                //mutex.lock();
+                graphview->masterlock->release(1); // This thread gives up for now..
+
+            }
+        } while (g);
+    }
+}
+
+#endif // ENABLE_THREADED_DRAWING
+
+void gGraphView::queGraph(gGraph *g, int left, int top, int width, int height)
+{
+    g->m_rect = QRect(left, top, width, height);
+#ifdef ENABLED_THREADED_DRAWING
+    dl_mutex.lock();
+#endif
+    m_drawlist.push_back(g);
+#ifdef ENABLED_THREADED_DRAWING
+    dl_mutex.unlock();
+#endif
+}
+
+void gGraphView::trashGraphs(bool destroy)
+{
+    if (destroy) {
+        for (int i=0; i< m_graphs.size(); ++i) {
+            delete m_graphs[i];
+        }
+    }
+    // Don't actually want to delete them here.. we are just borrowing the graphs
+    m_graphs.clear();
+    m_graphsbyname.clear();
+}
+
+// Take the next graph to render from the drawing list
+gGraph *gGraphView::popGraph()
+{
+    gGraph *g;
+#ifdef ENABLED_THREADED_DRAWING
+    dl_mutex.lock();
+#endif
+
+    if (!m_drawlist.isEmpty()) {
+        g = m_drawlist.at(0);
+        m_drawlist.pop_front();
+    } else { g = nullptr; }
+
+#ifdef ENABLED_THREADED_DRAWING
+    dl_mutex.unlock();
+#endif
+    return g;
+}
+
+gGraphView::gGraphView(QWidget *parent, gGraphView *shared)
+#ifdef BROKEN_OPENGL_BUILD
+    : QWidget(parent),
+#else
+    : QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DirectRendering | QGL::HasOverlay | QGL::Rgba),parent,shared),
+#endif
+      m_offsetY(0), m_offsetX(0), m_scaleY(0.0), m_scrollbar(nullptr)
+{
+    m_shared = shared;
+    m_sizer_index = m_graph_index = 0;
+    m_metaselect = m_button_down = m_graph_dragging = m_sizer_dragging = false;
+    m_lastypos = m_lastxpos = 0;
+    m_horiz_travel = 0;
+    m_minx = m_maxx = 0;
+    m_day = nullptr;
+    m_selected_graph = nullptr;
+    m_scrollbar = nullptr;
+    m_point_released = m_point_clicked = QPoint(0,0);
+    m_showAuthorMessage = true;
+
+    horizScrollTime.start();
+    vertScrollTime.start();
+
+    this->setMouseTracking(true);
+    m_emptytext = STR_Empty_NoData;
+    InitGraphGlobals(); // FIXME: sstangl: handle error return.
+#ifdef ENABLE_THREADED_DRAWING
+    m_idealthreads = QThread::idealThreadCount();
+
+    if (m_idealthreads <= 0) { m_idealthreads = 1; }
+
+    masterlock = new QSemaphore(m_idealthreads);
+#endif
+    m_tooltip = new gToolTip(this);
+    /*for (int i=0;i<m_idealthreads;i++) {
+        gThread * gt=new gThread(this);
+        m_threads.push_back(gt);
+        //gt->start();
+    }*/
+
+    setFocusPolicy(Qt::StrongFocus);
+    m_showsplitter = true;
+    timer = new QTimer(this);
+    connect(timer, SIGNAL(timeout()), SLOT(refreshTimeout()));
+    print_scaleY = print_scaleX = 1.0;
+
+    redrawtimer = new QTimer(this);
+    connect(redrawtimer, SIGNAL(timeout()), SLOT(redraw()));
+
+    m_fadingOut = false;
+    m_fadingIn = false;
+    m_inAnimation = false;
+    m_limbo = false;
+    m_fadedir = false;
+    m_blockUpdates = false;
+    use_pixmap_cache = p_profile->appearance->usePixmapCaching();
+
+    pin_graph = nullptr;
+   // pixmapcache.setCacheLimit(10240*2);
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+    m_dpr = devicePixelRatio();
+    m_dpr = 1;
+#endif
+
+#ifndef BROKEN_OPENGL_BUILD
+    setAutoFillBackground(false);
+    setAutoBufferSwap(false);
+#endif
+
+    context_menu = new QMenu(this);
+    pin_action = context_menu->addAction(QString(), this, SLOT(togglePin()));
+    pin_icon = QPixmap(":/icons/pushpin.png");
+
+    snap_action = context_menu->addAction(QString(), this, SLOT(onSnapshotGraphToggle()));
+    context_menu->addSeparator();
+
+
+    zoom100_action = context_menu->addAction(tr("100% zoom level"), this, SLOT(resetZoom()));
+    zoom100_action->setToolTip(tr("Restore X-axis zoom too 100% to view entire days data."));
+
+    QAction * action = context_menu->addAction(tr("Reset Graph Layout"), this, SLOT(resetLayout()));
+    action->setToolTip(tr("Resets all graphs to a uniform height and default order."));
+
+    context_menu->addSeparator();
+    limits_menu = context_menu->addMenu(tr("Y-Axis"));
+    plots_menu = context_menu->addMenu(tr("Plots"));
+    connect(plots_menu, SIGNAL(triggered(QAction*)), this, SLOT(onPlotsClicked(QAction*)));
+
+//    overlay_menu = context_menu->addMenu("Overlays");
+
+    cpap_menu = context_menu->addMenu(tr("CPAP Overlays"));
+    connect(cpap_menu, SIGNAL(triggered(QAction*)), this, SLOT(onOverlaysClicked(QAction*)));
+
+    oximeter_menu = context_menu->addMenu(tr("Oximeter Overlays"));
+    connect(oximeter_menu, SIGNAL(triggered(QAction*)), this, SLOT(onOverlaysClicked(QAction*)));
+
+    lines_menu = context_menu->addMenu(tr("Dotted Lines"));
+    connect(lines_menu, SIGNAL(triggered(QAction*)), this, SLOT(onLinesClicked(QAction*)));
+
+
+#if !defined(Q_OS_MAC)
+    context_menu->setStyleSheet("QMenu {\
+                              background-color: #f0f0f0; /* sets background of the menu */\
+                              border: 1px solid black;\
+                          }\
+                          QMenu::item {\
+                              /* sets background of menu item. set this to something non-transparent\
+                                  if you want menu color and menu item color to be different */\
+                              background-color: #f0f0f0;\
+                          }\
+                          QMenu::item:selected { /* when user selects item using mouse or keyboard */\
+                              background-color: #ABCDEF;\
+                          }");
+
+#else
+    context_menu->setStyleSheet("QMenu::item:selected { /* when user selects item using mouse or keyboard */\
+                                    background-color: #ABCDEF;\
+                                }");
+#endif
+}
+
+void gGraphView::togglePin()
+{
+    if (pin_graph) {
+        pin_graph->setPinned(!pin_graph->isPinned());
+        timedRedraw(0);
+    }
+}
+
+void gGraphView::closeEvent(QCloseEvent * event)
+{
+
+    timer->stop();
+    redrawtimer->stop();
+    disconnect(redrawtimer, 0, 0, 0);
+    disconnect(timer, 0, 0, 0);
+    timer->deleteLater();
+    redrawtimer->deleteLater();
+    pixmapcache.clear();
+    if (m_scrollbar) {
+        this->disconnect(m_scrollbar, SIGNAL(sliderMoved(int)), 0, 0);
+    }
+#ifdef BROKEN_OPENGL_BUILD
+    QWidget::closeEvent(event);
+#else
+    QGLWidget::closeEvent(event);
+#endif
+}
+
+gGraphView::~gGraphView()
+{
+#ifndef BROKEN_OPENGL_BUILD
+    doneCurrent();
+#endif
+
+#ifdef ENABLE_THREADED_DRAWING
+
+    for (int i = 0; i < m_threads.size(); i++) {
+        delete m_threads[i];
+    }
+
+    delete masterlock;
+#endif
+
+    // Note: This will cause a crash if two graphs accidentally have the same name
+    for (QList<gGraph *>::iterator g = m_graphs.begin(); g!= m_graphs.end(); ++g) {
+        gGraph * graph = *g;
+        delete graph;
+    }
+
+    delete m_tooltip;
+    m_graphs.clear();
+}
+
+void gGraphView::dumpInfo()
+{
+    QDate date = mainwin->getDaily()->getDate();
+    QString text = "==================== CPAP Information Dump ====================";
+    mainwin->log(text);
+
+    Day * day = p_profile->GetGoodDay(date, MT_CPAP);
+    if (day) {
+        QDateTime dt=QDateTime::fromMSecsSinceEpoch(day->first());
+
+        mainwin->log(QString("Available Channels for %1").arg(dt.toString("MMM dd yyyy")));
+        QHash<schema::ChanType, QList<schema::Channel *> > list;
+
+        for (int i=0; i< day->size(); ++i) {
+            Session * sess = day->sessions.at(i);
+            QHash<ChannelID, QVector<EventList *> >::iterator it;
+            for (it = sess->eventlist.begin(); it != sess->eventlist.end(); ++it) {
+                ChannelID code = it.key();
+                schema::Channel * chan = &schema::channel[code];
+                list[chan->type()].append(chan);
+            }
+        }
+
+        QHash<schema::ChanType, QList<schema::Channel *> >::iterator lit;
+        for (lit = list.begin(); lit != list.end(); ++lit) {
+            switch (lit.key()) {
+            case schema::DATA:
+                text = "DATA: ";
+                break;
+            case schema::SETTING:
+                text = "SETTING: ";
+                break;
+            case schema::FLAG:
+                text = "FLAG: ";
+                break;
+            case schema::MINOR_FLAG:
+                text = "MINOR_FLAG: ";
+                break;
+            case schema::SPAN:
+                text = "SPAN: ";
+                break;
+            case schema::WAVEFORM:
+                text = "WAVEFORM: ";
+                break;
+            case schema::UNKNOWN:
+                text = "UNKNOWN: ";
+                break;
+            default:
+                break;
+            }
+            QStringList str;
+            for (int i=0; i< lit.value().size(); ++i) {
+                str.append(lit.value().at(i)->code());
+            }
+            str.sort();
+            text.append(str.join(", "));
+            mainwin->log(text);
+        }
+    }
+//    for (int i=0;i<m_graphs.size();i++) {
+//        m_graphs[i]->dumpInfo();
+//    }
+}
+
+bool gGraphView::usePixmapCache()
+{
+    //use_pixmap_cache is an overide setting
+    return p_profile->appearance->usePixmapCaching();
+}
+
+#define CACHE_DRAWTEXT
+#ifndef CACHE_DRAWTEXT
+// Render all qued text via QPainter method
+void gGraphView::DrawTextQue(QPainter &painter)
+{
+    int w, h;
+
+    // not sure if global antialiasing would be better..
+    //painter.setRenderHint(QPainter::TextAntialiasing, p_profile->appearance->antiAliasing());
+    int items = m_textque.size();
+    for (int i = 0; i < items; ++i) {
+        TextQue &q = m_textque[i];
+        painter.setPen(q.color);
+        painter.setRenderHint(QPainter::TextAntialiasing, q.antialias);
+        QFont font = *q.font;
+        painter.setFont(font);
+
+        if (q.angle == 0) { // normal text
+
+            painter.drawText(q.x, q.y, q.text);
+        } else { // rotated text
+            w = painter.fontMetrics().width(q.text);
+            h = painter.fontMetrics().xHeight() + 2;
+
+            painter.translate(q.x, q.y);
+            painter.rotate(-q.angle);
+            painter.drawText(floor(-w / 2.0), floor(-h / 2.0), q.text);
+            painter.rotate(+q.angle);
+            painter.translate(-q.x, -q.y);
+        }
+        strings_drawn_this_frame++;
+        q.text.clear();
+    }
+
+    m_textque.clear();
+
+    items = m_textqueRect.size();
+    for (int i=0; i< items; ++i) {
+        TextQueRect &q = m_textqueRect[i];
+        painter.setPen(q.color);
+        painter.setRenderHint(QPainter::TextAntialiasing, q.antialias);
+        QFont font = *q.font;
+        painter.setFont(font);
+
+        if (q.angle == 0) { // normal text
+
+            painter.drawText(q.rect, q.flags, q.text);
+        } else { // rotated text
+
+            int x = q.rect.x();
+            int y = q.rect.y();
+            w = painter.fontMetrics().width(q.text);
+            h = painter.fontMetrics().xHeight() + 2;
+
+            painter.translate(x, y);
+            painter.rotate(-q.angle);
+            painter.drawText(floor(-w / 2.0), floor(-h / 2.0), q.text);
+            painter.rotate(+q.angle);
+            painter.translate(-x, -y);
+        }
+        strings_drawn_this_frame++;
+        q.text.clear();
+
+    }
+
+    m_textqueRect.clear();
+}
+
+#else
+// Render graphs with QPainter or pixmap caching, depending on preferences
+void gGraphView::DrawTextQue(QPainter &painter)
+{
+    {
+        // process the text drawing queue
+        int m_textque_items = m_textque.size();
+
+        int h,w;
+
+        for (int i = 0; i < m_textque_items; ++i) {
+            const TextQue &q = m_textque.at(i);
+
+            // can do antialiased text via texture cache fine on mac
+            if (usePixmapCache()) {
+                // Generate the pixmap cache "key"
+                QString hstr = QString("%1:%2:%3").
+                        arg(q.text).
+                        arg(q.color.name()).
+                        arg(q.font->pointSize());
+
+                QPixmap pm;
+                const int buf = 8;
+                if (!QPixmapCache::find(hstr, &pm)) {
+
+                    QFontMetrics fm(*q.font);
+                   // QRect rect=fm.tightBoundingRect(q.text);
+                    w = fm.width(q.text);
+                    h = fm.height()+buf;
+
+                    pm=QPixmap(w, h);
+                    pm.fill(Qt::transparent);
+
+                    QPainter imgpainter(&pm);
+
+                    imgpainter.setPen(q.color);
+
+                    imgpainter.setFont(*q.font);
+
+                    imgpainter.setRenderHint(QPainter::TextAntialiasing, q.antialias);
+                    imgpainter.drawText(0, h-buf, q.text);
+                    imgpainter.end();
+
+                    QPixmapCache::insert(hstr, pm);
+                    strings_drawn_this_frame++;
+                } else {
+                    //cached
+                    strings_cached_this_frame++;
+                }
+
+                h = pm.height();
+                w = pm.width();
+                if (q.angle != 0) {
+                    float xxx = q.x - h - (h / 2);
+                    float yyy = q.y + w / 2; // + buf / 2;
+
+                    xxx+=4;
+                    yyy+=4;
+
+                    painter.translate(xxx, yyy);
+                    painter.rotate(-q.angle);
+                    painter.drawPixmap(QRect(0, h / 2, w, h), pm);
+                    painter.rotate(+q.angle);
+                    painter.translate(-xxx, -yyy);
+                } else {
+                    QRect r1(q.x - buf / 2 + 4, q.y - h + buf, w, h);
+                    painter.drawPixmap(r1, pm);
+                }
+            } else {
+                // Just draw the fonts..
+                painter.setPen(QColor(q.color));
+                painter.setFont(*q.font);
+
+                if (q.angle == 0) {
+                    painter.drawText(q.x, q.y, q.text);
+                } else {
+                    painter.setFont(*q.font);
+
+                    w = painter.fontMetrics().width(q.text);
+                    h = painter.fontMetrics().xHeight() + 2;
+
+                    painter.translate(q.x, q.y);
+                    painter.rotate(-q.angle);
+                    painter.drawText(floor(-w / 2.0)-6, floor(-h / 2.0), q.text);
+                    painter.rotate(+q.angle);
+                    painter.translate(-q.x, -q.y);
+                }
+                strings_drawn_this_frame++;
+
+            }
+
+            //q.text.clear();
+            //q.text.squeeze();
+        }
+
+        m_textque.clear();
+    }
+    ////////////////////////////////////////////////////////////////////////
+    // Text Rectangle Queues..
+    ////////////////////////////////////////////////////////////////////////
+    int items = m_textqueRect.size();
+
+    float ww, hh;
+    for (int i = 0; i < items; ++i) {
+        const TextQueRect &q = m_textqueRect.at(i);
+
+        // can do antialiased text via texture cache fine on mac
+        if (usePixmapCache()) {
+            // Generate the pixmap cache "key"
+            QString hstr = QString("%1:%2:%3").
+                    arg(q.text).
+                    arg(q.color.name()).
+                    arg(q.font->pointSize());
+
+            QPixmap pm;
+            if (!QPixmapCache::find(hstr, &pm)) {
+
+                ww = q.rect.width();
+                hh = q.rect.height();
+
+                pm=QPixmap(ww, hh);
+
+                //int aaw1 = pm.width();
+                pm.fill(Qt::transparent);
+
+                QPainter imgpainter(&pm);
+
+                //int aaw2 = pm.width();
+                imgpainter.setPen(q.color);
+
+                imgpainter.setFont(*q.font);
+
+                imgpainter.setRenderHint(QPainter::Antialiasing, true);
+                imgpainter.setRenderHint(QPainter::TextAntialiasing, true);
+                QRectF rect(0,0, ww, hh);
+                imgpainter.drawText(rect, q.flags, q.text);
+                //int aaw3 = pm.width();
+                imgpainter.end();
+
+                QPixmapCache::insert(hstr, pm);
+                //int aaw4 = pm.width();
+                strings_drawn_this_frame++;
+            } else {
+                //cached
+                strings_cached_this_frame++;
+            }
+
+            hh = pm.height();
+            ww = pm.width();
+            if (q.angle != 0) {
+                float xxx = q.rect.x() - hh - (hh / 2);
+                float yyy = q.rect.y() + ww / 2; // + buf / 2;
+
+                xxx+=4;
+                yyy+=4;
+
+                painter.translate(xxx, yyy);
+                painter.rotate(-q.angle);
+                painter.drawPixmap(QRect(0, hh / 2, ww, hh), pm);
+                painter.rotate(+q.angle);
+                painter.translate(-xxx, -yyy);
+            } else {
+                //painter.drawPixmap(QPoint(q.rect.x(), q.rect.y()), pm);
+                painter.drawPixmap(q.rect,pm, QRect(0,0,ww,hh));
+            }
+        } else {
+            // Just draw the fonts..
+
+            painter.setPen(QColor(q.color));
+            painter.setFont(*q.font);
+
+            if (q.angle == 0) {
+                painter.drawText(q.rect, q.flags, q.text);
+            } else {
+                painter.setFont(*q.font);
+
+                ww = painter.fontMetrics().width(q.text);
+                hh = painter.fontMetrics().xHeight() + 2;
+
+                painter.translate(q.rect.x(), q.rect.y());
+                painter.rotate(-q.angle);
+                painter.drawText(floor(-ww / 2.0), floor(-hh / 2.0), q.text);
+                painter.rotate(+q.angle);
+                painter.translate(-q.rect.x(), -q.rect.y());
+            }
+            strings_drawn_this_frame++;
+
+        }
+
+        //q.text.clear();
+        //q.text.squeeze();
+    }
+
+    m_textqueRect.clear();
+
+}
+#endif
+
+void gGraphView::AddTextQue(const QString &text, QRectF rect, quint32 flags, float angle, QColor color, QFont *font, bool antialias)
+{
+#ifdef ENABLED_THREADED_DRAWING
+    text_mutex.lock();
+#endif
+    m_textqueRect.append(TextQueRect(rect,flags,text,angle,color,font,antialias));
+#ifdef ENABLED_THREADED_DRAWING
+    text_mutex.unlock();
+#endif
+}
+
+void gGraphView::AddTextQue(const QString &text, short x, short y, float angle, QColor color, QFont *font, bool antialias)
+{
+#ifdef ENABLED_THREADED_DRAWING
+    text_mutex.lock();
+#endif
+    m_textque.append(TextQue(x,y,angle,text,color,font,antialias));
+#ifdef ENABLED_THREADED_DRAWING
+    text_mutex.unlock();
+#endif
+}
+
+void gGraphView::addGraph(gGraph *g, short group)
+{
+    if (!g) {
+        qDebug() << "Attempted to add an empty graph!";
+        return;
+    }
+
+    if (!m_graphs.contains(g)) {
+        g->setGroup(group);
+        m_graphs.push_back(g);
+
+        if (!m_graphsbyname.contains(g->name())) {
+            m_graphsbyname[g->name()] = g;
+        } else {
+            qDebug() << "Can't have two graphs with the same code string in the same GraphView!!";
+        }
+
+        // updateScrollBar();
+    }
+}
+
+// Calculate total height of all graphs including spacers
+float gGraphView::totalHeight()
+{
+    float th = 0;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        gGraph * g = m_graphs[i];
+        if (g->isEmpty() || (!g->visible())) { continue; }
+
+        th += g->height() + graphSpacer;
+    }
+
+    return ceil(th);
+}
+
+float gGraphView::findTop(gGraph *graph)
+{
+    float th = -m_offsetY;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        if (m_graphs[i] == graph) { break; }
+
+        if (m_graphs[i]->isEmpty() || (!m_graphs[i]->visible())) { continue; }
+
+        th += m_graphs[i]->height() * m_scaleY + graphSpacer;
+    }
+
+    return ceil(th);
+}
+
+float gGraphView::scaleHeight()
+{
+    float th = 0;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        if (m_graphs[i]->isEmpty() || (!m_graphs[i]->visible())) { continue; }
+
+        th += m_graphs[i]->height() * m_scaleY + graphSpacer;
+    }
+
+    return ceil(th);
+}
+
+void gGraphView::updateScale()
+{
+    if (!isVisible()) {
+        m_scaleY = 0.0;
+        return;
+    }
+
+    float th = totalHeight(); // height of all graphs
+    float h = height();     // height of main widget
+
+
+    if (th < h) {
+        th -= graphSpacer;
+    //    th -= visibleGraphs() * graphSpacer;   // compensate for spacer height
+        m_scaleY = h / th;  // less graphs than fits on screen, so scale to fit
+    } else {
+        m_scaleY = 1.0;
+    }
+
+    updateScrollBar();
+}
+
+
+void gGraphView::resizeEvent(QResizeEvent *e)
+{
+//    QWidget::resizeEvent(e); // This ques a redraw event..
+
+    updateScale();
+
+    if (m_scaleY > 0.0001) {
+        for (int i = 0; i < m_graphs.size(); i++) {
+            m_graphs[i]->resize(e->size().width(), m_graphs[i]->height() * m_scaleY);
+        }
+    }
+    e->accept();
+}
+
+void gGraphView::scrollbarValueChanged(int val)
+{
+    //qDebug() << "Scrollbar Changed" << val;
+    if (m_offsetY != val) {
+        m_offsetY = val;
+        timedRedraw(); // do this on a timer?
+    }
+}
+
+void gGraphView::GetRXBounds(qint64 &st, qint64 &et)
+{
+    //qint64 m1=0,m2=0;
+    gGraph *g = nullptr;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        g = m_graphs[i];
+
+        if (g->group() == 0) {
+            break;
+        }
+    }
+
+    st = g->rmin_x;
+    et = g->rmax_x;
+}
+
+void gGraphView::ResetBounds(bool refresh) //short group)
+{
+    if (m_graphs.size() == 0) return;
+    Q_UNUSED(refresh)
+    qint64 m1 = 0, m2 = 0;
+    gGraph *g = nullptr;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        m_graphs[i]->ResetBounds();
+
+        if (!m_graphs[i]->min_x) { continue; }
+
+        g = m_graphs[i];
+
+        if (!m1 || m_graphs[i]->min_x < m1) { m1 = m_graphs[i]->min_x; }
+
+        if (!m2 || m_graphs[i]->max_x > m2) { m2 = m_graphs[i]->max_x; }
+    }
+
+//    if (p_profile->general->linkGroups()) {
+//        for (int i = 0; i < m_graphs.size(); i++) {
+//            m_graphs[i]->SetMinX(m1);
+//            m_graphs[i]->SetMaxX(m2);
+//        }
+//    }
+
+    if (!g) {
+        g = m_graphs[0];
+    }
+
+    m_minx = g->min_x;
+    m_maxx = g->max_x;
+
+    updateScale();
+}
+
+void gGraphView::GetXBounds(qint64 &st, qint64 &et)
+{
+    st = m_minx;
+    et = m_maxx;
+}
+
+void gGraphView::SetXBounds(qint64 minx, qint64 maxx, short group, bool refresh)
+{
+    for (int i = 0; i < m_graphs.size(); i++) {
+        if ((m_graphs[i]->group() == group)) {
+            m_graphs[i]->SetXBounds(minx, maxx);
+        }
+    }
+
+    m_minx = minx;
+    m_maxx = maxx;
+
+    if (refresh) { timedRedraw(0); }
+}
+
+void gGraphView::updateScrollBar()
+{
+    if (!m_scrollbar || (m_graphs.size() == 0)) {
+        return;
+    }
+
+    float th = scaleHeight(); // height of all graphs
+    float h = height();     // height of main widget
+
+    float vis = 0;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        vis += (m_graphs[i]->isEmpty() || !m_graphs[i]->visible()) ? 0 : 1;
+    }
+
+    if (th < h) { // less graphs than fits on screen
+
+        m_scrollbar->setMaximum(0); // turn scrollbar off.
+
+    } else {  // more graphs than fit on screen
+        //m_scaleY=1.0;
+        float avgheight = th / vis;
+        m_scrollbar->setPageStep(avgheight);
+        m_scrollbar->setSingleStep(avgheight / 8.0);
+        m_scrollbar->setMaximum(th - height());
+
+        if (m_offsetY > th - height()) {
+            m_offsetY = th - height();
+        }
+    }
+}
+
+void gGraphView::setScrollBar(MyScrollBar *sb)
+{
+    m_scrollbar = sb;
+    m_scrollbar->setMinimum(0);
+    updateScrollBar();
+    this->connect(m_scrollbar, SIGNAL(valueChanged(int)), SLOT(scrollbarValueChanged(int)));
+}
+
+bool gGraphView::renderGraphs(QPainter &painter)
+{
+    float px = m_offsetX;
+    float py = -m_offsetY;
+    int numgraphs = 0;
+    float h, w;
+    //ax=px;//-m_offsetX;
+
+    //bool threaded;
+
+    // Tempory hack using this pref..
+    //#ifdef ENABLED_THREADED_DRAWING
+    /*if (profile->session->multithreading()) { // && (m_idealthreads>1)) {
+        threaded=true;
+        for (int i=0;i<m_idealthreads;i++) {
+            if (!m_threads[i]->isRunning())
+                m_threads[i]->start();
+        }
+    } else threaded=false; */
+    //#endif
+    //threaded=false;
+    if (height() < 40) return false;
+
+    if (m_scaleY < 0.0000001) {
+        updateScale();
+    }
+
+    lines_drawn_this_frame = 0;
+    quads_drawn_this_frame = 0;
+
+    // Calculate the height of pinned graphs
+
+    float pinned_height = 0; // pixel height total
+    int pinned_graphs = 0; // count
+    gGraph * g = nullptr;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        g = m_graphs[i];
+        int minh = g->minHeight();
+        if (g->height() < minh) {
+            g->setHeight(minh);
+        }
+        if (g->isEmpty()) { continue; }
+
+        if (!g->visible()) { continue; }
+
+        if (!g->isPinned()) { continue; }
+
+        h = g->height() * m_scaleY;
+        pinned_height += h + graphSpacer;
+        pinned_graphs++;
+    }
+
+    py += pinned_height; // start drawing at the end of pinned space
+
+    // Draw non pinned graphs
+    for (int i = 0; i < m_graphs.size(); i++) {
+        g = m_graphs[i];
+        if (g->isEmpty()) { continue; }
+
+        if (!g->visible()) { continue; }
+
+        if (g->isPinned()) { continue; }
+
+        numgraphs++;
+        h = g->height() * m_scaleY;
+
+        // set clipping?
+
+        if (py > height()) {
+            break;    // we are done.. can't draw anymore
+        }
+
+        if ((py + h + graphSpacer) >= 0) {
+            w = width();
+            int tw = 0; // (g->showTitle() ? titleWidth : 0);
+
+            queGraph(g, px + tw, py, width() - tw, h);
+
+            if ((m_graphs.size() > 1) && m_showsplitter) {
+                // draw the splitter handle
+
+                painter.setPen(QColor(220, 220, 220, 255));
+                painter.drawLine(0, py + h, w, py + h);
+                painter.setPen(QColor(158,158,158,255));
+                painter.drawLine(0, py + h + 1, w, py + h + 1);
+                painter.setPen(QColor(240, 240, 240, 255));
+                painter.drawLine(0, py + h + 2, w, py + h + 2);
+
+            }
+
+        }
+
+        py = ceil(py + h + graphSpacer);
+    }
+
+    // Physically draw the unpinned graphs
+    int s = m_drawlist.size();
+
+    for (int i = 0; i < s; i++) {
+        g = m_drawlist.at(0);
+        m_drawlist.pop_front();
+        g->paint(painter, QRegion(g->m_rect));
+    }
+
+    if (m_graphs.size() > 1) {
+        DrawTextQue(painter);
+
+        // Draw a gradient behind pinned graphs
+        QLinearGradient linearGrad(QPointF(100, 100), QPointF(width() / 2, 100));
+        linearGrad.setColorAt(0, QColor(216, 216, 255));
+        linearGrad.setColorAt(1, Qt::white);
+
+        painter.fillRect(0, 0, width(), pinned_height, QBrush(linearGrad));
+    }
+
+    py = 0; // start drawing at top...
+
+    // Draw Pinned graphs
+    for (int i = 0; i < m_graphs.size(); i++) {
+        g = m_graphs[i];
+        if (g->isEmpty()) { continue; }
+
+        if (!g->visible()) { continue; }
+
+        if (!g->isPinned()) { continue; }
+
+        h = g->height() * m_scaleY;
+        numgraphs++;
+
+        if (py > height()) {
+            break;    // we are done.. can't draw anymore
+        }
+
+        if ((py + h + graphSpacer) >= 0) {
+            w = width();
+            int tw = 0; //(g->showTitle() ? titleWidth : 0);
+
+            queGraph(g, px + tw, py, width() - tw, h);
+
+            if ((m_graphs.size() > 1) && m_showsplitter) {
+                // draw the splitter handle
+                painter.setPen(QColor(220, 220, 220, 255));
+                painter.drawLine(0, py + h, w, py + h);
+                painter.setPen(QColor(128, 128, 128, 255));
+                painter.drawLine(0, py + h + 1, w, py + h + 1);
+                painter.setPen(QColor(190, 190, 190, 255));
+                painter.drawLine(0, py + h + 2, w, py + h + 2);
+            }
+
+        }
+
+        py = ceil(py + h + graphSpacer);
+    }
+
+    //int thr=m_idealthreads;
+#ifdef ENABLED_THREADED_DRAWING
+    if (threaded) {
+        for (int i = 0; i < m_idealthreads; i++) {
+            masterlock->acquire(1);
+            m_threads[i]->mutex.unlock();
+        }
+
+        // wait till all the threads are done
+        // ask for all the CPU's back..
+        masterlock->acquire(m_idealthreads);
+        masterlock->release(m_idealthreads);
+    } else {
+#endif
+        s = m_drawlist.size();
+
+        for (int i = 0; i < s; i++) {
+            g = m_drawlist.at(0);
+            m_drawlist.pop_front();
+            g->paint(painter, QRegion(g->m_rect));
+        }
+
+#ifdef ENABLED_THREADED_DRAWING
+    }
+#endif
+    //int elapsed=time.elapsed();
+    //QColor col=Qt::black;
+
+    //    lines->setSize(linesize);
+
+     DrawTextQue(painter);
+    //glDisable(GL_TEXTURE_2D);
+    //glDisable(GL_DEPTH_TEST);
+
+    return numgraphs > 0;
+}
+
+#include "version.h"
+#ifdef BROKEN_OPENGL_BUILD
+void gGraphView::paintEvent(QPaintEvent *)
+#else
+void gGraphView::paintGL()
+#endif
+{
+
+    if (!isVisible()) {
+        // wtf is this even getting CALLED??
+        return;
+    }
+#ifdef DEBUG_EFFICIENCY
+    QElapsedTimer time;
+    time.start();
+#endif
+
+    if (redrawtimer->isActive()) {
+        redrawtimer->stop();
+    }
+
+    bool render_cube = false; //p_profile->appearance->animations(); // do something to
+
+    if (width() <= 0) { return; }
+    if (height() <= 0) { return; }
+
+
+    // Create QPainter object, note this is only valid from paintGL events!
+    QPainter painter(this);
+
+    painter.setRenderHint(QPainter::TextAntialiasing, true);
+
+    QRect bgrect(0, 0, width(), height());
+    painter.fillRect(bgrect,QBrush(QColor(255,255,255)));
+
+    bool graphs_drawn = true;
+
+    lines_drawn_this_frame = 0;
+    quads_drawn_this_frame = 0;
+    strings_drawn_this_frame = 0;
+    strings_cached_this_frame = 0;
+
+    graphs_drawn = renderGraphs(painter);
+
+    if (!graphs_drawn) { // No graphs drawn? show something useful :)
+        QString txt;
+        if (m_showAuthorMessage) {
+            if (emptyText() == STR_Empty_Brick) {
+                txt = "\nI'm very sorry your machine doesn't record useful data to graph in Daily View :(";
+            } else {
+                // not proud of telling them their machine is a Brick.. ;)
+                txt = QObject::tr("SleepyHead is proudly brought to you by JediMark.");
+            }
+        }
+//        int x2, y2;
+//        GetTextExtent(m_emptytext, x2, y2, bigfont);
+//        int tp2, tp1;
+
+        if (!m_emptyimage.isNull()) {
+            painter.drawPixmap(width() /2 - m_emptyimage.width() /2, height() /2 - m_emptyimage.height() /2 , m_emptyimage);
+//            tp2 = height() /2 + m_emptyimage.height()/2  + y2;
+
+        } /*else {
+
+            tp2 = height() / 2 + y2;
+        }*/
+        QColor col = Qt::black;
+        painter.setPen(col);
+
+//        painter.setFont(*bigfont);
+//        painter.drawText((width() / 2) - x2 / 2, tp2, m_emptytext);
+
+        QRectF rec(0,0,width(),0);
+        painter.setFont(*defaultfont);
+        rec = painter.boundingRect(rec, Qt::AlignHCenter | Qt::AlignBottom, txt);
+        rec.moveBottom(height()-5);
+
+        painter.drawText(rec, Qt::AlignHCenter | Qt::AlignBottom, txt);
+    }
+    if (p_profile->appearance->lineCursorMode()) {
+       emit updateCurrentTime(graphs_drawn ? m_currenttime : 0.0F);
+    } else {
+       emit updateRange(graphs_drawn ? m_minx : 0.0F, m_maxx);
+    }
+    DrawTextQue(painter);
+
+    m_tooltip->paint(painter);
+
+#ifdef DEBUG_EFFICIENCY
+    const int rs = 10;
+    static double ring[rs] = {0};
+    static int rp = 0;
+
+    // Show FPS and draw time
+    if (m_showsplitter && p_profile->general->showPerformance()) {
+        QString ss;
+        qint64 ela = time.nsecsElapsed();
+        double ms = double(ela) / 1000000.0;
+        ring[rp++] = 1000.0 / ms;
+        rp %= rs;
+        double v = 0;
+
+        for (int i = 0; i < rs; i++) {
+            v += ring[i];
+        }
+
+        double fps = v / double(rs);
+        ss = "Debug Mode " + QString::number(fps, 'f', 1) + "fps "
+                + QString::number(lines_drawn_this_frame, 'f', 0) + " lines "
+//                + QString::number(quads_drawn_this_frame, 'f', 0) + " quads "
+                + QString::number(strings_drawn_this_frame, 'f', 0) + " strings "
+                + QString::number(strings_cached_this_frame, 'f', 0) + " cached ";
+
+        int w, h;
+        // this uses tightBoundingRect, which is different on Mac than it is on Windows & Linux.
+        GetTextExtent(ss, w, h);
+        QColor col = Qt::white;
+
+        if (m_graphs.size() > 0) {
+            painter.fillRect(width() - m_graphs[0]->marginRight(), 0, m_graphs[0]->marginRight(), w, QBrush(col));
+        }
+#ifndef Q_OS_MAC
+        //   if (usePixmapCache()) xx+=4; else xx-=3;
+#endif
+        AddTextQue(ss, width(), w / 2, 90, QColor(Qt::black), defaultfont);
+        DrawTextQue(painter);
+    }
+//    painter.setPen(Qt::lightGray);
+//    painter.drawLine(0, 0, 0, height());
+//    painter.drawLine(0, 0, width(), 0);
+//    painter.setPen(Qt::darkGray);
+    //painter.drawLine(width(), 0, width(), height());
+
+#endif
+
+    painter.end();
+
+#ifndef BROKEN_OPENGL_BUILD
+    swapBuffers();
+#endif
+    if (this->isVisible() && !graphs_drawn && render_cube) { // keep the cube spinning
+        redrawtimer->setInterval(1000.0 / 50); // 50 FPS
+        redrawtimer->setSingleShot(true);
+        redrawtimer->start();
+    }
+
+}
+
+QString gGraphView::getRangeString()
+{
+    QString fmt;
+
+    qint64 diff = m_maxx - m_minx;
+
+    if (diff > 86400000) {
+        int days = ceil(double(m_maxx-m_minx) / 86400000.0);
+
+        qint64 minx = floor(double(m_minx)/86400000.0);
+        minx *= 86400000L;
+
+        qint64 maxx = minx + 86400000L * qint64(days)-1;
+
+        QDateTime st = QDateTime::fromMSecsSinceEpoch(minx);
+        QDateTime et = QDateTime::fromMSecsSinceEpoch(maxx);
+
+        QString txt = st.toString("d MMM") + " - " +  et.addDays(-1).toString("d MMM yyyy");
+        return txt;
+    } else if (diff > 60000) {
+        fmt = "HH:mm:ss";
+    } else {
+        fmt = "HH:mm:ss:zzz";
+    }
+    QDateTime st = QDateTime::fromMSecsSinceEpoch(m_minx);
+    QDateTime et = QDateTime::fromMSecsSinceEpoch(m_maxx);
+
+    QString txt = st.toString(QObject::tr("d MMM [ %1 - %2 ]").arg(fmt).arg(et.toString(fmt))) ;
+
+    return txt;
+}
+
+void gGraphView::leaveEvent(QEvent * event)
+{
+    Q_UNUSED(event);
+    if (m_metaselect) {
+        m_metaselect = false;
+        timedRedraw(0);
+    }
+    releaseKeyboard();
+}
+
+
+// For manual scrolling
+void gGraphView::setOffsetY(int offsetY)
+{
+    if (m_offsetY != offsetY) {
+        m_offsetY = offsetY;
+        redraw(); //issue full redraw..
+    }
+}
+
+// For manual X scrolling (not really needed)
+void gGraphView::setOffsetX(int offsetX)
+{
+    if (m_offsetX != offsetX) {
+        m_offsetX = offsetX;
+        redraw(); //issue redraw
+    }
+}
+
+void gGraphView::mouseMoveEvent(QMouseEvent *event)
+{
+    grabKeyboard();
+
+    int x = event->x();
+    int y = event->y();
+
+    m_mouse = QPoint(x, y);
+
+    if (m_sizer_dragging) { // Resize handle being dragged
+        float my = y - m_sizer_point.y();
+        //qDebug() << "Sizer moved vertically" << m_sizer_index << my*m_scaleY;
+        float h = m_graphs[m_sizer_index]->height();
+        h += my / m_scaleY;
+
+        if (h > m_graphs[m_sizer_index]->minHeight()) {
+            m_graphs[m_sizer_index]->setHeight(h);
+            m_sizer_point.setX(x);
+            m_sizer_point.setY(y);
+            updateScrollBar();
+            timedRedraw();
+        }
+
+        return;
+    }
+
+    if (m_graph_dragging) { // Title bar being dragged to reorder
+        gGraph *p;
+        int yy = m_sizer_point.y();
+        bool empty;
+
+        if (y < yy) {
+
+            for (int i = m_graph_index - 1; i >= 0; i--) {
+                if (m_graphs[i]->isPinned() != m_graphs[m_graph_index]->isPinned()) {
+                    // fix cursor
+                    continue;
+                }
+
+                empty = m_graphs[i]->isEmpty() || (!m_graphs[i]->visible());
+                // swapping upwards.
+                int yy2 = yy - graphSpacer - m_graphs[i]->height() * m_scaleY;
+                yy2 += m_graphs[m_graph_index]->height() * m_scaleY;
+
+                if (y < yy2) {
+                    //qDebug() << "Graph Reorder" << m_graph_index;
+                    p = m_graphs[m_graph_index];
+                    m_graphs[m_graph_index] = m_graphs[i];
+                    m_graphs[i] = p;
+
+                    if (!empty) {
+                        m_sizer_point.setY(yy - graphSpacer - m_graphs[m_graph_index]->height()*m_scaleY);
+                        redraw();
+                    }
+
+                    m_graph_index--;
+                }
+
+                if (!empty) { break; }
+
+            }
+        } else if (y > yy + graphSpacer + m_graphs[m_graph_index]->height()*m_scaleY) {
+            // swapping downwards
+            //qDebug() << "Graph Reorder" << m_graph_index;
+            for (int i = m_graph_index + 1; i < m_graphs.size(); i++) {
+                if (m_graphs[i]->isPinned() != m_graphs[m_graph_index]->isPinned()) {
+                    //m_graph_dragging=false;
+                    // fix cursor
+                    continue;
+                }
+
+                empty = m_graphs[i]->isEmpty() || (!m_graphs[i]->visible());
+                p = m_graphs[m_graph_index];
+                m_graphs[m_graph_index] = m_graphs[i];
+                m_graphs[i] = p;
+
+                if (!empty) {
+                    m_sizer_point.setY(yy + graphSpacer + m_graphs[m_graph_index]->height()*m_scaleY);
+                    timedRedraw();
+                }
+
+                m_graph_index++;
+
+                if (!empty) { break; }
+            }
+        }
+
+        return;
+    }
+
+    float py = 0, pinned_height = 0, h;
+    bool done = false;
+
+    // Do pinned graphs first
+    for (int i = 0; i < m_graphs.size(); i++) {
+
+        if (m_graphs[i]->isEmpty() || !m_graphs[i]->visible() || !m_graphs[i]->isPinned()) {
+            continue;
+        }
+
+        h = m_graphs[i]->height() * m_scaleY;
+        pinned_height += h + graphSpacer;
+
+        if (py > height()) {
+            break;    // we are done.. can't draw anymore
+        }
+
+        if (!((y >= py + m_graphs[i]->top) && (y < py + h - m_graphs[i]->bottom))) {
+            if (m_graphs[i]->isSelected()) {
+                m_graphs[i]->deselect();
+                timedRedraw(150);
+            }
+        }
+
+        // Update Mouse Cursor shape
+        if ((y >= py + h - 1) && (y < (py + h + graphSpacer))) {
+            this->setCursor(Qt::SplitVCursor);
+            done = true;
+        } else if ((y >= py + 1) && (y < py + h)) {
+            if (x >= titleWidth + 10) {
+                this->setCursor(Qt::ArrowCursor);
+            } else {
+                m_tooltip->display("Double click title to pin / unpin\nClick and drag to reorder graphs", x + 10, y, TT_AlignLeft);
+                timedRedraw(0);
+
+                this->setCursor(Qt::OpenHandCursor);
+            }
+
+
+            m_horiz_travel += qAbs(x - m_lastxpos) + qAbs(y - m_lastypos);
+            m_lastxpos = x;
+            m_lastypos = y;
+            //           QPoint p(x,y);
+            //           QMouseEvent e(event->type(),p,event->button(),event->buttons(),event->modifiers());
+
+            m_graphs[i]->mouseMoveEvent(event);
+
+            done = true;
+        }
+
+        py += h + graphSpacer;
+
+    }
+
+    py = -m_offsetY;
+    py += pinned_height;
+
+    // Propagate mouseMove events to relevant graphs
+    if (!done)
+        for (int i = 0; i < m_graphs.size(); i++) {
+
+            if (m_graphs[i]->isEmpty() || !m_graphs[i]->visible() || m_graphs[i]->isPinned()) {
+                continue;
+            }
+
+            h = m_graphs[i]->height() * m_scaleY;
+
+            if (py > height()) {
+                break;    // we are done.. can't draw anymore
+            }
+
+            if (!((y >= py + m_graphs[i]->top) && (y < py + h - m_graphs[i]->bottom))) {
+                if (m_graphs[i]->isSelected()) {
+                    m_graphs[i]->deselect();
+                    timedRedraw(150);
+                }
+            }
+
+            // Update Mouse Cursor shape
+            if ((y >= py + h - 1) && (y < (py + h + graphSpacer))) {
+                this->setCursor(Qt::SplitVCursor);
+            } else if ((y >= py + 1) && (y < py + h)) {
+                if (x >= titleWidth + 10) {
+                    this->setCursor(Qt::ArrowCursor);
+                } else {
+                    m_tooltip->display("Double click title to pin / unpin\nClick and drag to reorder graphs", x + 10, y, TT_AlignLeft);
+                    timedRedraw(0);
+
+                    this->setCursor(Qt::OpenHandCursor);
+                }
+
+
+                m_horiz_travel += qAbs(x - m_lastxpos) + qAbs(y - m_lastypos);
+                m_lastxpos = x;
+                m_lastypos = y;
+                gGraph *g = m_graphs[i];
+                if (g) {
+                    g->mouseMoveEvent(event);
+                }
+
+            }
+
+            /*            else if (!m_button_down && (y >= py) && (y < py+m_graphs[i]->top)) {
+                            // Mouse cursor is in top graph margin.
+                        } else if (!m_button_down && (y >= py+h-m_graphs[i]->bottom) && (y <= py+h)) {
+                            // Mouse cursor is in bottom grpah margin.
+                        } else if (m_button_down || ((y >= py+m_graphs[i]->top) && (y < py + h-m_graphs[i]->bottom))) {
+                            if (m_button_down || (x >= titleWidth+10)) { //(gYAxis::Margin-5)
+                                this->setCursor(Qt::ArrowCursor);
+                                m_horiz_travel+=qAbs(x-m_lastxpos)+qAbs(y-m_lastypos);
+                                m_lastxpos=x;
+                                m_lastypos=y;
+                                QPoint p(x-titleWidth,y-py);
+                                QMouseEvent e(event->type(),p,event->button(),event->buttons(),event->modifiers());
+
+                                m_graphs[i]->mouseMoveEvent(&e);
+                                if (!m_button_down && (x<=titleWidth+(gYAxis::Margin-5))) {
+                                    //qDebug() << "Hovering over" << m_graphs[i]->title();
+                                    if (m_graphsbytitle[STR_TR_EventFlags]==m_graphs[i]) {
+                                        QVector<Layer *> & layers=m_graphs[i]->layers();
+                                        gFlagsGroup *fg;
+                                        for (int i=0;i<layers.size();i++) {
+                                            if ((fg=dynamic_cast<gFlagsGroup *>(layers[i]))!=nullptr) {
+                                                float bh=fg->barHeight();
+                                                int count=fg->count();
+                                                float yp=py+m_graphs[i]->marginTop();
+                                                    yp=y-yp;
+                                                float th=(float(count)*bh);
+                                                if (yp>=0 && yp<th) {
+                                                    int i=yp/bh;
+                                                    if (i<count) {
+                                                        ChannelID code=fg->visibleLayers()[i]->code();
+                                                        QString ttip=schema::channel[code].description();
+                                                        m_tooltip->display(ttip,x,y-20,p_profile->general->tooltipTimeout());
+                                                        redraw();
+                                                        //qDebug() << code << ttip;
+                                                    }
+                                                }
+
+                                                break;
+                                            }
+                                        }
+                                    } else {
+                                        if (!m_graphs[i]->units().isEmpty()) {
+                                            m_tooltip->display(m_graphs[i]->units(),x,y-20,p_profile->general->tooltipTimeout());
+                                            redraw();
+                                        }
+                                    }
+                                }
+                            } else {
+
+                                this->setCursor(Qt::OpenHandCursor);
+                            }
+
+                        } */
+
+            //   }
+            py += h + graphSpacer;
+        }
+
+}
+
+Layer * gGraphView::findLayer(gGraph * graph, LayerType type)
+{
+    for (int i=0; i< graph->layers().size(); i++) {
+        Layer * l = graph->layers()[i];
+        if (l->layerType() == type) {
+            return l;
+        }
+    }
+    return nullptr;
+}
+
+class MyWidgetAction : public QWidgetAction
+{
+public:
+    MyWidgetAction(ChannelID code, QObject * parent = nullptr) :QWidgetAction(parent), code(code) { chbox = nullptr; }
+protected:
+    virtual QWidget * createWidget(QWidget * parent) {
+        connect(chbox, SIGNAL(toggled(bool)), this, SLOT(setChecked(bool)));
+        connect(chbox, SIGNAL(clicked()), this, SLOT(trigger()));
+
+        return chbox;
+    }
+    QCheckBox * chbox;
+    ChannelID code;
+};
+
+
+MinMaxWidget::MinMaxWidget(gGraph * graph, QWidget *parent)
+:QWidget(parent), graph(graph)
+{
+    step = 1;
+    createLayout();
+}
+
+void MinMaxWidget::onMinChanged(double d)
+{
+    graph->rec_miny = d;
+    graph->timedRedraw(0);
+}
+void MinMaxWidget::onMaxChanged(double d)
+{
+    graph->rec_maxy = d;
+    graph->timedRedraw(0);
+}
+void MinMaxWidget::onResetClicked()
+{
+    int tmp = graph->zoomY();
+    graph->setZoomY(0);
+    EventDataType miny = graph->MinY(),
+                  maxy = graph->MaxY();
+
+    graph->roundY(miny, maxy);
+    setMin(graph->rec_miny = miny);
+    setMax(graph->rec_maxy = maxy);
+
+    float r = maxy-miny;
+    if (r > 400) {
+        step = 50;
+    } else if (r > 100) {
+        step = 10;
+    } else if (r > 50) {
+        step = 5;
+    } else {
+        step = 1;
+    }
+
+    graph->setZoomY(tmp);
+}
+
+void MinMaxWidget::onComboChanged(int idx)
+{
+    minbox->setEnabled(idx == 2);
+    maxbox->setEnabled(idx == 2);
+    reset->setEnabled(idx == 2);
+
+    graph->setZoomY(idx);
+
+    if (idx == 2) {
+        if (qAbs(graph->rec_maxy - graph->rec_miny) < 0.0001) {
+            onResetClicked();
+        }
+    }
+}
+
+void MinMaxWidget::createLayout()
+{
+
+
+    QGridLayout * layout = new QGridLayout;
+    layout->setMargin(4);
+    layout->setSpacing(4);
+
+    combobox = new QComboBox(this);
+    combobox->addItem(tr("Auto-Fit"), 0);
+    combobox->addItem(tr("Defaults"), 1);
+    combobox->addItem(tr("Override"), 2);
+    combobox->setToolTip(tr("The Y-Axis scaling mode, 'Auto-Fit' for automatic scaling, 'Defaults' for settings according to manufacturer, and 'Override' to choose your own."));
+    connect(combobox, SIGNAL(activated(int)), this, SLOT(onComboChanged(int)));
+
+    minbox = new QDoubleSpinBox(this);
+    maxbox = new QDoubleSpinBox(this);
+
+    minbox->setToolTip(tr("The Minimum Y-Axis value.. Note this can be a negative number if you wish."));
+    maxbox->setToolTip(tr("The Maximum Y-Axis value.. Must be greater than Minimum to work."));
+
+    int idx = graph->zoomY();
+    combobox->setCurrentIndex(idx);
+
+    minbox->setEnabled(idx == 2);
+    maxbox->setEnabled(idx == 2);
+
+    minbox->setAlignment(Qt::AlignRight);
+    maxbox->setAlignment(Qt::AlignRight);
+
+    minbox->setMinimum(-9999.0);
+    maxbox->setMinimum(-9999.0);
+    minbox->setMaximum(9999.99);
+    maxbox->setMaximum(9999.99);
+    setMin(graph->rec_miny);
+    setMax(graph->rec_maxy);
+
+    float r = graph->rec_maxy - graph->rec_miny;
+    if (r > 400) {
+        step = 50;
+    } else if (r > 100) {
+        step = 10;
+    } else if (r > 50) {
+        step = 5;
+    } else {
+        step = 1;
+    }
+
+    minbox->setSingleStep(step);
+    maxbox->setSingleStep(step);
+
+    connect(minbox, SIGNAL(valueChanged(double)), this, SLOT(onMinChanged(double)));
+    connect(maxbox, SIGNAL(valueChanged(double)), this, SLOT(onMaxChanged(double)));
+
+    QLabel * label = new QLabel(tr("Scaling Mode"));
+    QFont font = label->font();
+    font.setBold(true);
+    label->setFont(font);
+    label->setAlignment(Qt::AlignCenter);
+    layout->addWidget(label,0,0);
+    layout->addWidget(combobox,1,0);
+
+    label = new QLabel(STR_TR_Min);
+    label->setFont(font);
+    label->setAlignment(Qt::AlignCenter);
+    layout->addWidget(label,0,1);
+    layout->addWidget(minbox,1,1);
+
+    label = new QLabel(STR_TR_Max);
+    label->setFont(font);
+    label->setAlignment(Qt::AlignCenter);
+    layout->addWidget(label,0,2);
+    layout->addWidget(maxbox,1,2);
+
+    reset = new QToolButton(this);
+    reset->setIcon(QIcon(":/icons/refresh.png"));
+    reset->setToolTip(tr("This button resets the Min and Max to match the Auto-Fit"));
+    reset->setEnabled(idx == 2);
+
+    layout->addWidget(reset,1,3);
+    connect(reset, SIGNAL(clicked()), this, SLOT(onResetClicked()));
+    this->setLayout(layout);
+}
+
+void gGraphView::populateMenu(gGraph * graph)
+{
+    QAction * action;
+
+
+    if (graph->isSnapshot()) {
+        snap_action->setText(tr("Remove Clone"));
+        snap_action->setData(graph->name()+"|remove");
+       // zoom100_action->setVisible(false);
+    } else {
+        snap_action->setText(tr("Clone %1 Graph").arg(graph->title()));
+        snap_action->setData(graph->name()+"|snapshot");
+      //  zoom100_action->setVisible(true);
+    }
+
+
+    // Menu title fonts
+    QFont font = QApplication::font();
+    font.setBold(true);
+    font.setPointSize(font.pointSize() + 3);
+
+    gLineChart * lc = dynamic_cast<gLineChart *>(findLayer(graph,LT_LineChart));
+    SummaryChart * sc = dynamic_cast<SummaryChart *>(findLayer(graph,LT_SummaryChart));
+    gSummaryChart * stg = dynamic_cast<gSummaryChart *>(findLayer(graph,LT_Overview));
+
+
+    limits_menu->clear();
+    if (lc || sc || stg) {
+        QWidgetAction * widget = new QWidgetAction(this);
+        MinMaxWidget * minmax = new MinMaxWidget(graph, this);
+
+        widget->setDefaultWidget(minmax);
+
+        limits_menu->addAction(widget);
+        limits_menu->menuAction()->setVisible(true);
+    } else {
+        limits_menu->menuAction()->setVisible(false);
+    }
+
+
+    // First check for any linechart for this graph..
+    if (lc) {
+        lines_menu->clear();
+        for (int i=0; i < lc->m_dotlines.size(); i++) {
+            DottedLine & dot = lc->m_dotlines[i];
+
+            if (!lc->m_enabled[dot.code]) continue;
+
+            schema::Channel &chan = schema::channel[dot.code];
+
+            if (dot.available) {
+
+                QWidgetAction * widget = new QWidgetAction(context_menu);
+
+                QCheckBox *chbox = new QCheckBox(chan.calc[dot.type].label(), context_menu);
+                chbox->setMouseTracking(true);
+                chbox->setStyleSheet(QString("QCheckBox:hover { background: %1; }").arg(QApplication::palette().highlight().color().name()));
+
+                widget->setDefaultWidget(chbox);
+
+                widget->setCheckable(true);
+                widget->setData(QString("%1|%2").arg(graph->name()).arg(i));
+
+                connect(chbox, SIGNAL(toggled(bool)), widget, SLOT(setChecked(bool)));
+                connect(chbox, SIGNAL(clicked()), widget, SLOT(trigger()));
+
+                bool b = lc->m_dot_enabled[dot.code][dot.type]; //chan.calc[dot.type].enabled;
+                chbox->setChecked(b);
+                lines_menu->addAction(widget);
+
+
+
+//                QAction *action = lines_menu->addAction(chan.calc[dot.type].label());
+//                action->setData(graph->name());
+//                action->setCheckable(true);
+//                action->setChecked(chan.calc[dot.type].enabled);
+            }
+
+        }
+
+        lines_menu->menuAction()->setVisible(lines_menu->actions().size() > 0);
+
+        if (lines_menu->actions().size() > 0) {
+            lines_menu->insertSeparator(lines_menu->actions()[0]);
+            action = new QAction(QObject::tr("%1").arg(graph->title()), lines_menu);
+            lines_menu->insertAction(lines_menu->actions()[0], action);
+            action->setFont(font);
+            action->setData(QString(""));
+            action->setEnabled(false);
+
+        }
+
+
+
+        //////////////////////////////////////////////////////////////////////////////////////
+        // Populate Plots Menus
+        //////////////////////////////////////////////////////////////////////////////////////
+
+        plots_menu->clear();
+
+        if (lc->m_codes.size() > 1) {
+            for (int i=0; i <lc->m_codes.size(); ++i) {
+                ChannelID code = lc->m_codes[i];
+                if (lc->m_day && !lc->m_day->channelHasData(code)) continue;
+
+                QWidgetAction * widget = new QWidgetAction(context_menu);
+
+                QCheckBox *chbox = new QCheckBox(schema::channel[code].label(), context_menu);
+                chbox->setMouseTracking(true);
+                chbox->setToolTip(schema::channel[code].description());
+                chbox->setStyleSheet(QString("QCheckBox:hover { background: %1; }").arg(QApplication::palette().highlight().color().name()));
+
+
+                widget->setDefaultWidget(chbox);
+
+                widget->setCheckable(true);
+                widget->setData(QString("%1|%2").arg(graph->name()).arg(code));
+
+                connect(chbox, SIGNAL(toggled(bool)), widget, SLOT(setChecked(bool)));
+                connect(chbox, SIGNAL(clicked()), widget, SLOT(trigger()));
+
+                bool b = lc->m_enabled[code];
+                chbox->setChecked(b);
+
+                plots_menu->addAction(widget);
+
+//                QAction * action = plots_menu->addAction(schema::channel[code].label());
+//                action->setData(QString("%1|%2").arg(graph->name()).arg(code));
+//                action->setCheckable(true);
+//                action->setChecked(lc->m_enabled[code]);
+            }
+        }
+
+        plots_menu->menuAction()->setVisible((plots_menu->actions().size() > 1));
+
+        if (plots_menu->actions().size() > 0) {
+            plots_menu->insertSeparator(plots_menu->actions()[0]);
+            action = new QAction(QObject::tr("%1").arg(graph->title()), plots_menu);
+            plots_menu->insertAction(plots_menu->actions()[0], action);
+
+            action->setFont(font);
+            action->setData(QString(""));
+            action->setEnabled(false);
+        }
+
+        //////////////////////////////////////////////////////////////////////////////////////
+        // Populate Event Menus
+        //////////////////////////////////////////////////////////////////////////////////////
+        oximeter_menu->clear();
+        cpap_menu->clear();
+
+        using namespace schema;
+        quint32 showflags = schema::FLAG | schema::MINOR_FLAG | schema::SPAN;
+        if (p_profile->general->showUnknownFlags()) showflags |= schema::UNKNOWN;
+        QList<ChannelID> chans = lc->m_day->getSortedMachineChannels(showflags);
+
+
+        QHash<MachineType, int> Vis;
+        for (int i=0; i < chans.size() ; ++i) {
+            ChannelID code = chans.at(i);
+            schema::Channel & chan = schema::channel[code];
+
+            QWidgetAction * widget = new QWidgetAction(context_menu);
+
+            QCheckBox *chbox = new QCheckBox(schema::channel[code].fullname(), context_menu);
+            chbox->setPalette(context_menu->palette());
+            chbox->setMouseTracking(true);
+            chbox->setToolTip(schema::channel[code].description());
+            chbox->setStyleSheet(QString("QCheckBox:hover { background: %1; }").arg(QApplication::palette().highlight().color().name()));
+
+
+            widget->setDefaultWidget(chbox);
+
+            widget->setCheckable(true);
+            widget->setData(QString("%1|%2").arg(graph->name()).arg(code));
+
+            connect(chbox, SIGNAL(toggled(bool)), widget, SLOT(setChecked(bool)));
+            connect(chbox, SIGNAL(clicked()), widget, SLOT(trigger()));
+
+            bool b = lc->m_flags_enabled[code];
+            chbox->setChecked(b);
+            Vis[chan.machtype()] += b ? 1 : 0;
+
+
+            action = nullptr;
+            if (chan.machtype() == MT_OXIMETER) {
+                oximeter_menu->insertAction(nullptr, widget);
+            } else if ( chan.machtype() == MT_CPAP) {
+                cpap_menu->insertAction(nullptr,widget);
+            }
+        }
+
+        QString HideAllEvents = QObject::tr("Hide All Events");
+        QString ShowAllEvents = QObject::tr("Show All Events");
+
+        oximeter_menu->menuAction()->setVisible(oximeter_menu->actions().size() > 0);
+        cpap_menu->menuAction()->setVisible(cpap_menu->actions().size() > 0);
+
+
+        if (cpap_menu->actions().size() > 0) {
+            cpap_menu->addSeparator();
+            if (Vis[MT_CPAP] > 0) {
+                action = cpap_menu->addAction(HideAllEvents);
+                action->setData(QString("%1|HideAll:CPAP").arg(graph->name()));
+            } else {
+                action = cpap_menu->addAction(ShowAllEvents);
+                action->setData(QString("%1|ShowAll:CPAP").arg(graph->name()));
+            }
+
+
+            // Show CPAP Events menu Header...
+            cpap_menu->insertSeparator(cpap_menu->actions()[0]);
+            action = new QAction(QObject::tr("%1").arg(graph->title()), cpap_menu);
+            cpap_menu->insertAction(cpap_menu->actions()[0], action);
+            action->setFont(font);
+            action->setData(QString(""));
+            action->setEnabled(false);
+        }
+        if (oximeter_menu->actions().size() > 0) {
+            oximeter_menu->addSeparator();
+            if (Vis[MT_OXIMETER] > 0) {
+                action = oximeter_menu->addAction(HideAllEvents);
+                action->setData(QString("%1|HideAll:OXI").arg(graph->name()));
+            } else {
+                action = oximeter_menu->addAction(ShowAllEvents);
+                action->setData(QString("%1|ShowAll:OXI").arg(graph->name()));
+            }
+
+            oximeter_menu->insertSeparator(oximeter_menu->actions()[0]);
+            action = new QAction(QObject::tr("%1").arg(graph->title()), oximeter_menu);
+            oximeter_menu->insertAction(oximeter_menu->actions()[0], action);
+            action->setFont(font);
+            action->setData(QString(""));
+            action->setEnabled(false);
+        }
+
+    } else {
+        lines_menu->clear();
+        lines_menu->menuAction()->setVisible(false);
+        plots_menu->clear();
+        plots_menu->menuAction()->setVisible(false);
+        oximeter_menu->clear();
+        oximeter_menu->menuAction()->setVisible(false);
+        cpap_menu->clear();
+        cpap_menu->menuAction()->setVisible(false);
+    }
+}
+
+void gGraphView::onSnapshotGraphToggle()
+{
+    QString name = snap_action->data().toString().section("|",0,0);
+    QString cmd = snap_action->data().toString().section("|",-1).toLower();
+    QHash<QString, gGraph *>::iterator it = m_graphsbyname.find(name);
+    if (it == m_graphsbyname.end()) return;
+
+    gGraph * graph = it.value();
+
+    if (cmd == "snapshot") {
+
+        QString basename = name+";";
+        if (graph->m_day) {
+            QDateTime date = QDateTime::fromMSecsSinceEpoch(graph->min_x);
+            basename += date.date().toString(Qt::SystemLocaleLongDate);
+        }
+        QString newname;
+
+        // Find a new name.. How many snapshots for each graph counts as stupid?
+        for (int i=1;i < 100;i++) {
+            newname = basename+" ("+QString::number(i)+")";
+
+            it = m_graphsbyname.find(newname);
+            if (it == m_graphsbyname.end()) {
+                break;
+            }
+        }
+
+        QString newtitle;
+        bool fnd = false;
+        // someday, some clown will keep adding new graphs to break this..
+        for (int i=1; i < 100; i++) {
+            newtitle = graph->title()+"-"+QString::number(i);
+            fnd = false;
+            for (int j=0; j<m_graphs.size(); ++j) {
+                if (m_graphs[j]->title() == newtitle) {
+                    fnd = true;
+                    break;
+                }
+            }
+            if (!fnd) break;
+        }
+        if (fnd) {
+            // holy crap.. what patience. but not what I meant by as many as you like ;)
+            return;
+        }
+
+
+        gGraph * newgraph = new gGraph(newname, nullptr, newtitle, graph->units(), graph->height(), graph->group());
+       // newgraph->setBlockSelect(true);
+        newgraph->setHeight(graph->height());
+
+        short group = 0;
+        m_graphs.insert(m_graphs.indexOf(graph)+1, newgraph);
+        m_graphsbyname[newname] = newgraph;
+        newgraph->m_graphview = this;
+
+        for (int i=0; i < graph->m_layers.size(); ++i) {
+            Layer * layer = graph->m_layers.at(i)->Clone();
+            if (layer) {
+                newgraph->m_layers.append(layer);
+            }
+        }
+
+        for (int i=0;i<m_graphs.size();i++) {
+            gGraph *g = m_graphs.at(i);
+            group = qMax(g->group(), group);
+        }
+        newgraph->setGroup(group+1);
+        //newgraph->setMinHeight(pm.height());
+
+        newgraph->setDay(graph->m_day);
+        if (graph->m_day) {
+            graph->m_day->incUseCounter();
+        }
+        newgraph->min_x = graph->min_x;
+        newgraph->max_x = graph->max_x;
+        if (graph->blockZoom()) {
+            newgraph->setBlockZoom(graph->blockZoom());
+            newgraph->setBlockSelect(true);
+        }
+        if (graph->blockSelect()) {
+            newgraph->setBlockSelect(true);
+        }
+        newgraph->setZoomY(graph->zoomY());
+
+        newgraph->setSnapshot(true);
+
+        emit GraphsChanged();
+
+//        addGraph(newgraph);
+        updateScale();
+        timedRedraw(0);
+    } else if (cmd == "remove") {
+        if (graph->m_day) {
+            graph->m_day->decUseCounter();
+            if (graph->m_day->useCounter() == 0) {
+            }
+        }
+        m_graphsbyname.remove(graph->name());
+        m_graphs.removeAll(it.value());
+        delete graph;
+
+
+        updateScale();
+        timedRedraw(0);
+
+        emit GraphsChanged();
+    }
+    qDebug() << cmd << name;
+}
+
+bool gGraphView::hasSnapshots()
+{
+    int size = m_graphs.size();
+    bool snap = false;
+    for (int i=0; i< size; ++i) {
+        gGraph * graph = m_graphs.at(i);
+        if (graph->isSnapshot()) {
+            snap = true;
+            break;
+        }
+    }
+    return snap;
+}
+
+
+void gGraphView::onPlotsClicked(QAction *action)
+{
+    QString name = action->data().toString().section("|",0,0);
+    ChannelID code = action->data().toString().section("|",-1).toInt();
+
+    QHash<QString, gGraph *>::iterator it = m_graphsbyname.find(name);
+    if (it == m_graphsbyname.end()) return;
+
+    gGraph * graph = it.value();
+
+    gLineChart * lc = dynamic_cast<gLineChart *>(findLayer(graph, LT_LineChart));
+
+    if (!lc) return;
+
+    lc->m_enabled[code] = !lc->m_enabled[code];
+    graph->min_y = graph->MinY();
+    graph->max_y = graph->MaxY();
+    graph->timedRedraw(0);
+//    lc->Miny();
+//    lc->Maxy();
+}
+
+void gGraphView::onOverlaysClicked(QAction *action)
+{
+    QString name = action->data().toString().section("|",0,0);
+    QString data = action->data().toString().section("|",-1);
+    QHash<QString, gGraph *>::iterator it = m_graphsbyname.find(name);
+    if (it == m_graphsbyname.end()) return;
+    gGraph * graph = it.value();
+
+    gLineChart * lc = dynamic_cast<gLineChart *>(findLayer(graph, LT_LineChart));
+
+    if (!lc) return;
+
+    bool ok;
+    ChannelID code = data.toInt(&ok);
+    if (ok) {
+        // Just toggling a flag on/off
+        bool b = ! lc->m_flags_enabled[code];
+        lc->m_flags_enabled[code] = b;
+        QWidgetAction * widget = qobject_cast<QWidgetAction *>(action);
+        if (widget) {
+            widget->setChecked(b);
+        }
+        timedRedraw(0);
+        return;
+    }
+
+    QString hideall = data.section(":",0,0);
+
+    if ((hideall == "HideAll") || (hideall == "ShowAll")) {
+
+        bool value = (hideall == "HideAll") ? false : true;
+        QString group = data.section(":",-1).toUpper();
+        MachineType mtype;
+        if (group == "CPAP") mtype = MT_CPAP;
+        else if (group == "OXI") mtype = MT_OXIMETER;
+        else mtype = MT_UNKNOWN;
+
+        QHash<ChannelID, bool>::iterator it;
+        QHash<ChannelID, bool>::iterator mfe = lc->m_flags_enabled.end();
+
+        // First toggle the actual flag bits
+        for (it = lc->m_flags_enabled.begin(); it != mfe; ++it) {
+            if (schema::channel[it.key()].machtype() == mtype) {
+                lc->m_flags_enabled[it.key()] = value;
+            }
+        }
+
+        // Now toggle the menu actions.. bleh
+        if (mtype == MT_CPAP) {
+            for (int i=0; i< cpap_menu->actions().size(); i++) {
+                if (cpap_menu->actions().at(i)->isCheckable())  {
+                    cpap_menu->actions().at(i)->setChecked(value);
+                }
+            }
+        } else if (mtype == MT_OXIMETER) {
+            for (int i=0; i< oximeter_menu->actions().size(); i++) {
+                if (oximeter_menu->actions().at(i)->isCheckable())  {
+                    oximeter_menu->actions().at(i)->setChecked(value);
+                }
+            }
+        }
+    }
+
+}
+
+
+void gGraphView::onLinesClicked(QAction *action)
+{
+    QString name = action->data().toString().section("|",0,0);
+    QString data = action->data().toString().section("|",-1);
+
+    QHash<QString, gGraph *>::iterator it = m_graphsbyname.find(name);
+    if (it == m_graphsbyname.end()) return;
+
+    gGraph * graph = it.value();
+
+    gLineChart * lc = dynamic_cast<gLineChart *>(findLayer(graph, LT_LineChart));
+
+    if (!lc) return;
+
+    bool ok;
+    int i = data.toInt(&ok);
+    if (ok) {
+        DottedLine & dot = lc->m_dotlines[i];
+        schema::Channel &chan = schema::channel[dot.code];
+
+        chan.calc[dot.type].enabled = !chan.calc[dot.type].enabled;
+        lc->m_dot_enabled[dot.code][dot.type] = !lc->m_dot_enabled[dot.code][dot.type];
+
+    }
+    timedRedraw(0);
+}
+
+
+void gGraphView::mousePressEvent(QMouseEvent *event)
+{
+    int x = event->x();
+    int y = event->y();
+
+    float h, pinned_height = 0, py = 0;
+
+    bool done = false;
+
+    // first handle pinned graphs.
+    // Calculate total height of all pinned graphs
+    for (int i = 0; i < m_graphs.size(); i++) {
+        gGraph *g = m_graphs[i];
+
+        if (!g || g->isEmpty() || !g->visible() || !g->isPinned()) {
+            continue;
+        }
+
+        h = g->height() * m_scaleY;
+        pinned_height += h + graphSpacer;
+
+        if (py > height()) {
+            break;
+        }
+
+        if ((py + h + graphSpacer) >= 0) {
+            if ((y >= py + h - 1) && (y <= py + h + graphSpacer)) {
+                this->setCursor(Qt::SplitVCursor);
+                m_sizer_dragging = true;
+                m_sizer_index = i;
+                m_sizer_point.setX(x);
+                m_sizer_point.setY(y);
+                done = true;
+            } else if ((y >= py) && (y < py + h)) {
+                //qDebug() << "Clicked" << i;
+                if ((event->button() == Qt::LeftButton) && (x < titleWidth + 20)) {
+                    // clicked on title to drag graph..
+                    // Note: reorder has to be limited to pinned graphs.
+                    m_graph_dragging = true;
+                    m_tooltip->cancel();
+
+                    timedRedraw(50);
+                    m_graph_index = i;
+                    m_sizer_point.setX(x);
+                    m_sizer_point.setY(py); // point at top of graph..
+                    this->setCursor(Qt::ClosedHandCursor);
+                    done=true;
+                } else if ((event->button() == Qt::RightButton) && (x < (titleWidth + gYAxis::Margin))) {
+                    this->setCursor(Qt::ArrowCursor);
+                    pin_action->setText(QObject::tr("Unpin %1 Graph").arg(g->title()));
+                    pin_graph = g;
+                    populateMenu(g);
+                    context_menu->popup(event->globalPos());
+                    done=true;
+                } else if (!g->blockSelect()) {
+                    if (m_metaselect) {
+                        if (m_selected_graph) {
+                            m_selected_graph->m_selecting_area = false;
+                        }
+                    }
+                    // send event to graph..
+                    m_point_clicked = QPoint(event->x(), event->y());
+
+                    //QMouseEvent e(event->type(),m_point_clicked,event->button(),event->buttons(),event->modifiers());
+
+
+                    m_button_down = true;
+                    m_metaselect = event->modifiers() && Qt::AltModifier;
+                    m_horiz_travel = 0;
+                    m_graph_index = i;
+                    m_selected_graph = g;
+                    g->mousePressEvent(event);
+                }
+
+                done = true;
+            }
+
+        }
+
+        py += h + graphSpacer;
+    }
+
+
+
+    // then handle the remainder...
+    py = -m_offsetY;
+    py += pinned_height;
+
+    if (!done)
+        for (int i = 0; i < m_graphs.size(); i++) {
+            gGraph * g = m_graphs[i];
+            if (!g) continue;
+
+            if (!g || g->isEmpty() || !g->visible() || g->isPinned()) { continue; }
+
+            h = g->height() * m_scaleY;
+
+            if (py > height()) {
+                break;
+            }
+
+            if ((py + h + graphSpacer) >= 0) {
+                if ((y >= py + h - 1) && (y <= py + h + graphSpacer)) {
+                    this->setCursor(Qt::SplitVCursor);
+                    m_sizer_dragging = true;
+                    m_sizer_index = i;
+                    m_sizer_point.setX(x);
+                    m_sizer_point.setY(y);
+                    //qDebug() << "Sizer clicked" << i;
+                    done=true;
+                } else if ((y >= py) && (y < py + h)) {
+                    //qDebug() << "Clicked" << i;
+
+                    if ((event->button() == Qt::LeftButton) && (x < (titleWidth + 20))) { // clicked on title to drag graph..
+                        m_graph_dragging = true;
+                        m_tooltip->cancel();
+                        redraw();
+                        m_graph_index = i;
+                        m_sizer_point.setX(x);
+                        m_sizer_point.setY(py); // point at top of graph..
+                        this->setCursor(Qt::ClosedHandCursor);
+                        done=true;
+                    } else if ((event->button() == Qt::RightButton) && (x < (titleWidth + gYAxis::Margin))) {
+                        this->setCursor(Qt::ArrowCursor);
+                        pin_action->setText(QObject::tr("Pin %1 Graph").arg(g->title()));
+                        pin_graph = g;
+                        populateMenu(g);
+
+                        context_menu->popup(event->globalPos());
+                        done=true;
+                    } else if (!g->blockSelect()) {
+                       if (m_metaselect) {
+                            if (m_selected_graph) {
+                                m_selected_graph->m_selecting_area = false;
+                            }
+                        }
+                        // send event to graph..
+                        m_point_clicked = QPoint(event->x(), event->y());
+                        //QMouseEvent e(event->type(),m_point_clicked,event->button(),event->buttons(),event->modifiers());
+                        m_button_down = true;
+                        m_metaselect = event->modifiers() && Qt::AltModifier;
+
+                        m_horiz_travel = 0;
+                        m_graph_index = i;
+                        m_selected_graph = g;
+                        g->mousePressEvent(event);
+                    }
+                }
+
+            }
+
+            py += h + graphSpacer;
+            done=true;
+        }
+
+    if (!done) {
+//        if (event->button() == Qt::RightButton) {
+//            this->setCursor(Qt::ArrowCursor);
+//            context_menu->popup(event->globalPos());
+//            done=true;
+//        }
+    }
+}
+
+void gGraphView::mouseReleaseEvent(QMouseEvent *event)
+{
+
+    int x = event->x();
+    int y = event->y();
+
+    float h, py = 0, pinned_height = 0;
+    bool done = false;
+
+
+    // Copy to a local variable to make sure this gets cleared
+    bool button_down = m_button_down;
+    m_button_down = false;
+
+    // Handle pinned graphs first
+    for (int i = 0; i < m_graphs.size(); i++) {
+        gGraph *g = m_graphs[i];
+
+        if (!g || g->isEmpty() || !g->visible() || !g->isPinned()) {
+            continue;
+        }
+
+        h = g->height() * m_scaleY;
+        pinned_height += h + graphSpacer;
+
+        if (py > height()) {
+            break;    // we are done.. can't draw anymore
+        }
+
+        if ((y >= py + h - 1) && (y < (py + h + graphSpacer))) {
+            this->setCursor(Qt::SplitVCursor);
+            done = true;
+        } else if ((y >= py + 1) && (y <= py + h)) {
+
+            //            if (!m_sizer_dragging && !m_graph_dragging) {
+            //               g->mouseReleaseEvent(event);
+            //            }
+
+            if (x >= titleWidth + 10) {
+                this->setCursor(Qt::ArrowCursor);
+            } else {
+                this->setCursor(Qt::OpenHandCursor);
+            }
+
+            done = true;
+        }
+
+        py += h + graphSpacer;
+    }
+
+    // Now do the unpinned ones
+    py = -m_offsetY;
+    py += pinned_height;
+
+    if (done)
+        for (int i = 0; i < m_graphs.size(); i++) {
+            gGraph *g = m_graphs[i];
+
+            if (!g || g->isEmpty() || !g->visible() || g->isPinned()) {
+                continue;
+            }
+
+            h = g->height() * m_scaleY;
+
+            if (py > height()) {
+                break;    // we are done.. can't draw anymore
+            }
+
+            if ((y >= py + h - 1) && (y < (py + h + graphSpacer))) {
+                this->setCursor(Qt::SplitVCursor);
+            } else if ((y >= py + 1) && (y <= py + h)) {
+
+                //            if (!m_sizer_dragging && !m_graph_dragging) {
+                //                g->mouseReleaseEvent(event);
+                //            }
+
+                if (x >= titleWidth + 10) {
+                    this->setCursor(Qt::ArrowCursor);
+                } else {
+                    this->setCursor(Qt::OpenHandCursor);
+                }
+            }
+
+            py += h + graphSpacer;
+        }
+
+    if (m_sizer_dragging) {
+        m_sizer_dragging = false;
+        return;
+    }
+
+    if (m_graph_dragging) {
+        m_graph_dragging = false;
+
+        // not sure why the cursor code doesn't catch this..
+        if (x >= titleWidth + 10) {
+            this->setCursor(Qt::ArrowCursor);
+        } else {
+            this->setCursor(Qt::OpenHandCursor);
+        }
+
+        return;
+    }
+
+    // The graph that got the button press gets the release event
+    if (button_down) {
+//        m_button_down = false;
+        m_metaselect = event->modifiers() & Qt::AltModifier;
+        saveHistory();
+
+        if (m_metaselect) {
+            m_point_released = event->pos();
+        } else {
+            if ((m_graph_index >= 0) && (m_graphs[m_graph_index])) {
+                m_graphs[m_graph_index]->mouseReleaseEvent(event);
+            }
+        }
+    }
+    timedRedraw(0);
+}
+
+void gGraphView::keyReleaseEvent(QKeyEvent *event)
+{
+    if (m_metaselect && !(event->modifiers() & Qt::AltModifier)) {
+        QMouseEvent mevent(QEvent::MouseButtonRelease, m_point_released, Qt::LeftButton, Qt::LeftButton, event->modifiers());
+        if (m_graph_index>=0) {
+            m_graphs[m_graph_index]->mouseReleaseEvent(&mevent);
+        }
+
+        m_metaselect = false;
+
+        timedRedraw(50);
+    }
+    if (event->key() == Qt::Key_Escape) {
+        if (history.size() > 0) {
+            SelectionHistoryItem h = history.takeFirst();
+            SetXBounds(h.minx, h.maxx);
+
+            // could Forward push this to another list?
+        } else {
+            ResetBounds();
+
+        }
+        return;
+    }
+#ifdef BROKEN_OPENGL_BUILD
+        QWidget::keyReleaseEvent(event);
+#else
+        QGLWidget::keyReleaseEvent(event);
+#endif
+}
+
+
+void gGraphView::mouseDoubleClickEvent(QMouseEvent *event)
+{
+    mousePressEvent(event); // signal missing.. a qt change might "fix" this if we are not careful.
+
+    int x = event->x();
+    int y = event->y();
+
+    float h, py = 0, pinned_height = 0;
+    bool done = false;
+
+    // Handle pinned graphs first
+    for (int i = 0; i < m_graphs.size(); i++) {
+        gGraph *g = m_graphs[i];
+        if (!g || g->isEmpty() || !g->visible() || !g->isPinned()) {
+            continue;
+        }
+
+        h = g->height() * m_scaleY;
+        pinned_height += h + graphSpacer;
+
+        if (py > height()) {
+            break;    // we are done.. can't draw anymore
+        }
+
+        if ((py + h + graphSpacer) >= 0) {
+            if ((y >= py) && (y <= py + h)) {
+                if (x < titleWidth) {
+                    // What to do when double clicked on the graph title ??
+
+                    g->mouseDoubleClickEvent(event);
+                    // pin the graph??
+                    g->setPinned(false);
+                    redraw();
+                } else {
+                    // send event to graph..
+                    g->mouseDoubleClickEvent(event);
+                }
+
+                done = true;
+            } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) {
+                // What to do when double clicked on the resize handle?
+                done = true;
+            }
+        }
+
+        py += h;
+        py += graphSpacer; // do we want the extra spacer down the bottom?
+    }
+
+
+    py = -m_offsetY;
+    py += pinned_height;
+
+    if (!done) // then handle unpinned graphs
+        for (int i = 0; i < m_graphs.size(); i++) {
+            gGraph *g = m_graphs[i];
+            if (!g || g->isEmpty() || !g->visible() || g->isPinned()) {
+                continue;
+            }
+
+            h = g->height() * m_scaleY;
+
+            if (py > height()) {
+                break;
+            }
+
+            if ((py + h + graphSpacer) >= 0) {
+                if ((y >= py) && (y <= py + h)) {
+                    if (x < titleWidth) {
+                        // What to do when double clicked on the graph title ??
+                        g->mouseDoubleClickEvent(event);
+
+                        g->setPinned(true);
+                        redraw();
+                    } else {
+                        // send event to graph..
+                        g->mouseDoubleClickEvent(event);
+                    }
+                } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) {
+                    // What to do when double clicked on the resize handle?
+                }
+
+            }
+
+            py += h;
+            py += graphSpacer; // do we want the extra spacer down the bottom?
+        }
+}
+
+void gGraphView::wheelEvent(QWheelEvent *event)
+{
+    // Hmm.. I could optionalize this to change mousewheel behaviour without affecting the scrollbar now..
+
+    if (m_button_down)
+        return;
+
+    if (event->modifiers() == Qt::NoModifier) {
+        int scrollDampening = p_profile->general->scrollDampening();
+
+        if (event->orientation() == Qt::Vertical) { // Vertical Scrolling
+            if (horizScrollTime.elapsed() < scrollDampening) {
+                return;
+            }
+
+            if (m_scrollbar)
+                m_scrollbar->SendWheelEvent(event); // Just forwarding the event to scrollbar for now..
+            m_tooltip->cancel();
+            vertScrollTime.start();
+            return;
+        }
+
+        // (This is a total pain in the butt on MacBook touchpads..)
+
+        if (vertScrollTime.elapsed() < scrollDampening) {
+            return;
+        }
+        horizScrollTime.start();
+    }
+
+    gGraph *graph = nullptr;
+    int group = 0;
+    int x = event->x();
+    int y = event->y();
+
+    float h, py = 0, pinned_height = 0;
+
+
+    // Find graph hovered over
+    for (int i = 0; i < m_graphs.size(); i++) {
+        gGraph *g = m_graphs[i];
+        if (!g || g->isEmpty() || !g->visible() || !g->isPinned()) {
+            continue;
+        }
+
+        h = g->height() * m_scaleY;
+        pinned_height += h + graphSpacer;
+
+        if (py > height()) {
+            break;    // we are done.. can't draw anymore
+        }
+
+        if ((py + h + graphSpacer) >= 0) {
+            if ((y >= py) && (y <= py + h)) {
+                graph = g;
+                break;
+            } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) {
+                // What to do when double clicked on the resize handle?
+                graph = g;
+                break;
+            }
+        }
+
+        py += h;
+        py += graphSpacer; // do we want the extra spacer down the bottom?
+    }
+    if (!graph) {
+        py = -m_offsetY;
+        py += pinned_height;
+
+        for (int i = 0; i < m_graphs.size(); i++) {
+            gGraph *g = m_graphs[i];
+            if (!g || g->isEmpty() || !g->visible() || g->isPinned()) {
+                continue;
+            }
+
+            h = g->height() * m_scaleY;
+
+            if (py > height()) {
+                break;
+            }
+
+            if ((py + h + graphSpacer) >= 0) {
+                if ((y >= py) && (y <= py + h)) {
+                    graph = g;
+                    break;
+                } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) {
+                    // What to do when double clicked on the resize handle?
+                    graph = g;
+                    break;
+                }
+
+            }
+
+            py += h;
+            py += graphSpacer; // do we want the extra spacer down the bottom?
+        }
+    }
+
+
+    if (event->modifiers() == Qt::NoModifier) {
+        if (!graph) {
+            // just pick any graph then
+            for (int i = 0; i < m_graphs.size(); i++) {
+                if (!m_graphs[i]) continue;
+                if (!m_graphs[i]->isEmpty()) {
+                    graph = m_graphs[i];
+                    group = graph->group();
+                    break;
+                }
+            }
+        } else group=graph->group();
+
+        if (!graph) { return; }
+
+        double xx = (graph->max_x - graph->min_x);
+        double zoom = 240.0;
+
+        int delta = event->delta();
+
+        if (delta > 0) {
+            graph->min_x -= (xx / zoom) * (float)abs(delta);
+        } else {
+            graph->min_x += (xx / zoom) * (float)abs(delta);
+        }
+
+        graph->max_x = graph->min_x + xx;
+
+        if (graph->min_x < graph->rmin_x) {
+            graph->min_x = graph->rmin_x;
+            graph->max_x = graph->rmin_x + xx;
+        }
+
+        if (graph->max_x > graph->rmax_x) {
+            graph->max_x = graph->rmax_x;
+            graph->min_x = graph->max_x - xx;
+        }
+
+        saveHistory();
+        SetXBounds(graph->min_x, graph->max_x, group);
+
+    } else if ((event->modifiers() & Qt::ControlModifier)) {
+
+        if (graph) graph->wheelEvent(event);
+//        int x = event->x();
+//        int y = event->y();
+
+//        float py = -m_offsetY;
+//        float h;
+
+
+
+//        for (int i = 0; i < m_graphs.size(); i++) {
+//            gGraph *g = m_graphs[i];
+//            if (!g || g->isEmpty() || !g->visible()) { continue; }
+
+//            h = g->height() * m_scaleY;
+
+//            if (py > height()) {
+//                break;
+//            }
+
+//            if ((py + h + graphSpacer) >= 0) {
+//                if ((y >= py) && (y <= py + h)) {
+//                    if (x < titleWidth) {
+//                        // What to do when ctrl+wheel is used on the graph title ??
+//                    } else {
+//                        // send event to graph..
+//                        g->wheelEvent(event);
+//                    }
+//                } else if ((y >= py + h) && (y <= py + h + graphSpacer + 1)) {
+//                    // What to do when the wheel is used on the resize handle?
+//                }
+
+//            }
+
+//            py += h;
+//            py += graphSpacer; // do we want the extra spacer down the bottom?
+//        }
+    }
+}
+
+void gGraphView::getSelectionTimes(qint64 & start, qint64 & end)
+{
+    if (m_graph_index >= 0) {
+        gGraph *g = m_graphs[m_graph_index];
+        if (!g) {
+            start = 0;
+            end = 0;
+            return;
+        }
+        int x1 = g->m_selection.x() + titleWidth;
+        int x2 = x1 + g->m_selection.width();
+        start = g->screenToTime(x1);
+        end = g->screenToTime(x2);
+    }
+}
+
+void gGraphView::keyPressEvent(QKeyEvent *event)
+{
+    m_metaselect = event->modifiers() & Qt::AltModifier;
+    if (m_metaselect && ((event->key() == Qt::Key_B) || (event->key() == 8747))) {
+        if (mainwin->getDaily()->graphView() == this) {
+            if (m_graph_index >= 0) {
+                m_metaselect=false;
+                qint64 start,end;
+                getSelectionTimes(start,end);
+                QDateTime d1 = QDateTime::fromMSecsSinceEpoch(start);
+        //        QDateTime d2 = QDateTime::fromMSecsSinceEpoch(end);
+
+                mainwin->getDaily()->addBookmark(start, end, QString("Bookmark at %1").arg(d1.time().toString("HH:mm:ss")));
+                m_graphs[m_graph_index]->cancelSelection();
+                m_graph_index = -1;
+                timedRedraw(0);
+            }
+            event->accept();
+            return;
+        }
+    }
+
+    if ((m_metaselect) && (event->key() >= Qt::Key_0) && (event->key() <= Qt::Key_9)) {
+        int bk = (int)event->key()-Qt::Key_0;
+        m_metaselect = false;
+
+        timedRedraw(0);
+    }
+
+    if (event->key() == Qt::Key_F3) {
+        p_profile->appearance->setLineCursorMode(!p_profile->appearance->lineCursorMode());
+        timedRedraw(0);
+    }
+    if ((event->key() == Qt::Key_F1)) {
+        dumpInfo();
+    }
+
+    if (event->key() == Qt::Key_Tab) {
+        event->ignore();
+        return;
+    }
+
+    if (event->key() == Qt::Key_PageUp) {
+        if (m_scrollbar) {
+            m_offsetY -= p_profile->appearance->graphHeight() * 3 * m_scaleY;
+            m_scrollbar->setValue(m_offsetY);
+            m_offsetY = m_scrollbar->value();
+            redraw();
+        }
+        return;
+    } else if (event->key() == Qt::Key_PageDown) {
+        if (m_scrollbar) {
+            m_offsetY += p_profile->appearance->graphHeight() * 3 * m_scaleY; //p_profile->appearance->graphHeight();
+
+            if (m_offsetY < 0) { m_offsetY = 0; }
+
+            m_scrollbar->setValue(m_offsetY);
+            m_offsetY = m_scrollbar->value();
+            redraw();
+        }
+        return;
+        //        redraw();
+    }
+
+    gGraph *g = nullptr;
+    int group = 0;
+
+    // Pick the first valid graph in the primary group
+    for (int i = 0; i < m_graphs.size(); i++) {
+        if (m_graphs[i]->group() == group) {
+            if (!m_graphs[i]->isEmpty() && m_graphs[i]->visible()) {
+                g = m_graphs[i];
+                break;
+            }
+        }
+    }
+
+    if (!g) {
+        for (int i = 0; i < m_graphs.size(); i++) {
+            if (!m_graphs[i]->isEmpty()) {
+                g = m_graphs[i];
+                group = g->group();
+                break;
+            }
+        }
+    }
+
+    if (!g) { return; }
+
+    g->keyPressEvent(event);
+
+    if (event->key() == Qt::Key_Left) {
+        double xx = g->max_x - g->min_x;
+        double zoom = 8.0;
+
+        if (event->modifiers() & Qt::ControlModifier) { zoom /= 4; }
+
+        g->min_x -= xx / zoom;;
+        g->max_x = g->min_x + xx;
+
+        if (g->min_x < g->rmin_x) {
+            g->min_x = g->rmin_x;
+            g->max_x = g->rmin_x + xx;
+        }
+
+        saveHistory();
+        SetXBounds(g->min_x, g->max_x, group);
+    } else if (event->key() == Qt::Key_Right) {
+        double xx = g->max_x - g->min_x;
+        double zoom = 8.0;
+
+        if (event->modifiers() & Qt::ControlModifier) { zoom /= 4; }
+
+        g->min_x += xx / zoom;
+        g->max_x = g->min_x + xx;
+
+        if (g->max_x > g->rmax_x) {
+            g->max_x = g->rmax_x;
+            g->min_x = g->rmax_x - xx;
+        }
+
+        saveHistory();
+        SetXBounds(g->min_x, g->max_x, group);
+    } else if (event->key() == Qt::Key_Up) {
+        float zoom = 0.75F;
+
+        if (event->modifiers() & Qt::ControlModifier) { zoom /= 1.5; }
+
+        g->ZoomX(zoom, 0); // zoom in.
+    } else if (event->key() == Qt::Key_Down) {
+        float zoom = 1.33F;
+
+        if (event->modifiers() & Qt::ControlModifier) { zoom *= 1.5; }
+
+        g->ZoomX(zoom, 0); // Zoom out
+    }
+
+    //qDebug() << "Keypress??";
+}
+
+
+void gGraphView::setDay(Day *day)
+{
+
+    m_day = day;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        if (m_graphs[i]) m_graphs[i]->setDay(day);
+    }
+
+    ResetBounds(false);
+}
+bool gGraphView::isEmpty()
+{
+    bool res = true;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        gGraph * graph = m_graphs.at(i);
+        if (!graph->isSnapshot() && !graph->isEmpty()) {
+            res = false;
+            break;
+        }
+    }
+
+    return res;
+}
+
+void gGraphView::refreshTimeout()
+{
+    if (this->isVisible()) {
+        redraw();
+    }
+}
+void gGraphView::timedRedraw(int ms)
+{
+
+    if (timer->isActive()) {
+        if (ms == 0) {
+            timer->stop();
+        } else {
+            int m = timer->remainingTime();
+            if (m > ms) {
+                timer->stop();
+            } else return;
+       }
+    }
+    timer->setSingleShot(true);
+    timer->start(ms);
+}
+void gGraphView::resetLayout()
+{
+    int default_height = p_profile->appearance->graphHeight();
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        if (m_graphs[i]) m_graphs[i]->setHeight(default_height);
+    }
+
+    updateScale();
+    timedRedraw(0);
+}
+void gGraphView::deselect()
+{
+    for (int i = 0; i < m_graphs.size(); i++) {
+        if (m_graphs[i]) m_graphs[i]->deselect();
+    }
+}
+
+const quint32 gvmagic = 0x41756728;
+const quint16 gvversion = 4;
+
+void gGraphView::SaveSettings(QString title)
+{
+    qDebug() << "Saving" << title << "settings";
+    QString filename = p_profile->Get("{DataFolder}/") + title.toLower() + ".shg";
+    QFile f(filename);
+    f.open(QFile::WriteOnly);
+    QDataStream out(&f);
+    out.setVersion(QDataStream::Qt_4_6);
+    out.setByteOrder(QDataStream::LittleEndian);
+
+    out << (quint32)gvmagic;
+    out << (quint16)gvversion;
+
+    out << (qint16)size();
+
+    for (qint16 i = 0; i < size(); i++) {
+        gGraph * graph = m_graphs[i];
+        if (!graph) continue;
+        if (graph->isSnapshot()) continue;
+
+        out << graph->name();
+        out << graph->height();
+        out << graph->visible();
+        out << graph->RecMinY();
+        out << graph->RecMaxY();
+        out << graph->zoomY();
+        out << (bool)graph->isPinned();
+
+        gLineChart * lc = dynamic_cast<gLineChart *>(findLayer(graph, LT_LineChart));
+        if (lc) {
+            out << (quint32)LT_LineChart;
+            out << lc->m_flags_enabled;
+            out << lc->m_enabled;
+            out << lc->m_dot_enabled;
+        } else {
+            out << (quint32)LT_Other;
+        }
+
+
+    }
+
+    f.close();
+}
+
+bool gGraphView::LoadSettings(QString title)
+{
+    QString filename = p_profile->Get("{DataFolder}/") + title.toLower() + ".shg";
+    QFile f(filename);
+
+    if (!f.exists()) {
+        return false;
+    }
+
+    f.open(QFile::ReadOnly);
+    QDataStream in(&f);
+    in.setVersion(QDataStream::Qt_4_6);
+    in.setByteOrder(QDataStream::LittleEndian);
+
+    quint32 t1;
+    quint16 version;
+
+    in >> t1;
+
+    if (t1 != gvmagic) {
+        qDebug() << "gGraphView" << title << "settings magic doesn't match" << t1 << gvmagic;
+        return false;
+    }
+
+    in >> version;
+
+    if (version < gvversion) {
+        qDebug() << "gGraphView" << title << "settings will be upgraded.";
+    }
+
+    qint16 siz;
+    in >> siz;
+    QString name;
+    float hght;
+    bool vis;
+    EventDataType recminy, recmaxy;
+    bool pinned;
+
+    short zoomy = 0;
+
+    QList<gGraph *> neworder;
+    QHash<QString, gGraph *>::iterator gi;
+
+    for (int i = 0; i < siz; i++) {
+        in >> name;
+        in >> hght;
+        in >> vis;
+        in >> recminy;
+        in >> recmaxy;
+
+        if (gvversion >= 1) {
+            in >> zoomy;
+        }
+
+        if (gvversion >= 2) {
+            in >> pinned;
+        }
+
+        QHash<ChannelID, bool> flags_enabled;
+        QHash<ChannelID, bool> plots_enabled;
+        QHash<ChannelID, QHash<quint32, bool> > dot_enabled;
+
+        // Warning: Do not break the follow section up!!!
+        quint32 layertype;
+        if (gvversion >= 4) {
+            in >> layertype;
+            if (layertype == LT_LineChart) {
+                in >> flags_enabled;
+                in >> plots_enabled;
+                in >> dot_enabled;
+            }
+        }
+
+        gGraph *g = nullptr;
+
+        if (version <= 2) {
+            continue;
+//            // Names were stored as translated strings, so look up title instead.
+//            g = nullptr;
+//            for (int z=0; z<m_graphs.size(); ++z) {
+//                if (m_graphs[z]->title() == name) {
+//                    g = m_graphs[z];
+//                    break;
+//                }
+//            }
+        } else {
+            gi = m_graphsbyname.find(name);
+            if (gi == m_graphsbyname.end()) {
+                qDebug() << "Graph" << name << "has been renamed or removed";
+            } else {
+                g = gi.value();
+            }
+        }
+        if (g) {
+            neworder.push_back(g);
+            g->setHeight(hght);
+            g->setVisible(vis);
+            g->setRecMinY(recminy);
+            g->setRecMaxY(recmaxy);
+            g->setZoomY(zoomy);
+            g->setPinned(pinned);
+
+            if (gvversion >= 4) {
+                if (layertype == LT_LineChart) {
+                    gLineChart * lc = dynamic_cast<gLineChart *>(findLayer(g, LT_LineChart));
+                    if (lc) {
+                        lc->m_flags_enabled = flags_enabled;
+                        lc->m_enabled = plots_enabled;
+
+                        lc->m_dot_enabled = dot_enabled;
+                    }
+                }
+            }
+
+        }
+    }
+
+    if (neworder.size() == m_graphs.size()) {
+        m_graphs = neworder;
+    }
+
+    f.close();
+    updateScale();
+    return true;
+}
+
+gGraph *gGraphView::findGraph(QString name)
+{
+    QHash<QString, gGraph *>::iterator i = m_graphsbyname.find(name);
+
+    if (i == m_graphsbyname.end()) { return nullptr; }
+
+    return i.value();
+}
+
+gGraph *gGraphView::findGraphTitle(QString title)
+{
+    for (int i=0; i< m_graphs.size(); ++i) {
+        if (m_graphs[i]->title() == title) return m_graphs[i];
+    }
+    return nullptr;
+}
+
+int gGraphView::visibleGraphs()
+{
+    int cnt = 0;
+
+    for (int i = 0; i < m_graphs.size(); i++) {
+        if (m_graphs[i]->visible() && !m_graphs[i]->isEmpty()) { cnt++; }
+    }
+
+    return cnt;
+}
+
+void gGraphView::dataChanged()
+{
+    for (int i = 0; i < m_graphs.size(); i++) {
+        m_graphs[i]->dataChanged();
+    }
+}
+
+
+void gGraphView::redraw()
+{
+#ifdef BROKEN_OPENGL_BUILD
+    repaint();
+#else
+    updateGL();
+#endif
+}
diff --git a/sleepyhead/Graphs/gGraphView.h b/sleepyhead/Graphs/gGraphView.h
new file mode 100644
index 0000000..729f507
--- /dev/null
+++ b/sleepyhead/Graphs/gGraphView.h
@@ -0,0 +1,693 @@
+/* gGraphView Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GGRAPHVIEW_H
+#define GGRAPHVIEW_H
+
+#include <QScrollBar>
+#include <QResizeEvent>
+#include <QThread>
+#include <QMutex>
+#include <QSemaphore>
+#include <QWaitCondition>
+#include <QPixmap>
+#include <QRect>
+#include <QPixmapCache>
+#include <QMenu>
+#include <QCheckBox>
+#include <QComboBox>
+#include <QDoubleSpinBox>
+#include <QToolButton>
+#include <QTimer>
+
+#ifndef BROKEN_OPENGL_BUILD
+#include <QGLWidget>
+#endif
+
+#include <Graphs/gGraph.h>
+#include <Graphs/glcommon.h>
+#include <SleepLib/day.h>
+
+
+class MinMaxWidget:public QWidget
+{
+     Q_OBJECT
+public:
+    explicit MinMaxWidget(gGraph * graph, QWidget *parent);
+     ~MinMaxWidget() {}
+
+    void createLayout();
+
+    void setMin(double d) {
+        minbox->setValue(d);
+    }
+    void setMax(double d) {
+        maxbox->setValue(d);
+    }
+    double min() { return minbox->value(); }
+    double max() { return maxbox->value(); }
+    void setComboIndex(int i) { combobox->setCurrentIndex(i); }
+    int comboIndex() { return combobox->currentIndex(); }
+
+//    void setChecked(bool b) { checkbox->setChecked(b); }
+//    bool checked() { return checkbox->isChecked(); }
+
+public slots:
+    void onMinChanged(double d);
+    void onMaxChanged(double d);
+    void onComboChanged(int idx);
+    void onResetClicked();
+protected:
+    gGraph * graph;
+    QComboBox *combobox;
+//    QCheckBox *checkbox;
+    QDoubleSpinBox *minbox;
+    QDoubleSpinBox *maxbox;
+    double step;
+    QToolButton * reset;
+};
+
+enum FlagType { FT_Bar, FT_Dot, FT_Span };
+
+
+void setEmptyImage(QString text, QPixmap pixmap);
+
+class MyLabel:public QWidget
+{
+    Q_OBJECT
+public:
+    MyLabel(QWidget * parent);
+    virtual ~MyLabel();
+
+    void setText(QString text);
+    void setAlignment(Qt::Alignment alignment);
+
+    void setFont(QFont & font);
+    QFont & font() { return m_font; }
+
+    virtual void paintEvent(QPaintEvent *);
+
+    QFont m_font;
+    QString m_text;
+    Qt::Alignment m_alignment;
+    QTime time;
+protected slots:
+    void doRedraw();
+
+};
+
+class gGraphView;
+
+const int textque_max = 512;
+
+/*! \struct TextQue
+    \brief Holds a single item of text for the drawing queue
+    */
+struct TextQue {
+    TextQue() {
+    }
+    TextQue(short x, short y, float angle, QString text, QColor color, QFont * font, bool antialias):
+    x(x), y(y), angle(angle), text(text), color(color), font(font), antialias(antialias)
+    {
+    }
+    TextQue(const TextQue & copy) {
+        x=copy.x;
+        y=copy.y;
+        text=copy.text;
+        angle=copy.angle;
+        color=copy.color;
+        font=copy.font;
+        antialias=copy.antialias;
+    }
+
+    //! \variable contains the x axis screen position to draw the text
+    short x;
+    //! \variable contains the y axis screen position to draw the text
+    short y;
+    //! \variable the angle in degrees for drawing rotated text
+    float angle;
+    //! \variable the actual text to draw
+    QString text;
+    //! \variable the color the text will be drawn in
+    QColor color;
+    //! \variable a pointer to the QFont to use to draw this text
+    QFont *font;
+    //! \variable whether to use antialiasing to draw this text
+    bool antialias;
+};
+
+struct TextQueRect {
+    TextQueRect() {
+    }
+    TextQueRect(QRectF r, quint32 flags, QString text, float angle, QColor color, QFont * font, bool antialias):
+    rect(r), flags(flags), text(text), angle(angle), color(color), font(font), antialias(antialias)
+    {
+    }
+    TextQueRect(const TextQueRect & copy) {
+        rect = copy.rect;
+        flags = copy.flags;
+        text = copy.text;
+        angle = copy.angle;
+        color = copy.color;
+        font = copy.font;
+        antialias = copy.antialias;
+    }
+
+    //! \variable contains the QRect containing the text object
+    QRectF rect;
+    //! \variable Qt alignment flags..
+    quint32 flags;
+    //! \variable the actual text to draw
+    QString text;
+    //! \variable the angle in degrees for drawing rotated text
+    float angle;
+    //! \variable the color the text will be drawn in
+    QColor color;
+    //! \variable a pointer to the QFont to use to draw this text
+    QFont *font;
+    //! \variable whether to use antialiasing to draw this text
+    bool antialias;
+};
+
+/*! \class MyScrollBar
+    \brief An custom scrollbar to interface with gGraphWindow
+    */
+class MyScrollBar : public QScrollBar
+{
+  public:
+    MyScrollBar(QWidget *parent = nullptr)
+        : QScrollBar(parent)
+    { }
+
+    void SendWheelEvent(QWheelEvent *e) {
+        wheelEvent(e);
+    }
+};
+
+/*! \class gThread
+    \brief Part of the Threaded drawing code
+
+    This is currently broken, as Qt didn't behave anyway, and it offered no performance improvement drawing-wise
+    */
+class gThread : public QThread
+{
+  public:
+    gThread(gGraphView *g);
+    ~gThread();
+
+    //! \brief Start thread process
+    void run();
+
+    //! \brief Kill thread process
+    void die() { m_running = false; }
+    QMutex mutex;
+
+  protected:
+    gGraphView *graphview;
+    volatile bool m_running;
+};
+
+/*! \class gToolTip
+    \brief Popup Tooltip to display information over the OpenGL graphs
+    */
+class gToolTip : public QObject
+{
+    Q_OBJECT
+  public:
+    //! \brief Initializes the ToolTip object, and connects the timeout to the gGraphView object
+    gToolTip(gGraphView *graphview);
+    virtual ~gToolTip();
+
+    /*! \fn virtual void display(QString text, int x, int y, int timeout=2000);
+        \brief Set the tooltips display message, position, and timeout value
+        */
+    virtual void display(QString text, int x, int y, ToolTipAlignment align = TT_AlignCenter, int timeout = 0);
+
+    //! \brief Draw the tooltip
+    virtual void paint(QPainter &paint); //actually paints it.
+
+    //! \brief Close the tooltip early.
+    void cancel();
+
+    //! \brief Returns true if the tooltip is currently visible
+    bool visible() { return m_visible; }
+
+  protected:
+    gGraphView *m_graphview;
+    QTimer *timer;
+    QPoint m_pos;
+    int tw, th;
+    QString m_text;
+    bool m_visible;
+    int m_spacer;
+    QImage m_image;
+    bool m_invalidate;
+    ToolTipAlignment m_alignment;
+
+  protected slots:
+
+    //! \brief Timeout to hide tooltip, and redraw without it.
+    void timerDone();
+};
+
+struct SelectionHistoryItem {
+    SelectionHistoryItem() {
+        minx=maxx=0;
+    }
+    SelectionHistoryItem(quint64 m1, quint64 m2) {
+        minx=m1;
+        maxx=m2;
+    }
+
+    SelectionHistoryItem(const SelectionHistoryItem & copy) {
+        minx = copy.minx;
+        maxx = copy.maxx;
+    }
+    quint64 minx;
+    quint64 maxx;
+};
+
+/*! \class gGraphView
+    \brief Main OpenGL Graph Area, derived from QGLWidget
+
+    This widget contains a list of graphs, and provides the means to display them, scroll via an attached
+    scrollbar, change the order around, and resize individual graphs.
+
+    It replaced QScrollArea and multiple QGLWidgets graphs, and a very buggy QSplitter.
+
+    It led to quite a performance increase over the old Qt method.
+
+    */
+class gGraphView
+#ifdef BROKEN_OPENGL_BUILD
+        :public QWidget
+#else
+        :public QGLWidget
+#endif
+{
+    friend class gGraph;
+    Q_OBJECT
+  public:
+    /*! \fn explicit gGraphView(QWidget *parent = 0,gGraphView * shared=0);
+        \brief Constructs a new gGraphView object (main graph area)
+        \param QWidget * parent
+        \param gGraphView * shared
+
+        The shared parameter allows for OpenGL context sharing.
+        But this must not be shared with Printers snapshot gGraphView object,
+        or it will lead to display/font corruption
+        */
+    explicit gGraphView(QWidget *parent = 0, gGraphView *shared = 0);
+    virtual ~gGraphView();
+    virtual void closeEvent(QCloseEvent * event);
+
+    //! \brief Add gGraph g to this gGraphView, in the requested graph-linkage group
+    void addGraph(gGraph *g, short group = 0);
+
+    //! \brief The width of the vertical text Title area for all graphs
+    static const int titleWidth = 30;
+
+    //! \brief The splitter is drawn inside this gap
+    static const int graphSpacer = 4;
+
+    bool contains(QString name) {
+        for (int i=0; i<m_graphs.size(); ++i) {
+            if (m_graphs[i]->name() == name) return true;
+        }
+        return false;
+    }
+    gGraph *operator [](QString name) {
+        for (int i=0; i<m_graphs.size(); ++i) {
+            if (m_graphs[i]->name() == name) return m_graphs[i];
+        }
+        return nullptr;
+    }
+
+    //! \brief Finds the top pixel position of the supplied graph
+    float findTop(gGraph *graph);
+
+    //! \brief Returns the scaleY value, which is used when laying out less graphs than fit on the screen.
+    float scaleY() { return m_scaleY; }
+
+    //! \brief Sets the scaleY value, which is used when laying out less graphs than fit on the screen.
+    void setScaleY(float sy) { m_scaleY = sy; }
+
+    //! \brief Returns the current selected time range
+    void GetXBounds(qint64 &st, qint64 &et);
+
+    //! \brief Returns the maximum time range bounds
+    void GetRXBounds(qint64 &st, qint64 &et);
+
+    //! \brief Resets the time range to default for this day. Refreshing the display if refresh==true.
+    void ResetBounds(bool refresh = true);
+
+    //! \brief Supplies time range to all graph objects in linked group, refreshing if requested
+    void SetXBounds(qint64 minx, qint64 maxx, short group = 0, bool refresh = true);
+
+    //! \brief Saves the current graph order, heights, min & Max Y values to disk
+    void SaveSettings(QString title);
+
+    //! \brief Loads the current graph order, heights, min & max Y values from disk
+    bool LoadSettings(QString title);
+
+    //! \brief Returns the graph object matching the supplied name, nullptr if it does not exist.
+    gGraph *findGraph(QString name);
+
+    //! \brief Returns the graph object matching the graph title, nullptr if it does not exist.
+    gGraph *findGraphTitle(QString title);
+
+    //! \brief Returns true if control key is down during select operation
+    inline bool metaSelect() const { return m_metaselect; }
+
+    //! \brief Returns true if currently selecting data with mouse
+    inline bool selectionInProgress() const { return m_button_down; }
+
+    inline float printScaleX() const { return print_scaleX; }
+    inline float printScaleY() const { return print_scaleY; }
+    inline void setPrintScaleX(float x) { print_scaleX = x; }
+    inline void setPrintScaleY(float y) { print_scaleY = y; }
+
+    void saveHistory() {
+        history.push_front(SelectionHistoryItem(m_minx, m_maxx));
+        if (history.size() > max_history) {
+            history.pop_back();
+        }
+    }
+
+    //! \brief Returns true if all Graph objects contain NO day data. ie, graph area is completely empty.
+    bool isEmpty();
+
+    Day * day() { return m_day; }
+
+    //! \brief Tell all graphs to deslect any highlighted areas
+    void deselect();
+
+    QPoint pointClicked() const { return m_point_clicked; }
+    void setPointClicked(QPoint p) { m_point_clicked = p; }
+
+    //! \brief Set a redraw timer for ms milliseconds, clearing any previous redraw timer.
+    void timedRedraw(int ms=0);
+
+    gGraph *m_selected_graph;
+    gToolTip *m_tooltip;
+    QTimer *timer;
+
+    //! \brief Add the Text information to the Text Drawing Queue (called by gGraphs renderText method)
+    void AddTextQue(const QString &text, QRectF rect, quint32 flags, float angle = 0.0,
+                    QColor color = Qt::black, QFont *font = defaultfont, bool antialias = true);
+
+    //! \brief Add the Text information to the Text Drawing Queue (called by gGraphs renderText method)
+    void AddTextQue(const QString &text, short x, short y, float angle = 0.0,
+                    QColor color = Qt::black, QFont *font = defaultfont, bool antialias = true);
+
+//    //! \brief Draw all Text in the text drawing queue
+//    void DrawTextQue();
+
+    //! \brief Draw all text components using QPainter object painter
+    void DrawTextQue(QPainter &painter);
+
+    //! \brief Returns number of graphs contained (whether they are visible or not)
+    int size() const { return m_graphs.size(); }
+
+    //! \brief Return individual graph by index value
+    gGraph *operator[](int i) { return m_graphs[i]; }
+
+    //! \brief Returns the custom scrollbar object linked to this gGraphArea
+    MyScrollBar *scrollBar() const { return m_scrollbar; }
+
+    //! \brief Sets the custom scrollbar object linked to this gGraphArea
+    void setScrollBar(MyScrollBar *sb);
+
+    //! \brief Calculates the correct scrollbar parameters for all visible, non empty graphs.
+    void updateScrollBar();
+
+    //! \brief Called on resize, fits graphs when too few to show, by scaling to fit screen size. Calls updateScrollBar()
+    void updateScale();         // update scale & Scrollbar
+
+    //! \brief Returns a count of all visible, non-empty Graphs.
+    int visibleGraphs();
+
+    //! \brief Returns the horizontal travel of the mouse, for use in Mouse Handling code.
+    int horizTravel() const { return m_horiz_travel; }
+
+    //! \brief Sets the message displayed when there are no graphs to draw
+    void setEmptyText(QString s) { m_emptytext = s; }
+
+    //! \brief Returns the message displayed when there are no graphs to draw
+    QString emptyText() { return m_emptytext; }
+
+    //! \brief Sets the message displayed when there are no graphs to draw
+    void setEmptyImage(QPixmap pm) { m_emptyimage = pm; }
+
+    inline const float &devicePixelRatio() { return m_dpr; }
+    void setDevicePixelRatio(float dpr) { m_dpr = dpr; }
+
+#ifdef ENABLE_THREADED_DRAWING
+    QMutex text_mutex;
+    QMutex gl_mutex;
+    QSemaphore *masterlock;
+    bool useThreads() { return m_idealthreads > 1; }
+    QVector<gThread *> m_threads;
+    int m_idealthreads;
+    QMutex dl_mutex;
+#endif
+
+    //! \brief Sends day object to be distributed to all Graphs Layers objects
+    void setDay(Day *day);
+
+    //! \brief pops a graph off the list for multithreaded drawing code
+    gGraph *popGraph(); // exposed for multithreaded drawing
+
+    //! \brief Hides the splitter, used in report printing code
+    void hideSplitter() { m_showsplitter = false; }
+
+    //! \brief Re-enabled the in-between graph splitters.
+    void showSplitter() { m_showsplitter = true; }
+
+    //! \brief Trash all graph objects listed (without destroying Graph contents)
+    void trashGraphs(bool destroy);
+
+    //! \brief Enable or disable the Text Pixmap Caching system preference overide
+    void setUsePixmapCache(bool b) { use_pixmap_cache = b; }
+
+    //! \brief Return whether or not the Pixmap Cache for text rendering is being used.
+    bool usePixmapCache();
+
+    //! \brief Graph drawing routines, returns true if there weren't any graphs to draw
+    bool renderGraphs(QPainter &painter);
+
+    //! \brief Used internally by graph mousehandler to set modifier state
+    void setMetaSelect(bool b) { m_metaselect = b; }
+
+    //! \brief The current time the mouse pointer is hovering over
+    inline double currentTime() { return m_currenttime; }
+
+    //! \brief Returns a context formatted text string with the currently selected time range
+    QString getRangeString();
+
+    Layer * findLayer(gGraph * graph, LayerType type);
+
+    void populateMenu(gGraph *);
+    QMenu * limits_menu;
+    QMenu * lines_menu;
+    QMenu * plots_menu;
+
+    QMenu * oximeter_menu;
+    QMenu * cpap_menu;
+
+
+    inline void setCurrentTime(double time) {
+        m_currenttime = time;
+    }
+
+    inline QPoint currentMousePos() const { return m_mouse; }
+
+    void dumpInfo();
+    void resetMouse() { m_mouse = QPoint(0,0); }
+
+    void getSelectionTimes(qint64 & start, qint64 & end);
+
+    //! \brief Whether to show a little authorship message down the bottom of empty graphs.
+    void setShowAuthorMessage(bool b) { m_showAuthorMessage = b; }
+
+    // for profiling purposes, a count of lines drawn in a single frame
+    int lines_drawn_this_frame;
+    int quads_drawn_this_frame;
+    int strings_drawn_this_frame;
+    int strings_cached_this_frame;
+
+    QVector<SelectionHistoryItem> history;
+
+  protected:
+
+    virtual void leaveEvent (QEvent * event);
+
+    //! \brief The heart of the drawing code
+#ifdef BROKEN_OPENGL_BUILD
+    virtual void paintEvent(QPaintEvent *);
+#else
+    virtual void paintGL();
+#endif
+    //! \brief Calculates the sum of all graph heights
+    float totalHeight();
+
+    //! \brief Calculates the sum of all graph heights, taking scaling into consideration
+    float scaleHeight();
+
+    //! \brief Update the OpenGL area when the screen is resized
+    virtual void resizeEvent(QResizeEvent *);
+
+    //! \brief Set the Vertical offset (used in scrolling)
+    void setOffsetY(int offsetY);
+
+    //! \brief Set the Horizontal offset (not used yet)
+    void setOffsetX(int offsetX);
+
+    //! \brief Mouse Moved somewhere in main gGraphArea, propagates to the individual graphs
+    virtual void mouseMoveEvent(QMouseEvent *event);
+    //! \brief Mouse Button Press Event somewhere in main gGraphArea, propagates to the individual graphs
+    virtual void mousePressEvent(QMouseEvent *event);
+    //! \brief Mouse Button Release Event somewhere in main gGraphArea, propagates to the individual graphs
+    virtual void mouseReleaseEvent(QMouseEvent *event);
+    //! \brief Mouse Button Double Click Event somewhere in main gGraphArea, propagates to the individual graphs
+    virtual void mouseDoubleClickEvent(QMouseEvent *event);
+    //! \brief Mouse Wheel Event somewhere in main gGraphArea, propagates to the individual graphs
+    virtual void wheelEvent(QWheelEvent *event);
+    //! \brief Keyboard event while main gGraphArea has focus.
+    virtual void keyPressEvent(QKeyEvent *event);
+    //! \brief Keyboard event while main gGraphArea has focus.
+    virtual void keyReleaseEvent(QKeyEvent *event);
+
+    //! \brief Add Graph to drawing queue, mainly for the benefit of multithreaded drawing code
+    void queGraph(gGraph *, int originX, int originY, int width, int height);
+
+
+    Day *m_day;
+
+    //! \brief the list of graphs to draw this frame
+    QList<gGraph *> m_drawlist;
+
+    //! \brief Linked graph object containing shared GL Context (in this app, daily view's gGraphView)
+    gGraphView *m_shared;
+
+    //! \brief List of all graphs contained in this area
+    QList<gGraph *> m_graphs;
+
+    //! \brief List of all graphs contained, indexed by title
+    QHash<QString, gGraph *> m_graphsbyname;
+
+    //! \variable Vertical scroll offset (adjusted when scrollbar gets moved)
+    int m_offsetY;
+    //! \variable Horizontal scroll offset (unused, but can be made to work if necessary)
+    int m_offsetX;
+    //! \variable Scale used to enlarge graphs when less graphs than can fit on screen.
+    float m_scaleY;
+    float m_dpr;
+
+    bool m_sizer_dragging;
+    int m_sizer_index;
+
+    bool m_button_down;
+    QPoint m_point_clicked;
+    QPoint m_point_released;
+    bool m_metaselect;
+
+    QPoint m_sizer_point;
+    int m_horiz_travel;
+
+    MyScrollBar *m_scrollbar;
+    QTimer *redrawtimer;
+
+    bool m_graph_dragging;
+    int m_graph_index;
+
+    //! \brief List of all queue text to draw.. not sure why I didn't use a vector here.. Might of been a leak issue
+    QVector<TextQue> m_textque;
+
+    //! \brief ANother text que with rect alignment capabilities...
+    QVector<TextQueRect> m_textqueRect;
+
+    int m_lastxpos, m_lastypos;
+
+    QString m_emptytext;
+    QPixmap m_emptyimage;
+
+    bool m_showsplitter;
+
+    qint64 m_minx, m_maxx;
+
+    QVector<SelectionHistoryItem> fwd_history;
+    float print_scaleX, print_scaleY;
+
+    QPixmap previous_day_snapshot;
+    QPixmap current_day_snapshot;
+    bool m_fadingOut;
+    bool m_fadingIn;
+    bool m_limbo;
+    bool m_fadedir;
+    bool m_inAnimation;
+    bool m_blockUpdates;
+
+    QPoint m_mouse;
+    double m_currenttime;
+
+    QTime m_animationStarted;
+
+    bool use_pixmap_cache;
+
+    QPixmapCache pixmapcache;
+
+    QTime horizScrollTime, vertScrollTime;
+    QMenu * context_menu;
+    QAction * pin_action;
+    QPixmap pin_icon;
+    gGraph *pin_graph;
+
+    QAction * snap_action;
+
+    QAction * zoom100_action;
+
+    bool m_showAuthorMessage;
+
+  signals:
+    void updateCurrentTime(double);
+    void updateRange(double,double);
+    void GraphsChanged();
+
+  public slots:
+    //! \brief Callback from the ScrollBar, to change scroll position
+    void scrollbarValueChanged(int val);
+
+    //! \brief Simply refreshes the GL view, called when timeout expires.
+    void refreshTimeout();
+
+    //! \brief Call UpdateGL unless animation is in progress
+    void redraw();
+
+    //! \brief Resets all contained graphs to have a uniform height.
+    void resetLayout();
+
+    void resetZoom() {
+        ResetBounds(true);
+    }
+
+    void dataChanged();
+
+
+    bool hasSnapshots();
+
+    void togglePin();
+protected slots:
+    void onLinesClicked(QAction *);
+    void onPlotsClicked(QAction *);
+    void onOverlaysClicked(QAction *);
+    void onSnapshotGraphToggle();
+
+};
+
+#endif // GGRAPHVIEW_H
diff --git a/sleepyhead/Graphs/gLineChart.cpp b/sleepyhead/Graphs/gLineChart.cpp
new file mode 100644
index 0000000..5feed0c
--- /dev/null
+++ b/sleepyhead/Graphs/gLineChart.cpp
@@ -0,0 +1,1167 @@
+/* gLineChart Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "Graphs/gLineChart.h"
+
+#include <QString>
+#include <QDebug>
+
+#include <math.h>
+
+#include "Graphs/glcommon.h"
+#include "Graphs/gGraph.h"
+#include "Graphs/gGraphView.h"
+#include "SleepLib/profiles.h"
+#include "Graphs/gLineOverlay.h"
+
+#define EXTRA_ASSERTS 1
+
+QDataStream & operator<<(QDataStream & stream, const DottedLine & dot)
+{
+    stream << dot.code;
+    stream << dot.type;
+    stream << dot.value;
+    stream << dot.visible;
+    stream << dot.available;
+    return stream;
+}
+QDataStream & operator>>(QDataStream & stream, DottedLine & dot)
+{
+    quint32 tmp;
+    stream >> dot.code;
+    stream >> tmp;
+    stream >> dot.value;
+    stream >> dot.visible;
+    stream >> dot.available;
+    dot.type = (ChannelCalcType)tmp;
+    return stream;
+}
+
+
+QColor darken(QColor color, float p)
+{
+    int r = qMin(int(color.red() * p), 255);
+    int g = qMin(int(color.green() * p), 255);
+    int b = qMin(int(color.blue() * p), 255);
+
+
+    return QColor(r,g,b, color.alpha());
+}
+
+gLineChart::gLineChart(ChannelID code, bool square_plot, bool disable_accel)
+    : Layer(code), m_square_plot(square_plot), m_disable_accel(disable_accel)
+{
+    addPlot(code, square_plot);
+    m_report_empty = false;
+    lines.reserve(50000);
+    lasttime = 0;
+    m_layertype = LT_LineChart;
+}
+gLineChart::~gLineChart()
+{
+    QHash<ChannelID, gLineOverlayBar *>::iterator fit;
+    for (fit = flags.begin(); fit != flags.end(); ++fit) {
+        // destroy any overlay bar from previous day
+        delete fit.value();
+    }
+
+    flags.clear();
+
+}
+
+bool gLineChart::isEmpty()
+{
+    if (!m_day) { return true; }
+
+    for (int j = 0; j < m_codes.size(); j++) {
+        ChannelID code = m_codes[j];
+
+        for (int i = 0; i < m_day->size(); i++) {
+            Session *sess = m_day->sessions[i];
+
+            if (sess->channelExists(code)) {
+                return false;
+            }
+        }
+    }
+
+    return true;
+}
+
+
+void gLineChart::SetDay(Day *d)
+{
+    //    Layer::SetDay(d);
+    m_day = d;
+
+    m_minx = 0, m_maxx = 0;
+    m_miny = 0, m_maxy = 0;
+    m_physminy = 0, m_physmaxy = 0;
+
+    if (!d) {
+        return;
+    }
+
+    qint64 t64;
+    EventDataType tmp;
+
+    bool first = true;
+
+    for (int j = 0; j < m_codes.size(); j++) {
+        ChannelID code = m_codes[j];
+
+        for (int i = 0; i < d->size(); i++) {
+            Session *sess = d->sessions[i];
+            if (!sess->enabled()) continue;
+
+            if (code == CPAP_MaskPressure) {
+                if (sess->channelExists(CPAP_MaskPressureHi)) {
+                    code = m_codes[j] = CPAP_MaskPressureHi;
+                    m_enabled[code] = schema::channel[CPAP_MaskPressureHi].enabled();
+
+                    goto skipcheck; // why not :P
+                }
+            }
+
+            if (!sess->channelExists(code)) {
+                continue;
+            }
+
+skipcheck:
+            if (first) {
+                m_miny = sess->Min(code);
+                m_maxy = sess->Max(code);
+                m_physminy = sess->physMin(code);
+                m_physmaxy = sess->physMax(code);
+                m_minx = sess->first(code);
+                m_maxx = sess->last(code);
+                first = false;
+            } else {
+                tmp = sess->physMin(code);
+
+                if (m_physminy > tmp) {
+                    m_physminy = tmp;
+                }
+
+                tmp = sess->physMax(code);
+
+                if (m_physmaxy < tmp) {
+                    m_physmaxy = tmp;
+                }
+
+                tmp = sess->Min(code);
+
+                if (m_miny > tmp) {
+                    m_miny = tmp;
+                }
+
+                tmp = sess->Max(code);
+
+                if (m_maxy < tmp) {
+                    m_maxy = tmp;
+                }
+
+                t64 = sess->first(code);
+
+                if (m_minx > t64) {
+                    m_minx = t64;
+                }
+
+                t64 = sess->last(code);
+
+                if (m_maxx < t64) {
+                    m_maxx = t64;
+                }
+            }
+        }
+
+    }
+
+    subtract_offset = 0;
+
+    QHash<ChannelID, gLineOverlayBar *>::iterator fit;
+    for (fit = flags.begin(); fit != flags.end(); ++fit) {
+        // destroy any overlay bar from previous day
+        delete fit.value();
+    }
+
+    flags.clear();
+
+    quint32 z = schema::FLAG | schema::MINOR_FLAG | schema::SPAN;
+    if (p_profile->general->showUnknownFlags()) z |= schema::UNKNOWN;
+    QList<ChannelID> available = m_day->getSortedMachineChannels(z);
+
+    for (int i=0; i < available.size(); ++i) {
+        ChannelID code = available.at(i);
+        if (!m_flags_enabled.contains(code)) {
+            bool b = false;
+
+            if (((m_codes[0] == CPAP_FlowRate) || ((m_codes[0] == CPAP_MaskPressureHi))) && (schema::channel[code].machtype() == MT_CPAP)) b = true;
+            if ((m_codes[0] == CPAP_Leak) && (code == CPAP_LargeLeak)) b = true;
+            m_flags_enabled[code] = b;
+        }
+        if (!m_day->channelExists(code)) continue;
+
+
+        schema::Channel * chan = &schema::channel[code];
+        gLineOverlayBar * lob = nullptr;
+
+        if (chan->type() == schema::FLAG) {
+            lob = new gLineOverlayBar(code, chan->defaultColor(), chan->label(), FT_Bar);
+        } else if ((chan->type() == schema::MINOR_FLAG) || (chan->type() == schema::UNKNOWN)) {
+            lob = new gLineOverlayBar(code, chan->defaultColor(), chan->label(), FT_Dot);
+        } else if (chan->type() == schema::SPAN) {
+            lob = new gLineOverlayBar(code, chan->defaultColor(), chan->label(), FT_Span);
+        }
+        if (lob != nullptr) {
+            lob->setOverlayDisplayType(((m_codes[0] == CPAP_FlowRate))? (OverlayDisplayType)p_profile->appearance->overlayType() : ODT_TopAndBottom);
+            lob->SetDay(m_day);
+            flags[code] = lob;
+        }
+    }
+
+    m_dotlines.clear();
+
+    for (int i=0; i< m_codes.size(); i++) {
+        ChannelID code = m_codes[i];
+        schema::Channel & chan = schema::channel[code];
+        addDotLine(DottedLine(code, Calc_Max,chan.calc[Calc_Max].enabled));
+        if ((code != CPAP_FlowRate) && (code != CPAP_MaskPressure) && (code != CPAP_MaskPressureHi)) {
+            addDotLine(DottedLine(code, Calc_Perc,chan.calc[Calc_Perc].enabled));
+            addDotLine(DottedLine(code, Calc_Middle, chan.calc[Calc_Middle].enabled));
+        }
+        if ((code != CPAP_Snore) && (code != CPAP_FlowLimit) && (code != CPAP_RDI) && (code != CPAP_AHI)) {
+            addDotLine(DottedLine(code, Calc_Min, chan.calc[Calc_Min].enabled));
+        }
+    }
+    if (m_codes[0] == CPAP_Leak) {
+        addDotLine(DottedLine(CPAP_Leak, Calc_UpperThresh, schema::channel[CPAP_Leak].calc[Calc_UpperThresh].enabled));
+    } else if (m_codes[0] == CPAP_FlowRate) {
+        addDotLine(DottedLine(CPAP_FlowRate, Calc_Zero, schema::channel[CPAP_FlowRate].calc[Calc_Zero].enabled));
+    } else if (m_codes[0] == OXI_Pulse) {
+        addDotLine(DottedLine(OXI_Pulse, Calc_UpperThresh, schema::channel[OXI_Pulse].calc[Calc_UpperThresh].enabled));
+        addDotLine(DottedLine(OXI_Pulse, Calc_LowerThresh, schema::channel[OXI_Pulse].calc[Calc_LowerThresh].enabled));
+    } else if (m_codes[0] == OXI_SPO2) {
+        addDotLine(DottedLine(OXI_SPO2, Calc_LowerThresh, schema::channel[OXI_SPO2].calc[Calc_LowerThresh].enabled));
+    }
+
+
+    if (m_day) {
+        for (int i=0; i < m_dotlines.size(); i++) {
+            m_dotlines[i].calc(m_day);
+
+            ChannelID code = m_dotlines[i].code;
+            ChannelCalcType type = m_dotlines[i].type;
+
+            bool b = false; // default value
+
+            QHash<ChannelID, QHash<quint32, bool> >::iterator cit = m_dot_enabled.find(code);
+
+            if (cit == m_dot_enabled.end()) {
+                m_dot_enabled[code].insert(type, b);
+            } else {
+                QHash<quint32, bool>::iterator it = cit.value().find(type);
+                if (it == cit.value().end()) {
+                    cit.value().insert(type, b);
+                }
+            }
+        }
+    }
+}
+EventDataType gLineChart::Miny()
+{
+    int size = m_codes.size();
+    if (size == 0) return 0;
+    if (!m_day) return 0;
+
+    bool first = false;
+    EventDataType min = 0, tmp;
+
+    for (int i=0; i< size; ++i) {
+        ChannelID code = m_codes[i];
+        if (!m_enabled[code] || !m_day->channelExists(code)) continue;
+
+        tmp = m_day->Min(code);
+
+        if (!first) {
+            min = tmp;
+            first = true;
+        } else {
+            min = qMin(tmp, min);
+        }
+    }
+    if (!first) min = 0;
+
+    m_miny = min;
+
+    return min;
+//    int m = Layer::Miny();
+
+//    if (subtract_offset > 0) {
+//        m -= subtract_offset;
+
+//        if (m < 0) { m = 0; }
+//    }
+
+//    return m;
+}
+EventDataType gLineChart::Maxy()
+{
+    int size = m_codes.size();
+    if (size == 0) return 0;
+    if (!m_day) return 0;
+
+    bool first = false;
+    EventDataType max = 0, tmp;
+
+    for (int i=0; i< size; ++i) {
+        ChannelID code = m_codes[i];
+        if (!m_enabled[code] || !m_day->channelExists(code)) continue;
+
+        tmp = m_day->Max(code);
+        if (!first) {
+            max = tmp;
+            first = true;
+        } else {
+            max = qMax(tmp, max);
+        }
+    }
+    if (!first) max = 0;
+    m_maxy = max;
+    return max;
+
+//    return Layer::Maxy() - subtract_offset;
+}
+
+bool gLineChart::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    graph->timedRedraw(0);
+
+    return false;
+}
+
+QString gLineChart::getMetaString(qint64 time)
+{
+    lasttext = QString();
+    if (!m_day) return lasttext;
+
+
+    EventDataType val;
+
+    EventDataType ipap = 0, epap = 0;
+    bool addPS = false;
+
+    for (int i=0; i<m_codes.size(); ++i) {
+        ChannelID code = m_codes[i];
+
+        if (m_day->channelHasData(code)) {
+            val = m_day->lookupValue(code, time, m_square_plot);
+            lasttext += " "+QString("%1: %2").arg(schema::channel[code].label()).arg(val,0,'f',2); //.arg(schema::channel[code].units());
+
+            if (code == CPAP_IPAP) {
+                ipap = val;
+                addPS = true;
+            }
+            if (code == CPAP_EPAP) {
+                epap = val;
+            }
+        }
+
+    }
+    if (addPS) {
+        val = ipap - epap;
+        lasttext += " "+QString("%1: %2").arg(schema::channel[CPAP_PS].label()).arg(val,0,'f',2);//.arg(schema::channel[CPAP_PS].units());
+    }
+
+    lasttime = time;
+    return lasttext;
+}
+
+// Time Domain Line Chart
+void gLineChart::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    QRect rect = region.boundingRect();
+    // TODO: Just use QRect directly.
+    int left = rect.left();
+    int top = rect.top();
+    int width = rect.width();
+    int height = rect.height();
+
+    if (!m_visible) {
+        return;
+    }
+
+    if (!m_day) {
+        return;
+    }
+
+    //if (!m_day->channelExists(m_code)) return;
+
+    if (width < 0) {
+        return;
+    }
+
+
+    top++;
+
+    double minx, maxx;
+
+
+    if (w.blockZoom()) {
+        minx = w.rmin_x, maxx = w.rmax_x;
+    } else {
+        maxx = w.max_x, minx = w.min_x;
+    }
+
+
+    // hmmm.. subtract_offset..
+
+    EventDataType miny = m_physminy;
+    EventDataType maxy = m_physmaxy;
+
+    w.roundY(miny, maxy);
+
+
+
+//#define DEBUG_AUTOSCALER
+#ifdef DEBUG_AUTOSCALER
+    QString a = QString().sprintf("%.2f - %.2f",miny, maxy);
+    w.renderText(a,width/2,top-5);
+#endif
+
+    // the middle of minx and maxy does not have to be the center...
+
+    double logX = painter.device()->logicalDpiX();
+    double physX = painter.device()->physicalDpiX();
+    double ratioX = physX / logX * w.printScaleX();
+    double logY = painter.device()->logicalDpiY();
+    double physY = painter.device()->physicalDpiY();
+    double ratioY = physY / logY * w.printScaleY();
+
+    double xx = maxx - minx;
+    double xmult = double(width) / xx;
+
+    EventDataType yy = maxy - miny;
+    EventDataType ymult = EventDataType(height - 3) / yy; // time to pixel conversion multiplier
+
+    // Return on screwy min/max conditions
+    if (xx < 0) {
+        return;
+    }
+
+    if (yy <= 0) {
+        if (miny == 0) {
+            return;
+        }
+    }
+
+    bool mouseover = false;
+    if (rect.contains(w.graphView()->currentMousePos())) {
+        mouseover = true;
+
+        painter.fillRect(rect, QBrush(QColor(255,255,245,128)));
+    }
+
+
+    bool linecursormode = p_profile->appearance->lineCursorMode();
+    ////////////////////////////////////////////////////////////////////////
+    // Display Line Cursor
+    ////////////////////////////////////////////////////////////////////////
+    if (linecursormode) {
+        double time = w.currentTime();
+
+        if ((time > minx) && (time < maxx)) {
+            double xpos = (time - double(minx)) * xmult;
+            painter.setPen(QPen(QBrush(QColor(0,255,0,255)),1));
+            painter.drawLine(left+xpos, top-w.marginTop()-3, left+xpos, top+height+w.bottom-1);
+        }
+
+        if ((time != lasttime) || lasttext.isEmpty()) {
+            getMetaString(time);
+        }
+
+        if (m_codes[0] != CPAP_FlowRate) {
+            QString text = lasttext;
+
+            int wid, h;
+            GetTextExtent(text, wid, h);
+            w.renderText(text, left , top-h+7*w.printScaleY());  //+ width/2 - wid/2
+        }
+    }
+
+    EventDataType lastpx, lastpy;
+    EventDataType px, py;
+    int idx;
+    bool done;
+    double x0, xL;
+    double sr;
+    int sam;
+    int minz, maxz;
+
+    // Draw bounding box
+    painter.setPen(QColor(Qt::black));
+    painter.drawLine(left, top, left, top + height);
+    painter.drawLine(left, top + height, left + width, top + height);
+    painter.drawLine(left + width, top + height, left + width, top);
+    painter.drawLine(left + width, top, left, top);
+
+    width--;
+    height -= 2;
+
+    int num_points = 0;
+    int visible_points = 0;
+    int total_points = 0;
+    int total_visible = 0;
+    bool square_plot, accel;
+    qint64 clockdrift = qint64(p_profile->cpap->clockDrift()) * 1000L;
+    qint64 drift = 0;
+
+    QHash<ChannelID, QVector<EventList *> >::iterator ci;
+
+    //m_line_color=schema::channel[m_code].defaultColor();
+    int legendx = left + width;
+
+    int codepoints;
+
+    painter.setClipRect(left, top, width, height+1);
+    painter.setClipping(true);
+    painter.setRenderHint(QPainter::Antialiasing, p_profile->appearance->antiAliasing());
+
+    painter.setFont(*defaultfont);
+    bool showDottedLines = true;
+
+    int dotlinesize = m_dotlines.size();
+
+    // Unset Dotted lines visible status, so we only draw necessary labels later
+    for (int i=0; i < dotlinesize; i++) {
+        DottedLine & dot = m_dotlines[i];
+        dot.visible = false;
+    }
+
+    Session * sess = nullptr;
+    ChannelID code;
+
+    for (int gi = 0; gi < m_codes.size(); gi++) {
+        code = m_codes[gi];
+        schema::Channel &chan = schema::channel[code];
+
+        ////////////////////////////////////////////////////////////////////////
+        // Draw the Channel Threshold dotted lines, and flow waveform centreline
+        ////////////////////////////////////////////////////////////////////////
+        if (showDottedLines) {
+            for (int i=0; i < dotlinesize; i++) {
+                DottedLine & dot = m_dotlines[i];
+                if ((dot.code != code) || (!m_dot_enabled[dot.code][dot.type]) || (!dot.available) || (!m_enabled[dot.code])) {
+                    continue;
+                }
+                schema::Channel & chan = schema::channel[code];
+
+                dot.visible = true;
+                QColor color = chan.calc[dot.type].color;
+                color.setAlpha(200);
+                painter.setPen(QPen(QBrush(color), p_profile->appearance->lineThickness(), Qt::DotLine));
+                EventDataType y=top + height + 1 - ((dot.value - miny) * ymult);
+                painter.drawLine(left + 1, y, left + 1 + width, y);
+
+            }
+        }
+        if (!m_enabled[code]) continue;
+
+
+        lines.clear();
+
+        codepoints = 0;
+
+        // For each session...
+        int daysize = m_day->size();
+        for (int svi = 0; svi < daysize; svi++) {
+            sess = (*m_day)[svi];
+
+            if (!sess) {
+                qWarning() << "gLineChart::Plot() nullptr Session Record.. This should not happen";
+                continue;
+            }
+
+            drift = (sess->type() == MT_CPAP) ? clockdrift : 0;
+
+            if (!sess->enabled()) { continue; }
+
+            schema::Channel ch = schema::channel[code];
+            bool fndbetter = false;
+
+            QList<schema::Channel *>::iterator mlend=ch.m_links.end();
+            for (QList<schema::Channel *>::iterator l = ch.m_links.begin(); l != mlend; l++) {
+                schema::Channel &c = *(*l);
+                ci = (*m_day)[svi]->eventlist.find(c.id());
+
+                if (ci != (*m_day)[svi]->eventlist.end()) {
+                    fndbetter = true;
+                    break;
+                }
+
+            }
+
+            if (!fndbetter) {
+                ci = (*m_day)[svi]->eventlist.find(code);
+
+                if (ci == (*m_day)[svi]->eventlist.end()) { continue; }
+            }
+
+
+            QVector<EventList *> &evec = ci.value();
+            num_points = 0;
+
+            QVector<EventList *>::iterator evec_end = evec.end();
+            QVector<EventList *>::iterator ni;
+
+            for (ni = evec.begin(); ni != evec_end; ++ni) {
+                num_points += (*ni)->count();
+            }
+
+            total_points += num_points;
+            codepoints += num_points;
+
+            // Max number of samples taken from samples per pixel for better min/max values
+            const int num_averages = 20;
+
+            int n=0;
+            for (ni = evec.begin(); ni != evec_end; ++ni, ++n) {
+                EventList & el = *(EventList*) (*ni);
+
+                accel = (el.type() == EVL_Waveform); // Turn on acceleration if this is a waveform.
+
+                if (accel) {
+                    sr = el.rate();         // Time distance between samples
+
+                    if (sr <= 0) {
+                        qWarning() << "qLineChart::Plot() assert(sr>0)";
+                        continue;
+                    }
+                }
+
+                if (m_disable_accel) { accel = false; }
+
+
+                square_plot = m_square_plot;
+
+                if (accel || num_points > 20000) { // Don't square plot if too many points or waveform
+                    square_plot = false;
+                }
+
+                int siz = el.count();
+
+                if (siz <= 1) { continue; } // Don't bother drawing 1 point or less.
+
+                x0 = el.time(0) + drift;
+                xL = el.time(siz - 1) + drift;
+
+                if (maxx < x0) { continue; }
+
+                if (xL < minx) { continue; }
+
+                if (x0 > xL) {
+                    if (siz == 2) { // this happens on CPAP
+                        quint32 t = el.getTime()[0];
+                        el.getTime()[0] = el.getTime()[1];
+                        el.getTime()[1] = t;
+                        EventStoreType d = el.getData()[0];
+                        el.getData()[0] = el.getData()[1];
+                        el.getData()[1] = d;
+
+                    } else {
+                        qDebug() << "Reversed order sample fed to gLineChart - ignored.";
+                        continue;
+                        //assert(x1<x2);
+                    }
+                }
+
+                if (accel) {
+                    //x1=el.time(1);
+
+                    double XR = xx / sr;
+                    double Z1 = MAX(x0, minx);
+                    double Z2 = MIN(xL, maxx);
+                    double ZD = Z2 - Z1;
+                    double ZR = ZD / sr;
+                    double ZQ = ZR / XR;
+                    double ZW = ZR / (width * ZQ);
+                    visible_points += ZR * ZQ;
+
+                    if (accel && n > 0) {
+                        sam = 1;
+                    }
+
+                    if (ZW < num_averages) {
+                        sam = 1;
+                        accel = false;
+                    } else {
+                        sam = ZW / num_averages;
+
+                        if (sam < 1) {
+                            sam = 1;
+                            accel = false;
+                        }
+                    }
+
+                    // Prepare the min max y values if we still are accelerating this plot
+                    if (accel) {
+                        for (int i = 0; i < width; i++) {
+                            m_drawlist[i].setX(height);
+                            m_drawlist[i].setY(0);
+                        }
+
+                        minz = width;
+                        maxz = 0;
+                    }
+
+                    total_visible += visible_points;
+                } else {
+                    sam = 1;
+                }
+
+                // these calculations over estimate
+                // The Z? values are much more accurate
+
+                idx = 0;
+
+                if (el.type() == EVL_Waveform)  {
+                    // We can skip data previous to minx if this is a waveform
+
+                    if (minx > x0) {
+                        double j = minx - x0; // == starting min of first sample in this segment
+                        idx = (j / sr);
+                        //idx/=(sam*num_averages);
+                        //idx*=(sam*num_averages);
+                        // Loose the precision
+                        idx += sam - (idx % sam);
+
+                    } // else just start from the beginning
+                }
+
+                int xst = left + 1;
+                int yst = top + height + 1;
+
+                double time;
+                EventDataType data;
+                EventDataType gain = el.gain();
+
+                done = false;
+
+                if (el.type() == EVL_Waveform) { // Waveform Plot
+                    if (idx > sam) { idx -= sam; }
+
+                    time = el.time(idx) + drift;
+                    double rate = double(sr) * double(sam);
+                    EventStoreType *ptr = el.rawData() + idx;
+                    if ((unsigned) siz > el.count())
+                        siz = el.count();
+
+                    if (accel) {
+                        //////////////////////////////////////////////////////////////////
+                        // Accelerated Waveform Plot
+                        //////////////////////////////////////////////////////////////////
+
+                        for (int i = idx; i <= siz; i += sam, ptr += sam) {
+                            time += rate;
+                            // This is much faster than QVector access.
+                            data = *ptr + el.offset();
+                            data *= gain;
+
+                            // Scale the time scale X to pixel scale X
+                            px = ((time - minx) * xmult);
+
+                            // Same for Y scale, with gain factored in nmult
+                            py = ((data - miny) * ymult);
+
+                            // In accel mode, each pixel has a min/max Y value.
+                            // m_drawlist's index is the pixel index for the X pixel axis.
+                            int z = round(px); // Hmmm... round may screw this up.
+
+                            if (z < minz) {
+                                minz = z;    // minz=First pixel
+                            }
+
+                            if (z > maxz) {
+                                maxz = z;    // maxz=Last pixel
+                            }
+
+                            if (minz < 0) {
+                                qDebug() << "gLineChart::Plot() minz<0  should never happen!! minz =" << minz;
+                                minz = 0;
+                            }
+
+                            if (maxz > max_drawlist_size) {
+                                qDebug() << "gLineChart::Plot() maxz>max_drawlist_size!!!! maxz = " << maxz <<
+                                         " max_drawlist_size =" << max_drawlist_size;
+                                maxz = max_drawlist_size;
+                            }
+
+                            // Update the Y pixel bounds.
+                            if (py < m_drawlist[z].x()) {
+                                m_drawlist[z].setX(py);
+                            }
+
+                            if (py > m_drawlist[z].y()) {
+                                m_drawlist[z].setY(py);
+                            }
+
+                            if (time > maxx) {
+                                done = true;
+                                break;
+                            }
+
+                        }
+
+                        // Plot compressed accelerated vertex list
+                        if (maxz > width) {
+                            maxz = width;
+                        }
+
+                        float ax1, ay1;
+                        QPoint *drl = m_drawlist + minz;
+                        // Don't need to cap VertexBuffer here, as it's limited to max_drawlist_size anyway
+
+
+                        // Cap within VertexBuffer capacity, one vertex per line point
+//                        int np = (maxz - minz) * 2;
+
+                        for (int i = minz; i < maxz; i++, drl++) {
+                            ax1 = drl->x();
+                            ay1 = drl->y();
+                            lines.append(QLine(xst + i, yst - ax1, xst + i, yst - ay1));
+                        }
+
+                    } else { // Zoomed in Waveform
+                        //////////////////////////////////////////////////////////////////
+                        // Normal Waveform Plot
+                        //////////////////////////////////////////////////////////////////
+                        // Prime first point
+                        data = (*ptr + el.offset()) * gain;
+                        lastpx = xst + ((time - minx) * xmult);
+                        lastpy = yst - ((data - miny) * ymult);
+                        siz--;
+                        for (int i = idx; i < siz; i += sam) {
+                            ptr += sam;
+                            time += rate;
+
+                            data = (*ptr + el.offset()) * gain;
+
+                            px = xst + ((time - minx) * xmult); // Scale the time scale X to pixel scale X
+                            py = yst - ((data - miny) * ymult); // Same for Y scale, with precomputed gain
+                            //py=yst-((data - ymin) * nmult);   // Same for Y scale, with precomputed gain
+
+                            lines.append(QLine(lastpx, lastpy, px, py));
+
+                            lastpx = px;
+                            lastpy = py;
+
+                            if (time >= maxx) {
+                                done = true;
+                                break;
+                            }
+                        }
+                    }
+
+                    painter.setPen(QPen(chan.defaultColor(), p_profile->appearance->lineThickness()));
+                    painter.drawLines(lines);
+                    w.graphView()->lines_drawn_this_frame += lines.count();
+                    lines.clear();
+
+
+                } else  {
+                    //////////////////////////////////////////////////////////////////
+                    // Standard events/zoomed in Plot
+                    //////////////////////////////////////////////////////////////////
+
+                    double start = el.first() + drift;
+
+                    quint32 *tptr = el.rawTime();
+
+                    int idx = 0;
+
+                    if (siz > 15) {
+                        // Prime a bit...
+                        for (; idx < siz; ++idx) {
+                            time = start + *tptr++;
+
+                            if (time >= minx) {
+                                break;
+                            }
+                        }
+
+                        if (idx > 0) {
+                            idx--;
+                        }
+                    }
+
+                    // Step one backwards if possible (to draw through the left margin)
+                    EventStoreType *dptr = el.rawData() + idx;
+                    tptr = el.rawTime() + idx;
+
+                    time = start + *tptr++;
+                    data = (*dptr++ + el.offset()) * gain;
+
+                    idx++;
+
+                    lastpx = xst + ((time - minx) * xmult); // Scale the time scale X to pixel scale X
+                    lastpy = yst - ((data - miny) * ymult); // Same for Y scale without precomputed gain
+
+                    siz -= idx;
+
+                    int gs = siz << 1;
+
+                    if (square_plot) {
+                        gs <<= 1;
+                    }
+
+                    // Unrolling square plot outside of loop to gain a minor speed improvement.
+                    EventStoreType *eptr = dptr + siz;
+
+                    if (square_plot) {
+                        for (; dptr < eptr; dptr++) {
+                            time = start + *tptr++;
+                            data = gain * (*dptr + el.offset());
+
+                            px = xst + ((time - minx) * xmult); // Scale the time scale X to pixel scale X
+                            py = yst - ((data - miny) * ymult); // Same for Y scale without precomputed gain
+
+                            // Horizontal lines are easy to cap
+                            if (py == lastpy) {
+                                // Cap px to left margin
+                                if (lastpx < xst) { lastpx = xst; }
+
+                                // Cap px to right margin
+                                if (px > xst + width) { px = xst + width; }
+
+//                                lines.append(QLine(lastpx, lastpy, px, lastpy));
+//                                lines.append(QLine(px, lastpy, px, py));
+                            } // else {
+                                // Letting the scissor do the dirty work for non horizontal lines
+                                // This really should be changed, as it might be cause that weird
+                                // display glitch on Linux..
+
+                                lines.append(QLine(lastpx, lastpy, px, lastpy));
+                                lines.append(QLine(px, lastpy, px, py));
+//                            }
+
+                            lastpx = px;
+                            lastpy = py;
+
+                            if (time > maxx) {
+                                done = true; // Let this iteration finish.. (This point will be in far clipping)
+                                break;
+                            }
+                        }
+                    } else {
+                        for (; dptr < eptr; dptr++) {
+                            //for (int i=0;i<siz;i++) {
+                            time = start + *tptr++;
+                            data = gain * (*dptr + el.offset());
+
+                            px = xst + ((time - minx) * xmult); // Scale the time scale X to pixel scale X
+                            py = yst - ((data - miny) * ymult); // Same for Y scale without precomputed gain
+
+                            // Horizontal lines are easy to cap
+                            if (py == lastpy) {
+                                // Cap px to left margin
+                                if (lastpx < xst) { lastpx = xst; }
+
+                                // Cap px to right margin
+                                if (px > xst + width) { px = xst + width; }
+
+                              //  lines.append(QLine(lastpx, lastpy, px, py));
+                            } //else {
+                                // Letting the scissor do the dirty work for non horizontal lines
+                                // This really should be changed, as it might be cause that weird
+                                // display glitch on Linux..
+                                lines.append(QLine(lastpx, lastpy, px, py));
+                            //}
+
+                            lastpx = px;
+                            lastpy = py;
+
+                            if (time > maxx) { // Past right edge, abort further drawing..
+                                done = true;
+                                break;
+                            }
+                        }
+                    }
+                    painter.setPen(QPen(chan.defaultColor(),p_profile->appearance->lineThickness()));
+                    painter.drawLines(lines);
+                    w.graphView()->lines_drawn_this_frame+=lines.count();
+                    lines.clear();
+
+                }
+
+                if (done) { break; }
+            }
+        }
+
+
+//        painter.setPen(QPen(m_colors[gi],p_profile->appearance->lineThickness()));
+//        painter.drawLines(lines);
+//        w.graphView()->lines_drawn_this_frame+=lines.count();
+//        lines.clear();
+
+        ////////////////////////////////////////////////////////////////////
+        // Draw Legends on the top line
+        ////////////////////////////////////////////////////////////////////
+
+        if ((codepoints > 0)) {
+            QString text = schema::channel[code].label();
+            QRectF rec(0, rect.top()-3, 0,0);
+            rec = painter.boundingRect(rec, Qt::AlignBottom | Qt::AlignLeft, text);
+            rec.moveRight(legendx);
+            legendx -= rec.width();
+            painter.setClipping(false);
+            painter.setPen(Qt::black);
+            painter.drawText(rec, Qt::AlignBottom | Qt::AlignRight, text);
+
+            float ps = 1 * ratioY;
+            ps = qMax(ps, 1.0f);
+
+            painter.setPen(QPen(chan.defaultColor(), ps));
+            int linewidth = (10 * ratioX);
+            int yp = rec.top()+(rec.height()/2);
+            painter.drawLine(rec.left()-linewidth, yp , rec.left()-(2 * ratioX), yp);
+
+            painter.setClipping(true);
+
+            legendx -= linewidth + (2*ratioX);
+        }
+    }
+    painter.setClipping(false);
+
+    ////////////////////////////////////////////////////////////////////
+    // Draw Channel Threshold legend markers
+    ////////////////////////////////////////////////////////////////////
+    for (int i=0; i < dotlinesize; i++) {
+        DottedLine & dot = m_dotlines[i];
+        if (!dot.visible) continue;
+        code = dot.code;
+        schema::Channel &chan = schema::channel[code];
+        int linewidth = (10 * ratioX);
+        QRectF rec(0, rect.top()-3, 0,0);
+
+        QString text = chan.calc[dot.type].label();
+        rec = painter.boundingRect(rec, Qt::AlignBottom | Qt::AlignLeft, text);
+        rec.moveRight(legendx);
+        legendx -= rec.width();
+        painter.setPen(Qt::black);
+        painter.drawText(rec, Qt::AlignBottom | Qt::AlignRight, text);
+
+        QColor color = chan.calc[dot.type].color;
+        color.setAlpha(200);
+        float ps = 1 * ratioY;
+        ps = qMax(ps, 1.0f);
+        painter.setPen(QPen(QBrush(color), ps,Qt::DotLine));
+
+        int yp = rec.top()+(rec.height()/2);
+        painter.drawLine(rec.left()-linewidth, yp , rec.left()-(2 * ratioX), yp);
+        legendx -= linewidth + (2*ratioX);
+
+
+    }
+
+    painter.setClipping(true);
+
+    if (!total_points) { // No Data?
+            QString msg = QObject::tr("Plots Disabled");
+            int x, y;
+            GetTextExtent(msg, x, y, bigfont);
+            w.renderText(msg, rect, Qt::AlignCenter, 0, Qt::gray, bigfont);
+    }
+
+    painter.setClipping(false);
+
+    // Calculate combined session times within selected area...
+    double first, last;
+    double time = 0;
+
+    // Calculate the CPAP session time.
+    for (QList<Session *>::iterator s = m_day->begin(); s != m_day->end(); s++) {
+        sess = *s;
+        if (!sess->enabled() || (sess->type() != MT_CPAP)) continue;
+
+        first = sess->first();
+        last = sess->last();
+
+        if (last < w.min_x) { continue; }
+        if (first > w.max_x) { continue; }
+
+        if (first < w.min_x) {
+            first = w.min_x;
+        }
+
+        if (last > w.max_x) {
+            last = w.max_x;
+        }
+
+        time += last - first;
+    }
+
+
+    time /= 1000;
+
+    QList<ChannelID> ahilist;
+    ahilist.push_back(CPAP_Hypopnea);
+    ahilist.push_back(CPAP_Obstructive);
+    ahilist.push_back(CPAP_Apnea);
+    ahilist.push_back(CPAP_ClearAirway);
+
+    QList<ChannelID> extras;
+    extras.push_back(CPAP_NRI);
+    extras.push_back(CPAP_UserFlag1);
+    extras.push_back(CPAP_UserFlag2);
+
+    double sum = 0;
+    int cnt = 0;
+
+    // Draw the linechart overlays
+    if (m_day && (p_profile->appearance->lineCursorMode() || (m_codes[0]==CPAP_FlowRate))) {
+        QHash<ChannelID, gLineOverlayBar *>::iterator fit;
+        bool blockhover = false;
+
+        for (fit = flags.begin(); fit != flags.end(); ++fit) {
+            code = fit.key();
+            if ((!m_flags_enabled[code]) || (!m_day->channelExists(code))) continue;
+            gLineOverlayBar * lob = fit.value();
+            lob->setBlockHover(blockhover);
+            lob->paint(painter, w, region);
+            if (lob->hover()) blockhover = true; // did it render a hover over?
+
+            if (ahilist.contains(code)) {
+                sum += lob->sum();
+                cnt += lob->count();
+            }
+        }
+    }
+//    if (m_codes[0] == OXI_SPO2Drop) {
+//    }
+    if (m_codes[0] == CPAP_FlowRate) {
+        float hours = time / 3600.0;
+        int h = time / 3600;
+        int m = int(time / 60) % 60;
+        int s = int(time) % 60;
+
+        double f = double(cnt) / hours; // / (sum / 3600.0);
+        QString txt = QObject::tr("Duration %1:%2:%3").arg(h,2,10,QChar('0')).arg(m,2,10,QChar('0')).arg(s,2,10,QChar('0')) + " "+
+                QObject::tr("AHI %1").arg(f,0,'f',2);// +" " +
+//                QObject::tr("Events %1").arg(cnt) + " " +
+//                QObject::tr("Hours %1").arg(hours,0,'f',2);
+
+        if (linecursormode) txt+=lasttext;
+
+        w.renderText(txt,left,top-6);
+    }
+
+
+    painter.setRenderHint(QPainter::Antialiasing, false);
+}
diff --git a/sleepyhead/Graphs/gLineChart.h b/sleepyhead/Graphs/gLineChart.h
new file mode 100644
index 0000000..4895bda
--- /dev/null
+++ b/sleepyhead/Graphs/gLineChart.h
@@ -0,0 +1,182 @@
+/* gLineChart Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GLINECHART_H
+#define GLINECHART_H
+
+#include <QPainter>
+#include <QVector>
+
+#include "Graphs/layer.h"
+#include "SleepLib/event.h"
+#include "SleepLib/day.h"
+#include "Graphs/gLineOverlay.h"
+
+enum DottedLineCalc {
+    DLC_Zero, DLC_Min, DLC_Mid, DLC_Perc, DLC_Max, DLC_UpperThresh, DLC_LowerThresh
+};
+
+QColor darken(QColor color, float p = 0.5);
+
+struct DottedLine {
+public:
+    DottedLine() {
+        code = NoChannel;
+        type = Calc_Zero;
+        value = 0;
+        visible = false;
+        available = false;
+    }
+    DottedLine(const DottedLine & copy) {
+        code = copy.code;
+        type = copy.type;
+        value = copy.value;
+        available = copy.available;
+        visible = copy.visible;
+    }
+    DottedLine(ChannelID code, ChannelCalcType type, bool available = false):
+        code(code), type(type), available(available) {}
+
+    EventDataType calc(Day * day) {
+        Q_ASSERT(day != nullptr);
+
+        available = day->channelExists(code);
+        value = day->calc(code, type);
+        return value;
+    }
+
+    ChannelID code;
+    ChannelCalcType type;
+    EventDataType value;
+    bool visible;
+    bool available;
+};
+QDataStream & operator<<(QDataStream &, const DottedLine &);
+QDataStream & operator>>(QDataStream &, DottedLine &);
+
+
+/*! \class gLineChart
+    \brief Draws a 2D linechart from all Session data in a day. EVL_Waveforms typed EventLists are accelerated.
+    */
+class gLineChart: public Layer
+{
+    friend class gGraphView;
+  public:
+    /*! \brief Creates a new 2D gLineChart Layer
+        \param code  The Channel that gets drawn by this layer
+        \param square_plot Whether or not to use square plots (only effective for EVL_Event typed EventList data)
+        \param disable_accel Whether or not to disable acceleration for EVL_Waveform typed EventList data
+        */
+    gLineChart(ChannelID code, bool square_plot = false, bool disable_accel = false);
+    virtual ~gLineChart();
+
+    //! \brief The drawing code that fills the vertex buffers
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+    //! \brief Set Use Square plots for non EVL_Waveform data
+    void SetSquarePlot(bool b) { m_square_plot = b; }
+
+    //! \brief Returns true if using Square plots for non EVL_Waveform data
+    bool GetSquarePlot() { return m_square_plot; }
+
+    //! \brief Set this if you want this layer to draw it's empty data message
+    //! They don't show anymore due to the changes in gGraphView. Should modify isEmpty if this still gets to live
+    void ReportEmpty(bool b) { m_report_empty = b; }
+
+    //! \brief Returns whether or not to show the empty text message
+    bool GetReportEmpty() { return m_report_empty; }
+
+    //! \brief Sets the ability to Disable waveform plot acceleration (which hides unseen data)
+    void setDisableAccel(bool b) { m_disable_accel = b; }
+
+    //! \brief Returns true if waveform plot acceleration is disabled
+    bool disableAccel() { return m_disable_accel; }
+
+    //! \brief Sets the Day object containing the Sessions this linechart draws from
+    virtual void SetDay(Day *d);
+
+    //! \brief Returns Minimum Y-axis value for this layer
+    virtual EventDataType Miny();
+
+    //! \brief Returns Maximum Y-axis value for this layer
+    virtual EventDataType Maxy();
+
+    //! \brief Returns true if all subplots contain no data
+    virtual bool isEmpty();
+
+    //! \brief Add Subplot 'code'. Note the first one is added in the constructor.
+    void addPlot(ChannelID code, bool square=false) { m_codes.push_back(code); m_enabled[code] = true; m_square.push_back(square); }
+
+    //! \brief Returns true of the subplot 'code' is enabled.
+    bool plotEnabled(ChannelID code) { if ((m_enabled.contains(code)) && m_enabled[code]) { return true; } else { return false; } }
+
+    //! \brief Enable or Disable the subplot identified by code.
+    void setPlotEnabled(ChannelID code, bool b) { m_enabled[code] = b; }
+
+    QString getMetaString(qint64 time);
+
+    void addDotLine(DottedLine dot) { m_dotlines.append(dot); }
+    QVector<DottedLine> m_dotlines;
+    QHash<ChannelID, bool> m_flags_enabled;
+    QHash<ChannelID, QHash<quint32, bool> > m_dot_enabled;
+
+    virtual Layer * Clone() {
+        gLineChart * lc = new gLineChart(m_code);
+        Layer::CloneInto(lc);
+        CloneInto(lc);
+        return lc;
+    }
+
+    void CloneInto(gLineChart * layer) {
+        layer->m_dotlines = m_dotlines;
+        layer->m_flags_enabled = m_flags_enabled;
+        layer->m_dot_enabled = m_dot_enabled;
+        layer->m_report_empty = m_report_empty;
+        layer->m_square_plot = m_square_plot;
+        layer->m_disable_accel = m_disable_accel;
+        layer->subtract_offset = layer->subtract_offset;
+        layer->m_codes = layer->m_codes;
+        layer->m_threshold = m_threshold;
+        layer->m_square = m_square;
+        layer->m_enabled = m_enabled;
+        layer->lines = lines;
+        layer->lasttext = lasttext;
+        layer->lasttime = lasttime;
+    }
+
+
+  protected:
+    //! \brief Mouse moved over this layers area (shows the hover-over tooltips here)
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+
+
+    bool m_report_empty;
+    bool m_square_plot;
+    bool m_disable_accel;
+
+    //! \brief Used by accelerated waveform plots. Must be >= Screen Resolution (or at least graph width)
+    static const int max_drawlist_size = 10000;
+
+    //! \brief The list of screen points used for accelerated waveform plots..
+    QPoint m_drawlist[max_drawlist_size];
+
+    int subtract_offset;
+
+    QVector<ChannelID> m_codes;
+    QStringList m_threshold;
+    QVector<bool> m_square;
+    QHash<ChannelID, bool> m_enabled; // plot enabled
+    QHash<ChannelID, gLineOverlayBar *> flags;
+
+    QVector<QLine> lines;
+
+    QString lasttext;
+    qint64 lasttime;
+};
+
+#endif // GLINECHART_H
diff --git a/sleepyhead/Graphs/gLineOverlay.cpp b/sleepyhead/Graphs/gLineOverlay.cpp
new file mode 100644
index 0000000..91df318
--- /dev/null
+++ b/sleepyhead/Graphs/gLineOverlay.cpp
@@ -0,0 +1,423 @@
+/* gLineOverlayBar Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <math.h>
+#include "SleepLib/profiles.h"
+#include "gLineOverlay.h"
+
+gLineOverlayBar::gLineOverlayBar(ChannelID code, QColor color, QString label, FlagType flt)
+    : Layer(code), m_flag_color(color), m_label(label), m_flt(flt), m_odt(ODT_TopAndBottom)
+{
+    m_hover = false;
+    m_blockhover = false;
+}
+gLineOverlayBar::~gLineOverlayBar()
+{
+}
+
+QColor brighten(QColor, float);
+
+void gLineOverlayBar::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    m_hover = false;
+    if (!schema::channel[m_code].enabled())
+        return;
+
+
+    int left = region.boundingRect().left();
+    int topp = region.boundingRect().top(); // FIXME: Misspelling intentional.
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    if (!m_visible) { return; }
+
+    if (!m_day) { return; }
+
+    int start_py = topp;
+
+    double xx = w.max_x - w.min_x;
+    double yy = w.max_y - w.min_y;
+    double jj = double(width) / double(xx);
+
+
+    if (xx <= 0) { return; }
+
+    double x1, x2;
+
+    int x, y;
+
+    float bottom = start_py + height - 25 * w.printScaleY(), top = start_py + 25 * w.printScaleY();
+
+    double X;
+    double Y;
+
+    QPoint mouse=w.graphView()->currentMousePos();
+
+    m_count = 0;
+    m_sum = 0;
+    m_flag_color = schema::channel[m_code].defaultColor();
+
+
+    if (m_flt == FT_Span) {
+        m_flag_color.setAlpha(128);
+    }
+
+    painter.setPen(m_flag_color);
+
+    EventStoreType raw;
+
+    quint32 *tptr;
+    EventStoreType *dptr, *eptr;
+    qint64 stime;
+
+    OverlayDisplayType odt = m_odt;
+    QHash<ChannelID, QVector<EventList *> >::iterator cei;
+    int count;
+
+    qint64 clockdrift = qint64(p_profile->cpap->clockDrift()) * 1000L;
+    qint64 drift = 0;
+    bool hover = false;
+
+    // For each session, process it's eventlist
+    for (QList<Session *>::iterator s = m_day->begin(); s != m_day->end(); s++) {
+
+        if (!(*s)->enabled()) { continue; }
+
+        cei = (*s)->eventlist.find(m_code);
+
+        if (cei == (*s)->eventlist.end()) { continue; }
+
+        QVector<EventList *> &evlist = cei.value();
+
+        if (evlist.size() == 0) { continue; }
+
+        drift = ((*s)->type() == MT_CPAP) ? clockdrift : 0;
+
+        // Could loop through here, but nowhere uses more than one yet..
+        for (int k = 0; k < evlist.size(); k++) {
+            EventList &el = *(evlist[k]);
+            count = el.count();
+            stime = el.first() + drift;
+            dptr = el.rawData();
+            eptr = dptr + count;
+            tptr = el.rawTime();
+
+            ////////////////////////////////////////////////////////////////////////////
+            // Skip data previous to minx bounds
+            ////////////////////////////////////////////////////////////////////////////
+            for (; dptr < eptr; dptr++) {
+                X = stime + *tptr;
+
+                if (X >= w.min_x) {
+                    break;
+                }
+
+                tptr++;
+            }
+
+            if (m_flt == FT_Span) {
+                ////////////////////////////////////////////////////////////////////////////
+                // FT_Span
+                ////////////////////////////////////////////////////////////////////////////
+                for (; dptr < eptr; dptr++) {
+                    hover = false;
+
+                    X = stime + *tptr++;
+                    raw = *dptr;
+                    Y = X - (qint64(raw) * 1000.0L); // duration
+
+                    if (Y > w.max_x) {
+                        break;
+                    }
+
+                    x1 = jj * double(X - w.min_x) + left;
+                    m_count++;
+                    m_sum += raw;
+                    x2 = jj * double(Y - w.min_x) + left;
+
+                    if (int(x1) == int(x2)) {
+                        x2 += 1;
+                    }
+
+                    if (x2 < left) {
+                        x2 = left;
+                    }
+
+                    if (x1 > width + left) {
+                        x1 = width + left;
+                    }
+
+                    QRect rect(x2, start_py, x1-x2, height);
+                    QColor col = m_flag_color;
+                    if (rect.contains(mouse)) {
+                        hover = true;
+                    }
+
+                    painter.fillRect(rect, QBrush(col));
+                }
+            }/* else if (m_flt == FT_Dot) {
+                ////////////////////////////////////////////////////////////////////////////
+                // FT_Dot
+                ////////////////////////////////////////////////////////////////////////////
+                for (; dptr < eptr; dptr++) {
+                    hover = false;
+
+                    X = stime + *tptr++; //el.time(i);
+                    raw = *dptr; //el.data(i);
+
+                    if (X > w.max_x) {
+                        break;
+                    }
+
+                    x1 = jj * double(X - w.min_x) + left;
+                    m_count++;
+                    m_sum += raw;
+
+//                    if ((odt == ODT_Bars) || (xx < 3600000)) {
+                        // show the fat dots in the middle
+                        painter.setPen(QPen(m_flag_color,4));
+
+                        painter.drawPoint(x1, double(height) / double(yy)*double(-20 - w.min_y) + topp);
+                        painter.setPen(QPen(m_flag_color,1));
+
+//                    } else {
+//                        // thin lines down the bottom
+//                        painter.drawLine(x1, start_py + 1, x1, start_py + 1 + 12);
+//                    }
+                }
+            } */else if ((m_flt == FT_Bar) || (m_flt == FT_Dot)) {
+                ////////////////////////////////////////////////////////////////////////////
+                // FT_Bar
+                ////////////////////////////////////////////////////////////////////////////
+                for (; dptr < eptr; dptr++) {
+                    hover = false;
+                    X = stime + *tptr++;
+                    raw = *dptr;
+
+                    if (X > w.max_x) {
+                        break;
+                    }
+
+                    x1 = jj * (double(X) - double(w.min_x)) + left;
+                    m_count++;
+                    m_sum += raw;
+                    int z = start_py + height;
+
+                    double d1 = jj * double(raw) * 1000.0;
+
+
+                    if ((m_flt == FT_Bar) && (odt == ODT_Bars)) { // || (xx < 3600000)) {
+                        QRect rect(x1-d1, top, d1+4, height);
+                        QColor col = m_flag_color;
+
+
+                        painter.setPen(QPen(col,4));
+                        painter.drawPoint(x1, top);
+
+                        if (!w.selectingArea() && !m_blockhover && rect.contains(mouse) && !m_hover) {
+                            m_hover = true;
+
+
+                            QColor col2(230,230,230,128);
+                            QRect rect((x1-d1), start_py+2, d1, height-2);
+                            if (rect.x() < left) {
+                                rect.setX(left);
+                            }
+
+                            painter.fillRect(rect, QBrush(col2));
+                            painter.setPen(col);
+                            painter.drawRect(rect);
+
+                            // Draw text label
+                            QString lab = QString("%1 (%2)").arg(schema::channel[m_code].fullname()).arg(raw);
+                            GetTextExtent(lab, x, y);
+
+                            w.ToolTip(lab, x1 - 10, start_py + 24 + (3 * w.printScaleY()), TT_AlignRight, p_profile->general->tooltipTimeout());
+
+                            //painter.fillRect(x1 - (x / 2) - x, start_py + 14 + (3 * w.printScaleY()), x+4,y+4, QBrush(QColor(255,255,255,245)));
+//                            painter.setPen(QPen(Qt::gray,1));
+//                            painter.drawRect(x1 - (x / 2) - x, start_py + 14 + (3 * w.printScaleY()), x+4,y+4);
+//                            w.renderText(lab, x1 - (x / 2)+2 - x, start_py + 14 + y + (3 * w.printScaleY()),0);
+
+//                            painter.drawLine(rect.x(), top, rect.x()+d1, top);
+//                            painter.drawLine(rect.x(), bottom, rect.x()+d1, bottom);
+//                            painter.drawLine(rect.x(), top, rect.x(), bottom);
+
+                           // col = COLOR_Gold;
+                            hover = true;
+                            painter.setPen(QPen(col,3));
+                        } else {
+                            painter.setPen(QPen(col,1));
+                        }
+                        painter.drawLine(x1, top, x1, bottom);
+                        if (xx < (3600000)) {
+                            QString lab = QString("%1").arg(m_label);
+                            GetTextExtent(lab, x, y);
+                            w.renderText(lab, x1 - (x / 2), top - y + (5 * w.printScaleY()),0);
+                        }
+
+
+                    } else {
+                        //////////////////////////////////////////////////////////////////////////////////////
+                        // Top and bottom markers
+                        //////////////////////////////////////////////////////////////////////////////////////
+                        bool b = false;
+                        if (!w.selectingArea() && !m_blockhover && QRect(x1-2, topp, 6, height).contains(mouse) && !m_hover) {
+                            // only want to draw the highlight/label once per frame
+                            m_hover = true;
+                            b = true;
+
+                            // Draw text label
+                            QString lab = QString("%1 (%2)").arg(schema::channel[m_code].fullname()).arg(raw);
+                            GetTextExtent(lab, x, y, defaultfont);
+
+                            w.ToolTip(lab, x1 - 10, start_py + 24 + (3 * w.printScaleY()), TT_AlignRight, p_profile->general->tooltipTimeout());
+
+//                            painter.fillRect(x1 - (x / 2) - x, start_py + 14 + (3 * w.printScaleY()), x+4,y+4, QBrush(QColor(255,255,255,245)));
+//                            painter.setPen(QPen(Qt::gray,1));
+//                            painter.drawRect(x1 - (x / 2) - x, start_py + 14 + (3 * w.printScaleY()), x+4,y+4);
+//                            w.renderText(lab, x1 - (x / 2)+2 - x, start_py + 14 + y + (3 * w.printScaleY()),0);
+
+                            //x1-=1;
+                            QColor col = m_flag_color;
+                            col.setAlpha(60);
+                            painter.setPen(QPen(col, 4));
+
+                            painter.drawLine(x1, start_py+14, x1, z - 12);
+                            painter.setPen(QPen(m_flag_color,4));
+
+                            painter.drawLine(x1, z, x1, z - 14);
+                            painter.drawLine(x1, start_py+2, x1, start_py + 16);
+                        } else {
+                            QColor col = m_flag_color;
+                            col.setAlpha(10);
+                            painter.setPen(QPen(col,1));
+                            painter.drawLine(x1, start_py+14, x1, z);
+                            painter.setPen(QPen(m_flag_color,1));
+                          //  painter.drawLine(x1, z, x1, z - 12);
+                            painter.drawLine(x1, start_py+2, x1, start_py + 14);
+                        }
+
+
+                    }
+                }
+            }
+
+        }
+
+    }
+}
+bool gLineOverlayBar::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    return false;
+}
+
+
+
+gLineOverlaySummary::gLineOverlaySummary(QString text, int x, int y)
+    : Layer(CPAP_Obstructive), m_text(text), m_x(x), m_y(y) // The Layer code is a dummy here.
+{
+}
+
+gLineOverlaySummary::~gLineOverlaySummary()
+{
+}
+
+void gLineOverlaySummary::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    Q_UNUSED(painter)
+
+    int left = region.boundingRect().left();
+    int top = region.boundingRect().top();
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    if (!m_visible) { return; }
+
+    if (!m_day) { return; }
+
+
+    Q_UNUSED(width);
+    Q_UNUSED(height);
+    float cnt = 0;
+    double sum = 0;
+    bool isSpan = false;
+
+    for (int i = 0; i < m_overlays.size(); i++) {
+        cnt += m_overlays[i]->count();
+        sum += m_overlays[i]->sum();
+
+        if (m_overlays[i]->flagtype() == FT_Span) { isSpan = true; }
+    }
+
+    double val, first, last;
+    double time = 0;
+
+    // Calculate the session time.
+    for (QList<Session *>::iterator s = m_day->begin(); s != m_day->end(); s++) {
+        if (!(*s)->enabled()) { continue; }
+
+        first = (*s)->first();
+        last = (*s)->last();
+
+        if (last < w.min_x) { continue; }
+
+        if (first > w.max_x) { continue; }
+
+        if (first < w.min_x) {
+            first = w.min_x;
+        }
+
+        if (last > w.max_x) {
+            last = w.max_x;
+        }
+
+        time += last - first;
+    }
+
+    val = 0;
+
+    time /= 1000;
+    int h = time / 3600;
+    int m = int(time / 60) % 60;
+    int s = int(time) % 60;
+
+
+    time /= 3600;
+
+    //if (time<1) time=1;
+
+    if (time > 0) { val = cnt / time; }
+
+    QString a;
+
+    if (0) { //(w.graphView()->selectionInProgress())) { // || w.graphView()->metaSelect()) && (!w.selDurString().isEmpty())) {
+        a = QObject::tr("Duration")+": "+w.selDurString();
+    } else {
+        a = QObject::tr("Events") + ": " + QString::number(cnt) + ", " +
+            QObject::tr("Duration") + " " + QString().sprintf("%02i:%02i:%02i", h, m, s) + ", " +
+            m_text + ": " + QString::number(val, 'f', 2);
+    }
+    if (isSpan) {
+        float sph;
+
+        if (!time) { sph = 0; }
+        else {
+            sph = (100.0 / float(time)) * (sum / 3600.0);
+
+            if (sph > 100) { sph = 100; }
+        }
+
+        // eg: %num of time in a span, like Periodic Breathing
+        a += " " + QObject::tr("(% %1 in events)").arg(sph, 0, 'f', 2);
+    }
+
+    w.renderText(a, left + m_x, top + m_y);
+}
diff --git a/sleepyhead/Graphs/gLineOverlay.h b/sleepyhead/Graphs/gLineOverlay.h
new file mode 100644
index 0000000..83d23d3
--- /dev/null
+++ b/sleepyhead/Graphs/gLineOverlay.h
@@ -0,0 +1,85 @@
+/* gLineOverlayBar Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GLINEOVERLAY_H
+#define GLINEOVERLAY_H
+
+#include "SleepLib/common.h"
+#include "gGraphView.h"
+
+
+/*! \class gLineOverlayBar
+    \brief Shows a flag line, a dot, or a span over the top of a 2D line chart.
+    */
+class gLineOverlayBar: public Layer
+{
+  public:
+    //! \brief Constructs a gLineOverlayBar object of type code, setting the flag/span color, the label to show when zoomed
+    //! in, and the display method requested, of either FT_Bar, FT_Span, or FT_Dot
+    gLineOverlayBar(ChannelID code, QColor col, QString _label = "", FlagType _flt = FT_Bar);
+    virtual ~gLineOverlayBar();
+
+    //! \brief The drawing code that fills the OpenGL vertex GLBuffers
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+    virtual EventDataType Miny() { return 0; }
+    virtual EventDataType Maxy() { return 0; }
+
+    //! \brief Returns true if no Channel data available for this code
+    virtual bool isEmpty() { return true; }
+
+    //! \brief returns a count of all flags drawn during render. (for gLineOverlaySummary)
+    int count() { return m_count; }
+    double sum() { return m_sum; }
+    FlagType flagtype() { return m_flt; }
+    bool hover() { return m_hover; }
+
+    void setBlockHover(bool b) { m_blockhover = b; }
+
+    inline void setOverlayDisplayType(OverlayDisplayType odt) { m_odt = odt; }
+    inline OverlayDisplayType overlayDisplayType() { return m_odt; }
+  protected:
+    //! \brief Mouse moved over this layers area (shows the hover-over tooltips here)
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+
+    QColor m_flag_color;
+    QString m_label;
+    FlagType m_flt;
+    OverlayDisplayType m_odt;
+    int m_count;
+    double m_sum;
+    bool m_hover;
+    bool m_blockhover;
+};
+
+/*! \class gLineOverlaySummary
+    \brief A container class to hold a group of gLineOverlayBar's, and shows the "Section AHI" over the Flow Rate waveform.
+    */
+class gLineOverlaySummary: public Layer
+{
+  public:
+    gLineOverlaySummary(QString text, int x, int y);
+    virtual ~gLineOverlaySummary();
+
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+    virtual EventDataType Miny() { return 0; }
+    virtual EventDataType Maxy() { return 0; }
+
+    //! \brief Returns true if no Channel data available for this code
+    virtual bool isEmpty() { return true; }
+
+    //! \brief Adds a gLineOverlayBar to this list
+    gLineOverlayBar *add(gLineOverlayBar *bar) { m_overlays.push_back(bar); return bar; }
+  protected:
+    QVector<gLineOverlayBar *> m_overlays;
+    QString m_text;
+    int m_x, m_y;
+};
+
+
+#endif // GLINEOVERLAY_H
diff --git a/sleepyhead/Graphs/gSegmentChart.cpp b/sleepyhead/Graphs/gSegmentChart.cpp
new file mode 100644
index 0000000..fe95a18
--- /dev/null
+++ b/sleepyhead/Graphs/gSegmentChart.cpp
@@ -0,0 +1,315 @@
+/* gSegmentChart Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <cmath>
+#include "gSegmentChart.h"
+
+gSegmentChart::gSegmentChart(GraphSegmentType type, QColor gradient_color, QColor outline_color)
+    : Layer(NoChannel), m_graph_type(type), m_gradient_color(gradient_color),
+      m_outline_color(outline_color)
+{
+    m_empty = true;
+}
+gSegmentChart::~gSegmentChart()
+{
+}
+void gSegmentChart::AddSlice(ChannelID code, QColor color, QString name)
+{
+    m_codes.push_back(code);
+    m_values.push_back(0);
+    m_colors.push_back(color);
+    m_names.push_back(name);
+    m_total = 0;
+}
+void gSegmentChart::SetDay(Day *d)
+{
+    Layer::SetDay(d);
+    m_total = 0;
+
+    if (!m_day) { return; }
+
+    for (int c = 0; c < m_codes.size(); c++) {
+        m_values[c] = 0;
+
+        for (QList<Session *>::iterator s = m_day->begin(); s != m_day->end(); ++s) {
+            if ((*s)->enabled() && (*s)->m_cnt.contains(m_codes[c])) {
+                EventDataType cnt = (*s)->count(m_codes[c]);
+                m_values[c] += cnt;
+                m_total += cnt;
+            }
+        }
+    }
+
+    m_empty = true;
+
+    for (int i = 0; i < m_codes.size(); i++) {
+        if (m_day->count(m_codes[i]) > 0) {
+            m_empty = false;
+            break;
+        }
+    }
+
+}
+bool gSegmentChart::isEmpty()
+{
+    return m_empty;
+}
+
+void gSegmentChart::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    QRect rect = region.boundingRect();
+    int height = qMin(rect.height(), rect.width());
+    int width = qMin(rect.height(), rect.width());
+
+    int left = rect.left();
+    int top = rect.top();
+
+    if (rect.width() > rect.height()) {
+        left = rect.left() + (rect.width() - rect.height());
+    }
+    //left --;
+    if (!m_visible) { return; }
+
+    if (!m_day) { return; }
+
+    int start_px = left;
+    int start_py = top;
+
+    width--;
+    float diameter = MIN(width, height);
+    diameter -= 8;
+    float radius = diameter / 2.0;
+
+    float xmult = float(width) / float(m_total);
+    float ymult = float(height) / float(m_total);
+
+    float xp = left;
+
+    int xoffset = width / 2;
+    int yoffset = height / 2;
+
+    if (m_total == 0) {
+        QColor col = Qt::green;
+        QString a = ":-)";
+        int x, y;
+        GetTextExtent(a, x, y, bigfont);
+
+        w.renderText(a, start_px + xoffset - x / 2, (start_py + yoffset + y / 2), 0, col, bigfont);
+        return;
+    }
+
+    EventDataType data;
+    unsigned size = m_values.size();
+    float line_step = float(width) / float(size - 1);
+    bool line_first = true;
+    int line_last;
+
+    float sum = -90.0;
+
+    painter.setFont(*defaultfont);
+    for (unsigned m = 0; m < size; m++) {
+        data = m_values[m];
+
+        if (data == 0) { continue; }
+
+        /////////////////////////////////////////////////////////////////////////////////////
+        // Pie Chart
+        /////////////////////////////////////////////////////////////////////////////////////
+        if (m_graph_type == GST_Pie) {
+            const QColor col = schema::channel[m_codes[m]].defaultColor();
+
+            // length of this segment in degrees
+            float len = 360.0 / m_total * data;
+
+            // Setup the shiny radial gradient
+
+            painter.setRenderHint(QPainter::Antialiasing);
+            QRect pierect(start_px+1, start_py+1, width-2, height-2);
+
+            painter.setPen(QPen(col, 0));
+            QRadialGradient gradient(pierect.center(), pierect.width()/2, pierect.center());
+            gradient.setColorAt(0, Qt::white);
+            gradient.setColorAt(1, col);
+
+
+            // draw filled pie
+            painter.setBrush(gradient);
+            painter.setBackgroundMode(Qt::OpaqueMode);
+            if (m_total == data) {
+                painter.drawEllipse(pierect);
+            } else {
+                painter.drawPie(pierect, -sum * 16.0, -len * 16.0);
+            }
+
+            // draw outline
+            painter.setBackgroundMode(Qt::TransparentMode);
+            painter.setBrush(QBrush(col,Qt::NoBrush));
+            painter.setPen(QPen(QColor(Qt::black),1.5));
+
+            if (m_total == data) {
+                painter.drawEllipse(pierect);
+            } else {
+                painter.drawPie(pierect, -sum * 16.0, -len * 16.0);
+            }
+
+
+            // Draw text labels if they fit
+            if (len > 20) {
+                float angle = (sum+90.0) + len / 2.0;
+                double tpx = (pierect.x() + pierect.width()/2)  + (sin((180 - angle) * (M_PI / 180.0)) * (radius / 1.65));
+                double tpy = (pierect.y() + pierect.height()/2) + (cos((180 - angle) * (M_PI / 180.0)) * (radius / 1.65));
+
+                QString txt = schema::channel[m_codes[m]].label(); //QString::number(floor(100.0/m_total*data),'f',0)+"%";
+                int x, y;
+                GetTextExtent(txt, x, y);
+                // antialiasing looks like crap here..
+                painter.setPen(QColor(Qt::black));
+                painter.drawText(tpx - (x / 2.0), tpy+3, txt);
+            }
+            sum += len;
+
+        } else if (m_graph_type == GST_CandleStick) {
+            /////////////////////////////////////////////////////////////////////////////////////
+            // CandleStick Chart
+            /////////////////////////////////////////////////////////////////////////////////////
+
+            QColor &col = m_colors[m % m_colors.size()];
+
+            float bw = xmult * float(data);
+
+            QLinearGradient linearGrad(QPointF(0, 0), QPointF(bw, 0));
+            linearGrad.setColorAt(0, col);
+            linearGrad.setColorAt(1, Qt::white);
+            painter.fillRect(xp, start_py, bw, height, QBrush(linearGrad));
+
+            painter.setPen(m_outline_color);
+            painter.drawLine(xp, start_py, xp + bw, start_py);
+            painter.drawLine(xp + bw, start_py + height, xp, start_py + height);
+
+            if (!m_names[m].isEmpty()) {
+                int px, py;
+                GetTextExtent(m_names[m], px, py);
+
+                if (px + 5 < bw) {
+                    w.renderText(m_names[m], (xp + bw / 2) - (px / 2), top + ((height / 2) - (py / 2)), 0, Qt::black);
+                }
+            }
+
+            xp += bw;
+            /////////////////////////////////////////////////////////////////////////////////////
+            // Line Chart
+            /////////////////////////////////////////////////////////////////////////////////////
+        } else if (m_graph_type == GST_Line) {
+            QColor col = Qt::black; //m_colors[m % m_colors.size()];
+            painter.setPen(col);
+            float h = (top + height) - (float(data) * ymult);
+
+            if (line_first) {
+                line_first = false;
+            } else {
+                painter.drawLine(xp, line_last, xp + line_step, h);
+                xp += line_step;
+            }
+
+            line_last = h;
+        }
+    }
+}
+
+
+gTAPGraph::gTAPGraph(ChannelID code, GraphSegmentType gt, QColor gradient_color,
+                     QColor outline_color)
+    : gSegmentChart(gt, gradient_color, outline_color), m_code(code)
+{
+    m_colors.push_back(Qt::red);
+    m_colors.push_back(Qt::green);
+}
+gTAPGraph::~gTAPGraph()
+{
+}
+void gTAPGraph::SetDay(Day *d)
+{
+    Layer::SetDay(d);
+    m_total = 0;
+
+    if (!m_day) { return; }
+
+    QMap<EventStoreType, qint64> tap;
+
+    EventStoreType data = 0, lastval = 0;
+    qint64 time = 0, lasttime = 0;
+    //bool first;
+    bool rfirst = true;
+    //bool changed;
+    EventDataType gain = 1, offset = 0;
+    QHash<ChannelID, QVector<EventList *> >::iterator ei;
+
+    for (QList<Session *>::iterator s = m_day->begin(); s != m_day->end(); ++s) {
+        if (!(*s)->enabled()) { continue; }
+
+        if ((ei = (*s)->eventlist.find(m_code)) == (*s)->eventlist.end()) { continue; }
+
+        for (int q = 0; q < ei.value().size(); q++) {
+            EventList &el = *(ei.value()[q]);
+            lasttime = el.time(0);
+            lastval = el.raw(0);
+
+            if (rfirst) {
+                gain = el.gain();
+                offset = el.offset();
+                rfirst = false;
+            }
+
+            //first=true;
+            //changed=false;
+            for (quint32 i = 1; i < el.count(); i++) {
+                data = el.raw(i);
+                time = el.time(i);
+
+                if (lastval != data) {
+                    qint64 v = (time - lasttime);
+
+                    if (tap.find(lastval) != tap.end()) {
+                        tap[lastval] += v;
+                    } else {
+                        tap[lastval] = v;
+                    }
+
+                    //changed=true;
+                    lasttime = time;
+                    lastval = data;
+                }
+            }
+
+            if (time != lasttime) {
+                qint64 v = (time - lasttime);
+
+                if (tap.find(lastval) != tap.end()) {
+                    tap[data] += v;
+                } else {
+                    tap[data] = v;
+                }
+            }
+        }
+    }
+
+    m_values.clear();
+    m_names.clear();
+    m_total = 0;
+    EventDataType val;
+
+    for (QMap<EventStoreType, qint64>::iterator i = tap.begin(); i != tap.end(); i++) {
+        val = float(i.key()) * gain + offset;
+
+        m_values.push_back(i.value() / 1000L);
+        m_total += i.value() / 1000L;
+        m_names.push_back(QString::number(val, 'f', 2));
+    }
+
+    m_empty = m_values.size() == 0;
+}
diff --git a/sleepyhead/Graphs/gSegmentChart.h b/sleepyhead/Graphs/gSegmentChart.h
new file mode 100644
index 0000000..251d9dc
--- /dev/null
+++ b/sleepyhead/Graphs/gSegmentChart.h
@@ -0,0 +1,75 @@
+/* gSegmentChart Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GSEGMENTCHART_H
+#define GSEGMENTCHART_H
+
+#include "gGraphView.h"
+
+enum GraphSegmentType { GST_Pie, GST_CandleStick, GST_Line };
+
+/*! \class gSegmentChart
+    \brief Draws a PieChart, CandleStick or 2D Line plots containing multiple Channel 'slices'
+  */
+class gSegmentChart : public Layer
+{
+  public:
+    gSegmentChart(GraphSegmentType gt = GST_Pie, QColor gradient_color = Qt::white,
+                  QColor outline_color = Qt::black);
+    virtual ~gSegmentChart();
+
+    //! \brief The drawing code that fills the Vertex buffers
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+    //! \brief Pre-fills a buffer with the data needed to draw
+    virtual void SetDay(Day *d);
+
+    //! \brief Returns true if no data available for drawing
+    virtual bool isEmpty();
+
+    //! \brief Adds a channel slice, and sets the color and label
+    void AddSlice(ChannelID code, QColor col, QString name = "");
+
+    //! \brief Sets the fade-out color to make the graphs look more attractive
+    void setGradientColor(QColor &color) { m_gradient_color = color; }
+
+    //! \brief Sets the outline color for the edges drawn around the Pie slices
+    void setOutlineColor(QColor &color) { m_outline_color = color; }
+    const GraphSegmentType &graphType() { return m_graph_type; }
+    void setGraphType(GraphSegmentType type) { m_graph_type = type; }
+
+  protected:
+    QVector<ChannelID> m_codes;
+    QVector<QString> m_names;
+    QVector<EventDataType> m_values;
+    QVector<QColor> m_colors;
+
+    EventDataType m_total;
+    GraphSegmentType m_graph_type;
+    QColor m_gradient_color;
+    QColor m_outline_color;
+    bool m_empty;
+};
+
+/*! \class gTAPGraph
+    \brief Time at Pressure chart, derived from gSegmentChart
+    \notes Currently unused
+    */
+class gTAPGraph: public gSegmentChart
+{
+  public:
+    gTAPGraph(ChannelID code, GraphSegmentType gt = GST_CandleStick,
+              QColor gradient_color = Qt::lightGray, QColor outline_color = Qt::black);
+    virtual ~gTAPGraph();
+    virtual void SetDay(Day *d);
+  protected:
+    ChannelID m_code;
+};
+
+
+#endif // GSEGMENTCHART_H
diff --git a/sleepyhead/Graphs/gSessionTimesChart.cpp b/sleepyhead/Graphs/gSessionTimesChart.cpp
new file mode 100644
index 0000000..79b67de
--- /dev/null
+++ b/sleepyhead/Graphs/gSessionTimesChart.cpp
@@ -0,0 +1,1473 @@
+/* gSessionTimesChart Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <math.h>
+#include <QLabel>
+#include <QDateTime>
+
+#include "mainwindow.h"
+#include "SleepLib/profiles.h"
+#include "gSessionTimesChart.h"
+
+#include "gYAxis.h"
+
+extern MainWindow * mainwin;
+
+short SummaryCalcItem::midcalc;
+
+gSummaryChart::gSummaryChart(QString label, MachineType machtype)
+    :Layer(NoChannel), m_label(label), m_machtype(machtype)
+{
+    m_layertype = LT_Overview;
+    QDateTime d1 = QDateTime::currentDateTime();
+    QDateTime d2 = d1;
+    d1.setTimeSpec(Qt::UTC);  // CHECK: Does this deal with DST?
+    tz_offset = d2.secsTo(d1);
+    tz_hours = tz_offset / 3600.0;
+    expected_slices = 5;
+}
+
+gSummaryChart::gSummaryChart(ChannelID code, MachineType machtype)
+    :Layer(code), m_machtype(machtype)
+{
+    m_layertype = LT_Overview;
+    QDateTime d1 = QDateTime::currentDateTime();
+    QDateTime d2 = d1;
+    d1.setTimeSpec(Qt::UTC);  // CHECK: Does this deal with DST?
+    tz_offset = d2.secsTo(d1);
+    tz_hours = tz_offset / 3600.0;
+    expected_slices = 5;
+
+    addCalc(code, ST_MIN, brighten(schema::channel[code].defaultColor() ,0.90));
+    addCalc(code, ST_MID, brighten(schema::channel[code].defaultColor() ,1.30));
+    addCalc(code, ST_90P, brighten(schema::channel[code].defaultColor() ,1.50));
+    addCalc(code, ST_MAX, brighten(schema::channel[code].defaultColor() ,1.80));
+}
+
+gSummaryChart::~gSummaryChart()
+{
+}
+
+void gSummaryChart::SetDay(Day *unused_day)
+{
+    cache.clear();
+
+    Q_UNUSED(unused_day)
+    Layer::SetDay(nullptr);
+
+    firstday = p_profile->FirstDay(m_machtype);
+    lastday = p_profile->LastDay(m_machtype);
+
+    dayindex.clear();
+    daylist.clear();
+
+    if (!firstday.isValid() || !lastday.isValid()) return;
+   // daylist.reserve(firstday.daysTo(lastday)+1);
+    QDate date = firstday;
+    int idx = 0;
+    do {
+        QMap<QDate, Day *>::iterator di = p_profile->daylist.find(date);
+        Day * day = nullptr;
+        if (di != p_profile->daylist.end()) {
+            day = di.value();
+        }
+        daylist.append(day);
+        dayindex[date] = idx;
+        idx++;
+        date = date.addDays(1);
+    } while (date <= lastday);
+
+    m_minx = QDateTime(firstday, QTime(0,0,0)).toMSecsSinceEpoch();
+    m_maxx = QDateTime(lastday, QTime(23,59,59)).toMSecsSinceEpoch();
+    m_miny = 0;
+    m_maxy = 20;
+
+    m_empty = false;
+
+}
+
+
+//QMap<QDate, int> gSummaryChart::dayindex;
+//QList<Day *> gSummaryChart::daylist;
+
+
+bool gSummaryChart::keyPressEvent(QKeyEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    return false;
+}
+
+bool gSummaryChart::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    return false;
+}
+
+bool gSummaryChart::mousePressEvent(QMouseEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    return false;
+}
+
+bool gSummaryChart::mouseReleaseEvent(QMouseEvent *event, gGraph *graph)
+{
+    if (!(event->modifiers() & Qt::ShiftModifier)) return false;
+
+    float x = event->x() - m_rect.left();
+    float y = event->y() - m_rect.top();
+    qDebug() << x << y;
+
+    EventDataType miny;
+    EventDataType maxy;
+
+    graph->roundY(miny, maxy);
+
+    QDate date = QDateTime::fromMSecsSinceEpoch(m_minx).date();
+
+    int days = ceil(double(m_maxx - m_minx) / 86400000.0);
+
+    float barw = float(m_rect.width()) / float(days);
+
+    float idx = x/barw;
+
+    date = date.addDays(idx);
+
+    QMap<QDate, int>::iterator it = dayindex.find(date);
+    if (it != dayindex.end()) {
+        Day * day = daylist.at(it.value());
+        if (day) {
+            mainwin->getDaily()->LoadDate(date);
+            mainwin->JumpDaily();
+        }
+    }
+
+    return true;
+}
+
+void gSummaryChart::preCalc()
+{
+    midcalc = p_profile->general->prefCalcMiddle();
+
+    for (int i=0; i<calcitems.size(); ++i) {
+        SummaryCalcItem & calc = calcitems[i];
+        calc.reset(idx_end - idx_start);
+    }
+}
+
+void gSummaryChart::customCalc(Day *day, QVector<SummaryChartSlice> & slices)
+{
+    int size = slices.size();
+    if (size != calcitems.size()) {
+        return;
+    }
+    float hour = day->hours(m_machtype);
+    for (int i=0; i < size; ++i) {
+        const SummaryChartSlice & slice = slices.at(i);
+        SummaryCalcItem & calc = calcitems[i];
+
+        calc.update(slice.value, hour);
+     }
+}
+
+void gSummaryChart::afterDraw(QPainter &painter, gGraph &graph, QRect rect)
+{
+    if (totaldays == nousedays) return;
+
+    if (calcitems.size() == 0) return;
+
+    QStringList strlist;
+    QString txt;
+
+    int midcalc = p_profile->general->prefCalcMiddle();
+    QString midstr;
+    if (midcalc == 0) {
+        midstr = QObject::tr("Med.");
+    } else if (midcalc == 1) {
+        midstr = QObject::tr("W-Avg");
+    } else {
+        midstr = QObject::tr("Avg");
+    }
+
+
+    float perc = p_profile->general->prefCalcPercentile();
+    QString percstr = QObject::tr("%1%").arg(perc, 0, 'f',0);
+
+    schema::Channel & chan = schema::channel[calcitems.at(0).code];
+
+    for (int i=0; i<calcitems.size(); ++i) {
+        SummaryCalcItem & calc = calcitems[i];
+        if (calcitems.size() == 1) {
+            float val = calc.min;
+            if (val < 99998)
+                strlist.append(QObject::tr("Min: %1").arg(val,0,'f',2));
+        }
+
+        float mid = 0;
+        switch (midcalc) {
+        case 0:
+            if (calc.median_data.size() > 0) {
+                mid = median(calc.median_data.begin(), calc.median_data.end());
+            }
+            break;
+        case 1:
+            mid = calc.wavg_sum / calc.divisor;
+            break;
+        case 2:
+            mid = calc.avg_sum / calc.cnt;
+            break;
+        }
+
+        float val = 0;
+        switch (calc.type) {
+        case ST_CPH:
+            val = mid;
+            txt = midstr+": ";
+            break;
+        case ST_SPH:
+            val = mid;
+            txt = midstr+": ";
+            break;
+        case ST_MIN:
+            val = calc.min;
+            if (val >= 99998) continue;
+            txt = QObject::tr("Min: ");
+            break;
+        case ST_MAX:
+            val = calc.max;
+            if (val <= -99998) continue;
+            txt = QObject::tr("Max: ");
+            break;
+        case ST_SETMIN:
+            val = calc.min;
+            if (val >= 99998) continue;
+            txt = QObject::tr("Min: ");
+            break;
+        case ST_SETMAX:
+            val = calc.max;
+            if (val <= -99998) continue;
+            txt = QObject::tr("Max: ");
+            break;
+        case ST_MID:
+            val = mid;
+            txt = QObject::tr("%1: ").arg(midstr);
+            break;
+        case ST_90P:
+            val = mid;
+            txt = QObject::tr("%1: ").arg(percstr);
+            break;
+        default:
+            val = mid;
+            txt = QObject::tr("???: ");
+            break;
+        }
+        strlist.append(QString("%1%2").arg(txt).arg(val,0,'f',2));
+        if (calcitems.size() == 1) {
+            val = calc.max;
+            if (val > -99998)
+                strlist.append(QObject::tr("Max: %1").arg(val,0,'f',2));
+        }
+    }
+
+    QString str;
+    if (totaldays > 1) {
+        str = QObject::tr("%1 (%2 days): ").arg(chan.fullname()).arg(totaldays);
+    } else {
+        str = QObject::tr("%1 (%2 day): ").arg(chan.fullname()).arg(totaldays);
+    }
+    str += " "+strlist.join(", ");
+
+    QRectF rec(rect.left(), rect.top(), 0,0);
+    painter.setFont(*defaultfont);
+    rec = painter.boundingRect(rec, Qt::AlignTop, str);
+    rec.moveBottom(rect.top()-3*graph.printScaleY());
+    painter.drawText(rec, Qt::AlignTop, str);
+
+//    graph.renderText(str, rect.left(), rect.top()-5*graph.printScaleY(), 0);
+
+
+}
+
+QString gSummaryChart::tooltipData(Day *, int idx)
+{
+    QVector<SummaryChartSlice> & slices = cache[idx];
+    QString txt;
+    for (int i=0; i< slices.size(); ++i) {
+        SummaryChartSlice & slice = slices[i];
+        txt += QString("\n%1: %2").arg(slice.name).arg(float(slice.value), 0, 'f', 2);
+
+    }
+    return txt;
+}
+
+void gSummaryChart::populate(Day * day, int idx)
+{
+
+    int size = calcitems.size();
+    bool good = false;
+    for (int i=0; i < size; ++i) {
+        const SummaryCalcItem & item = calcitems.at(i);
+        if (day->hasData(item.code, item.type)) {
+            good = true;
+            break;
+        }
+    }
+    if (!good) return;
+
+    QVector<SummaryChartSlice> & slices = cache[idx];
+
+    float hours = day->hours(m_machtype);
+    float base = 0;
+    for (int i=0; i < size; ++i) {
+        SummaryCalcItem & item = calcitems[i];
+        ChannelID code = item.code;
+        schema::Channel & chan = schema::channel[code];
+        float value = 0;
+        QString name;
+        QColor color;
+        switch (item.type) {
+        case ST_CPH:
+            value = day->count(code) / hours;
+            name = chan.label();
+            color = item.color;
+            slices.append(SummaryChartSlice(&item, value, value, name, color));
+            break;
+        case ST_SPH:
+            value = (100.0 / hours) * (day->sum(code) / 3600.0);
+            name = QObject::tr("% in %1").arg(chan.label());
+            color = item.color;
+            slices.append(SummaryChartSlice(&item, value, value, name, color));
+            break;
+        case ST_HOURS:
+            value = hours;
+            name = QObject::tr("Hours");
+            color = COLOR_LightBlue;
+            slices.append(SummaryChartSlice(&item, hours, hours, name, color));
+            break;
+        case ST_MIN:
+            value = day->Min(code);
+            name = QObject::tr("Min %1").arg(chan.label());
+            color = item.color;
+            slices.append(SummaryChartSlice(&item, value, value - base, name, color));
+            base = value;
+            break;
+        case ST_MID:
+            value = day->calcMiddle(code);
+            name = day->calcMiddleLabel(code);
+            color = item.color;
+            slices.append(SummaryChartSlice(&item, value, value - base, name, color));
+            base = value;
+            break;
+        case ST_90P:
+            value = day->calcPercentile(code);
+            name = day->calcPercentileLabel(code);
+            color = item.color;
+            slices.append(SummaryChartSlice(&item, value, value - base, name, color));
+            base = value;
+            break;
+        case ST_MAX:
+            value = day->calcMax(code);
+            name = day->calcMaxLabel(code);
+            color = item.color;
+            slices.append(SummaryChartSlice(&item, value, value - base, name, color));
+            base = value;
+            break;
+        default:
+            break;
+        }
+    }
+}
+
+void gSummaryChart::paint(QPainter &painter, gGraph &graph, const QRegion &region)
+{
+    QRect rect = region.boundingRect();
+
+    painter.setPen(QColor(Qt::black));
+    painter.drawRect(rect);
+
+    rect.moveBottom(rect.bottom()+1);
+
+    m_minx = graph.min_x;
+    m_maxx = graph.max_x;
+
+
+    QDateTime date2 = QDateTime::fromMSecsSinceEpoch(m_minx);
+    QDateTime enddate2 = QDateTime::fromMSecsSinceEpoch(m_maxx);
+
+    QDate date = date2.date();
+    QDate enddate = enddate2.date();
+
+    int days = ceil(double(m_maxx - m_minx) / 86400000.0);
+
+    //float lasty1 = rect.bottom();
+
+    QMap<QDate, int>::iterator it = dayindex.find(date);
+    idx_start=0;
+    if (it != dayindex.end()) {
+        idx_start = it.value();
+    }
+    int idx = idx_start;
+
+    QMap<QDate, int>::iterator ite = dayindex.find(enddate);
+    idx_end = daylist.size()-1;
+    if (ite != dayindex.end()) {
+        idx_end = ite.value();
+    }
+
+    QPoint mouse = graph.graphView()->currentMousePos();
+
+    nousedays = 0;
+    totaldays = 0;
+
+    QRectF hl_rect;
+    QDate hl_date;
+    Day * hl_day = nullptr;
+    int hl_idx = -1;
+    bool hl = false;
+
+    if ((daylist.size() == 0) || (it == dayindex.end())) return;
+
+    Day * lastday = nullptr;
+
+    //    int dc = 0;
+//    for (int i=idx; i<=idx_end; ++i) {
+//        Day * day = daylist.at(i);
+//        if (day || lastday) {
+//            dc++;
+//        }
+//        lastday = day;
+//    }
+//    days = dc;
+//    lastday = nullptr;
+    float barw = float(rect.width()) / float(days);
+
+    QString hl2_text = "";
+
+    QVector<QRectF> outlines;
+    int size = idx_end - idx;
+    outlines.reserve(size * expected_slices);
+
+    // Virtual call to setup any custom graph stuff
+    preCalc();
+
+    float lastx1 = rect.left();
+    float right_edge = (rect.left()+rect.width()+1);
+
+
+    /////////////////////////////////////////////////////////////////////
+    /// Calculate Graph Peaks
+    /////////////////////////////////////////////////////////////////////
+    peak_value = 0;
+    for (int i=idx; i <= idx_end; ++i, lastx1 += barw) {
+        Day * day = daylist.at(i);
+
+        if ((lastx1 + barw) > right_edge)
+            break;
+
+        if (!day) {
+            continue;
+        }
+
+        day->OpenSummary();
+
+        QHash<int, QVector<SummaryChartSlice> >::iterator cit = cache.find(i);
+
+        if (cit == cache.end()) {
+            populate(day, i);
+            cit = cache.find(i);
+        }
+
+        if (cit != cache.end()) {
+            QVector<SummaryChartSlice> & list = cit.value();
+            float base = 0, val;
+            int listsize = list.size();
+            for (int j=0; j < listsize; ++j) {
+                SummaryChartSlice & slice = list[j];
+                val = slice.height;
+                base += val;
+            }
+            peak_value = qMax(peak_value, base);
+        }
+    }
+    m_miny = 0;
+    m_maxy = ceil(peak_value);
+
+    /////////////////////////////////////////////////////////////////////
+    /// Y-Axis scaling
+    /////////////////////////////////////////////////////////////////////
+
+    EventDataType miny;
+    EventDataType maxy;
+
+    graph.roundY(miny, maxy);
+    float ymult = float(rect.height()) / (maxy-miny);
+
+    lastx1 = rect.left();
+
+    /////////////////////////////////////////////////////////////////////
+    /// Main drawing loop
+    /////////////////////////////////////////////////////////////////////
+    do {
+        Day * day = daylist.at(idx);
+
+        if ((lastx1 + barw) > right_edge)
+            break;
+
+        totaldays++;
+
+        if (!day) {//  || !day->hasMachine(m_machtype)) {
+           // lasty1 = rect.bottom();
+            lastx1 += barw;
+            it++;
+            nousedays++;
+            lastday = day;
+            continue;
+        }
+
+        lastday = day;
+
+        float x1 = lastx1 + barw;
+
+        day->OpenSummary();
+        QRectF hl2_rect;
+
+        bool hlday = false;
+        QRectF rec2(lastx1, rect.top(), barw, rect.height());
+        if (rec2.contains(mouse)) {
+            hl_rect = rec2;
+            hl_day = day;
+            hl_date = it.key();
+            hl_idx = idx;
+
+            hl = true;
+            hlday = true;
+        }
+
+        QHash<int, QVector<SummaryChartSlice> >::iterator cit = cache.find(idx);
+
+        if (cit == cache.end()) {
+            populate(day, idx);
+            cit = cache.find(idx);
+        }
+
+        float lastval = 0, val, y1,y2;
+        if (cit != cache.end()) {
+            /////////////////////////////////////////////////////////////////////////////////////
+            /// Draw pressure settings
+            /////////////////////////////////////////////////////////////////////////////////////
+            QVector<SummaryChartSlice> & list = cit.value();
+            customCalc(day, list);
+
+            int listsize = list.size();
+            QLinearGradient gradient(lastx1, 0, lastx1 + barw, 0); //rect.bottom(), barw, rect.bottom());
+
+            for (int i=0; i < listsize; ++i) {
+                SummaryChartSlice & slice = list[i];
+
+                val = slice.height;
+                y1 = ((lastval-miny) * ymult);
+                y2 = (val * ymult);
+                QColor color = slice.color;
+
+                QRectF rec = QRectF(lastx1, rect.bottom() - y1, barw, -y2).intersected(rect);
+
+                if (hlday) {
+                    if (rec.contains(mouse.x(), mouse.y())) {
+                        color = Qt::yellow;
+                        hl2_rect = rec;
+                    }
+                }
+
+                if (barw <= 3) {
+                    painter.fillRect(rec, QBrush(color));
+                } else if (barw > 8) {
+                    gradient.setColorAt(0,color);
+                    gradient.setColorAt(1,brighten(color, 2.0));
+                    painter.fillRect(rec, QBrush(gradient));
+//                    painter.fillRect(rec, slice.brush);
+                    outlines.append(rec);
+                } else {
+                    painter.fillRect(rec, QBrush(brighten(color,1.25)));
+                    outlines.append(rec);
+                }
+
+                lastval += val;
+
+            }
+
+        }
+
+        lastx1 = x1;
+        it++;
+
+    } while (++idx <= idx_end);
+    painter.setPen(QPen(Qt::black,1));
+    painter.drawRects(outlines);
+
+    if (hl) {
+        QColor col2(255,0,0,64);
+        painter.fillRect(hl_rect, QBrush(col2));
+
+        QString txt = hl_date.toString(Qt::SystemLocaleShortDate)+" ";
+        if (hl_day) {
+            // grab extra tooltip data
+            txt += tooltipData(hl_day, hl_idx);
+            if (!hl2_text.isEmpty()) {
+                QColor col = Qt::yellow;
+                col.setAlpha(255);
+           //     painter.fillRect(hl2_rect, QBrush(col));
+                txt += hl2_text;
+            }
+        }
+
+        graph.ToolTip(txt, mouse.x()-15, mouse.y()+5, TT_AlignRight);
+    }
+    try {
+        afterDraw(painter, graph, rect);
+    } catch(...) {
+        qDebug() << "Bad median call in" << m_label;
+    }
+
+
+    // This could be turning off graphs prematurely..
+    if (cache.size() == 0) {
+
+        m_empty = true;
+        graph.graphView()->updateScale();
+    }
+
+}
+
+QString gUsageChart::tooltipData(Day * day, int)
+{
+    return QObject::tr("\nHours: %1").arg(day->hours(m_machtype), 0, 'f', 2);
+}
+
+void gUsageChart::populate(Day *day, int idx)
+{
+    QVector<SummaryChartSlice> & slices = cache[idx];
+
+    float hours = day->hours();
+
+    QColor cpapcolor = day->summaryOnly() ? QColor(128,128,128) : calcitems[0].color;
+    bool haveoxi = day->hasMachine(MT_OXIMETER);
+
+    QColor goodcolor = haveoxi ? QColor(128,255,196) : cpapcolor;
+
+    QColor color = (hours < compliance_threshold) ? QColor(255,64,64) : goodcolor;
+    slices.append(SummaryChartSlice(&calcitems[0], hours, hours, QObject::tr("Hours"), color));
+}
+
+void gUsageChart::preCalc()
+{
+    midcalc = p_profile->general->prefCalcMiddle();
+
+    compliance_threshold = p_profile->cpap->complianceHours();
+    incompdays = 0;
+
+    SummaryCalcItem & calc = calcitems[0];
+    calc.reset(idx_end - idx_start);
+}
+
+void gUsageChart::customCalc(Day *, QVector<SummaryChartSlice> &list)
+{
+    if (list.size() == 0) {
+        incompdays++;
+        return;
+    }
+
+    SummaryChartSlice & slice = list[0];
+    SummaryCalcItem & calc = calcitems[0];
+
+    if (slice.value < compliance_threshold) incompdays++;
+
+    calc.update(slice.value, 1);
+}
+
+void gUsageChart::afterDraw(QPainter &, gGraph &graph, QRect rect)
+{
+    if (totaldays == nousedays) return;
+
+    if (totaldays > 1) {
+        float comp = 100.0 - ((float(incompdays + nousedays) / float(totaldays)) * 100.0);
+
+        int midcalc = p_profile->general->prefCalcMiddle();
+        float mid = 0;
+        SummaryCalcItem & calc = calcitems[0];
+        switch (midcalc) {
+        case 0: // median
+            mid = median(calc.median_data.begin(), calc.median_data.end());
+            break;
+        case 1: // w-avg
+            mid = calc.wavg_sum / calc.divisor;
+            break;
+        case 2:
+            mid = calc.avg_sum / calc.cnt;
+            break;
+        }
+
+        QString txt = QObject::tr("%1 low usage, %2 no usage, out of %3 days (%4% compliant.) Length: %5 / %6 / %7").
+                arg(incompdays).arg(nousedays).arg(totaldays).arg(comp,0,'f',1).arg(calc.min, 0, 'f', 2).arg(mid, 0, 'f', 2).arg(calc.max, 0, 'f', 2);;
+        graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0);
+    }
+}
+
+
+void gSessionTimesChart::preCalc() {
+
+    midcalc = p_profile->general->prefCalcMiddle();
+
+    num_slices = 0;
+    num_days = 0;
+    total_length = 0;
+    SummaryCalcItem  & calc = calcitems[0];
+
+    calc.reset((idx_end - idx_start) * 6);
+
+    SummaryCalcItem  & calc1 = calcitems[1];
+
+    calc1.reset(idx_end - idx_start);
+
+    SummaryCalcItem  & calc2 = calcitems[2];
+    calc2.reset(idx_end - idx_start);
+}
+
+void gSessionTimesChart::customCalc(Day *, QVector<SummaryChartSlice> & slices) {
+    int size = slices.size();
+    num_slices += size;
+
+    SummaryCalcItem  & calc1 = calcitems[1];
+    calc1.update(slices.size(), 1);
+
+    EventDataType max = 0;
+    for (int i=0; i<size; ++i) {
+        SummaryChartSlice & slice = slices[i];
+        SummaryCalcItem & calc = *slice.calc;
+
+        calc.update(slice.height, slice.height);
+
+        max = qMax(slice.height, max);
+    }
+    SummaryCalcItem  & calc2 = calcitems[2];
+
+    calc2.update(max, max);
+
+    num_days++;
+}
+
+void gSessionTimesChart::afterDraw(QPainter & /*painter */, gGraph &graph, QRect rect)
+{
+    if (totaldays == nousedays) return;
+
+    SummaryCalcItem  & calc = calcitems[0]; // session length
+    SummaryCalcItem  & calc1 = calcitems[1]; // number of sessions
+    SummaryCalcItem  & calc2 = calcitems[2]; // number of sessions
+
+    int midcalc = p_profile->general->prefCalcMiddle();
+
+    float mid = 0, mid1 = 0, midlongest = 0;
+    switch (midcalc) {
+    case 0:
+        if (calc.median_data.size() > 0) {
+            mid = median(calc.median_data.begin(), calc.median_data.end());
+            mid1 = median(calc1.median_data.begin(), calc1.median_data.end());
+            midlongest = median(calc2.median_data.begin(), calc2.median_data.end());
+        }
+        break;
+    case 1:
+        mid = calc.wavg_sum / calc.divisor;
+        mid1 = calc1.wavg_sum / calc1.divisor;
+        midlongest = calc2.wavg_sum / calc2.divisor;
+        break;
+    case 2:
+        mid = calc.avg_sum / calc.cnt;
+        mid1 = calc1.avg_sum / calc1.cnt;
+        midlongest = calc2.avg_sum / calc2.cnt;
+        break;
+    }
+
+
+//    float avgsess = float(num_slices) / float(num_days);
+
+    QString txt = QObject::tr("Sessions: %1 / %2 / %3 Length: %4 / %5 / %6 Longest: %7 / %8 / %9")
+            .arg(calc1.min, 0, 'f', 2).arg(mid1, 0, 'f', 2).arg(calc1.max, 0, 'f', 2)
+            .arg(calc.min, 0, 'f', 2).arg(mid, 0, 'f', 2).arg(calc.max, 0, 'f', 2)
+            .arg(calc2.min, 0, 'f', 2).arg(midlongest, 0, 'f', 2).arg(calc2.max, 0, 'f', 2);
+    graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0);
+}
+
+void gSessionTimesChart::paint(QPainter &painter, gGraph &graph, const QRegion &region)
+{
+    QRect rect = region.boundingRect();
+
+    painter.setPen(QColor(Qt::black));
+    painter.drawRect(rect);
+
+    m_minx = graph.min_x;
+    m_maxx = graph.max_x;
+
+    QDateTime date2 = QDateTime::fromMSecsSinceEpoch(m_minx);
+    QDateTime enddate2 = QDateTime::fromMSecsSinceEpoch(m_maxx);
+
+    QDate date = date2.date();
+    QDate enddate = enddate2.date();
+
+    int days = ceil(double(m_maxx - m_minx) / 86400000.0);
+
+    float barw = float(rect.width()) / float(days);
+
+    QDateTime splittime;
+
+//    float lasty1 = rect.bottom();
+    float lastx1 = rect.left();
+
+    QMap<QDate, int>::iterator it = dayindex.find(date);
+    int idx=0;
+    if (it != dayindex.end()) {
+        idx = it.value();
+    }
+
+    QMap<QDate, int>::iterator ite = dayindex.find(enddate);
+    int idx_end = daylist.size()-1;
+    if (ite != dayindex.end()) {
+        idx_end = ite.value();
+    }
+
+    QPoint mouse = graph.graphView()->currentMousePos();
+
+    if (daylist.size() == 0) return;
+
+    QVector<QRectF> outlines;
+    int size = idx_end - idx;
+    outlines.reserve(size * 5);
+
+    QMap<QDate, int>::iterator it2 = it;
+
+    /////////////////////////////////////////////////////////////////////
+    /// Calculate Graph Peaks
+    /////////////////////////////////////////////////////////////////////
+    peak_value = 0;
+    min_value = 999;
+    QMap<QDate, int>::iterator it_end = dayindex.end();
+
+    float right_edge = (rect.left()+rect.width()+1);
+    for (int i=idx; (i <= idx_end) && (it2 != it_end); ++i, ++it2, lastx1 += barw) {
+        Day * day = daylist.at(i);
+
+        if ((lastx1 + barw) > right_edge)
+            break;
+
+        if (!day) {
+            continue;
+        }
+
+        QHash<int, QVector<SummaryChartSlice> >::iterator cit = cache.find(i);
+
+        if (cit == cache.end()) {
+            day->OpenSummary();
+            date = it2.key();
+            splittime = QDateTime(date, split);
+            QList<Session *>::iterator si;
+
+            QVector<SummaryChartSlice> & slices = cache[i];
+
+            bool haveoxi = day->hasMachine(MT_OXIMETER);
+
+            QColor goodcolor = haveoxi ? QColor(128,255,196) : QColor(64,128,255);
+
+            QString datestr = date.toString(Qt::SystemLocaleShortDate);
+
+            for (si = day->begin(); si != day->end(); ++si) {
+                Session *sess = (*si);
+                if (!sess->enabled() || (sess->type() != m_machtype)) continue;
+
+                // Look at mask on/off slices...
+                int slize = sess->m_slices.size();
+                if (slize > 0) {
+                    // segments
+                    for (int j=0; j<slize; ++j) {
+                        const SessionSlice & slice = sess->m_slices.at(j);
+                        QDateTime st = QDateTime::fromMSecsSinceEpoch(slice.start);
+
+                        float s1 = float(splittime.secsTo(st)) / 3600.0;
+
+                        float s2 = double(slice.end - slice.start) / 3600000.0;
+
+                        QColor col = (slice.status == EquipmentOn) ? goodcolor : Qt::black;
+                        QString txt = QObject::tr("%1\nLength: %3\nStart: %2\n").arg(datestr).arg(st.time().toString("hh:mm:ss")).arg(s2,0,'f',2);
+
+                        txt += (slice.status == EquipmentOn) ? QObject::tr("Mask On") : QObject::tr("Mask Off");
+                        slices.append(SummaryChartSlice(&calcitems[0], s1, s2, txt, col));
+                    }
+                } else {
+                    // otherwise just show session duration
+                    qint64 sf = sess->first();
+                    QDateTime st = QDateTime::fromMSecsSinceEpoch(sf);
+                    float s1 = float(splittime.secsTo(st)) / 3600.0;
+
+                    float s2 = sess->hours();
+
+                    QString txt = QObject::tr("%1\nLength: %3\nStart: %2").arg(datestr).arg(st.time().toString("hh:mm:ss")).arg(s2,0,'f',2);
+
+                    slices.append(SummaryChartSlice(&calcitems[0], s1, s2, txt, goodcolor));
+                }
+            }
+
+            cit = cache.find(i);
+        }
+
+        if (cit != cache.end()) {
+            QVector<SummaryChartSlice> & list = cit.value();
+            int listsize = list.size();
+
+            float peak = 0, base = 999;
+
+            for (int j=0; j < listsize; ++j) {
+                SummaryChartSlice & slice = list[j];
+                float s1 = slice.value;
+                float s2 = slice.height;
+
+                peak = qMax(peak, s1+s2);
+                base = qMin(base, s1);
+            }
+            peak_value = qMax(peak_value, peak);
+            min_value = qMin(min_value, base);
+
+        }
+    }
+    m_miny = (min_value < 999) ? floor(min_value) : 0;
+    m_maxy = ceil(peak_value);
+
+    /////////////////////////////////////////////////////////////////////
+    /// Y-Axis scaling
+    /////////////////////////////////////////////////////////////////////
+
+    EventDataType miny;
+    EventDataType maxy;
+
+    graph.roundY(miny, maxy);
+    float ymult = float(rect.height()) / (maxy-miny);
+
+
+    preCalc();
+    totaldays = 0;
+    nousedays = 0;
+
+    lastx1 = rect.left();
+
+    /////////////////////////////////////////////////////////////////////
+    /// Main Loop scaling
+    /////////////////////////////////////////////////////////////////////
+    do {
+        Day * day = daylist.at(idx);
+
+        if ((lastx1 + barw) > right_edge)
+            break;
+
+        totaldays++;
+
+
+        if (!day) { // || !day->hasMachine(m_machtype)) {
+           // lasty1 = rect.bottom();
+            lastx1 += barw;
+            nousedays++;
+         //   it++;
+            continue;
+        }
+
+        QHash<int, QVector<SummaryChartSlice> >::iterator cit = cache.find(idx);
+
+        float x1 = lastx1 + barw;
+
+        bool hl = false;
+
+        QRect rec2(lastx1, rect.top(), barw, rect.height());
+        if (rec2.contains(mouse)) {
+            QColor col2(255,0,0,64);
+            painter.fillRect(rec2, QBrush(col2));
+            hl = true;
+        }
+
+        if (cit != cache.end()) {
+            QVector<SummaryChartSlice> & slices = cit.value();
+
+            customCalc(day, slices);
+            int size = slices.size();
+
+            QLinearGradient gradient(lastx1, rect.bottom(), lastx1+barw, rect.bottom());
+
+            for (int i=0; i < size; ++i) {
+                const SummaryChartSlice & slice = slices.at(i);
+                float s1 = slice.value - miny;
+                float s2 = slice.height;
+
+                float y1 = (s1 * ymult);
+                float y2 = (s2 * ymult);
+
+                QColor col = slice.color;
+
+                QRect rec(lastx1, rect.bottom() - y1 - y2, barw, y2);
+                rec = rec.intersected(rect);
+
+//                QBrush brush = slice.brush;
+                if (rec.contains(mouse)) {
+                    col = Qt::yellow;
+                    graph.ToolTip(slice.name, mouse.x() - 15,mouse.y() + 15, TT_AlignRight);
+
+                }
+
+                if (barw > 8) {
+                    gradient.setColorAt(0,col);
+                    gradient.setColorAt(1,brighten(col, 2.0));
+                    painter.fillRect(rec, QBrush(gradient));
+//                    painter.fillRect(rec, brush);
+                    outlines.append(rec);
+                } else if (barw > 3) {
+                    painter.fillRect(rec, QBrush(brighten(col,1.25)));
+                    outlines.append(rec);
+                } else {
+                    painter.fillRect(rec, QBrush(col));
+                }
+
+            }
+        }
+
+
+        lastx1 = x1;
+    } while (++idx <= idx_end);
+
+    painter.setPen(QPen(Qt::black,1));
+    painter.drawRects(outlines);
+    afterDraw(painter, graph, rect);
+}
+
+////////////////////////////////////////////////////////////////////////////
+/// Total Time in Apnea Chart Stuff
+////////////////////////////////////////////////////////////////////////////
+
+void gTTIAChart::preCalc()
+{
+    gSummaryChart::preCalc();
+}
+void gTTIAChart::customCalc(Day *, QVector<SummaryChartSlice> & slices)
+{
+    if (slices.size() == 0) return;
+    const SummaryChartSlice & slice = slices.at(0);
+
+    calcitems[0].update(slice.value, slice.value);
+}
+void gTTIAChart::afterDraw(QPainter &, gGraph &graph, QRect rect)
+{
+    QStringList txtlist;
+    int num_channels = calcitems.size();
+
+    for (int i=0; i < num_channels; ++i) {
+        SummaryCalcItem & calc = calcitems[i];
+        //ChannelID code = calc.code;
+        //schema::Channel & chan = schema::channel[code];
+        float mid = 0;
+        switch (midcalc) {
+        case 0:
+            if (calc.median_data.size() > 0) {
+                mid = median(calc.median_data.begin(), calc.median_data.end());
+            }
+            break;
+        case 1:
+            if (calc.divisor > 0) {
+                mid = calc.wavg_sum / calc.divisor;
+            }
+            break;
+        case 2:
+            if (calc.divisor > 0) {
+                mid = calc.avg_sum / calc.divisor;
+            }
+            break;
+        }
+
+        txtlist.append(QString("%1 %2 / %3 / %4").arg(QObject::tr("TTIA:")).arg(calc.min, 0, 'f', 2).arg(mid, 0, 'f', 2).arg(calc.max, 0, 'f', 2));
+    }
+    QString txt = txtlist.join(", ");
+    graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0);
+}
+void gTTIAChart::populate(Day *day, int idx)
+{
+    QVector<SummaryChartSlice> & slices = cache[idx];
+    float ttia = day->sum(CPAP_Obstructive) + day->sum(CPAP_ClearAirway) + day->sum(CPAP_Apnea) + day->sum(CPAP_Hypopnea);
+    int h = ttia / 3600;
+    int m = int(ttia) / 60 % 60;
+    int s = int(ttia) % 60;
+    slices.append(SummaryChartSlice(&calcitems[0], ttia / 60.0, ttia / 60.0, QObject::tr("\nTTIA: %1").arg(QString().sprintf("%02i:%02i:%02i",h,m,s)), QColor(255,147,150)));
+
+
+}
+QString gTTIAChart::tooltipData(Day *, int idx)
+{
+    QVector<SummaryChartSlice> & slices = cache[idx];
+    if (slices.size() == 0) return QString();
+
+    const SummaryChartSlice & slice = slices.at(0);
+    return slice.name;
+}
+
+////////////////////////////////////////////////////////////////////////////
+/// AHI Chart Stuff
+////////////////////////////////////////////////////////////////////////////
+void gAHIChart::preCalc()
+{
+    gSummaryChart::preCalc();
+
+    ahi_wavg = 0;
+    ahi_avg = 0;
+    calc_cnt = 0;
+    total_hours = 0;
+    min_ahi = 99999;
+    max_ahi = -99999;
+
+    ahi_data.clear();
+    ahi_data.reserve(idx_end-idx_start);
+}
+void gAHIChart::customCalc(Day *day, QVector<SummaryChartSlice> &list)
+{
+    int size = list.size();
+    if (size == 0) return;
+    EventDataType hours = day->hours(m_machtype);
+    EventDataType ahi_cnt = 0;
+    for (int i=0; i < size; ++i) {
+        SummaryChartSlice & slice = list[i];
+        SummaryCalcItem * calc = slice.calc;
+
+        EventDataType value = slice.value;
+        float valh =  value/ hours;
+
+        switch (midcalc) {
+        case 0:
+            calc->median_data.append(valh);
+            break;
+        case 1:
+            calc->wavg_sum += value;
+            calc->divisor += hours;
+        default:
+            calc->avg_sum += value;
+            calc->cnt++;
+            break;
+        }
+
+
+
+        calc->min = qMin(valh, calc->min);
+        calc->max = qMax(valh, calc->max);
+
+        ahi_cnt += value;
+    }
+    min_ahi = qMin(ahi_cnt / hours, min_ahi);
+    max_ahi = qMax(ahi_cnt / hours, max_ahi);
+
+    ahi_data.append(ahi_cnt / hours);
+
+    ahi_wavg += ahi_cnt;
+    ahi_avg += ahi_cnt;
+    total_hours += hours;
+    calc_cnt++;
+}
+void gAHIChart::afterDraw(QPainter & /*painter */, gGraph &graph, QRect rect)
+{
+    if (totaldays == nousedays) return;
+
+    //int size = idx_end - idx_start;
+
+    bool skip = true;
+    float med = 0;
+    switch (midcalc) {
+    case 0:
+        if (ahi_data.size() > 0) {
+            med = median(ahi_data.begin(), ahi_data.end());
+            skip = false;
+        }
+        break;
+    case 1: // wavg
+        if (total_hours > 0) {
+            med = ahi_wavg / total_hours;
+            skip = false;
+        }
+        break;
+    case 2: // avg
+        if (calc_cnt > 0) {
+            med = ahi_avg / calc_cnt;
+            skip = false;
+        }
+        break;
+    }
+
+    QStringList txtlist;
+    if (!skip) txtlist.append(QObject::tr("%1 %2 / %3 / %4").arg(STR_TR_AHI).arg(min_ahi, 0, 'f', 2).arg(med, 0, 'f', 2).arg(max_ahi, 0, 'f', 2));
+
+    int num_channels = calcitems.size();
+
+    for (int i=0; i < num_channels; ++i) {
+        SummaryCalcItem & calc = calcitems[i];
+        ChannelID code = calc.code;
+        schema::Channel & chan = schema::channel[code];
+        float mid = 0;
+        skip = true;
+        switch (midcalc) {
+        case 0:
+            if (calc.median_data.size() > 0) {
+                mid = median(calc.median_data.begin(), calc.median_data.end());
+                skip = false;
+            }
+            break;
+        case 1:
+            if (calc.divisor > 0) {
+                mid = calc.wavg_sum / calc.divisor;
+                skip = false;
+            }
+            break;
+        case 2:
+            if (calc.cnt > 0) {
+                mid = calc.avg_sum / calc.cnt;
+                skip = false;
+            }
+            break;
+        }
+
+        if (!skip) txtlist.append(QString("%1 %2 / %3 / %4").arg(chan.label()).arg(calc.min, 0, 'f', 2).arg(mid, 0, 'f', 2).arg(calc.max, 0, 'f', 2));
+    }
+    QString txt = txtlist.join(", ");
+    graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0);
+}
+
+void gAHIChart::populate(Day *day, int idx)
+{
+    QVector<SummaryChartSlice> & slices = cache[idx];
+
+    float hours = day->hours();
+    int num_channels = calcitems.size();
+
+    for (int i=0; i < num_channels; ++i) {
+        SummaryCalcItem & calc = calcitems[i];
+        ChannelID code = calc.code;
+        if (!day->hasData(code, ST_CNT)) continue;
+
+        schema::Channel *chan = schema::channel.channels.find(code).value();
+
+        float c = day->count(code);
+        slices.append(SummaryChartSlice(&calc, c, c  / hours, chan->label(), calc.color));
+    }
+}
+QString gAHIChart::tooltipData(Day *day, int idx)
+{
+    QVector<SummaryChartSlice> & slices = cache[idx];
+    float total = 0;
+    float hour = day->hours(m_machtype);
+    QString txt;
+    for (int i=0; i< slices.size(); ++i) {
+        SummaryChartSlice & slice = slices[i];
+        total += slice.value;
+        txt += QString("\n%1: %2").arg(slice.name).arg(float(slice.value) / hour, 0, 'f', 2);
+
+    }
+    return QString("\n%1: %2").arg(STR_TR_AHI).arg(float(total) / hour,0,'f',2)+txt;
+}
+
+
+gPressureChart::gPressureChart()
+    :gSummaryChart("Pressure", MT_CPAP)
+{
+
+    // Do not reorder these!!! :P
+    addCalc(CPAP_Pressure, ST_SETMAX, schema::channel[CPAP_Pressure].defaultColor());    // 00
+    addCalc(CPAP_Pressure, ST_MID, schema::channel[CPAP_Pressure].defaultColor());       // 01
+    addCalc(CPAP_Pressure, ST_90P, brighten(schema::channel[CPAP_Pressure].defaultColor(), 1.33)); // 02
+    addCalc(CPAP_PressureMin, ST_SETMIN, schema::channel[CPAP_PressureMin].defaultColor());  // 03
+    addCalc(CPAP_PressureMax, ST_SETMAX, schema::channel[CPAP_PressureMax].defaultColor());  // 04
+
+    addCalc(CPAP_EPAP, ST_SETMAX, schema::channel[CPAP_EPAP].defaultColor());      // 05
+    addCalc(CPAP_IPAP, ST_SETMAX, schema::channel[CPAP_IPAP].defaultColor());      // 06
+    addCalc(CPAP_EPAPLo, ST_SETMAX, schema::channel[CPAP_EPAPLo].defaultColor());    // 07
+    addCalc(CPAP_IPAPHi, ST_SETMAX, schema::channel[CPAP_IPAPHi].defaultColor());    // 08
+
+    addCalc(CPAP_EPAP, ST_MID, schema::channel[CPAP_EPAP].defaultColor());         // 09
+    addCalc(CPAP_EPAP, ST_90P, brighten(schema::channel[CPAP_EPAP].defaultColor(),1.33));         // 10
+    addCalc(CPAP_IPAP, ST_MID, schema::channel[CPAP_IPAP].defaultColor());         // 11
+    addCalc(CPAP_IPAP, ST_90P, brighten(schema::channel[CPAP_IPAP].defaultColor(),1.33));         // 12
+}
+
+void gPressureChart::afterDraw(QPainter &, gGraph &graph, QRect rect)
+{
+    int pressure_cnt = calcitems[0].cnt;
+    int pressuremin_cnt = calcitems[3].cnt;
+    int epap_cnt = calcitems[5].cnt;
+    int ipap_cnt = calcitems[6].cnt;
+    int ipaphi_cnt = calcitems[8].cnt;
+    int epaplo_cnt = calcitems[7].cnt;
+
+    QStringList presstr;
+
+    float mid = 0;
+
+    if (pressure_cnt > 0) {
+        mid = calcitems[0].mid();
+        presstr.append(QString("%1 %2/%3/%4").
+                arg(STR_TR_CPAP).
+                arg(calcitems[0].min,0,'f',1).
+                arg(mid, 0, 'f', 1).
+                arg(calcitems[0].max,0,'f',1));
+    }
+    if (pressuremin_cnt > 0) {
+        presstr.append(QString("%1 %2/%3/%4/%5").
+                arg(STR_TR_APAP).
+                arg(calcitems[3].min,0,'f',1).
+                arg(calcitems[1].mid(), 0, 'f', 1).
+                arg(calcitems[2].mid(),0,'f',1).
+                arg(calcitems[4].max, 0, 'f', 1));
+
+    }
+    if (epap_cnt > 0) {
+        presstr.append(QString("%1 %2/%3/%4").
+                arg(STR_TR_EPAP).
+                arg(calcitems[5].min,0,'f',1).
+                arg(calcitems[5].mid(), 0, 'f', 1).
+                arg(calcitems[5].max, 0, 'f', 1));
+    }
+    if (ipap_cnt > 0) {
+        presstr.append(QString("%1 %2/%3/%4").
+             arg(STR_TR_IPAP).
+             arg(calcitems[6].min,0,'f',1).
+             arg(calcitems[6].mid(), 0, 'f', 1).
+             arg(calcitems[6].max, 0, 'f', 1));
+    }
+    if (epaplo_cnt > 0) {
+        presstr.append(QString("%1 %2/%3/%4").
+            arg(STR_TR_EPAPLo).
+            arg(calcitems[7].min,0,'f',1).
+            arg(calcitems[7].mid(), 0, 'f', 1).
+            arg(calcitems[7].max, 0, 'f', 1));
+    }
+
+    if (ipaphi_cnt > 0) {
+        presstr.append(QString("%1 %2/%3/%4").
+            arg(STR_TR_IPAPHi).
+            arg(calcitems[8].min,0,'f',1).
+            arg(calcitems[8].mid(), 0, 'f', 1).
+            arg(calcitems[8].max, 0, 'f', 1));
+    }
+    QString txt = presstr.join(" ");
+    graph.renderText(txt, rect.left(), rect.top()-5*graph.printScaleY(), 0);
+
+}
+
+
+void gPressureChart::populate(Day * day, int idx)
+{
+    float tmp;
+    CPAPMode mode =  (CPAPMode)(int)qRound(day->settings_wavg(CPAP_Mode));
+    QVector<SummaryChartSlice> & slices = cache[idx];
+
+    if (mode == MODE_CPAP) {
+        float pr = day->settings_max(CPAP_Pressure);
+        slices.append(SummaryChartSlice(&calcitems[0], pr, pr, schema::channel[CPAP_Pressure].label(), calcitems[0].color));
+    } else if (mode == MODE_APAP) {
+        float min = day->settings_min(CPAP_PressureMin);
+        float max = day->settings_max(CPAP_PressureMax);
+
+        tmp = min;
+
+        slices.append(SummaryChartSlice(&calcitems[3], min, min, schema::channel[CPAP_PressureMin].label(), calcitems[3].color));
+        if (!day->summaryOnly()) {
+            float med = day->calcMiddle(CPAP_Pressure);
+            slices.append(SummaryChartSlice(&calcitems[1], med, med - tmp, day->calcMiddleLabel(CPAP_Pressure), calcitems[1].color));
+            tmp += med - tmp;
+
+            float p90 = day->calcPercentile(CPAP_Pressure);
+            slices.append(SummaryChartSlice(&calcitems[2], p90, p90 - tmp, day->calcPercentileLabel(CPAP_Pressure), calcitems[2].color));
+            tmp += p90 - tmp;
+        }
+        slices.append(SummaryChartSlice(&calcitems[4], max, max - tmp, schema::channel[CPAP_PressureMax].label(), calcitems[4].color));
+
+    } else if (mode == MODE_BILEVEL_FIXED) {
+        float epap = day->settings_max(CPAP_EPAP);
+        float ipap = day->settings_max(CPAP_IPAP);
+
+        slices.append(SummaryChartSlice(&calcitems[5], epap, epap, schema::channel[CPAP_EPAP].label(), calcitems[5].color));
+        slices.append(SummaryChartSlice(&calcitems[6], ipap, ipap - epap, schema::channel[CPAP_IPAP].label(), calcitems[6].color));
+
+    } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+        float epap = day->settings_max(CPAP_EPAPLo);
+        tmp = epap;
+        float ipap = day->settings_max(CPAP_IPAPHi);
+
+        slices.append(SummaryChartSlice(&calcitems[7], epap, epap, schema::channel[CPAP_EPAPLo].label(), calcitems[7].color));
+        if (!day->summaryOnly()) {
+
+            float e50 = day->calcMiddle(CPAP_EPAP);
+            slices.append(SummaryChartSlice(&calcitems[9], e50, e50 - tmp, day->calcMiddleLabel(CPAP_EPAP), calcitems[9].color));
+            tmp += e50 - tmp;
+
+            float e90 = day->calcPercentile(CPAP_EPAP);
+            slices.append(SummaryChartSlice(&calcitems[10], e90, e90 - tmp, day->calcPercentileLabel(CPAP_EPAP), calcitems[10].color));
+            tmp += e90 - tmp;
+
+            float i50 = day->calcMiddle(CPAP_IPAP);
+            slices.append(SummaryChartSlice(&calcitems[11], i50, i50 - tmp, day->calcMiddleLabel(CPAP_IPAP), calcitems[11].color));
+            tmp += i50 - tmp;
+
+            float i90 = day->calcPercentile(CPAP_IPAP);
+            slices.append(SummaryChartSlice(&calcitems[12], i90, i90 - tmp, day->calcPercentileLabel(CPAP_IPAP), calcitems[12].color));
+            tmp += i90 - tmp;
+        }
+        slices.append(SummaryChartSlice(&calcitems[8], ipap, ipap - tmp, schema::channel[CPAP_IPAPHi].label(), calcitems[8].color));
+    } else if ((mode == MODE_BILEVEL_AUTO_VARIABLE_PS) || (mode == MODE_ASV_VARIABLE_EPAP)) {
+        float epap = day->settings_max(CPAP_EPAPLo);
+        tmp = epap;
+
+        slices.append(SummaryChartSlice(&calcitems[7], epap, epap, schema::channel[CPAP_EPAPLo].label(), calcitems[7].color));
+        if (!day->summaryOnly()) {
+            float e50 = day->calcMiddle(CPAP_EPAP);
+            slices.append(SummaryChartSlice(&calcitems[9], e50, e50 - tmp, day->calcMiddleLabel(CPAP_EPAP), calcitems[9].color));
+            tmp += e50 - tmp;
+
+            float e90 = day->calcPercentile(CPAP_EPAP);
+            slices.append(SummaryChartSlice(&calcitems[10], e90, e90 - tmp, day->calcPercentileLabel(CPAP_EPAP), calcitems[10].color));
+            tmp += e90 - tmp;
+
+            float i50 = day->calcMiddle(CPAP_IPAP);
+            slices.append(SummaryChartSlice(&calcitems[11], i50, i50 - tmp, day->calcMiddleLabel(CPAP_IPAP), calcitems[11].color));
+            tmp += i50 - tmp;
+
+            float i90 = day->calcPercentile(CPAP_IPAP);
+            slices.append(SummaryChartSlice(&calcitems[12], i90, i90 - tmp, day->calcPercentileLabel(CPAP_IPAP), calcitems[12].color));
+            tmp += i90 - tmp;
+        }
+        float ipap = day->settings_max(CPAP_IPAPHi);
+        slices.append(SummaryChartSlice(&calcitems[8], ipap, ipap - tmp, schema::channel[CPAP_IPAPHi].label(), calcitems[8].color));
+    } else if (mode == MODE_ASV) {
+        float epap = day->settings_max(CPAP_EPAP);
+        tmp = epap;
+
+        slices.append(SummaryChartSlice(&calcitems[5], epap, epap, schema::channel[CPAP_EPAP].label(), calcitems[5].color));
+        if (!day->summaryOnly()) {
+            float i50 = day->calcMiddle(CPAP_IPAP);
+            slices.append(SummaryChartSlice(&calcitems[11], i50, i50 - tmp, day->calcMiddleLabel(CPAP_IPAP), calcitems[11].color));
+            tmp += i50 - tmp;
+
+            float i90 = day->calcPercentile(CPAP_IPAP);
+            slices.append(SummaryChartSlice(&calcitems[12], i90, i90 - tmp, day->calcPercentileLabel(CPAP_IPAP), calcitems[12].color));
+            tmp += i90 - tmp;
+        }
+        float ipap = day->settings_max(CPAP_IPAPHi);
+        slices.append(SummaryChartSlice(&calcitems[8], ipap, ipap - tmp, schema::channel[CPAP_IPAPHi].label(), calcitems[8].color));
+    }
+
+}
+
+//void gPressureChart::afterDraw(QPainter &painter, gGraph &graph, QRect rect)
+//{
+//}
+
diff --git a/sleepyhead/Graphs/gSessionTimesChart.h b/sleepyhead/Graphs/gSessionTimesChart.h
new file mode 100644
index 0000000..fa41c30
--- /dev/null
+++ b/sleepyhead/Graphs/gSessionTimesChart.h
@@ -0,0 +1,465 @@
+/* gSessionTimesChart Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GSESSIONTIMESCHART_H
+#define GSESSIONTIMESCHART_H
+
+#include "SleepLib/day.h"
+#include "SleepLib/profiles.h"
+#include "gGraphView.h"
+
+
+struct TimeSpan
+{
+public:
+    TimeSpan():begin(0), end(0) {}
+    TimeSpan(float b, float e) : begin(b), end(e) {}
+    TimeSpan(const TimeSpan & copy) {
+        begin = copy.begin;
+        end = copy.end;
+    }
+    ~TimeSpan() {}
+    float begin;
+    float end;
+};
+
+struct SummaryCalcItem {
+    SummaryCalcItem() {
+        code = 0;
+        type = ST_CNT;
+        color = Qt::black;
+        wavg_sum = 0;
+        avg_sum = 0;
+        cnt = 0;
+        divisor = 0;
+        min = 0;
+        max = 0;
+    }
+    SummaryCalcItem(const SummaryCalcItem & copy) {
+        code = copy.code;
+        type = copy.type;
+        color = copy.color;
+
+        wavg_sum = 0;
+        avg_sum = 0;
+        cnt = 0;
+        divisor = 0;
+        min = 0;
+        max = 0;
+        midcalc = p_profile->general->prefCalcMiddle();
+
+    }
+
+    SummaryCalcItem(ChannelID code, SummaryType type, QColor color)
+        :code(code), type(type), color(color) {
+    }
+    float mid()
+    {
+        float val = 0;
+        switch (midcalc) {
+        case 0:
+            if (median_data.size() > 0)
+                val = median(median_data.begin(), median_data.end());
+            break;
+        case 1:
+            if (divisor > 0)
+                val = wavg_sum / divisor;
+            break;
+        case 2:
+            if (cnt > 0)
+                val = avg_sum / cnt;
+        }
+        return val;
+    }
+
+
+    inline void update(float value, float weight) {
+        if (midcalc == 0) {
+            median_data.append(value);
+        }
+
+        avg_sum += value;
+        cnt++;
+        wavg_sum += value * weight;
+        divisor += weight;
+        min = qMin(min, value);
+        max = qMax(max, value);
+    }
+
+    void reset(int reserve) {
+        midcalc = p_profile->general->prefCalcMiddle();
+
+        wavg_sum = 0;
+        avg_sum = 0;
+        divisor = 0;
+        cnt = 0;
+        min = 99999;
+        max = -99999;
+        median_data.clear();
+        if (midcalc == 0) {
+            median_data.reserve(reserve);
+        }
+    }
+    ChannelID code;
+    SummaryType type;
+    QColor color;
+
+    double wavg_sum;
+    double divisor;
+    double avg_sum;
+    int cnt;
+    EventDataType min;
+    EventDataType max;
+    static short midcalc;
+
+    QList<float> median_data;
+
+};
+
+struct SummaryChartSlice {
+    SummaryChartSlice() {
+        calc = nullptr;
+        height = 0;
+        value = 0;
+        name = ST_CNT;
+        color = Qt::black;
+    }
+    SummaryChartSlice(const SummaryChartSlice & copy) {
+        calc = copy.calc;
+        value = copy.value;
+        height = copy.height;
+        name = copy.name;
+        color = copy.color;
+//        brush = copy.brush;
+    }
+
+    SummaryChartSlice(SummaryCalcItem * calc, EventDataType value, EventDataType height, QString name, QColor color)
+        :calc(calc), value(value), height(height), name(name), color(color) {
+//        QLinearGradient gradient(0, 0, 1, 0);
+//        gradient.setCoordinateMode(QGradient::ObjectBoundingMode);
+//        gradient.setColorAt(0,color);
+//        gradient.setColorAt(1,brighten(color));
+//        brush = QBrush(gradient);
+    }
+    SummaryCalcItem * calc;
+    EventDataType value;
+    EventDataType height;
+    QString name;
+    QColor color;
+//    QBrush brush;
+};
+
+class gSummaryChart : public Layer
+{
+public:
+    gSummaryChart(QString label, MachineType machtype);
+    gSummaryChart(ChannelID code, MachineType machtype);
+    virtual ~gSummaryChart();
+
+    //! \brief Renders the graph to the QPainter object
+    virtual void paint(QPainter &, gGraph &, const QRegion &);
+
+    //! \brief Called whenever data model changes underneath. Day object is not needed here, it's just here for Layer compatability.
+    virtual void SetDay(Day *day = nullptr);
+
+    //! \brief Returns true if no data was found for this day during SetDay
+    virtual bool isEmpty() { return m_empty; }
+
+    virtual void populate(Day *, int idx);
+
+    //! \brief Override to setup custom stuff before main loop
+    virtual void preCalc();
+
+    //! \brief Override to call stuff in main loop
+    virtual void customCalc(Day *, QVector<SummaryChartSlice> &);
+
+    //! \brief Override to call stuff after draw is complete
+    virtual void afterDraw(QPainter &, gGraph &, QRect);
+
+    //! \brief Return any extra data to show beneath the date in the hover over tooltip
+    virtual QString tooltipData(Day *, int);
+
+    virtual void dataChanged() {
+        cache.clear();
+    }
+
+
+    void addCalc(ChannelID code, SummaryType type, QColor color) {
+        calcitems.append(SummaryCalcItem(code, type, color));
+    }
+    void addCalc(ChannelID code, SummaryType type) {
+        calcitems.append(SummaryCalcItem(code, type, schema::channel[code].defaultColor()));
+    }
+
+    virtual Layer * Clone() {
+        gSummaryChart * sc = new gSummaryChart(m_label, m_machtype);
+        Layer::CloneInto(sc);
+        CloneInto(sc);
+
+        // copy this here, because only base summary charts need it
+        sc->calcitems = calcitems;
+
+        return sc;
+    }
+
+    void CloneInto(gSummaryChart * layer) {
+        layer->m_empty = m_empty;
+        layer->firstday = firstday;
+        layer->lastday = lastday;
+        layer->expected_slices = expected_slices;
+        layer->nousedays = nousedays;
+        layer->totaldays = totaldays;
+        layer->peak_value = peak_value;
+        layer->idx_start = idx_start;
+        layer->idx_end = idx_end;
+        layer->cache.clear();
+        layer->dayindex = dayindex;
+        layer->daylist = daylist;
+    }
+
+protected:
+    //! \brief Key was pressed that effects this layer
+    virtual bool keyPressEvent(QKeyEvent *event, gGraph *graph);
+
+    //! \brief Mouse moved over this layers area (shows the hover-over tooltips here)
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+
+    //! \brief Mouse Button was pressed over this area
+    virtual bool mousePressEvent(QMouseEvent *event, gGraph *graph);
+
+    //! \brief Mouse Button was released over this area. (jumps to daily view here)
+    virtual bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph);
+
+    QString m_label;
+    MachineType m_machtype;
+    bool m_empty;
+    int hl_day;
+    int tz_offset;
+    float tz_hours;
+    QDate firstday;
+    QDate lastday;
+
+    QMap<QDate, int> dayindex;
+    QList<Day *> daylist;
+
+    QHash<int, QVector<SummaryChartSlice> > cache;
+    QVector<SummaryCalcItem> calcitems;
+
+    int expected_slices;
+
+    int nousedays;
+    int totaldays;
+
+    EventDataType peak_value;
+    EventDataType min_value;
+
+    int idx_start;
+    int idx_end;
+
+    short midcalc;
+};
+
+
+/*! \class gSessionTimesChart
+    \brief Displays a summary of session times
+    */
+class gSessionTimesChart : public gSummaryChart
+{
+public:
+    gSessionTimesChart()
+        :gSummaryChart("SessionTimes", MT_CPAP) {
+        addCalc(NoChannel, ST_SESSIONS, QColor(64,128,255));
+        addCalc(NoChannel, ST_SESSIONS, QColor(64,128,255));
+        addCalc(NoChannel, ST_SESSIONS, QColor(64,128,255));
+    }
+    virtual ~gSessionTimesChart() {}
+
+    virtual void SetDay(Day * day = nullptr) {
+        gSummaryChart::SetDay(day);
+        split = p_profile->session->daySplitTime();
+
+        m_miny = 0;
+        m_maxy = 28;
+    }
+
+    virtual void preCalc();
+    virtual void customCalc(Day *, QVector<SummaryChartSlice> & slices);
+    virtual void afterDraw(QPainter &, gGraph &, QRect);
+
+    //! \brief Renders the graph to the QPainter object
+    virtual void paint(QPainter &painter, gGraph &graph, const QRegion &region);
+
+    virtual Layer * Clone() {
+        gSessionTimesChart * sc = new gSessionTimesChart();
+        gSummaryChart::CloneInto(sc);
+        CloneInto(sc);
+        return sc;
+    }
+
+    void CloneInto(gSessionTimesChart * layer) {
+        layer->split = split;
+    }
+    QTime split;
+    int num_slices;
+    int num_days;
+    int total_slices;
+    double total_length;
+    QList<float> session_data;
+
+};
+
+
+class gUsageChart : public gSummaryChart
+{
+public:
+    gUsageChart()
+        :gSummaryChart("Usage", MT_CPAP) {
+        addCalc(NoChannel, ST_HOURS, QColor(64,128,255));
+    }
+    virtual ~gUsageChart() {}
+
+    virtual void preCalc();
+    virtual void customCalc(Day *, QVector<SummaryChartSlice> &);
+    virtual void afterDraw(QPainter &, gGraph &, QRect);
+    virtual void populate(Day *day, int idx);
+
+    virtual QString tooltipData(Day * day, int);
+
+
+    virtual Layer * Clone() {
+        gUsageChart * sc = new gUsageChart();
+        gSummaryChart::CloneInto(sc);
+        CloneInto(sc);
+        return sc;
+    }
+
+    void CloneInto(gUsageChart * layer) {
+        layer->incompdays = incompdays;
+        layer->compliance_threshold = compliance_threshold;
+    }
+
+private:
+    int incompdays;
+    EventDataType compliance_threshold;
+};
+
+class gTTIAChart : public gSummaryChart
+{
+public:
+    gTTIAChart()
+        :gSummaryChart("TTIA", MT_CPAP) {
+        addCalc(NoChannel, ST_CNT, QColor(255,147,150));
+    }
+    virtual ~gTTIAChart() {}
+
+    virtual void preCalc();
+    virtual void customCalc(Day *, QVector<SummaryChartSlice> &);
+    virtual void afterDraw(QPainter &, gGraph &, QRect);
+    virtual void populate(Day *day, int idx);
+    virtual QString tooltipData(Day * day, int);
+
+    virtual Layer * Clone() {
+        gTTIAChart * sc = new gTTIAChart();
+        gSummaryChart::CloneInto(sc);
+        CloneInto(sc);
+        return sc;
+    }
+
+    void CloneInto(gTTIAChart * /* layer*/) {
+    }
+
+private:
+};
+
+class gAHIChart : public gSummaryChart
+{
+public:
+    gAHIChart()
+        :gSummaryChart("AHIChart", MT_CPAP) {
+        addCalc(CPAP_ClearAirway, ST_CPH);
+        addCalc(CPAP_Obstructive, ST_CPH);
+        addCalc(CPAP_Apnea, ST_CPH);
+        addCalc(CPAP_Hypopnea, ST_CPH);
+        if (p_profile->general->calculateRDI())
+            addCalc(CPAP_RERA, ST_CPH);
+    }
+    virtual ~gAHIChart() {}
+
+    virtual void preCalc();
+    virtual void customCalc(Day *, QVector<SummaryChartSlice> &);
+    virtual void afterDraw(QPainter &, gGraph &, QRect);
+
+    virtual void populate(Day *, int idx);
+
+    virtual QString tooltipData(Day * day, int);
+
+    virtual Layer * Clone() {
+        gAHIChart * sc = new gAHIChart();
+        gSummaryChart::CloneInto(sc);
+        CloneInto(sc);
+        return sc;
+    }
+
+    void CloneInto(gAHIChart * /* layer */) {
+//        layer->ahicalc = ahicalc;
+//        layer->ahi_wavg = ahi_wavg;
+//        layer->ahi_avg = ahi_avg;
+//        layer->total_hours = total_hours;
+//        layer->max_ahi = max_ahi;
+//        layer->min_ahi = min_ahi;
+//        layer->calc_cnt = calc_cnt;
+//        layer->ahi_data = ahi_data;
+    }
+
+  //  SummaryCalcItem ahicalc;
+    double ahi_wavg;
+    double ahi_avg;
+
+    double total_hours;
+    float max_ahi;
+    float min_ahi;
+
+    int calc_cnt;
+    QList<float> ahi_data;
+};
+
+
+class gPressureChart : public gSummaryChart
+{
+public:
+    gPressureChart();
+    virtual ~gPressureChart() {}
+
+    virtual Layer * Clone() {
+        gPressureChart * sc = new gPressureChart();
+        gSummaryChart::CloneInto(sc);
+        return sc;
+    }
+
+//    virtual void preCalc();
+    virtual void customCalc(Day *day, QVector<SummaryChartSlice> &slices) {
+        int size = slices.size();
+        float hour = day->hours(m_machtype);
+        for (int i=0; i < size; ++i) {
+            SummaryChartSlice & slice = slices[i];
+            SummaryCalcItem * calc = slices[i].calc;
+
+            calc->update(slice.value, hour);
+         }
+    }
+    virtual void afterDraw(QPainter &, gGraph &, QRect);
+
+    virtual void populate(Day * day, int idx);
+
+    virtual QString tooltipData(Day * day, int idx) {
+        return day->getCPAPMode() + "\n" + day->getPressureSettings() + gSummaryChart::tooltipData(day, idx);
+    }
+
+};
+
+#endif // GSESSIONTIMESCHART_H
diff --git a/sleepyhead/Graphs/gStatsLine.cpp b/sleepyhead/Graphs/gStatsLine.cpp
new file mode 100644
index 0000000..59665fc
--- /dev/null
+++ b/sleepyhead/Graphs/gStatsLine.cpp
@@ -0,0 +1,69 @@
+/* gStatsLine Implementation
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "SleepLib/day.h"
+#include "gYAxis.h"
+#include "gStatsLine.h"
+
+gStatsLine::gStatsLine(ChannelID code, QString label, QColor textcolor)
+    : Layer(code), m_label(label), m_textcolor(textcolor)
+{
+}
+void gStatsLine::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    Q_UNUSED(painter)
+
+    int left = region.boundingRect().left();
+    int top = region.boundingRect().top();
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    if (!m_visible) { return; }
+
+    //if (m_empty) return;
+    Q_UNUSED(height);
+
+    int z = (width + gYAxis::Margin) / 5;
+    int p = left - gYAxis::Margin;
+
+    top += 4;
+    w.renderText(m_label, p, top);
+
+    //w.renderText(m_text,p,top,0,m_textcolor);
+
+    p += z;
+    w.renderText(st_min, p, top);
+
+    p += z;
+    w.renderText(st_avg, p, top);
+
+    p += z;
+    w.renderText(st_p90, p, top);
+
+    p += z;
+    w.renderText(st_max, p, top);
+
+}
+
+void gStatsLine::SetDay(Day *d)
+{
+    Layer::SetDay(d);
+
+    if (!m_day) { return; }
+
+    m_min = d->Min(m_code);
+    m_max = d->Max(m_code);
+    m_avg = d->wavg(m_code);
+    m_p90 = d->p90(m_code);
+
+    st_min = "Min=" + QString::number(m_min, 'f', 2);
+    st_max = "Max=" + QString::number(m_max, 'f', 2);
+    st_avg = "Avg=" + QString::number(m_avg, 'f', 2);
+    st_p90 = "90%=" + QString::number(m_p90, 'f', 2);
+
+}
diff --git a/sleepyhead/Graphs/gStatsLine.h b/sleepyhead/Graphs/gStatsLine.h
new file mode 100644
index 0000000..7e5a5b5
--- /dev/null
+++ b/sleepyhead/Graphs/gStatsLine.h
@@ -0,0 +1,33 @@
+/* gStatsLine
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GSTATSLINE_H
+#define GSTATSLINE_H
+
+#include "SleepLib/machine.h"
+#include "gGraphView.h"
+
+/*! \class gStatsLine
+    \brief Show a rendered stats area in place of a graph. This is currently unused
+    */
+class gStatsLine : public Layer
+{
+  public:
+    gStatsLine(ChannelID code, QString label = "", QColor textcolor = Qt::black);
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+    void SetDay(Day *d);
+
+  protected:
+    QString m_label;
+    QColor m_textcolor;
+    EventDataType m_min, m_max, m_avg, m_p90;
+    QString st_min, st_max, st_avg, st_p90;
+    float m_tx, m_ty;
+};
+
+#endif // GSTATSLINE_H
diff --git a/sleepyhead/Graphs/gSummaryChart.cpp b/sleepyhead/Graphs/gSummaryChart.cpp
new file mode 100644
index 0000000..2b7efad
--- /dev/null
+++ b/sleepyhead/Graphs/gSummaryChart.cpp
@@ -0,0 +1,1306 @@
+/* gSummaryChart Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <math.h>
+#include <QLabel>
+#include <QDateTime>
+#include "gYAxis.h"
+#include "gSummaryChart.h"
+
+SummaryChart::SummaryChart(QString label, GraphType type)
+    : Layer(NoChannel), m_label(label), m_graphtype(type)
+{
+    m_empty = true;
+    hl_day = -1;
+    m_machinetype = MT_CPAP;
+
+    QDateTime d1 = QDateTime::currentDateTime();
+    QDateTime d2 = d1;
+    d1.setTimeSpec(Qt::UTC);
+    tz_offset = d2.secsTo(d1);
+    tz_hours = tz_offset / 3600.0;
+    m_layertype = LT_SummaryChart;
+}
+SummaryChart::~SummaryChart()
+{
+}
+void SummaryChart::SetDay(Day * nullday)
+{
+    Q_UNUSED(nullday)
+    Day *day = nullptr;
+    Layer::SetDay(day);
+
+    m_values.clear();
+    m_times.clear();
+    m_days.clear();
+    m_hours.clear();
+    m_goodcodes.clear();
+    m_miny = 999999999.0F;
+    m_maxy = -999999999.0F;
+    m_physmaxy = 0;
+    m_physminy = 0;
+    m_minx = 0;
+    m_maxx = 0;
+
+
+    int dn;
+    EventDataType tmp, tmp2, total;
+    ChannelID code;
+    CPAPMode cpapmode = (CPAPMode)(int)p_profile->calcSettingsMax(CPAP_Mode, MT_CPAP,
+                        p_profile->FirstDay(MT_CPAP), p_profile->LastDay(MT_CPAP));
+
+
+    //////////////////////////////////////////////////////////
+    // Setup for dealing with different CPAP Pressure types
+    //////////////////////////////////////////////////////////
+    if (m_label == STR_TR_Pressure) {
+        m_codes.clear();
+        m_colors.clear();
+        m_type.clear();
+        m_typeval.clear();
+
+        float perc = p_profile->general->prefCalcPercentile() / 100.0;
+        int mididx = p_profile->general->prefCalcMiddle();
+        SummaryType mid;
+
+        if (mididx == 0) { mid = ST_PERC; }
+        else if (mididx == 1) { mid = ST_WAVG; }
+        else if (mididx == 2) { mid = ST_AVG; }
+
+        if (cpapmode >= MODE_ASV) {
+            addSlice(CPAP_EPAP, QColor("green"), ST_SETMIN);
+            addSlice(CPAP_IPAPLo, QColor("light blue"), ST_SETMIN);
+            addSlice(CPAP_IPAP, QColor("cyan"), mid, 0.5);
+            addSlice(CPAP_IPAP, QColor("dark cyan"), ST_PERC, perc);
+            //addSlice(CPAP_IPAP,QColor("light blue"),ST_PERC,0.95);
+            addSlice(CPAP_IPAPHi, QColor("blue"), ST_SETMAX);
+        } else if (cpapmode >= MODE_BILEVEL_AUTO_FIXED_PS) {
+            addSlice(CPAP_EPAP, QColor("green"), ST_SETMIN);
+            addSlice(CPAP_IPAP, QColor("light cyan"), mid, 0.5);
+            addSlice(CPAP_IPAP, QColor("light blue"), ST_PERC, perc);
+            addSlice(CPAP_PSMin, QColor("blue"), ST_SETMIN, perc);
+            addSlice(CPAP_PSMax, QColor("red"), ST_SETMAX, perc);
+
+        } else if (cpapmode >= MODE_BILEVEL_FIXED) {
+            addSlice(CPAP_EPAP, QColor("green"), ST_SETMIN);
+            addSlice(CPAP_EPAP, QColor("light green"), ST_PERC, perc);
+            addSlice(CPAP_IPAP, QColor("light cyan"), mid, 0.5);
+            addSlice(CPAP_IPAP, QColor("light blue"), ST_PERC, perc);
+            addSlice(CPAP_IPAPHi, QColor("blue"), ST_SETMAX);
+        } else if (cpapmode >= MODE_APAP) {
+            addSlice(CPAP_PressureMin, QColor("orange"), ST_SETMIN);
+            addSlice(CPAP_Pressure, QColor("dark green"), mid, 0.5);
+            addSlice(CPAP_Pressure, QColor("grey"), ST_PERC, perc);
+            addSlice(CPAP_PressureMax, QColor("red"), ST_SETMAX);
+        } else {
+            addSlice(CPAP_Pressure, QColor("dark green"), ST_SETWAVG);
+        }
+    }
+
+    // Initialize goodcodes (which identified which legends are drawn) to all off
+    m_goodcodes.resize(m_codes.size());
+    for (int i = 0; i < m_codes.size(); i++) {
+        m_goodcodes[i] = false;
+    }
+
+    m_fday = 0;
+    qint64 tt, zt;
+    m_empty = true;
+
+    if (m_graphtype == GT_SESSIONS) {
+        // No point drawing anything if no real data on record
+        if (p_profile->countDays(MT_CPAP, p_profile->FirstDay(MT_CPAP), p_profile->LastDay(MT_CPAP)) == 0) {
+            return;
+        }
+    }
+
+    int suboffset;
+    SummaryType type;
+    bool first = true;
+
+    // For each day in the main profile daylist
+    QMap<QDate, Day *>::iterator d;
+
+    for (d = p_profile->daylist.begin(); d != p_profile->daylist.end(); d++) {
+
+        // get the timestamp of this day.
+        tt = QDateTime(d.key(), QTime(0, 0, 0), Qt::UTC).toTime_t();
+
+        // calculate day number
+        dn = tt / 86400;
+
+        // to ms since epoch.
+        tt *= 1000L;
+
+        // update min and max for this timestamp
+        if (!m_minx || tt < m_minx) { m_minx = tt; }
+        if (!m_maxx || tt > m_maxx) { m_maxx = tt; }
+
+        total = 0;
+        bool fnd = false;
+
+        //////////////////////////////////////////////////////////
+        // Setup for Sessions Time display chart
+        //////////////////////////////////////////////////////////
+        if (m_graphtype == GT_SESSIONS) {
+            // Turn all legends on
+            for (int i = 0; i < m_codes.size(); i++) {
+                m_goodcodes[i] = true;
+            }
+
+            // for each day object on record for this date
+            day = d.value();
+
+            // skip any empty or irrelevant day records
+            if (!day || (day->machine(m_machinetype) == nullptr)) { continue; }
+
+            int ft = qint64(day->first()) / 1000L;
+            ft += tz_offset; // convert to local time
+
+            int dz2 = ft / 86400;
+            dz2 *= 86400;
+            // ft = first sessions time, rounded back to midnight..
+
+            // For each session in this day record
+            for (int s = 0; s < day->size(); s++) {
+                Session *sess = (*day)[s];
+
+                if (!sess->enabled()) { continue; }
+
+                // Get session duration
+                tmp = sess->hours();
+                m_values[dn][s] = tmp;
+
+                total += tmp;
+
+                // Get session start timestamp
+                zt = qint64(sess->first()) / 1000L;
+                zt += tz_offset;
+
+                // Calculate the starting hour
+                tmp2 = zt - dn * 86400;
+                tmp2 /= 3600.0;
+
+                m_times[dn][s] = tmp2;
+
+                // Update min & max Y values
+                if (first) {
+                    m_miny = tmp2;
+                    m_maxy = tmp2 + tmp;
+                    first = false;
+                } else {
+                    if (tmp2 < m_miny) {
+                        m_miny = tmp2;
+                    }
+
+                    if (tmp2 + tmp > m_maxy) {
+                        m_maxy = tmp2 + tmp;
+                    }
+                }
+            } // for each session
+
+            // if total hours for all sessions more than 0, register the day as valid
+            if (total > 0) {
+                m_days[dn] = day;
+                m_hours[dn] = total;
+                m_empty = false;
+            }
+        } else {
+            //////////////////////////////////////////////////////////////////////////////
+            // Data Channel summary charts
+            //////////////////////////////////////////////////////////////////////////////
+
+            // For each Channel
+            for (int j = 0; j < m_codes.size(); j++) {
+                code = m_codes[j];
+                suboffset = 0;
+                type = m_type[j];
+                EventDataType typeval = m_typeval[j];
+
+                day = d.value();
+
+                CPAPMode mode = (CPAPMode)(int)day->settings_max(CPAP_Mode);
+
+                // ignore irrelevent day objects
+                if (day->machine(m_machinetype) == nullptr) { continue; }
+
+                bool hascode = //day->channelHasData(code) ||
+                    (type == ST_HOURS) ||
+                    (type == ST_SESSIONS) ||
+                    day->settingExists(code) ||
+                    day->hasData(code, type);
+
+
+                if (code == CPAP_Pressure) {
+                    if ((cpapmode > MODE_CPAP) && (mode == MODE_CPAP)) {
+                        hascode = false;
+
+                        if ((type == ST_WAVG) || (type == ST_AVG) || ((type == ST_PERC) && (typeval == 0.5))) {
+                            type = ST_SETWAVG;
+                            hascode = true;
+                        }
+                    } else {
+                        type = m_type[j];
+                    }
+                }
+
+                //if (code==CPAP_Hypopnea) { // Make sure at least one of the CPAP data gets through with 0
+                //    hascode=true;
+                //}
+                if (hascode) {
+                    m_days[dn] = day;
+
+                    switch (type) {
+                    case ST_AVG:
+                        tmp = day->avg(code);
+                        break;
+
+                    case ST_SUM:
+                        tmp = day->sum(code);
+                        break;
+
+                    case ST_WAVG:
+                        tmp = day->wavg(code);
+                        break;
+
+                    case ST_90P:
+                        tmp = day->p90(code);
+                        break;
+
+                    case ST_PERC:
+                        tmp = day->percentile(code, typeval);
+                        break;
+
+                    case ST_MIN:
+                        tmp = day->Min(code);
+                        break;
+
+                    case ST_MAX:
+                        tmp = day->Max(code);
+                        break;
+
+                    case ST_CNT:
+                        tmp = day->count(code);
+                        break;
+
+                    case ST_CPH:
+                        tmp = day->count(code) / day->hours(m_machinetype);
+                        break;
+
+                    case ST_SPH:
+                        tmp = day->sph(code);
+                        break;
+
+                    case ST_HOURS:
+                        tmp = day->hours(m_machinetype);
+                        break;
+
+                    case ST_SESSIONS:
+                        tmp = day->size();
+                        break;
+
+                    case ST_SETMIN:
+                        tmp = day->settings_min(code);
+                        break;
+
+                    case ST_SETMAX:
+                        tmp = day->settings_max(code);
+                        break;
+
+                    case ST_SETAVG:
+                        tmp = day->settings_avg(code);
+                        break;
+
+                    case ST_SETWAVG:
+                        tmp = day->settings_wavg(code);
+                        break;
+
+                    case ST_SETSUM:
+                        tmp = day->settings_sum(code);
+                        break;
+
+                    default:
+                        tmp = 0;
+                        break;
+                    }
+
+                    if (suboffset > 0) {
+                        tmp -= suboffset;
+
+                        if (tmp < 0) { tmp = 0; }
+                    }
+
+                    total += tmp;
+                    m_values[dn][j + 1] = tmp;
+
+                    if (tmp < m_miny) { m_miny = tmp; }
+
+                    if (tmp > m_maxy) { m_maxy = tmp; }
+
+                    m_goodcodes[j] = true;
+                    fnd = true;
+                }
+
+            }
+
+            if (fnd) {
+                if (!m_fday) { m_fday = dn; }
+
+                m_values[dn][0] = total;
+                m_hours[dn] = day->hours(m_machinetype);
+
+                if (m_graphtype == GT_BAR) {
+                    if (total < m_miny) { m_miny = total; }
+
+                    if (total > m_maxy) { m_maxy = total; }
+                }
+            }
+        }
+    }
+
+    m_empty = true;
+
+    for (int i = 0; i < m_goodcodes.size(); i++) {
+        if (m_goodcodes[i]) {
+            m_empty = false;
+            break;
+        }
+    }
+
+    if (m_graphtype == GT_BAR) {
+        m_miny = 0;
+    }
+
+    // m_minx=qint64(QDateTime(p_profile->FirstDay(),QTime(0,0,0),Qt::UTC).toTime_t())*1000L;
+    m_maxx = qint64(QDateTime(p_profile->LastDay(), QTime(23, 59, 0), Qt::UTC).toTime_t()) * 1000L;
+    m_physmaxy = m_maxy;
+    m_physminy = m_miny;
+}
+
+void SummaryChart::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    int left = region.boundingRect().left();
+    int top = region.boundingRect().top();
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    if (!m_visible) { return; }
+
+    GraphType graphtype = m_graphtype;
+
+    if (graphtype == GT_LINE || graphtype == GT_POINTS) {
+        bool pts = p_profile->appearance->overviewLinechartMode() == OLC_Lines;
+        graphtype = pts ? GT_POINTS : GT_LINE;
+    }
+
+    rtop = top;
+
+    painter.setPen(QColor(Qt::black));
+    painter.drawLine(left, top, left, top+height);
+    painter.drawLine(left, top+height, left+width, top+height);
+    painter.drawLine(left+width, top+height, left+width, top);
+    painter.drawLine( left+width, top, left, top);
+
+    qint64 minx = w.min_x, maxx = w.max_x;
+
+    int days = ceil(double(maxx-minx) / 86400000.0);
+
+    bool buttuglydaysteps = !p_profile->appearance->animations();
+
+    double lcursor = w.graphView()->currentTime();
+    if (days >= 1) {
+
+        double b = w.max_x - w.min_x;
+        double a = lcursor - w.min_x;
+        double c = a / b;
+
+        if (buttuglydaysteps) {
+            // this kills the beautiful smooth scrolling and makes days stop on day boundaries :(
+            minx = floor(double(minx)/86400000.0);
+            minx *= 86400000L;
+
+            maxx = minx + 86400000L * qint64(days)-1;
+        }
+
+        b = maxx - minx;
+        double d = c * b;
+        lcursor = d + minx;
+
+
+    }
+
+
+    qint64 xx = maxx - minx;
+
+
+
+    EventDataType miny = m_physminy;
+    EventDataType maxy = m_physmaxy;
+
+    w.roundY(miny, maxy);
+
+    EventDataType yy = maxy - miny;
+    EventDataType ymult = float(height - 2) / yy;
+
+    barw = (float(width) / float(days));
+
+   // graph = &w;
+    float px = left;
+    l_left = w.marginLeft() + gYAxis::Margin;
+    l_top = w.marginTop();
+    l_width = width;
+    l_height = height;
+    float py;
+    EventDataType total;
+
+    int daynum = 0;
+    EventDataType h, tmp, tmp2;
+
+
+    l_offset = (minx) % 86400000L;
+    offset = float(l_offset) / 86400000.0;
+
+    offset *= barw;
+    px = left - offset;
+    l_minx = minx;
+    l_maxx = maxx + 86400000L;
+
+    int total_days = 0;
+    double total_val = 0;
+    double total_hours = 0;
+    bool lastdaygood = false;
+    QVector<double> totalcounts;
+    QVector<double> totalvalues;
+    QVector<float> lastX;
+    QVector<short> lastY;
+    int numcodes = m_codes.size();
+    totalcounts.resize(numcodes);
+    totalvalues.resize(numcodes);
+    lastX.resize(numcodes);
+    lastY.resize(numcodes);
+    int zd = minx / 86400000L;
+    zd--;
+    QHash<int, QMap<short, EventDataType> >::iterator d = m_values.find(zd);
+
+    QVector<bool> goodcodes;
+    goodcodes.resize(m_goodcodes.size());
+
+    lastdaygood = true;
+
+    // Display Line Cursor
+    if (p_profile->appearance->lineCursorMode()) {
+        qint64 time = lcursor;
+        double xmult = double(width) / xx;
+
+        if ((time > minx) && (time < maxx)) {
+            double xpos = (time - minx) * xmult;
+            painter.setPen(QPen(QBrush(QColor(0,255,0,255)),1));
+            painter.drawLine(left+xpos, top-w.marginTop()-3, left+xpos, top+height+w.bottom-1);
+        }
+
+
+
+//        QDateTime dt=QDateTime::fromMSecsSinceEpoch(time,Qt::UTC);
+
+//        QString text = dt.date().toString(Qt::SystemLocaleLongDate);
+
+//        int wid, h;
+       // GetTextExtent(text, wid, h);
+       // w.renderText(text, left + width/2 - wid/2, top-h+5);
+
+    }
+
+    for (int i = 0; i < numcodes; i++) {
+        totalcounts[i] = 0;
+
+        // Set min and max to the opposite largest starting value
+        if ((m_type[i] == ST_MIN) || (m_type[i] == ST_SETMIN)) {
+            totalvalues[i] = maxy;
+        } else if ((m_type[i] == ST_MAX) || (m_type[i] == ST_SETMAX)) {
+            totalvalues[i] = miny;
+        } else {
+            totalvalues[i] = 0;
+        }
+
+        // Turn off legend display.. It will only display if it's turned back on during draw.
+        goodcodes[i] = false;
+
+        if (!m_goodcodes[i]) { continue; }
+
+        lastX[i] = px;
+
+        if (d != m_values.end() && d.value().contains(i + 1)) {
+
+            tmp = d.value()[i + 1];
+            h = tmp * ymult;
+        } else {
+            lastdaygood = false;
+            h = 0;
+        }
+
+        lastY[i] = top + height - 1 - h;
+    }
+
+    float compliance_hours = 0;
+
+    if (p_profile->cpap->showComplianceInfo()) {
+        compliance_hours = p_profile->cpap->complianceHours();
+    }
+
+    int incompliant = 0;
+    Day *day;
+    EventDataType hours;
+
+    //quint32 * tptr;
+    //EventStoreType * dptr;
+
+    short px2, py2;
+    const qint64 ms_per_day = 86400000L;
+
+
+    painter.setClipRect(left, top, width, height);
+    painter.setClipping(true);
+
+    QColor summaryColor = QColor("dark gray");
+
+    for (qint64 Q = minx; Q <= maxx + ms_per_day; Q += ms_per_day) {
+        zd = Q / ms_per_day;
+        d = m_values.find(zd);
+
+        if (Q < minx) {
+            goto jumpnext;
+        }
+
+        if (d != m_values.end()) {
+            day = m_days[zd];
+            bool summary_only = day && day->summaryOnly();
+
+
+            if (!m_hours.contains(zd)) {
+                goto jumpnext;
+            }
+
+            hours = m_hours[zd];
+
+            int x1 = px;
+            //x1-=(barw/2.0);
+            int x2 = px + barw;
+
+            //if (x1 < left) { x1 = left; }
+
+            if (x2 > left + width) { x2 = left + width; }
+
+            //  if (x2<x1)
+            //      goto jumpnext;
+
+
+            if (zd == hl_day) {
+                QColor col = QColor("red");
+                col.setAlpha(64);
+
+                if (graphtype != GT_POINTS) {
+                    painter.fillRect(x1-1, top, barw, height, QBrush(col));
+//                    quads->add(x1 - 1, top, x1 - 1, top + height, x2, top + height, x2, top, col.rgba());
+                } else {
+                    painter.fillRect((x1+barw/2)-5, top, barw, height, QBrush(col));
+//                    quads->add((x1 + barw / 2) - 5, top, (x1 + barw / 2) - 5, top + height, (x2 - barw / 2) + 5,
+//                               top + height, (x2 - barw / 2) + 5, top, col.rgba());
+                }
+            }
+
+            if (graphtype == GT_SESSIONS) {
+                int j;
+                QHash<int, QMap<short, EventDataType> >::iterator times = m_times.find(zd);
+                QColor col = m_colors[0];
+                //if (hours<compliance_hours) col=QColor("#f03030");
+
+                if (summary_only) {
+                    col = summaryColor;
+                }
+                if (zd == hl_day) {
+                    col = COLOR_Gold;
+                }
+
+                QColor col1 = col;
+                QColor col2 = brighten(col,2.37);
+                //outlines->setColor(Qt::black);
+
+                int np = d.value().size();
+
+                if (np > 0) {
+                    for (int i = 0; i < goodcodes.size(); i++) {
+                        goodcodes[i] = true;
+                    }
+                }
+
+                for (j = 0; j < np; j++) {
+                    tmp2 = times.value()[j] - miny;
+                    py = top + height - (tmp2 * ymult);
+
+                    tmp = d.value()[j]; // length
+
+                    //tmp-=miny;
+                    h = tmp * ymult;
+
+                    QLinearGradient gradient(x1, py-h, x1+barw, py-h);
+                    gradient.setColorAt(0,col1);
+                    gradient.setColorAt(1,col2);
+                    painter.fillRect(x1, py-h, barw, h, QBrush(gradient));
+//                    quads->add(x1, py, x1, py - h, x2, py - h, x2, py, col1, col2);
+
+                    if ((h > 0) && (barw > 2)) {
+                        painter.setPen(QColor(Qt::black));
+                        painter.drawLine(x1, py, x1, py - h);
+                        painter.drawLine(x1, py - h, x2, py - h);
+                        painter.drawLine(x1, py, x2, py);
+                        painter.drawLine(x2, py, x2, py - h);
+                    }
+
+                    totalvalues[0] += hours * tmp;
+                }
+
+                totalcounts[0] += hours;
+                totalvalues[1] += j;
+                totalcounts[1]++;
+                total_val += hours;
+                total_hours += hours;
+                total_days++;
+            } else {
+                if (!d.value().contains(0)) {
+                    goto jumpnext;
+                }
+
+                total = d.value()[0];
+
+                //if (total>0) {
+                if (day) {
+                    EventDataType hours = m_hours[zd];
+                    total_val += total * hours;
+                    total_hours += hours;
+                    total_days++;
+                }
+
+                py = top + height;
+
+                //}
+                bool good;
+                SummaryType type;
+
+                for (QMap<short, EventDataType>::iterator g = d.value().begin(); g != d.value().end(); g++) {
+                    short j = g.key();
+
+                    if (!j) { continue; }
+
+                    j--;
+                    good = m_goodcodes[j];
+
+                    if (!good) {
+                        continue;
+                    }
+
+                    type = m_type[j];
+                    // code was actually used (to signal the display of the legend summary)
+                    goodcodes[j] = good;
+
+                    tmp = g.value();
+
+                    QColor col = m_colors[j];
+
+                    if (type == ST_HOURS) {
+                        if (tmp < compliance_hours) {
+                            col = QColor("#f04040");
+                            incompliant++;
+                        } else if (summary_only) {
+                            col = summaryColor;
+                        }
+                    }
+
+                    if (zd == hl_day) {
+                        col = COLOR_Gold;
+                    }
+
+                    //if (!tmp) continue;
+                    if ((type == ST_MAX) || (type == ST_SETMAX)) {
+                        if (totalvalues[j] < tmp) {
+                            totalvalues[j] = tmp;
+                        }
+                    } else if ((type == ST_MIN) || (type == ST_SETMIN)) {
+                        if (totalvalues[j] > tmp) {
+                            totalvalues[j] = tmp;
+                        }
+                    } else {
+                        totalvalues[j] += tmp * hours;
+                    }
+
+                    //if (tmp) {
+                    totalcounts[j] += hours;
+                    //}
+                    tmp -= miny;
+                    h = tmp * ymult; // height in pixels
+
+                    if (graphtype == GT_BAR) {
+                        QColor col1 = col;
+                        QColor col2 = brighten(col,2.5);
+
+                        QLinearGradient gradient(x1, py-h, x1+barw, py-h);
+                        gradient.setColorAt(0,col1);
+                        gradient.setColorAt(1,col2);
+                        painter.fillRect(x1, py-h, barw, h, QBrush(gradient));
+
+//                        quads->add(x1, py, x1, py - h, col1);
+//                        quads->add(x2, py - h, x2, py, col2);
+
+                        if (h > 0 && barw > 2) {
+                            painter.setPen(QColor(Qt::black));
+                            painter.drawLine(x1, py, x1, py - h);
+                            painter.drawLine(x1, py - h, x2, py - h);
+                            painter.drawLine(x1, py, x2, py);
+                            painter.drawLine(x2, py, x2, py - h);
+                        } // if (bar
+
+                        py -= h;
+                    } else if (graphtype == GT_LINE) { // if (m_graphtype==GT_BAR
+                        QColor col1 = col;
+                        QColor col2 = m_colors[j];
+                        px2 = px + barw;
+                        py2 = (top + height - 1) - h;
+
+                        // If more than 1 day between records, skip the vertical crud.
+                        if ((px2 - lastX[j]) > barw + 1) {
+                            lastdaygood = false;
+                        }
+
+                        if (lastdaygood) {
+                            if (lastY[j] != py2) { // vertical line
+                                painter.setPen(QPen(col2,p_profile->appearance->lineThickness()));
+                                painter.drawLine(lastX[j], lastY[j], px, py2);
+                            }
+
+                            painter.setPen(QPen(col1,p_profile->appearance->lineThickness()));
+                            painter.drawLine(px, py2, px2, py2);
+                        } else {
+                            painter.setPen(QPen(col1,p_profile->appearance->lineThickness()));
+                            painter.drawLine(x1, py2, x2, py2);
+                        }
+
+                        lastX[j] = px2;
+                        lastY[j] = py2;
+                    } else if (graphtype == GT_POINTS) {
+                        QColor col1 = col;
+                        QColor  col2 = m_colors[j];
+                        px2 = px + barw;
+                        py2 = (top + height - 2) - h;
+
+                        // If more than 1 day between records, skip the vertical crud.
+                        if ((px2 - lastX[j]) > barw + 1) {
+                            lastdaygood = false;
+                        }
+
+                        if (zd == hl_day) {
+                            painter.setPen(QPen(brighten(col2),10));
+                            painter.drawPoint(px2 - barw / 2, py2);
+                        }
+
+                        if (lastdaygood) {
+                            painter.setPen(QPen(col2,p_profile->appearance->lineThickness()));
+                            painter.drawLine(lastX[j] - barw / 2, lastY[j], px2 - barw / 2, py2);
+                        } else {
+                            painter.setPen(QPen(col1,p_profile->appearance->lineThickness()));
+                            painter.drawLine(px + barw / 2 - 1, py2, px + barw / 2 + 1, py2);
+                        }
+
+                        lastX[j] = px2;
+                        lastY[j] = py2;
+                    }
+                }  // for(QHash<short
+            }
+
+            lastdaygood = true;
+            //    if (Q>maxx+extra) break;
+        } else {
+            if (Q < maxx) {
+                incompliant++;
+            }
+
+            lastdaygood = false;
+        }
+
+jumpnext:
+
+        if (px >= left + width + barw) {
+            break;
+        }
+
+        px += barw;
+
+        daynum++;
+        //lastQ=Q;
+    }
+    painter.setClipping(false);
+
+//#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+//    quads->scissor(left * dpr, w.flipY(top + height + 2)*dpr, (width)*dpr, (height + 1)*dpr);
+//    lines->scissor(left * dpr, w.flipY(top + height + 2)*dpr, (width + 1)*dpr, (height + 1)*dpr);
+//    outlines->scissor(left * dpr, w.flipY(top + height + 2)*dpr, (width)*dpr, (height + 1)*dpr);
+//#else
+//    lines->scissor(left, w.flipY(top + height + 2), width + 1, height + 2);
+//    outlines->scissor(left, w.flipY(top + height + 2), width, height + 2);
+//    quads->scissor(left, w.flipY(top + height + 2), width, height + 2);
+//#endif
+    // Draw Ledgend
+    px = left + width - 3;
+    py = top - 5;
+    int legendx = px;
+    QString a, b;
+    int x, y;
+
+    QFontMetrics fm(*defaultfont);
+    int bw = fm.width('X');
+    int bh = fm.height() / 1.8;
+
+    bool ishours = false;
+    int good = 0;
+
+//    if (w.title().compare("Resp. Rate")==0) {
+//        int i=5;
+//    }
+
+    for (int j = 0; j < m_codes.size(); j++) {
+        if (!goodcodes[j]) { continue; }
+
+        good++;
+        SummaryType type = m_type[j];
+        ChannelID code = m_codes[j];
+        EventDataType tval = m_typeval[j];
+
+        switch (type) {
+        case ST_WAVG:
+            b = "Avg";
+            break;
+
+        case ST_AVG:
+            b = "Avg";
+            break;
+
+        case ST_90P:
+            b = "90%";
+            break;
+
+        case ST_PERC:
+            if (tval >= 0.99) { b = STR_TR_Max; }
+            else if (tval == 0.5) { b = STR_TR_Med; }
+            else { b = QString("%1%").arg(tval * 100.0, 0, 'f', 0); }
+
+            break;
+
+        //b=QString("%1%").arg(tval*100.0,0,'f',0); break;
+        case ST_MIN:
+            b = STR_TR_Min;
+            break;
+
+        case ST_MAX:
+            b = STR_TR_Max;
+            break;
+
+        case ST_SETMIN:
+            b = STR_TR_Min;
+            break;
+
+        case ST_SETMAX:
+            b = STR_TR_Max;
+            break;
+
+        case ST_CPH:
+            b = "";
+            break;
+
+        case ST_SPH:
+            b = "%";
+            break;
+
+        case ST_HOURS:
+            b = STR_UNIT_Hours;
+            break;
+
+        case ST_SESSIONS:
+            b = STR_TR_Sessions;
+            break;
+
+        default:
+            b = "";
+            break;
+        }
+
+        a = schema::channel[code].label();
+
+        if (a == w.title() && !b.isEmpty()) { a = b; }
+        else { a += " " + b; }
+
+        QString val;
+        float f = 0;
+
+        if (totalcounts[j] > 0) {
+            if ((type == ST_MIN) || (type == ST_MAX) || (type == ST_SETMIN) || (type == ST_SETMAX)) {
+                f = totalvalues[j];
+            } else {
+                f = totalvalues[j] / totalcounts[j];
+            }
+        }
+
+        if (type == ST_HOURS) {
+            int h = f;
+            int m = int(f * 60) % 60;
+            val.sprintf("%02i:%02i", h, m);
+            ishours = true;
+        } else {
+            val = QString::number(f, 'f', 2);
+        }
+
+        a += ": " + val;
+        //GetTextExtent(a,x,y);
+        //float wt=20*w.printScaleX();
+        //px-=wt+x;
+        //w.renderText(a,px+wt,py+1);
+        //quads->add(px+wt-y/4-y,py-y,px+wt-y/4,py-y,px+wt-y/4,py+1,px+wt-y/4-y,py+1,m_colors[j].rgba());
+
+
+        //QString text=schema::channel[code].label();
+
+        int wid, hi;
+        GetTextExtent(a, wid, hi);
+        legendx -= wid;
+        w.renderText(a, legendx, top - 4);
+        //  legendx-=bw/2;
+
+        painter.fillRect(legendx - bw-4, top-w.marginTop()-1, bh, w.marginTop(), QBrush(m_colors[j]));
+        legendx -= bw * 2;
+
+
+        //lines->add(px,py,px+20,py,m_colors[j]);
+        //lines->add(px,py+1,px+20,py+1,m_colors[j]);
+    }
+
+    if ((m_graphtype == GT_BAR) && (good > 0)) {
+
+        if (m_type.size() > 1) {
+            float val = total_val / float(total_hours);
+            a = m_label + ": " + QString::number(val, 'f', 2) + " ";
+            GetTextExtent(a, x, y);
+            legendx -= x;
+            w.renderText(a, legendx, py + 1);
+        }
+    }
+
+    a = "";
+    /*if (m_graphtype==GT_BAR) {
+        if (m_type.size()>1) {
+            float val=total_val/float(total_days);
+            a+=m_label+": "+QString::number(val,'f',2)+" ";
+            //
+        }
+    }*/
+    a += QString(QObject::tr("Days: %1")).arg(total_days, 0);
+
+    if (p_profile->cpap->showComplianceInfo()) {
+        if (ishours && incompliant > 0) {
+            a += " "+QString(QObject::tr("Low Usage Days: %1")).arg(incompliant, 0)+
+                 " "+QString(QObject::tr("(%1% compliant, defined as > %2 hours)")).
+                    arg((1.0 / daynum) * (total_days - incompliant) * 100.0, 0, 'f', 2).arg(compliance_hours, 0, 'f', 1);
+        }
+    }
+
+
+    //GetTextExtent(a,x,y);
+    //legendx-=30+x;
+    //w.renderText(a,px+24,py+5);
+    w.renderText(a, left, py + 1);
+}
+
+QString formatTime(EventDataType v, bool show_seconds = false, bool duration = false,
+                   bool show_12hr = false)
+{
+    int h = int(v);
+
+    if (!duration) {
+        h %= 24;
+    } else { show_12hr = false; }
+
+    int m = int(v * 60) % 60;
+    int s = int(v * 3600) % 60;
+
+    char pm[3] = {"am"};
+
+    if (show_12hr) {
+        h >= 12 ? pm[0] = 'p' : pm[0] = 'a';
+        h %= 12;
+
+        if (h == 0) { h = 12; }
+
+    } else {
+        pm[0] = 0;
+    }
+
+    if (show_seconds) {
+        return QString().sprintf("%i:%02i:%02i%s", h, m, s, pm);
+    } else {
+        return QString().sprintf("%i:%02i%s", h, m, pm);
+    }
+}
+
+bool SummaryChart::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+    graph->timedRedraw(0);
+    int x = event->x();
+    int y = event->y();
+
+    if (!m_rect.contains(x, y)) {
+        //    if ((x<0 || y<0 || x>l_width || y>l_height)) {
+        hl_day = -1;
+        //graph->timedRedraw(2000);
+        return false;
+    }
+
+    x -= m_rect.left();
+    y -= m_rect.top();
+
+    double xx = l_maxx - l_minx;
+
+    double xmult = xx / double(l_width + barw);
+
+    qint64 mx = ceil(xmult * double(x - offset));
+    mx += l_minx;
+    mx = mx + l_offset; //-86400000L;
+    int zd = mx / 86400000L;
+
+    Day *day;
+    //if (hl_day!=zd)   // This line is an optimization
+
+    {
+        hl_day = zd;
+        graph->Trigger(2000);
+
+        QHash<int, QMap<short, EventDataType> >::iterator d = m_values.find(hl_day);
+
+        QMap<short, EventDataType> &valhash = d.value();
+
+        x += m_rect.left(); //gYAxis::Margin+gGraphView::titleWidth; //graph->m_marginleft+
+        int y = event->y() - m_rect.top() + rtop - 15;
+        //QDateTime dt1=QDateTime::fromTime_t(hl_day*86400).toLocalTime();
+        QDateTime dt2 = QDateTime::fromTime_t(hl_day * 86400).toUTC();
+
+        //QTime t1=dt1.time();
+        //QTime t2=dt2.time();
+
+        QDate dt = dt2.date();
+        day = m_days[zd];
+
+        if ((d != m_values.end()) && (day != nullptr)) {
+            bool summary_only = day->summaryOnly();
+
+            QString z = dt.toString(Qt::SystemLocaleShortDate);
+
+            // Day * day=m_days[hl_day];
+            //EventDataType val;
+            QString val;
+
+            if (m_graphtype == GT_SESSIONS) {
+                if (m_type[0] == ST_HOURS) {
+
+                    int t = m_hours[zd] * 3600.0;
+                    int h = t / 3600;
+                    int m = (t / 60) % 60;
+                    //int s=t % 60;
+                    val.sprintf("%02i:%02i", h, m);
+                } else {
+                    val = QString::number(d.value()[0], 'f', 2);
+                }
+
+                z += "\r\n" + m_label + ": " + val;
+
+                if (m_type[1] == ST_SESSIONS) {
+                    z += " "+QString(QObject::tr("(Sess: %1)")).arg(day->size(), 0);
+                }
+
+                EventDataType v = m_times[zd][0];
+                int lastt = m_times[zd].size() - 1;
+
+                if (lastt < 0) { lastt = 0; }
+
+                z += "\r\n"+QString(QObject::tr("Bedtime: %1")).arg(formatTime(v, false, false, true));
+                v = m_times[zd][lastt] + m_values[zd][lastt];
+                z += "\r\n"+QString(QObject::tr("Waketime: %1")).arg(formatTime(v, false, false, true));
+
+            } else if (m_graphtype == GT_BAR) {
+                if (m_type[0] == ST_HOURS) {
+                    int t = d.value()[0] * 3600.0;
+                    int h = t / 3600;
+                    int m = (t / 60) % 60;
+                    //int s=t % 60;
+                    val.sprintf("%02i:%02i", h, m);
+                } else {
+                    val = QString::number(d.value()[0], 'f', 2);
+                }
+
+                z += "\r\n" + m_label + ": " + val;
+                //z+="\r\nMode="+QString::number(day->settings_min("FlexSet"),'f',0);
+
+            } else {
+                QString a;
+
+                for (int i = 0; i < m_type.size(); i++) {
+                    if (!m_goodcodes[i]) {
+                        continue;
+                    }
+
+                    if (!valhash.contains(i + 1)) {
+                        continue;
+                    }
+
+                    EventDataType tval = m_typeval[i];
+
+                    switch (m_type[i]) {
+                    case ST_WAVG:
+                        a = STR_TR_WAvg;
+                        break;
+
+                    case ST_AVG:
+                        a = STR_TR_Avg;
+                        break;
+
+                    case ST_90P:
+                        a = QObject::tr("90%");
+                        break;
+
+                    case ST_PERC:
+                        if (tval >= 0.99) { a = STR_TR_Max; }
+                        else if (tval == 0.5) { a = STR_TR_Med; }
+                        else { a = QString("%1%").arg(tval * 100.0, 0, 'f', 0); }
+
+                        break;
+
+                    case ST_MIN:
+                        a = STR_TR_Min;
+                        break;
+
+                    case ST_MAX:
+                        a = STR_TR_Max;
+                        break;
+
+                    case ST_CPH:
+                        a = "";
+                        break;
+
+                    case ST_SPH:
+                        a = "%";
+                        break;
+
+                    case ST_HOURS:
+                        a = STR_UNIT_Hours;
+                        break;
+
+                    case ST_SESSIONS:
+                        a = STR_TR_Sessions;
+                        break;
+
+                    case ST_SETMIN:
+                        a = STR_TR_Min;
+                        break;
+
+                    case ST_SETMAX:
+                        a = STR_TR_Max;
+                        break;
+
+                    default:
+                        a = "";
+                        break;
+                    }
+
+                    if (m_type[i] == ST_SESSIONS) {
+                        val = QString::number(d.value()[i + 1], 'f', 0);
+                        z += "\r\n" + a + ": " + val;
+                    } else {
+                        //if (day && (day->channelExists(m_codes[i]) || day->settingExists(m_codes[i]))) {
+                        schema::Channel &chan = schema::channel[m_codes[i]];
+                        EventDataType v;
+
+                        if (valhash.contains(i + 1)) {
+                            v = valhash[i + 1];
+                        } else { v = 0; }
+
+                        if (m_codes[i] == Journal_Weight) {
+                            val = weightString(v, p_profile->general->unitSystem());
+                        } else {
+                            val = QString::number(v, 'f', 2);
+                        }
+
+                        z += "\r\n" + chan.label() + " " + a + ": " + val;
+                        //}
+                    }
+                }
+
+            }
+            if (summary_only) {
+                z += "\r\n"+QObject::tr("(Summary Only)");
+            }
+
+            graph->ToolTip(z, x, y - 15);
+            return false;
+        } else {
+            QString z = dt.toString(Qt::SystemLocaleShortDate) + "\r\n"+QObject::tr("No Data");
+            graph->ToolTip(z, x, y - 15);
+            return false;
+        }
+    }
+
+
+    return false;
+}
+
+bool SummaryChart::mousePressEvent(QMouseEvent *event, gGraph *graph)
+{
+    if (event->modifiers() & Qt::ShiftModifier) {
+        //qDebug() << "Jump to daily view?";
+        return true;
+    }
+
+    Q_UNUSED(graph)
+    return false;
+}
+
+bool SummaryChart::keyPressEvent(QKeyEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    //qDebug() << "Summarychart Keypress";
+    return false;
+}
+
+#include "mainwindow.h"
+extern MainWindow *mainwin;
+bool SummaryChart::mouseReleaseEvent(QMouseEvent *event, gGraph *graph)
+{
+    if (event->modifiers() & Qt::ShiftModifier) {
+        if (hl_day < 0) {
+            mouseMoveEvent(event, graph);
+        }
+
+        if (hl_day > 0) {
+            QDateTime d = QDateTime::fromTime_t(hl_day * 86400).toUTC();
+            mainwin->getDaily()->LoadDate(d.date());
+            mainwin->JumpDaily();
+            //qDebug() << "Jump to daily view?" << d;
+            return true;
+        }
+    }
+
+    Q_UNUSED(event)
+    hl_day = -1;
+    graph->timedRedraw(2000);
+    return false;
+}
+
diff --git a/sleepyhead/Graphs/gSummaryChart.h b/sleepyhead/Graphs/gSummaryChart.h
new file mode 100644
index 0000000..db50d56
--- /dev/null
+++ b/sleepyhead/Graphs/gSummaryChart.h
@@ -0,0 +1,153 @@
+/* gSummaryChart Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GBARCHART_H
+#define GBARCHART_H
+
+#include <SleepLib/profiles.h>
+#include "gGraphView.h"
+#include "gXAxis.h"
+
+/*! \enum GraphType
+    \value GT_BAR   Display as a BarGraph
+    \value GT_LINE  Display as a line plot
+    \value GT_SESSIONS Display type for session times chart
+    */
+enum GraphType { GT_BAR, GT_LINE, GT_POINTS, GT_SESSIONS };
+
+
+/*! \class SummaryChart
+    \brief The main overall chart type layer used in Overview page
+    */
+class SummaryChart: public Layer
+{
+  public:
+    //! \brief Constructs a SummaryChart with QString label, of GraphType type
+    SummaryChart(QString label, GraphType type = GT_BAR);
+    virtual ~SummaryChart();
+
+    //! \brief Renders the graph to the QPainter object
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+    //! \brief Precalculation code prior to drawing. Day object is not needed here, it's just here for Layer compatability.
+    virtual void SetDay(Day *day = nullptr);
+
+    //! \brief Returns true if no data was found for this day during SetDay
+    virtual bool isEmpty() { return m_empty; }
+
+    //! \brief Adds a layer to the summaryChart (When in Bar mode, it becomes culminative, eg, the AHI chart)
+    void addSlice(ChannelID code, QColor color, SummaryType type, EventDataType tval = 0.00f) {
+        m_codes.push_back(code);
+        m_colors.push_back(color);
+        m_type.push_back(type);
+        //m_zeros.push_back(ignore_zeros);
+        m_typeval.push_back(tval);
+    }
+
+    //! \brief Deselect highlighting (the gold bar)
+    virtual void deselect() {
+        hl_day = -1;
+    }
+
+    //! \brief Returns true if currently selected..
+    virtual bool isSelected() { return hl_day >= 0; }
+
+
+    //! \brief Sets the MachineType this SummaryChart is interested in
+    void setMachineType(MachineType type) { m_machinetype = type; }
+
+    //! \brief Returns the MachineType this SummaryChart is interested in
+    MachineType machineType() { return m_machinetype; }
+
+    virtual Layer * Clone() {
+        SummaryChart * sc = new SummaryChart(m_label);
+        Layer::CloneInto(sc);
+        CloneInto(sc);
+        return sc;
+    }
+
+    void CloneInto(SummaryChart * layer) {
+        layer->m_orientation = m_orientation;
+        layer->m_colors = m_colors;
+        layer->m_codes = m_codes;
+        layer->m_goodcodes = m_goodcodes;
+        layer->m_type = m_type;
+        layer->m_typeval = m_typeval;
+        layer->m_values = m_values;
+        layer->m_times = m_times;
+        layer->m_hours = m_hours;
+        layer->m_days = m_days;
+
+        layer->m_empty = m_empty;
+        layer->m_fday = m_fday;
+        layer->m_label = m_label;
+        layer->barw = barw;
+        layer->l_offset = l_offset;
+        layer->offset = offset;
+        layer->l_left = l_left;
+        layer->l_top = l_top;
+        layer->l_width= l_width;
+        layer->l_height = l_height;
+        layer->rtop = rtop;
+        layer->l_minx = l_minx;
+        layer->l_maxx = l_maxx;
+        layer->hl_day = hl_day;
+        layer->m_graphtype = m_graphtype;
+        layer->m_machinetype = m_machinetype;
+        layer->tz_offset = tz_offset;
+        layer->tz_hours = tz_hours;
+
+    }
+
+
+  protected:
+    Qt::Orientation m_orientation;
+
+    QVector<QColor> m_colors;
+    QVector<ChannelID> m_codes;
+    QVector<bool> m_goodcodes;
+    //QVector<bool> m_zeros;
+    QVector<SummaryType> m_type;
+    QVector<EventDataType> m_typeval;
+    QHash<int, QMap<short, EventDataType> > m_values;
+    QHash<int, QMap<short, EventDataType> > m_times;
+    QHash<int, EventDataType> m_hours;
+    QHash<int, Day *> m_days;
+
+    bool m_empty;
+    int m_fday;
+    QString m_label;
+
+    float barw; // bar width from last draw
+    qint64 l_offset; // last offset
+    float offset;    // in pixels;
+    int l_left, l_top, l_width, l_height;
+    int rtop;
+    qint64 l_minx, l_maxx;
+    int hl_day;
+    //gGraph *graph;
+    GraphType m_graphtype;
+    MachineType m_machinetype;
+    int tz_offset;
+    float tz_hours;
+
+    //! \brief Key was pressed that effects this layer
+    virtual bool keyPressEvent(QKeyEvent *event, gGraph *graph);
+
+    //! \brief Mouse moved over this layers area (shows the hover-over tooltips here)
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+
+    //! \brief Mouse Button was pressed over this area
+    virtual bool mousePressEvent(QMouseEvent *event, gGraph *graph);
+
+    //! \brief Mouse Button was released over this area. (jumps to daily view here)
+    virtual bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph);
+};
+
+
+#endif // GBARCHART_H
diff --git a/sleepyhead/Graphs/gXAxis.cpp b/sleepyhead/Graphs/gXAxis.cpp
new file mode 100644
index 0000000..08d832d
--- /dev/null
+++ b/sleepyhead/Graphs/gXAxis.cpp
@@ -0,0 +1,447 @@
+/* gXAxis Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QDebug>
+#include <QFontMetrics>
+
+#include <math.h>
+
+#include "Graphs/gXAxis.h"
+#include "SleepLib/profiles.h"
+#include "Graphs/glcommon.h"
+#include "Graphs/gGraph.h"
+#include "Graphs/gGraphView.h"
+
+// These divisors are used to round xaxis timestamps to reasonable increments
+const quint64 divisors[] = {
+    15552000000ULL, 7776000000ULL, 5184000000ULL, 2419200000ULL, 1814400000ULL, 1209600000L, 604800000L, 259200000L,
+    172800000L, 86400000, 2880000, 14400000, 7200000, 3600000, 2700000,
+    1800000, 1200000, 900000, 600000, 300000, 120000, 60000, 45000, 30000,
+    20000, 15000, 10000, 5000, 2000, 1000, 500, 100, 50, 10, 1
+};
+const int divcnt = sizeof(divisors) / sizeof(quint64);
+
+gXAxis::gXAxis(QColor col, bool fadeout)
+    : Layer(NoChannel)
+{
+    m_line_color = col;
+    m_text_color = col;
+    m_major_color = Qt::darkGray;
+    m_minor_color = Qt::lightGray;
+    m_show_major_lines = false;
+    m_show_minor_lines = false;
+    m_show_minor_ticks = true;
+    m_show_major_ticks = true;
+    m_utcfix = false;
+    m_fadeout = fadeout;
+
+    tz_offset = timezoneOffset();
+    tz_hours = tz_offset / 3600000.0;
+
+    m_roundDays = false;
+}
+gXAxis::~gXAxis()
+{
+}
+
+int gXAxis::minimumHeight()
+{
+    QFontMetrics fm(*defaultfont);
+    int h = fm.height();
+#if defined(Q_OS_MAC)
+    return 9+h;
+#else
+    return 11+h;
+#endif
+}
+
+void gXAxis::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    int left = region.boundingRect().left();
+    int top = region.boundingRect().top();
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    QString months[] = {
+        QObject::tr("Jan"), QObject::tr("Feb"), QObject::tr("Mar"), QObject::tr("Apr"), QObject::tr("May"), QObject::tr("Jun"),
+        QObject::tr("Jul"), QObject::tr("Aug"), QObject::tr("Sep"), QObject::tr("Oct"), QObject::tr("Nov"), QObject::tr("Dec")
+    };
+    //static QString dow[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
+
+
+    QVector<QLine> ticks;
+
+
+    QPainter painter2; // Only need this for pixmap caching
+
+    // pixmap caching screws font size when printing
+
+    bool usepixmap = w.graphView()->usePixmapCache(); // Whether or not to use pixmap caching
+
+    if (!usepixmap || (usepixmap && w.invalidate_xAxisImage)) {
+        // Redraw graph xaxis labels and ticks either to pixmap or directly to screen
+
+        if (usepixmap) {
+            // Initialize a new cache image
+            m_image = QImage(width + 22, height + 4, QImage::Format_ARGB32_Premultiplied);
+            m_image.fill(Qt::transparent);
+            painter2.begin(&m_image);
+            painter2.setPen(Qt::black);
+            painter2.setFont(*defaultfont);
+        }
+
+        double px, py;
+
+        int start_px = left;
+        //int start_py=top;
+        //int width=scrx-(w.GetLeftMargin()+w.GetRightMargin());
+        //    float height=scry-(w.GetTopMargin()+w.GetBottomMargin());
+
+        if (width < 40) {
+            return;
+        }
+
+        qint64 minx;
+        qint64 maxx;
+
+        if (w.blockZoom()) {
+            // Lock zoom to entire data range
+            minx = w.rmin_x;
+            maxx = w.rmax_x;
+        } else {
+            // Allow zoom
+            minx = w.min_x;
+            maxx = w.max_x;
+
+        }
+
+        int days = ceil(double(maxx-minx) / 86400000.0);
+
+        if (m_roundDays) {
+            minx = floor(double(minx)/86400000.0);
+            minx *= 86400000L;
+
+            maxx = minx + 86400000L * qint64(days);
+        }
+
+        // duration of graph display window in milliseconds.
+        qint64 xx = maxx - minx;
+
+        // shouldn't really be negative, but this is safer than an assert
+        if (xx <= 0) {
+            return;
+        }
+
+        //Most of this could be precalculated when min/max is set..
+        QString fd, tmpstr;
+        int divmax, dividx;
+        int fitmode;
+
+        // Have a quick look at the scale and prep the autoscaler a little faster
+        if (xx >= 86400000L) {       // Day
+            fd = "Mjj 00";
+            dividx = 0;
+            divmax = 10;
+            fitmode = 0;
+        } else if (xx > 1800000) {  // Minutes
+            fd = " j0:00";
+            dividx = 10;
+            divmax = 21;
+            fitmode = 1;
+        } else if (xx > 5000) {    // Seconds
+            fd = " j0:00:00";
+            dividx = 16;
+            divmax = 29;
+            fitmode = 2;
+        } else {                   // Microseconds
+            fd = "j0:00:00:000";
+            dividx = 28;
+            divmax = divcnt;
+            fitmode = 3;
+        }
+
+        //if (divmax>divcnt) divmax=divcnt;
+
+        int x, y;
+        // grab the text extent of the dummy text fields above to know how much space is needed
+        GetTextExtent(fd, x, y);
+
+        // Not sure when this was a problem...
+        Q_ASSERT(x > 0);
+//        if (x <= 0) {
+//            qWarning() << "gXAxis::Plot() x<=0 font size bug";
+//            return;
+//        }
+
+
+        // Max number of ticks that will fit, with a bit of room for a buffer
+        int max_ticks = width / (x + 15);
+
+        int fit_ticks = 0;
+        int div = -1;
+        qint64 closest = 0, tmp, tmpft;
+
+        // Scan through divisor list with the index range given above, to find which
+        // gives the closest number of ticks to the maximum that will physically fit
+
+        for (int i = dividx; i < divmax; i++) {
+            tmpft = xx / divisors[i];
+            tmp = max_ticks - tmpft;
+
+            if (tmp < 0) { continue; }
+
+            if (tmpft > closest) {   // Find the closest scale to the number
+                closest = tmpft;     // that will fit
+                div = i;
+                fit_ticks = tmpft;
+            }
+        }
+
+        if (fit_ticks == 0) {
+            qDebug() << "gXAxis::Plot() Couldn't fit ticks.. Too short?" << minx << maxx << xx;
+            return;
+        }
+
+        if ((div < 0) || (div > divcnt)) {
+            qDebug() << "gXAxis::Plot() div out of bounds";
+            return;
+        }
+
+        qint64 step = divisors[div];
+
+        //Align left minimum to divisor by losing precision
+        qint64 aligned_start = minx / step;
+        aligned_start *= step;
+
+        while (aligned_start < minx) {
+            aligned_start += step;
+        }
+
+        painter.setPen(QColor(Qt::black));
+
+
+        //int utcoff=m_utcfix ? tz_hours : 0;
+
+        //utcoff=0;
+        int num_minor_ticks;
+
+        if (step >= 86400000) {
+            qint64 i = step / 86400000L; // number of days
+
+            if (i > 14) { i /= 2; }
+
+            if (i < 0) { i = 1; }
+
+            num_minor_ticks = i;
+        } else { num_minor_ticks = 10; }
+
+        float xmult = double(width) / double(xx);
+        float step_pixels = double(step / float(num_minor_ticks)) * xmult;
+
+        py = left + float(aligned_start - minx) * xmult;
+
+        //py+=usepixmap ? 20 : left;
+
+        int mintop = top + 3.0 * (float(y) / 10.0);
+        int majtop = top + 6.0 * (float(y) / 10.0);
+        int texttop = majtop + y; // 18*w.printScaleY();
+#if defined (Q_OS_MAC)
+           texttop += 2;
+#endif
+
+        // Fill in the minor tick marks up to the first major alignment tick
+
+        for (int i = 0; i < num_minor_ticks; i++) {
+            py -= step_pixels;
+
+            if (py < start_px) { continue; }
+
+            if (usepixmap) {
+                ticks.append(QLine(py - left + 20, 0, py - left + 20, mintop - top));
+            } else {
+                ticks.append(QLine(py, top+2, py, mintop+2));
+            }
+        }
+
+        int ms, m, h, s, d;
+        qint64 j;
+
+        for (qint64 i = aligned_start; i < maxx; i += step) {
+            px = (i - minx) * xmult;
+            px += left;
+
+            if (usepixmap) {
+                ticks.append(QLine(px - left + 20, 0, px - left + 20, majtop - top));
+            } else {
+                ticks.append(QLine(px, top+2, px, majtop+2));
+            }
+
+            j = i;
+
+            if (!m_utcfix) { j += tz_offset; }
+
+            ms = j % 1000;
+            s = (j / 1000L) % 60L;
+            m = (j / 60000L) % 60L;
+            h = (j / 3600000L) % 24L;
+            //int d=(j/86400000) % 7;
+
+            if (fitmode == 0) {
+                d = (j / 1000);
+                QDateTime dt = QDateTime::fromTime_t(d).toUTC();
+                QDate date = dt.date();
+                // SLOW SLOW SLOW!!! On Mac especially, this function is pathetically slow.
+                //dt.toString("MMM dd");
+
+                // Doing it this way instead because it's MUUUUUUCH faster
+                tmpstr = QString("%1 %2").arg(months[date.month() - 1]).arg(date.day());
+                //} else if (fitmode==0) {
+                //            tmpstr=QString("%1 %2:%3").arg(dow[d]).arg(h,2,10,QChar('0')).arg(m,2,10,QChar('0'));
+            } else if (fitmode == 1) { // minute
+                tmpstr = QString("%1:%2").arg(h, 2, 10, QChar('0')).arg(m, 2, 10, QChar('0'));
+            } else if (fitmode == 2) { // second
+                tmpstr = QString("%1:%2:%3").arg(h, 2, 10, QChar('0')).arg(m, 2, 10, QChar('0')).arg(s, 2, 10, QChar('0'));
+            } else if (fitmode == 3) { // milli
+                tmpstr = QString("%1:%2:%3:%4").arg(h, 2, 10, QChar('0')).arg(m, 2, 10, QChar('0')).arg(s, 2, 10, QChar('0')).arg(ms, 3, 10, QChar('0'));
+            }
+
+            int tx = px - x / 2.0;
+
+            if (m_utcfix) {
+                tx += step_pixels / 2.0;
+            }
+
+            if ((tx + x) < (left + width)) {
+                if (!usepixmap) { w.renderText(tmpstr, tx, texttop, 0, Qt::black, defaultfont); }
+                else { painter2.drawText(tx - left + 20, texttop - top, tmpstr); }
+            }
+
+            py = px;
+
+            for (int j = 1; j < num_minor_ticks; j++) {
+                py += step_pixels;
+
+                if (py >= left + width) { break; }
+
+                if (usepixmap) {
+                    ticks.append(QLine(py - left + 20, 0, py - left + 20, mintop - top));
+                } else {
+                    ticks.append(QLine(py, top+2, py, mintop+2));
+                }
+            }
+        }
+
+        if (usepixmap) {
+            painter2.drawLines(ticks);
+            painter2.end();
+        } else {
+            painter.drawLines(ticks);
+        }
+        w.graphView()->lines_drawn_this_frame += ticks.size();
+
+        w.invalidate_xAxisImage = false;
+    }
+
+    if (usepixmap && !m_image.isNull()) {
+        painter.drawImage(QPoint(left - 20, top + height - m_image.height() + 5), m_image);
+    }
+}
+
+
+gXAxisDay::gXAxisDay(QColor col)
+    :Layer(NoChannel)
+{
+    m_line_color = col;
+    m_text_color = col;
+    m_major_color = Qt::darkGray;
+    m_minor_color = Qt::lightGray;
+    m_show_major_lines = false;
+    m_show_minor_lines = false;
+    m_show_minor_ticks = true;
+    m_show_major_ticks = true;
+}
+gXAxisDay::~gXAxisDay()
+{
+}
+
+int gXAxisDay::minimumHeight()
+{
+    QFontMetrics fm(*defaultfont);
+    int h = fm.height();
+#if defined(Q_OS_MAC)
+    return 9+h;
+#else
+    return 11+h;
+#endif
+}
+
+void gXAxisDay::paint(QPainter &painter, gGraph &graph, const QRegion &region)
+{
+    float left = region.boundingRect().left();
+    float top = region.boundingRect().top();
+    float width = region.boundingRect().width();
+    float height = region.boundingRect().height();
+
+    QString months[] = {
+        QObject::tr("Jan"), QObject::tr("Feb"), QObject::tr("Mar"), QObject::tr("Apr"), QObject::tr("May"), QObject::tr("Jun"),
+        QObject::tr("Jul"), QObject::tr("Aug"), QObject::tr("Sep"), QObject::tr("Oct"), QObject::tr("Nov"), QObject::tr("Dec")
+    };
+    qint64 minx;
+    qint64 maxx;
+
+    minx = graph.min_x;
+    maxx = graph.max_x;
+
+    QDateTime date2 = QDateTime::fromMSecsSinceEpoch(minx);
+    QDateTime enddate2 = QDateTime::fromMSecsSinceEpoch(maxx);
+
+    QDate date = date2.date();
+//    QDate enddate = enddate2.date();
+
+    int days = ceil(double(maxx - minx) / 86400000.0);
+
+    float barw = width / float(days);
+
+    qint64 xx = maxx - minx;
+
+    // shouldn't really be negative, but this is safer than an assert
+    if (xx <= 0) {
+        return;
+    }
+
+
+    float lastx = left;
+    float y1 = top;
+
+    QString fd = "Mjj 00";
+    int x,y;
+    GetTextExtent(fd, x, y);
+    float xpos = (barw / 2.0) - (float(x) / 2.0);
+
+    float lastxpos = 0;
+    QVector<QLine> lines;
+    for (int i=0; i < days; i++) {
+        if ((lastx + barw) > (left + width + 1))
+            break;
+
+        QString tmpstr = QString("%1 %2").arg(months[date.month() - 1]).arg(date.day(), 2, 10, QChar('0'));
+
+        float x1 = lastx + xpos;
+        //lines.append(QLine(lastx, top, lastx, top+6));
+        if (x1 > (lastxpos + x + 8*graph.printScaleX())) {
+            graph.renderText(tmpstr, x1, y1 + y + 8);
+            lastxpos = x1;
+            lines.append(QLine(lastx+barw/2, top, lastx+barw/2, top+6));
+        }
+        lastx = lastx + barw;
+        date = date.addDays(1);
+    }
+    painter.setPen(QPen(Qt::black,1));
+    painter.drawLines(lines);
+
+}
diff --git a/sleepyhead/Graphs/gXAxis.h b/sleepyhead/Graphs/gXAxis.h
new file mode 100644
index 0000000..44a23dc
--- /dev/null
+++ b/sleepyhead/Graphs/gXAxis.h
@@ -0,0 +1,150 @@
+/* gXAxis Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GXAXIS_H
+#define GXAXIS_H
+
+#include <QImage>
+#include <QPixmap>
+#include "Graphs/layer.h"
+
+/*! \class gXAxis
+    \brief Draws the XTicker timescales underneath graphs */
+class gXAxis: public Layer
+{
+  public:
+    static const int Margin = 30; // How much room does this take up. (Bottom margin)
+
+  public:
+    gXAxis(QColor col = Qt::black, bool fadeout = true);
+    virtual ~gXAxis();
+
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+    void SetShowMinorLines(bool b) { m_show_minor_lines = b; }
+    void SetShowMajorLines(bool b) { m_show_major_lines = b; }
+    bool ShowMinorLines() { return m_show_minor_lines; }
+    bool ShowMajorLines() { return m_show_major_lines; }
+    void SetShowMinorTicks(bool b) { m_show_minor_ticks = b; }
+    void SetShowMajorTicks(bool b) { m_show_major_ticks = b; }
+    bool ShowMinorTicks() { return m_show_minor_ticks; }
+    bool ShowMajorTicks() { return m_show_major_ticks; }
+    void setUtcFix(bool b) { m_utcfix = b; }
+
+    void setRoundDays(bool b) { m_roundDays = b; }
+
+    //! \brief Returns the minimum height needed to fit
+    virtual int minimumHeight();
+
+    virtual Layer * Clone() {
+        gXAxis * xaxis = new gXAxis();
+        Layer::CloneInto(xaxis);
+        CloneInto(xaxis);
+        return xaxis;
+    }
+
+    void CloneInto(gXAxis * layer) {
+        layer->m_show_major_ticks = m_show_major_ticks;
+        layer->m_show_minor_ticks = m_show_minor_ticks;
+        layer->m_show_major_lines = m_show_major_lines;
+        layer->m_show_minor_lines = m_show_minor_lines;
+        layer->m_major_color = m_major_color;
+        layer->m_minor_color = m_minor_color;
+        layer->m_line_color = m_line_color;
+        layer->m_text_color = m_text_color;
+
+        layer->m_utcfix = m_utcfix;
+        layer->m_fadeout = m_fadeout;
+
+        layer->tz_offset = tz_offset;
+        layer->tz_hours = tz_hours;
+
+        layer->m_image = m_image;
+        layer->m_roundDays = m_roundDays;
+    }
+
+
+  protected:
+    bool m_show_major_lines;
+    bool m_show_minor_lines;
+    bool m_show_minor_ticks;
+    bool m_show_major_ticks;
+
+    bool m_utcfix;
+
+    QColor m_line_color;
+    QColor m_text_color;
+    QColor m_major_color;
+    QColor m_minor_color;
+    bool m_fadeout;
+    qint64 tz_offset;
+    float tz_hours;
+
+    QImage m_image;
+
+    bool m_roundDays;
+};
+
+class gXAxisDay: public Layer
+{
+  public:
+    static const int Margin = 30; // How much room does this take up. (Bottom margin)
+
+  public:
+    gXAxisDay(QColor col = Qt::black);
+    virtual ~gXAxisDay();
+
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+    void SetShowMinorLines(bool b) { m_show_minor_lines = b; }
+    void SetShowMajorLines(bool b) { m_show_major_lines = b; }
+    bool ShowMinorLines() { return m_show_minor_lines; }
+    bool ShowMajorLines() { return m_show_major_lines; }
+    void SetShowMinorTicks(bool b) { m_show_minor_ticks = b; }
+    void SetShowMajorTicks(bool b) { m_show_major_ticks = b; }
+    bool ShowMinorTicks() { return m_show_minor_ticks; }
+    bool ShowMajorTicks() { return m_show_major_ticks; }
+
+    //! \brief Returns the minimum height needed to fit
+    virtual int minimumHeight();
+
+    virtual Layer * Clone() {
+        gXAxisDay * xaxis = new gXAxisDay();
+        Layer::CloneInto(xaxis);
+        CloneInto(xaxis);
+        return xaxis;
+    }
+
+    void CloneInto(gXAxisDay * layer) {
+        layer->m_show_major_ticks = m_show_major_ticks;
+        layer->m_show_minor_ticks = m_show_minor_ticks;
+        layer->m_show_major_lines = m_show_major_lines;
+        layer->m_show_minor_lines = m_show_minor_lines;
+        layer->m_major_color = m_major_color;
+        layer->m_minor_color = m_minor_color;
+        layer->m_line_color = m_line_color;
+        layer->m_text_color = m_text_color;
+
+        layer->m_image = m_image;
+    }
+
+
+  protected:
+    bool m_show_major_lines;
+    bool m_show_minor_lines;
+    bool m_show_minor_ticks;
+    bool m_show_major_ticks;
+
+    QColor m_line_color;
+    QColor m_text_color;
+    QColor m_major_color;
+    QColor m_minor_color;
+
+    QImage m_image;
+
+};
+
+#endif // GXAXIS_H
diff --git a/sleepyhead/Graphs/gYAxis.cpp b/sleepyhead/Graphs/gYAxis.cpp
new file mode 100644
index 0000000..39f0e09
--- /dev/null
+++ b/sleepyhead/Graphs/gYAxis.cpp
@@ -0,0 +1,344 @@
+/* gYAxis Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "Graphs/gYAxis.h"
+
+#include <QDebug>
+
+#include <math.h>
+
+#include "Graphs/glcommon.h"
+#include "Graphs/gGraph.h"
+#include "Graphs/gGraphView.h"
+#include "SleepLib/profiles.h"
+
+gXGrid::gXGrid(QColor col)
+    : Layer(NoChannel)
+{
+    Q_UNUSED(col)
+
+    m_major_color = QColor(180, 180, 180, 64);
+    //m_major_color=QColor(180,180,180,92);
+    m_minor_color = QColor(230, 230, 230, 64);
+    m_show_major_lines = true;
+    m_show_minor_lines = true;
+}
+gXGrid::~gXGrid()
+{
+}
+void gXGrid::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    int left = region.boundingRect().left();
+    int top = region.boundingRect().top()+1;
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    int x, y;
+
+    EventDataType miny = w.physMinY();
+    EventDataType maxy = w.physMaxY();
+
+    w.roundY(miny, maxy);
+
+    //EventDataType dy=maxy-miny;
+
+    if (height < 0) { return; }
+
+    static QString fd = "0";
+    GetTextExtent(fd, x, y);
+
+    double max_yticks = round(height / (y + 14.0*w.printScaleY())); // plus spacing between lines
+    //double yt=1/max_yticks;
+
+    double mxy = maxy; //MAX(fabs(maxy), fabs(miny));
+    double mny = miny;
+
+//    if (miny < 0) {
+//        mny = -mxy;
+//    }
+
+    double rxy = mxy - mny;
+
+    int myt;
+    bool fnd = false;
+
+    for (myt = max_yticks; myt >= 1; myt--) {
+        float v = rxy / float(myt);
+
+        if (float(v) == int(v)) {
+            fnd = true;
+            break;
+        }
+    }
+
+    if (fnd) { max_yticks = myt; }
+    else {
+        max_yticks = 2;
+    }
+
+    double yt = 1 / max_yticks;
+
+    double ymult = height / rxy;
+
+    double min_ytick = rxy * yt;
+
+    float ty, h;
+
+    if (min_ytick <= 0) {
+        qDebug() << "min_ytick error in gXGrid::paint() in" << w.title();
+        return;
+    }
+
+    if (min_ytick >= 1000000) {
+        min_ytick = 100;
+    }
+    QVector<QLine> majorlines;
+    QVector<QLine> minorlines;
+
+    for (double i = miny; i <= maxy + min_ytick - 0.00001; i += min_ytick) {
+        ty = (i - miny) * ymult;
+        h = top + height - ty;
+
+        if (m_show_major_lines && (i > miny)) {
+            majorlines.append(QLine(left, h, left + width, h));
+        }
+
+        double z = (min_ytick / 4) * ymult;
+        double g = h;
+
+        for (int i = 0; i < 3; i++) {
+            g += z;
+
+            if (g > top + height) { break; }
+
+            //if (vertcnt>=maxverts) {
+            //  qWarning() << "vertarray bounds exceeded in gYAxis for " << w.title() << "graph" << "MinY =" <<miny << "MaxY =" << maxy << "min_ytick=" <<min_ytick;
+            //                break;
+            //          }
+            if (m_show_minor_lines) {// && (i > miny)) {
+                minorlines.append(QLine(left, g, left + width, g));
+            }
+        }
+    }
+    painter.setPen(QPen(m_major_color,1));
+    painter.drawLines(majorlines);
+    painter.setPen(QPen(m_minor_color,1));
+    painter.drawLines(minorlines);
+    w.graphView()->lines_drawn_this_frame += majorlines.size() + minorlines.size();
+}
+
+
+
+
+gYAxis::gYAxis(QColor col)
+    : Layer(NoChannel)
+{
+    m_line_color = col;
+    m_text_color = col;
+    m_yaxis_scale = 1;
+}
+gYAxis::~gYAxis()
+{
+}
+
+int gYAxis::minimumWidth()
+{
+    return Margin;
+}
+
+void gYAxis::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+    int left = region.boundingRect().left();
+    int top = region.boundingRect().top()+1;
+    int width = region.boundingRect().width();
+    int height = region.boundingRect().height();
+
+    int x, y; //,yh=0;
+
+    //Todo: clean this up as there is a lot of duplicate code between the sections
+
+    if (0) {
+    } else {
+        if (height < 0) { return; }
+
+        if (height > 4000) { return; }
+
+        int labelW = 0;
+
+
+        EventDataType miny = w.physMinY();
+        EventDataType maxy = w.physMaxY();
+
+        w.roundY(miny, maxy);
+
+        EventDataType dy = maxy - miny;
+
+        static QString fd = "0";
+        GetTextExtent(fd, x, y);
+
+#ifdef DEBUG_LAYOUT
+        painter.setPen(Qt::green);
+        painter.drawLine(0,top,100,top);
+#endif
+
+        double max_yticks = round(height / (y + 14.0)); // plus spacing between lines
+
+        double mxy = maxy; // MAX(fabs(maxy), fabs(miny));
+        double mny = miny;
+
+        if (miny < 0) {
+//            mny = -mxy;
+        }
+
+        double rxy = mxy - mny;
+
+        int myt;
+        bool fnd = false;
+
+        for (myt = max_yticks; myt > 2; myt--) {
+            float v = rxy / float(myt);
+
+            if (qAbs(v - int(v)) < 0.000001) {
+                fnd = true;
+                break;
+            }
+        }
+
+        if (fnd) { max_yticks = myt; }
+
+        double yt = 1 / max_yticks;
+
+        double ymult = height / rxy;
+
+        double min_ytick = rxy * yt;
+
+
+        //if (dy>5) {
+        //    min_ytick=round(min_ytick);
+        //} else {
+
+        //}
+
+        float ty, h;
+
+        if (min_ytick <= 0) {
+            qDebug() << "min_ytick error in gYAxis::paint() in" << w.title();
+            return;
+        }
+
+        if (min_ytick >= 1000000) {
+            min_ytick = 100;
+        }
+
+        QVector<QLine> ticks;
+
+        float shorttick = 4.0 * w.printScaleX();
+        for (double i = miny; i <= maxy + min_ytick - 0.00001; i += min_ytick) {
+            ty = (i - miny) * ymult;
+
+            if (dy < 5) {
+                fd = Format(i * m_yaxis_scale, 2);
+            } else {
+                fd = Format(i * m_yaxis_scale, 1);
+            }
+
+            GetTextExtent(fd, x, y); // performance bottleneck..
+
+            if (x > labelW) { labelW = x; }
+
+            h = top + height - ty;
+
+            if (h < top) { continue; }
+
+            w.renderText(fd, left + width - shorttick*2 - x, (h + (y / 2.0)), 0, m_text_color, defaultfont);
+
+            ticks.append(QLine(left + width - shorttick, h, left + width, h));
+
+            double z = (min_ytick / 4) * ymult;
+            double g = h;
+
+            for (int i = 0; i < 3; i++) {
+                g += z;
+
+                if (g > top + height) { break; }
+
+                ticks.append(QLine(left + width - shorttick/2, g, left + width, g));
+            }
+        }
+        painter.setPen(m_line_color);
+        painter.drawLines(ticks);
+        w.graphView()->lines_drawn_this_frame += ticks.size();
+
+    }
+}
+const QString gYAxis::Format(EventDataType v, int dp)
+{
+    return QString::number(v, 'f', dp);
+}
+
+bool gYAxis::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+    if (!p_profile->appearance->graphTooltips()) {
+        return false;
+    }
+
+    graph->timedRedraw(0);
+
+    int x = event->x();
+    int y = event->y();
+
+    if (!graph->units().isEmpty()) {
+        graph->ToolTip(graph->units(), x+10, y+10, TT_AlignLeft);
+        //   graph->redraw();
+    }
+
+    return false;
+}
+
+bool gYAxis::mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph)
+{
+    if (graph) {
+        //        int x=event->x();
+        //        int y=event->y();
+        short z = (graph->zoomY() + 1) % gGraph::maxZoomY;
+        graph->setZoomY(z);
+        qDebug() << "Mouse double clicked for" << graph->name() << z;
+    }
+
+    Q_UNUSED(event);
+    return false;
+}
+
+const QString gYAxisTime::Format(EventDataType v, int dp)
+{
+    int h = int(v) % 24;
+    int m = int(v * 60) % 60;
+    int s = int(v * 3600) % 60;
+
+    char pm[3] = {"pm"};
+
+    if (show_12hr) {
+
+        h >= 12 ? pm[0] = 'a' : pm[0] = 'p';
+        h %= 12;
+
+        if (h == 0) { h = 12; }
+    } else {
+        pm[0] = 0;
+    }
+
+    if (dp > 2) { return QString().sprintf("%02i:%02i:%02i%s", h, m, s, pm); }
+
+    return QString().sprintf("%i:%02i%s", h, m, pm);
+}
+
+const QString gYAxisWeight::Format(EventDataType v, int dp)
+{
+    Q_UNUSED(dp)
+    return weightString(v, m_unitsystem);
+}
diff --git a/sleepyhead/Graphs/gYAxis.h b/sleepyhead/Graphs/gYAxis.h
new file mode 100644
index 0000000..91ad04a
--- /dev/null
+++ b/sleepyhead/Graphs/gYAxis.h
@@ -0,0 +1,196 @@
+/* gYAxis Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GYAXIS_H
+#define GYAXIS_H
+
+#include <QImage>
+#include "Graphs/layer.h"
+
+/*! \class gXGrid
+    \brief Draws the horizintal major/minor grids over graphs
+   */
+class gXGrid: public Layer
+{
+  public:
+    //! \brief Constructs an gXGrid object with default settings, and col for line colour.
+    gXGrid(QColor col = QColor("black"));
+    virtual ~gXGrid();
+
+    //! \brief Draw the horizontal lines by adding the to the Vertex GLbuffers
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+    //! \brief set the visibility status of Major lines
+    void setShowMinorLines(bool b) { m_show_minor_lines = b; }
+
+    //! \brief set the visibility status of Minor lines
+    void setShowMajorLines(bool b) { m_show_major_lines = b; }
+
+    //! \brief Returns the visibility status of minor lines
+    bool showMinorLines() { return m_show_minor_lines; }
+
+    //! \brief Returns the visibility status of Major lines
+    bool showMajorLines() { return m_show_major_lines; }
+
+    virtual Layer * Clone() {
+        gXGrid * grid = new gXGrid();
+        Layer::CloneInto(grid);
+        CloneInto(grid);
+        return grid;
+    }
+
+    void CloneInto(gXGrid * layer) {
+        layer->m_show_major_lines = m_show_major_lines;
+        layer->m_show_minor_lines = m_show_minor_lines;
+        layer->m_major_color = m_major_color;
+        layer->m_minor_color = m_minor_color;
+    }
+
+protected:
+    bool m_show_major_lines;
+    bool m_show_minor_lines;
+    QColor m_major_color;
+    QColor m_minor_color;
+};
+
+/*! \class gYAxis
+   \brief Draws the YAxis tick markers, and numeric labels
+   */
+class gYAxis: public Layer
+{
+  public:
+    //! \brief Left Margin space in pixels
+    static const int Margin = 60;
+
+  public:
+    //! \brief Construct a gYAxis object, with QColor col for tickers & text
+    gYAxis(QColor col = Qt::black);
+    virtual ~gYAxis();
+
+    //! \brief Draw the horizontal tickers display
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+    //! \brief Sets the visibility status of minor ticks
+    void SetShowMinorTicks(bool b) { m_show_minor_ticks = b; }
+
+    //! \brief Sets the visibility status of Major ticks
+    void SetShowMajorTicks(bool b) { m_show_major_ticks = b; }
+
+    //! \brief Returns the visibility status of Minor ticks
+    bool ShowMinorTicks() { return m_show_minor_ticks; }
+
+    //! \brief Returns the visibility status of Major ticks
+    bool ShowMajorTicks() { return m_show_major_ticks; }
+
+    //! \brief Formats the ticker value.. Override to implement other types
+    virtual const QString Format(EventDataType v, int dp);
+
+    virtual int minimumWidth();
+
+    //! \brief Set the scale of the Y axis values.. Values can be multiplied by this to convert formats
+    void SetScale(float f) { m_yaxis_scale = f; }
+
+    //! \brief Returns the scale of the Y axis values..
+    //         Values can be multiplied by this to convert formats
+    float Scale() { return m_yaxis_scale; }
+
+  protected:
+    bool m_show_minor_ticks;
+    bool m_show_major_ticks;
+    float m_yaxis_scale;
+
+    QColor m_line_color;
+    QColor m_text_color;
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+    virtual bool mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph);
+
+    QImage m_image;
+
+    virtual Layer * Clone() {
+        gYAxis * yaxis = new gYAxis();
+        Layer::CloneInto(yaxis);
+        CloneInto(yaxis);
+        return yaxis;
+    }
+
+    void CloneInto(gYAxis * layer) {
+        layer->m_show_major_ticks = m_show_major_ticks;
+        layer->m_show_minor_ticks = m_show_minor_ticks;
+        layer->m_line_color = m_line_color;
+        layer->m_text_color = m_text_color;
+        layer->m_image = m_image;
+    }
+
+};
+
+/*! \class gYAxisTime
+   \brief Draws the YAxis tick markers, and labels in time format
+   */
+class gYAxisTime: public gYAxis
+{
+  public:
+    //! \brief Construct a gYAxisTime object, with QColor col for tickers & times
+    gYAxisTime(bool hr12 = true, QColor col = Qt::black) : gYAxis(col), show_12hr(hr12) {}
+    virtual ~gYAxisTime() {}
+  protected:
+    //! \brief Overrides gYAxis Format to display Time format
+    virtual const QString Format(EventDataType v, int dp);
+
+    //! \brief Whether to format as 12 or 24 hour times
+    bool show_12hr;
+
+    virtual Layer * Clone() {
+        gYAxisTime * yaxis = new gYAxisTime();
+        Layer::CloneInto(yaxis);
+        CloneInto(yaxis);
+        return yaxis;
+    }
+
+    void CloneInto(gYAxisTime * layer) {
+        gYAxis::CloneInto(layer);
+        layer->show_12hr = show_12hr;
+    }
+
+};
+
+
+/*! \class gYAxisWeight
+   \brief Draws the YAxis tick markers, and labels in weight format
+   */
+class gYAxisWeight: public gYAxis
+{
+  public:
+    //! \brief Construct a gYAxisWeight object, with QColor col for tickers & weight values
+    gYAxisWeight(UnitSystem us = US_Metric, QColor col = Qt::black) : gYAxis(col), m_unitsystem(us) {}
+    virtual ~gYAxisWeight() {}
+
+    //! \brief Returns the current UnitSystem displayed (eg, US_Metric (the rest of the world), US_Archiac (American) )
+    UnitSystem unitSystem() { return m_unitsystem; }
+
+    //! \brief Set the unit system displayed by this YTicker
+    void setUnitSystem(UnitSystem us) { m_unitsystem = us; }
+  protected:
+    //! \brief Overrides gYAxis Format to display Time format
+    virtual const QString Format(EventDataType v, int dp);
+    UnitSystem m_unitsystem;
+
+    virtual Layer * Clone() {
+        gYAxisWeight * yaxis = new gYAxisWeight();
+        Layer::CloneInto(yaxis);
+        CloneInto(yaxis);
+        return yaxis;
+    }
+
+    void CloneInto(gYAxisWeight * layer) {
+        gYAxis::CloneInto(layer);
+        layer->m_unitsystem = m_unitsystem;
+    }
+};
+
+
+#endif // GYAXIS_H
diff --git a/sleepyhead/Graphs/gdailysummary.cpp b/sleepyhead/Graphs/gdailysummary.cpp
new file mode 100644
index 0000000..db4e529
--- /dev/null
+++ b/sleepyhead/Graphs/gdailysummary.cpp
@@ -0,0 +1,446 @@
+/* gDailySummary Graph Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <cmath>
+#include <QFontMetrics>
+#include "gdailysummary.h"
+#include "Graphs/gGraph.h"
+#include "Graphs/gGraphView.h"
+#include "SleepLib/profiles.h"
+
+gDailySummary::gDailySummary() : Layer(NoChannel)
+{
+}
+
+void gDailySummary::SetDay(Day *day)
+{
+    QList<ChannelID> piechans;
+
+    piechans.append(CPAP_ClearAirway);
+    piechans.append(CPAP_Obstructive);
+    piechans.append(CPAP_Apnea);
+    piechans.append(CPAP_Hypopnea);
+    piechans.append(CPAP_RERA);
+    piechans.append(CPAP_FlowLimit);
+
+    pie_data.clear();
+    pie_chan.clear();
+    pie_labels.clear();
+    pie_total = 0;
+
+    m_day = day;
+    Machine * cpap = nullptr;
+    if (day) cpap = day->machine(MT_CPAP);
+
+    if (cpap) {
+
+        m_minx = m_day->first();
+        m_maxx = m_day->last();;
+
+        quint32 zchans = schema::SPAN | schema::FLAG;
+        bool show_minors = true;
+        if (p_profile->general->showUnknownFlags()) zchans |= schema::UNKNOWN;
+
+        if (show_minors) zchans |= schema::MINOR_FLAG;
+        QList<ChannelID> available = day->getSortedMachineChannels(zchans);
+
+        flag_values.clear();
+        flag_background.clear();
+        flag_foreground.clear();
+        flag_labels.clear();
+        flag_codes.clear();
+
+        EventDataType val;
+        EventDataType hours = day->hours();
+
+        int x,y;
+        flag_value_width = flag_label_width = flag_height = 0;
+        for (int i=0; i < available.size(); ++i) {
+            ChannelID code = available.at(i);
+            schema::Channel & chan = schema::channel[code];
+            QString str;
+            if (chan.type() == schema::SPAN) {
+                val = (100.0 / hours)*(day->sum(code)/3600.0);
+                str = QString("%1%").arg(val,0,'f',2);
+            } else {
+                val = day->count(code) / hours;
+                str = QString("%1").arg(val,0,'f',2);
+            }
+            flag_values.push_back(str);
+            flag_codes.push_back(code);
+            flag_background.push_back(chan.defaultColor());
+            flag_foreground.push_back((brightness(chan.defaultColor()) < 0.3) ? Qt::white : Qt::black); // pick a contrasting color
+            QString label = chan.fullname();
+
+            if (piechans.contains(code)) {
+                pie_data.push_back(val);
+                pie_labels.push_back(chan.label());
+                pie_chan.append(code);
+                pie_total += val;
+            }
+
+            flag_labels.push_back(label);
+            GetTextExtent(label, x, y, defaultfont);
+
+            // Update maximum text boundaries
+            if (y > flag_height) flag_height = y;
+            if (x > flag_label_width) flag_label_width  = x;
+
+            GetTextExtent(str, x, y, defaultfont);
+            if (x > flag_value_width) flag_value_width = x;
+            if (y > flag_height) flag_height = y;
+        }
+
+        info.clear();
+        info_background.clear();
+        settings.clear();
+
+        ahi = day->calcAHI();
+
+        CPAPMode mode = (CPAPMode)(int)round(day->settings_wavg(CPAP_Mode));
+
+        info.append(QObject::tr("%1: %2").arg(STR_TR_AHI).arg(day->calcAHI(),0,'f',2));
+        info_background.append(QColor("orange"));
+
+
+        settings.append(cpap->brand()+ " " + cpap->series());
+        settings.append(cpap->model()+ " " + cpap->modelnumber());
+        settings.append(schema::channel[CPAP_Mode].option(mode));
+
+        if (mode == MODE_CPAP) {
+            EventDataType p = round(day->settings_max(CPAP_Pressure));
+            settings.append(QString("Fixed %1%2").arg(p,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+        } else if (mode == MODE_APAP) {
+            EventDataType min = round(day->settings_min(CPAP_PressureMin));
+            EventDataType max = round(day->settings_max(CPAP_PressureMax));
+            settings.append(QString("Min Pressure %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+            settings.append(QString("Max Pressure %1%2").arg(max,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+        } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+            EventDataType min = round(day->settings_min(CPAP_EPAPLo));
+            EventDataType max = round(day->settings_max(CPAP_IPAPHi));
+            EventDataType ps = round(day->settings_max(CPAP_PS));
+            settings.append(QString("Min EPAP %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+            settings.append(QString("Max IPAP %1%2").arg(max,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+            settings.append(QString("PS %1%2").arg(ps,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+        } else if (mode == MODE_BILEVEL_FIXED) {
+            EventDataType min = round(day->settings_min(CPAP_EPAP));
+            EventDataType max = round(day->settings_max(CPAP_IPAP));
+            settings.append(QString("EPAP %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+            settings.append(QString("IPAP %1%2").arg(max,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+        } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
+            EventDataType min = round(day->settings_min(CPAP_EPAPLo));
+            EventDataType max = round(day->settings_max(CPAP_IPAPHi));
+            EventDataType ps = round(day->settings_max(CPAP_PSMin));
+            EventDataType pshi = round(day->settings_max(CPAP_PSMax));
+            settings.append(QString("Min EPAP %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+            settings.append(QString("Max IPAP %1%2").arg(max,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+            settings.append(QString("PS %1-%2%3").arg(ps,0,'f',2).arg(pshi,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+        } else if (mode == MODE_ASV) {
+            EventDataType min = round(day->settings_min(CPAP_EPAP));
+            EventDataType ps = round(day->settings_max(CPAP_PSMin));
+            EventDataType pshi = round(day->settings_max(CPAP_PSMax));
+            settings.append(QString("EPAP %1%2").arg(min,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+            settings.append(QString("PS %1-%2%3").arg(ps,0,'f',2).arg(pshi,0,'f',2).arg(schema::channel[CPAP_Pressure].units()));
+        }
+        settings.append(QObject::tr("Relief: %1").arg(day->getPressureRelief()));
+
+        int secs = hours * 3600.0;
+        int h = secs / 3600;
+        int m = secs / 60 % 60;
+        int s  = secs % 60;
+        info.append(QObject::tr("Hours: %1h, %2m, %3s").arg(h).arg(m).arg(s));
+        info_background.append(QColor("light blue"));
+
+        info_width = info_height = 0;
+
+        for (int i=0; i < info.size(); ++i) {
+            GetTextExtent(info.at(i), x, y, mediumfont);
+            if (y > info_height) info_height = y;
+            if (x > info_width) info_width  = x;
+        }
+
+        m_minimum_height = flag_values.size() * flag_height;
+
+        m_empty = !(day->channelExists(CPAP_Pressure) || day->channelExists(CPAP_IPAP));
+
+
+    } else {
+        m_minx = m_maxx = 0;
+        m_miny = m_maxy = 0;
+        m_empty = true;
+
+        m_day = nullptr;
+    }
+}
+
+bool gDailySummary::isEmpty()
+{
+    return m_empty;
+}
+
+
+void gDailySummary::paint(QPainter &painter, gGraph &w, const QRegion &region)
+{
+
+    QRect rect = region.boundingRect();
+
+    int top = rect.top()-10;
+    int left = rect.left();
+    int width = rect.width();
+    int height = rect.height()+10;
+
+    // Draw bounding box
+    painter.setPen(QColor(Qt::black));
+ //   painter.drawRect(QRect(left,top,width,height),5,5);
+
+
+    QRectF rect1, rect2;
+    int size;
+
+
+//    QFontMetrics fm(*mediumfont);
+//    top += fm.height();
+//    painter.setFont(*mediumfont);
+//    size = info_values.size();
+//
+//    for (int i=0; i < size; ++i) {
+//        rect1 = QRect(0,0,200,100), rect2 = QRect(0,0,200,100);
+//        rect1 = painter.boundingRect(rect1, info_labels.at(i));
+//        w.renderText(info_labels.at(i), column, row, 0, Qt::black, mediumfont);
+
+//        rect2 = painter.boundingRect(rect2, info_values.at(i));
+//        w.renderText(info_values.at(i), column, row + rect1.height(), 0, Qt::black, mediumfont);
+//        column += qMax(rect1.width(), rect2.width()) + 15;
+//    }
+//    row += rect1.height()+rect2.height()-5;
+//    column = left + 10;
+
+    float row = top + 10;
+    float column = left+10;
+
+    painter.setFont(*mediumfont);
+
+    size = info.size();
+    float xpos = left + 10;;
+    float ypos = top + 10;
+    double maxwidth = 0 ;
+
+    for (int i=0; i< info.size(); ++i) {
+        rect1 = QRectF(xpos, ypos, 0, 0);
+        QString txt = info.at(i);
+
+        rect1 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, txt);
+        rect1.setHeight(rect1.height() * 1.25);
+
+        maxwidth = qMax(rect1.width(), maxwidth);
+        ypos += rect1.height() + 5;
+    }
+    painter.setFont(*defaultfont);
+    float tpos = ypos+5;
+    for (int i=0; i< settings.size(); ++i) {
+        rect1 = QRectF(xpos, tpos, 0, 0);
+        QString txt = settings.at(i);
+
+        rect1 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, txt);
+        rect1.setHeight(rect1.height() * 1.25);
+
+        maxwidth = qMax(rect1.width(), maxwidth);
+        tpos += rect1.height();
+    }
+
+    maxwidth *= 1.1;
+
+    QRectF rect3 = QRectF(xpos, tpos, 0, 0);
+    QString machinfo = QObject::tr("Machine Information");
+
+    rect3 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, machinfo);
+    maxwidth = qMax(rect1.width(), maxwidth);
+
+    painter.drawRect(QRect(xpos, ypos + rect3.height()+4, maxwidth, tpos-ypos));
+    ypos = top + 10;
+
+    painter.setFont(*mediumfont);
+    for (int i=0; i< info.size(); ++i) {
+        rect1 = QRectF(xpos, ypos, 0, 0);
+        QString txt = info.at(i);
+
+        rect1 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, txt);
+        rect1.setWidth(maxwidth);
+        rect1.setHeight(rect1.height() * 1.25);
+        painter.fillRect(rect1, QColor(info_background.at(i)));
+        painter.setPen(Qt::black);
+        painter.drawText(rect1, Qt::AlignCenter, txt);
+        painter.drawRoundedRect(rect1, 5, 5);
+        ypos += rect1.height() + 5;
+    }
+
+    rect3.moveTop(ypos+1);
+    rect3.setWidth(maxwidth);
+    QFont ffont = *defaultfont;
+    ffont.setBold(true);
+    painter.setFont(ffont);
+
+    painter.drawText(rect3, Qt::AlignCenter, machinfo);
+
+    painter.setFont(*defaultfont);
+    ypos += 6 + rect3.height();
+
+
+    for (int i=0; i< settings.size(); ++i) {
+        rect1 = QRectF(xpos, ypos, 0, 0);
+        QString txt = settings.at(i);
+
+        rect1 = painter.boundingRect(rect1, Qt::AlignTop || Qt::AlignLeft, txt);
+        rect1.setWidth(maxwidth);
+        rect1.setHeight(rect1.height() * 1.25);
+//        painter.fillRect(rect1, QColor("orange"));
+        painter.setPen(Qt::black);
+        painter.drawText(rect1, Qt::AlignCenter, txt);
+//        painter.drawRoundedRect(rect1, 5, 5);
+        ypos += rect1.height();
+    }
+
+
+    column += rect1.width() + 15;
+
+    size = flag_values.size();
+    int vis = 0;
+    for (int i=0; i < size; ++i) {
+        schema::Channel & chan = schema::channel[flag_codes.at(i)];
+        if (chan.enabled()) vis++;
+    }
+
+    flag_value_width = 0;
+    flag_label_width = 0;
+    flag_height = 0;
+
+    float hpl = float(height-20) / float(vis);
+    QFont font(defaultfont->family());
+    font.setPixelSize(hpl*0.75);
+
+    font.setBold(true);
+    font.setItalic(true);
+    painter.setFont(font);
+
+    for (int i=0; i < size; ++i) {
+        rect1 = QRectF(0,0,0,0), rect2 = QRectF(0,0,0,0);
+
+        rect1 = painter.boundingRect(rect1, Qt::AlignLeft | Qt::AlignTop, flag_labels.at(i));
+        rect2 = painter.boundingRect(rect2, Qt::AlignLeft | Qt::AlignTop, flag_values.at(i));
+
+        if (rect1.width() > flag_label_width) flag_label_width = rect1.width();
+        if (rect2.width() > flag_value_width) flag_value_width = rect2.width();
+        if (rect1.height() > flag_height) flag_height = rect1.height();
+        if (rect2.height() > flag_height) flag_height = rect2.height();
+
+    }
+    flag_height = hpl;
+
+
+    QRect flag_outline(column -5, row -5, (flag_value_width + flag_label_width + 20 + 4) + 10, (hpl * vis) + 10);
+    painter.setPen(QPen(Qt::gray, 1));
+    painter.drawRoundedRect(flag_outline, 5, 5);
+
+    font.setBold(false);
+    font.setItalic(false);
+    painter.setFont(font);
+
+
+    for (int i=0; i < size; ++i) {
+        schema::Channel & chan = schema::channel[flag_codes.at(i)];
+        if (!chan.enabled()) continue;
+        painter.setPen(flag_foreground.at(i));
+
+        QRectF box(column, floor(row) , (flag_value_width + flag_label_width + 20 + 4), ceil(flag_height));
+        painter.fillRect(box, QBrush(flag_background.at(i)));
+        if (box.contains(w.graphView()->currentMousePos())) {
+            w.ToolTip(chan.description(), w.graphView()->currentMousePos().x()+5, w.graphView()->currentMousePos().y(), TT_AlignLeft);
+            font.setBold(true);
+            font.setItalic(true);
+            painter.setFont(font);
+            QRect rect1 = QRect(column+2, row , flag_label_width, ceil(hpl));
+            painter.drawText(rect1, Qt::AlignVCenter, flag_labels.at(i));
+            QRect rect2 = QRect(column+2 + flag_label_width + 20, row, flag_value_width, ceil(hpl));
+            painter.drawText(rect2, Qt::AlignVCenter, flag_values.at(i));
+            font.setBold(false);
+            font.setItalic(false);
+            painter.setFont(font);
+        } else {
+            QRect rect1 = QRect(column+2, row , flag_label_width, ceil(hpl));
+            painter.drawText(rect1, Qt::AlignVCenter, flag_labels.at(i));
+            QRect rect2 = QRect(column+2 + flag_label_width + 20, row, flag_value_width, ceil(hpl));
+            painter.drawText(rect2, Qt::AlignVCenter, flag_values.at(i));
+        }
+
+        row += (flag_height);
+
+    }
+    column += 22 + flag_label_width + flag_value_width + 20;
+    row = top + 10;
+
+
+    ////////////////////////////////////////////////////////////////////////////////
+    // Pie Chart
+    ////////////////////////////////////////////////////////////////////////////////
+    painter.setRenderHint(QPainter::Antialiasing);
+    QRect pierect(column, row, height-30, height-30);
+
+    float sum = -90.0;
+
+    int slices = pie_data.size();
+    EventDataType data;
+    for (int i=0; i < slices; ++i) {
+        data = pie_data[i];
+
+        if (data == 0) { continue; }
+
+        // Setup the shiny radial gradient
+        float len = 360.0 / float(pie_total) * float(data);
+        QColor col = schema::channel[pie_chan[i]].defaultColor();
+
+        painter.setPen(QPen(col, 0));
+        QRadialGradient gradient(pierect.center(), float(pierect.width()) / 2.0, pierect.center());
+        gradient.setColorAt(0, Qt::white);
+        gradient.setColorAt(1, col);
+
+        // draw filled pie
+        painter.setBrush(gradient);
+        painter.setBackgroundMode(Qt::OpaqueMode);
+        painter.drawPie(pierect, -sum * 16.0, -len * 16.0);
+
+        // draw outline
+        painter.setBackgroundMode(Qt::TransparentMode);
+        painter.setBrush(QBrush(col,Qt::NoBrush));
+        painter.setPen(QPen(QColor(Qt::black),1.5));
+        painter.drawPie(pierect, -sum * 16.0, -len * 16.0);
+        sum += len;
+
+    }
+
+}
+
+bool gDailySummary::mousePressEvent(QMouseEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    return true;
+}
+bool gDailySummary::mouseReleaseEvent(QMouseEvent *event, gGraph *graph)
+{
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    return true;
+}
+
+bool gDailySummary::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+    graph->timedRedraw(0);
+    Q_UNUSED(event)
+    Q_UNUSED(graph)
+    return true;
+}
diff --git a/sleepyhead/Graphs/gdailysummary.h b/sleepyhead/Graphs/gdailysummary.h
new file mode 100644
index 0000000..d5e2a20
--- /dev/null
+++ b/sleepyhead/Graphs/gdailysummary.h
@@ -0,0 +1,64 @@
+/* gDailySummary Graph Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GDAILYSUMMARY_H
+#define GDAILYSUMMARY_H
+
+#include "Graphs/layer.h"
+#include "SleepLib/day.h"
+
+class gDailySummary:public Layer
+{
+public:
+    gDailySummary();
+    virtual ~gDailySummary() {}
+
+    virtual void SetDay(Day *d);
+
+    virtual bool isEmpty();
+
+    //! Draw filled rectangles behind Event Flag's, and an outlines around them all, Calls the individual paint for each gFlagLine
+    virtual void paint(QPainter &painter, gGraph &w, const QRegion &region);
+
+    virtual int minimumHeight() { return m_minimum_height; }
+    bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+    bool mousePressEvent(QMouseEvent *event, gGraph *graph);
+    bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph);
+
+protected:
+    QList<QString> flag_values;
+    QList<QString> flag_labels;
+    QList<ChannelID> flag_codes;
+    QList<QColor> flag_foreground;
+    QList<QColor> flag_background;
+
+
+    QList<ChannelID> pie_chan;
+    QList<EventDataType> pie_data;
+    QList<QString> pie_labels;
+    EventDataType pie_total;
+
+    QList<QString> settings;
+    QList<QString> info;
+    QList<QColor> info_background;
+    QList<QColor> info_foreground;
+
+    float flag_height;
+    float flag_label_width;
+    float flag_value_width;
+
+    double ahi;
+
+    int info_height;
+    int info_width;
+
+    int m_minimum_height;
+    bool m_empty;
+};
+
+#endif // GDAILYSUMMARY_H
diff --git a/sleepyhead/Graphs/glcommon.cpp b/sleepyhead/Graphs/glcommon.cpp
new file mode 100644
index 0000000..90deea0
--- /dev/null
+++ b/sleepyhead/Graphs/glcommon.cpp
@@ -0,0 +1,55 @@
+/* glcommon GL code & font stuff
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <cmath>
+#include "glcommon.h"
+
+float brightness(QColor color) {
+    return color.redF()*0.299 + color.greenF()*0.587 + color.blueF()*0.114;
+}
+
+
+QColor brighten(QColor color, float mult)
+{
+    int cr, cg, cb;
+
+    cr = color.red();
+    cg = color.green();
+    cb = color.blue();
+
+    if (cr < 64) { cr = 64; }
+
+    if (cg < 64) { cg = 64; }
+
+    if (cb < 64) { cb = 64; }
+
+    cr *= mult;
+    cg *= mult;
+    cb *= mult;
+
+    if (cr > 255) { cr = 255; }
+
+    if (cg > 255) { cg = 255; }
+
+    if (cb > 255) { cb = 255; }
+
+    return QColor(cr, cg, cb, 255);
+
+}
+
+#ifdef BUILD_WITH_MSVC
+
+#if (_MSC_VER < 1800)
+double round(double number)
+{
+    return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
+}
+#endif
+#endif
+
+
diff --git a/sleepyhead/Graphs/glcommon.h b/sleepyhead/Graphs/glcommon.h
new file mode 100644
index 0000000..ba82e79
--- /dev/null
+++ b/sleepyhead/Graphs/glcommon.h
@@ -0,0 +1,72 @@
+/* glcommon GL code & font stuff Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GLCOMMON_H
+#define GLCOMMON_H
+
+#include <QColor>
+
+#ifndef nullptr
+#define nullptr NULL
+#endif
+
+//! \brief Returns the grayscale brightness (between 0 and 1) of a color
+float brightness(QColor color);
+
+#define MIN(a,b) (((a)<(b)) ? (a) : (b));
+#define MAX(a,b) (((a)<(b)) ? (b) : (a));
+
+const QColor COLOR_Black = Qt::black;
+const QColor COLOR_LightGreen = QColor("light green");
+const QColor COLOR_DarkGreen = Qt::darkGreen;
+const QColor COLOR_Purple = QColor("purple");
+const QColor COLOR_Aqua = QColor("#40c0ff");
+const QColor COLOR_Magenta = Qt::magenta;
+const QColor COLOR_Blue = Qt::blue;
+const QColor COLOR_LightBlue = QColor("light blue");
+const QColor COLOR_Gray = Qt::gray;
+const QColor COLOR_LightGray = Qt::lightGray;
+const QColor COLOR_DarkGray = Qt::darkGray;
+const QColor COLOR_Cyan = Qt::cyan;
+const QColor COLOR_DarkCyan = Qt::darkCyan;
+const QColor COLOR_DarkBlue = Qt::darkBlue;
+const QColor COLOR_DarkMagenta = Qt::darkMagenta;
+const QColor COLOR_Gold = QColor("gold");
+const QColor COLOR_White = Qt::white;
+const QColor COLOR_Red = Qt::red;
+const QColor COLOR_Pink = QColor("pink");
+const QColor COLOR_DarkRed = Qt::darkRed;
+const QColor COLOR_Yellow = Qt::yellow;
+const QColor COLOR_DarkYellow = Qt::darkYellow;
+const QColor COLOR_Orange = QColor("orange");
+const QColor COLOR_Green = Qt::green;
+const QColor COLOR_Brown = QColor("brown");
+
+const QColor COLOR_Text = Qt::black;
+const QColor COLOR_Outline = Qt::black;
+
+const QColor COLOR_ALT_BG1 = QColor(0xc8, 0xff, 0xc8, 0x7f); // Alternating Background Color 1 (Event Flags)
+const QColor COLOR_ALT_BG2 = COLOR_White;                    // Alternating Background Color 2 (Event Flags)
+
+
+QColor brighten(QColor color, float mult = 2.0);
+
+const int max_history = 50;
+
+#ifndef M_PI
+const double M_PI = 3.141592653589793;
+#endif
+
+#ifdef BUILD_WITH_MSVC
+// Visual C++ earlier than 2013 doesn't have round in it's maths header..
+#if (_MSC_VER < 1800)
+double round(double number);
+#endif
+#endif
+
+#endif // GLCOMMON_H
diff --git a/sleepyhead/Graphs/graphdata.h b/sleepyhead/Graphs/graphdata.h
new file mode 100644
index 0000000..1b3f1e4
--- /dev/null
+++ b/sleepyhead/Graphs/graphdata.h
@@ -0,0 +1,122 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * gGraphData Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GRAPHDATA_H
+#define GRAPHDATA_H
+
+#include "graphlayer.h"
+#include "SleepLib/day.h"
+#include <list>
+using namespace std;
+/*enum gDataType { gDT_Point, gDT_Point3D, gDT_Stacked, gDT_Segmented };
+
+class gLayer;
+
+class gGraphData
+{
+public:
+    gGraphData(int mp,gDataType t=gDT_Point);
+    virtual ~gGraphData();
+
+    virtual void Reload(Day *day=nullptr) { day=day; }
+
+    virtual void Update(Day *day=nullptr);
+    //inline wxRealPoint & operator [](int i) { return vpoint[seg][i]; }
+    //inline vector<double> & Vec(int i) { return yaxis[i]; }
+
+    //virtual inline const int & NP(int i) { return vnp[i]; }
+    //virtual inline const int & MP(int i) { return vsize[i]; }
+    inline const gDataType & Type() { return type; }
+    virtual double CalcAverage()=0;
+    virtual double CalcMinY()=0;
+    virtual double CalcMaxY()=0;
+
+
+    virtual inline double MaxX() { return max_x; }
+    virtual inline double MinX() { return min_x; }
+    virtual inline double MaxY() { return max_y; }
+    virtual inline double MinY() { return min_y; }
+    virtual inline void SetMaxX(double v) { max_x=v; if (max_x>real_max_x) max_x=real_max_x; }
+    virtual inline void SetMinX(double v) { min_x=v; if (min_x<real_min_x) min_x=real_min_x; }
+    virtual inline void SetMaxY(double v) { max_y=v; if (max_y>real_max_y) max_y=real_max_y; }
+    virtual inline void SetMinY(double v) { min_y=v; if (min_y<real_min_y) min_y=real_min_y; }
+    virtual inline double RealMaxX() { return real_max_x; }
+    virtual inline double RealMinX() { return real_min_x; }
+    virtual inline double RealMaxY() { return real_max_y; }
+    virtual inline double RealMinY() { return real_min_y; }
+
+    virtual inline void SetRealMaxX(double v) { real_max_x=v; }
+    virtual inline void SetRealMinX(double v) { real_min_x=v; }
+    virtual inline void SetRealMaxY(double v) { real_max_y=v;  }
+    virtual inline void SetRealMinY(double v) { real_min_y=v; }
+
+    virtual inline void ForceMinY(double v) { force_min_y=v; }
+    virtual inline void ForceMaxY(double v) { force_max_y=v; }
+
+    inline void ResetX() { min_x=real_min_x; max_x=real_max_x; }
+    inline void ResetY() { min_y=real_min_y; max_y=real_max_y; }
+
+    virtual inline int VC() { return vc; }
+    void SetVC(int v) { vc=v; }
+
+    vector<int> np;
+    vector<int> maxsize;
+    bool IsReady() { return m_ready; }
+    void SetReady(bool b) { m_ready=b; }
+    bool isEmpty();
+
+    void AddLayer(gLayer *g);
+protected:
+    virtual void AddSegment(int max_points) { max_points=max_points; }
+
+    double real_min_x, real_max_x, real_min_y, real_max_y;
+    double min_x, max_x, min_y, max_y;
+
+    double force_min_y,force_max_y;
+
+    int vc;
+    gDataType type;
+    int max_points;
+    bool m_ready;
+
+    list<gLayer *> notify_layers;
+};
+
+class QPointD
+{
+public:
+    QPointD() {};
+    QPointD(double _x,double _y):X(_x),Y(_y) {};
+    //QPointD(const QPointD & ref):X(ref.X),Y(ref.Y) {};
+
+    double x() { return X; };
+    double y() { return Y; };
+    void setX(double v) { X=v; };
+    void setY(double v) { Y=v; };
+protected:
+    double X,Y;
+};
+
+class gPointData:public gGraphData
+{
+public:
+    gPointData(int mp);
+    virtual ~gPointData();
+    virtual void Reload(Day *day=nullptr){ day=day; };
+    virtual void AddSegment(int max_points);
+    virtual double CalcAverage();
+    virtual double CalcMinY();
+    virtual double CalcMaxY();
+
+    vector<QPointD *> point;
+};
+*/
+#endif // GRAPHDATA_H
diff --git a/sleepyhead/Graphs/graphdata_custom.h b/sleepyhead/Graphs/graphdata_custom.h
new file mode 100644
index 0000000..b660c9c
--- /dev/null
+++ b/sleepyhead/Graphs/graphdata_custom.h
@@ -0,0 +1,138 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * Custom graph data Headers
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+/*#ifndef GRAPHDATA_CUSTOM_H
+#define GRAPHDATA_CUSTOM_H
+
+#include <QDateTime>
+#include "SleepLib/profiles.h"
+#include "SleepLib/day.h"
+#include "SleepLib/machine_common.h"
+#include "graphdata.h"
+
+
+class FlagData:public gPointData
+{
+public:
+    FlagData(MachineCode _code,int _field=-1,int _offset=-1);
+    virtual ~FlagData();
+    virtual void Reload(Day *day=nullptr);
+protected:
+    MachineCode code;
+    int field;
+    int offset;
+};
+
+class TAPData:public gPointData
+{
+public:
+    TAPData(MachineCode _code);
+    virtual ~TAPData();
+    virtual void Reload(Day *day=nullptr);
+
+    static const int max_slots=4096;
+    double pTime[max_slots];
+    MachineCode code;
+
+};
+
+class WaveData:public gPointData
+{
+public:
+    WaveData(MachineCode _code,int _size=1000000);
+    virtual ~WaveData();
+    virtual void Reload(Day *day=nullptr);
+protected:
+    MachineCode code;
+};
+
+class EventData:public gPointData
+{
+public:
+    EventData(MachineCode _code,int _field=0,int _size=250000,bool _skipzero=false);
+    virtual ~EventData();
+    virtual void Reload(Day *day=nullptr);
+protected:
+    MachineCode code;
+    int field;
+    bool skipzero;
+};
+
+
+class AHIData:public gPointData
+{
+public:
+    AHIData();
+    virtual ~AHIData();
+    virtual void Reload(Day *day=nullptr);
+};
+
+class HistoryData:public gPointData
+{
+public:
+    HistoryData(Profile * _profile,int mpts=2048);
+    virtual ~HistoryData();
+
+    void SetProfile(Profile *_profile) { profile=_profile; Reload(); }
+    Profile * GetProfile() { return profile; }
+    //double GetAverage();
+
+    virtual double Calc(Day *day);
+    virtual void Reload(Day *day=nullptr);
+    virtual void ResetDateRange();
+    virtual void SetDateRange(QDate start,QDate end);
+  //  virtual void Reload(Machine *machine=nullptr);
+protected:
+    Profile * profile;
+};
+
+class SessionTimes:public HistoryData
+{
+public:
+    SessionTimes(Profile * _profile);
+    virtual ~SessionTimes();
+
+    //void SetProfile(Profile *_profile) { profile=_profile; Reload(); }
+    //Profile * GetProfile() { return profile; }
+    //virtual double GetAverage(); // length??
+    virtual void Reload(Day *day=nullptr);
+    //virtual void ResetDateRange();
+    //virtual void SetDateRange(QDate start,QDate end);
+
+protected:
+   // Profile * profile;
+};
+
+class HistoryCodeData:public HistoryData
+{
+public:
+    HistoryCodeData(Profile *_profile,MachineCode _code);
+    virtual ~HistoryCodeData();
+    virtual double Calc(Day *day);
+protected:
+    MachineCode code;
+};
+
+
+enum T_UHD { UHD_Bedtime, UHD_Waketime, UHD_Hours };
+class UsageHistoryData:public HistoryData
+{
+public:
+    UsageHistoryData(Profile *_profile,T_UHD _uhd);
+    virtual ~UsageHistoryData();
+    virtual double Calc(Day *day);
+protected:
+    T_UHD uhd;
+};
+
+
+#endif // GRAPHDATA_CUSTOM_H
+*/
diff --git a/sleepyhead/Graphs/gspacer.cpp b/sleepyhead/Graphs/gspacer.cpp
new file mode 100644
index 0000000..5ef652b
--- /dev/null
+++ b/sleepyhead/Graphs/gspacer.cpp
@@ -0,0 +1,15 @@
+/* graph spacer Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "gspacer.h"
+
+gSpacer::gSpacer(int space)
+    : Layer(NoChannel)
+{
+    m_space = space;
+}
diff --git a/sleepyhead/Graphs/gspacer.h b/sleepyhead/Graphs/gspacer.h
new file mode 100644
index 0000000..5efe460
--- /dev/null
+++ b/sleepyhead/Graphs/gspacer.h
@@ -0,0 +1,33 @@
+/* graph spacer Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef GSPACER_H
+#define GSPACER_H
+
+#include "gGraphView.h"
+
+
+/*! \class gSpacer
+    \brief A dummy graph spacer layer object
+   */
+class gSpacer: public Layer
+{
+  public:
+    gSpacer(int space = 20); // orientation?
+    virtual void paint(QPainter &painter, gGraph &g, const QRegion &region) {
+        Q_UNUSED(painter);
+        Q_UNUSED(g);
+        Q_UNUSED(region);
+    }
+    int space() { return m_space; }
+
+  protected:
+    int m_space;
+};
+
+#endif // GSPACER_H
diff --git a/sleepyhead/Graphs/layer.cpp b/sleepyhead/Graphs/layer.cpp
new file mode 100644
index 0000000..90bcfd2
--- /dev/null
+++ b/sleepyhead/Graphs/layer.cpp
@@ -0,0 +1,293 @@
+/* Graph Layer Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "Graphs/layer.h"
+
+Layer::~Layer()
+{
+//    for (int i = 0; i < mgl_buffers.size(); i++) {
+//        delete mgl_buffers[i];
+//    }
+
+//    for (int i = 0; i < mv_buffers.size(); i++) {
+//        delete mv_buffers[i];
+//    }
+}
+
+//void Layer::drawGLBuf(float linesize)
+//{
+//    int type;
+//    float size;
+
+//    if (!m_visible) { return; }
+
+//    GLBuffer *buf;
+//    gVertexBuffer *vb;
+
+//    for (int i = 0; i < mv_buffers.size(); i++) {
+//        vb = mv_buffers[i];
+//        size = vb->size();
+//        type = vb->type();
+
+//        if ((linesize > size) && ((type == GL_LINES) || (type == GL_LINE_LOOP))) {
+//            vb->setSize(linesize);
+//        }
+
+//        vb->draw();
+//        vb->setSize(size);
+//    }
+
+//    for (int i = 0; i < mgl_buffers.size(); i++) {
+//        buf = mgl_buffers[i];
+//        size = buf->size();
+//        type = buf->type();
+
+//        if ((linesize > size) && ((type == GL_LINES) || (type == GL_LINE_LOOP))) {
+//            buf->setSize(linesize);
+//        }
+
+//        buf->draw();
+//        //if ((linesize>size) && ((type==GL_LINES) || (type==GL_LINE_LOOP))) {
+//        buf->setSize(size);
+//        //}
+//    }
+//}
+
+void Layer::CloneInto(Layer * layer)
+{
+    layer->m_refcount = m_refcount;
+    layer->m_day = m_day;
+    layer->m_visible = m_visible;
+    layer->m_movable = m_movable;
+    layer->m_minx = m_minx;
+    layer->m_maxx = m_maxx;
+    layer->m_miny = m_miny;
+    layer->m_maxy = m_maxy;
+    layer->m_physmaxy = m_physmaxy;
+    layer->m_physminy = m_physminy;
+    layer->m_code = m_code;
+    layer->m_width = m_width;
+    layer->m_height = m_height;
+    layer->m_X = m_X;
+    layer->m_Y = m_Y;
+    layer->m_order = m_order;
+    layer->m_position = m_position;
+    layer->m_rect = m_rect;
+    layer->m_mouseover = m_mouseover;
+    layer->m_recalculating = m_recalculating;
+    layer->m_layertype = m_layertype;
+}
+
+void Layer::SetDay(Day *d)
+{
+    m_day = d;
+    if (d) {
+        m_minx = d->first(m_code);
+        m_maxx = d->last(m_code);
+        m_miny = d->Min(m_code);
+        m_maxy = d->Max(m_code);
+    } else { m_day = nullptr; }
+
+}
+
+bool Layer::isEmpty()
+{
+    //if (m_day && (m_day->count(m_code)>0))
+    if (m_day && (m_day->channelExists(m_code))) {
+        return false;
+    }
+
+    return true;
+}
+void Layer::setLayout(LayerPosition position, short width, short height, short order)
+{
+    m_position = position;
+    m_width = width;
+    m_height = height;
+    m_order = order;
+}
+
+LayerGroup::~LayerGroup()
+{
+    for (int i = 0; i < layers.size(); i++) {
+        delete layers[i];
+    }
+}
+bool LayerGroup::isEmpty()
+{
+    if (!m_day) {
+        return true;
+    }
+
+    bool empty = true;
+
+    for (int i = 0; i < layers.size(); i++) {
+        if (layers[i]->isEmpty()) {
+            empty = false;
+            break;
+        }
+    }
+
+    return empty;
+}
+//void LayerGroup::drawGLBuf(float linesize)
+//{
+//    Layer::drawGLBuf(linesize);
+
+//    for (int i = 0; i < layers.size(); i++) {
+//        layers[i]->drawGLBuf(linesize);
+//    }
+//}
+
+void LayerGroup::SetDay(Day *d)
+{
+    m_day = d;
+
+    for (int i = 0; i < layers.size(); i++) {
+        layers[i]->SetDay(d);
+    }
+}
+
+void LayerGroup::AddLayer(Layer *l)
+{
+    layers.push_back(l);
+    l->addref();
+}
+
+qint64 LayerGroup::Minx()
+{
+    bool first = true;
+    qint64 m = 0, t;
+
+    for (int i = 0; i < layers.size(); i++)  {
+        t = layers[i]->Minx();
+
+        if (!t) { continue; }
+
+        if (first) {
+            m = t;
+            first = false;
+        } else if (m > t) { m = t; }
+    }
+
+    return m;
+}
+qint64 LayerGroup::Maxx()
+{
+    bool first = true;
+    qint64 m = 0, t;
+
+    for (int i = 0; i < layers.size(); i++)  {
+        t = layers[i]->Maxx();
+
+        if (!t) { continue; }
+
+        if (first) {
+            m = t;
+            first = false;
+        } else if (m < t) { m = t; }
+    }
+
+    return m;
+}
+
+EventDataType LayerGroup::Miny()
+{
+    bool first = true;
+    EventDataType m = 0, t;
+
+    for (int i = 0; i < layers.size(); i++)  {
+        t = layers[i]->Miny();
+
+        if (t == layers[i]->Maxy()) { continue; }
+
+        if (first) {
+            m = t;
+            first = false;
+        } else {
+            if (m > t) { m = t; }
+        }
+    }
+
+    return m;
+}
+
+EventDataType LayerGroup::Maxy()
+{
+    bool first = true;
+    EventDataType m = 0, t;
+
+    for (int i = 0; i < layers.size(); i++)  {
+        t = layers[i]->Maxy();
+
+        if (t == layers[i]->Miny()) { continue; }
+
+        if (first) {
+            m = t;
+            first = false;
+        } else if (m < t) { m = t; }
+    }
+
+    return m;
+}
+
+//! \brief Mouse wheel moved somewhere over this layer
+bool LayerGroup::wheelEvent(QWheelEvent *event, gGraph *graph)
+{
+    for (int i = 0; i < layers.size(); i++)
+        if (layers[i]->wheelEvent(event, graph)) {
+            return true;
+        }
+
+    return false;
+}
+
+//! \brief Mouse moved somewhere over this layer
+bool LayerGroup::mouseMoveEvent(QMouseEvent *event, gGraph *graph)
+{
+    for (int i = 0; i < layers.size(); i++)
+        if (layers[i]->mouseMoveEvent(event, graph)) { return true; }
+
+    return false;
+}
+
+//! \brief Mouse left or right button pressed somewhere on this layer
+bool LayerGroup::mousePressEvent(QMouseEvent *event, gGraph *graph)
+{
+    for (int i = 0; i < layers.size(); i++)
+        if (layers[i]->mousePressEvent(event, graph)) { return true; }
+
+    return false;
+}
+
+//! \brief Mouse button released that was originally pressed somewhere on this layer
+bool LayerGroup::mouseReleaseEvent(QMouseEvent *event, gGraph *graph)
+{
+    for (int i = 0; i < layers.size(); i++)
+        if (layers[i]->mouseReleaseEvent(event, graph)) { return true; }
+
+    return false;
+}
+
+//! \brief Mouse button double clicked somewhere on this layer
+bool LayerGroup::mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph)
+{
+    for (int i = 0; i < layers.size(); i++)
+        if (layers[i]->mouseDoubleClickEvent(event, graph)) { return true; }
+
+    return false;
+}
+
+//! \brief A key was pressed on the keyboard while the graph area was focused.
+bool LayerGroup::keyPressEvent(QKeyEvent *event, gGraph *graph)
+{
+    for (int i = 0; i < layers.size(); i++)
+        if (layers[i]->keyPressEvent(event, graph)) { return true; }
+
+    return false;
+}
diff --git a/sleepyhead/Graphs/layer.h b/sleepyhead/Graphs/layer.h
new file mode 100644
index 0000000..47f22ea
--- /dev/null
+++ b/sleepyhead/Graphs/layer.h
@@ -0,0 +1,297 @@
+/* Graph Layer Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef graphs_layer_h
+#define graphs_layer_h
+
+#include <QKeyEvent>
+#include <QMouseEvent>
+#include <QRect>
+#include <QVector>
+#include <QWheelEvent>
+
+#include "SleepLib/common.h"
+#include "SleepLib/day.h"
+#include "SleepLib/machine_common.h"
+
+class gGraph;
+class LayerGroup;
+
+enum LayerPosition { LayerLeft, LayerRight, LayerTop, LayerBottom, LayerCenter, LayerOverlay };
+
+enum ToolTipAlignment { TT_AlignCenter, TT_AlignLeft, TT_AlignRight };
+
+enum LayerType { LT_Other = 0, LT_LineChart, LT_SummaryChart, LT_EventFlags, LT_Spacer, LT_Overview };
+
+/*! \class Layer
+    \brief The base component for all individual Graph layers
+    */
+class Layer
+{
+    friend class gGraph;
+    friend class LayerGroup;
+
+  public:
+    Layer(ChannelID code)
+        : m_refcount(0),
+          m_day(nullptr),
+          m_visible(true),
+          m_movable(false),
+          m_minx(0), m_maxx(0),
+          m_miny(0), m_maxy(0),
+          m_physminy(0), m_physmaxy(0),
+          m_code(code),
+          m_width(0), m_height(0),
+          m_X(0), m_Y(0),
+          m_order(0),
+          m_position(LayerCenter),
+          m_recalculating(false),
+          m_layertype(LT_Other)
+    { }
+
+    virtual void recalculate(gGraph * graph) { Q_UNUSED(graph)}
+    virtual ~Layer();
+
+    virtual Layer * Clone() { return nullptr; }
+    void CloneInto(Layer *);
+
+    //! \brief This gets called on day selection, allowing this layer to precalculate any drawing data
+    virtual void SetDay(Day *d);
+
+    //! \brief Set the ChannelID used in this layer
+    virtual void SetCode(ChannelID c) { m_code = c; }
+    //! \brief Return the ChannelID used in this layer
+    const ChannelID & code() { return m_code; }
+
+    const LayerType & layerType() { return m_layertype; }
+
+    //! \brief returns true if this layer contains no data.
+    virtual bool isEmpty();
+
+    //! \brief Override and returns true if there are any highlighted components
+    virtual bool isSelected() { return false; }
+
+    //! \brief Deselect any highlighted components
+    virtual void deselect() { }
+
+    //! \brief Override to set the minimum allowed height for this layer
+    virtual int minimumHeight() { return 0; }
+
+    //! \brief Override to set the minimum allowed width for this layer
+    virtual int minimumWidth() { return 0; }
+
+    //! \brief Return this layers physical minimum date boundary
+    virtual qint64 Minx() { return m_day ? m_day->first() : m_minx; }
+
+    //! \brief Return this layers physical maximum date boundary
+    virtual qint64 Maxx() { return m_day ? m_day->last() : m_maxx; }
+
+    //! \brief Return this layers physical minimum Yaxis value
+    virtual EventDataType Miny() { return m_miny; }
+
+    //! \brief Return this layers physical maximum Yaxis value
+    virtual EventDataType Maxy() { return m_maxy; }
+
+    //! \brief Return this layers physical minimum Yaxis value
+    virtual EventDataType physMiny() { return m_physminy; }
+
+    //! \brief Return this layers physical maximum Yaxis value
+    virtual EventDataType physMaxy() { return m_physmaxy; }
+
+    //! \brief Set this layers physical minimum date boundary
+    virtual void setMinX(qint64 val) { m_minx = val; }
+
+    //! \brief Set this layers physical maximum date boundary
+    virtual void setMaxX(qint64 val) { m_maxx = val; }
+
+    //! \brief Set this layers physical minimum Yaxis value
+    virtual void setMinY(EventDataType val) { m_miny = val; }
+
+    //! \brief Set this layers physical maximum Yaxis value
+    virtual void setMaxY(EventDataType val) { m_maxy = val; }
+
+    //! \brief Set this layers Visibility status
+    void setVisible(bool b) { m_visible = b; }
+
+    //! \brief Return this layers Visibility status
+    inline bool visible() const { return m_visible; }
+
+    //! \brief Set this layers Moveability status (not really used yet)
+    void setMovable(bool b) { m_movable = b; }
+
+    //! \brief Return this layers Moveability status (not really used yet)
+    inline bool movable() const { return m_movable; }
+
+    inline bool recalculating() const { return m_recalculating; }
+
+    virtual void dataChanged() {}
+
+    /*! \brief Override this for the drawing code, using GLBuffer components for drawing
+        \param gGraph & gv    Graph Object that holds this layer
+        \param int left
+        \param int top
+        \param int width
+        \param int height
+      */
+    virtual void paint(QPainter &painter, gGraph &gv, const QRegion &region) = 0;
+
+    //! \brief Set the layout position and order for this layer.
+    void setLayout(LayerPosition position, short width, short height, short order);
+
+    void setPos(short x, short y) { m_X = x; m_Y = y; }
+
+    inline int Width() const { return m_width; }
+    inline int Height() const { return m_height; }
+
+    //! \brief Return this Layers Layout Position.
+    LayerPosition position() { return m_position; }
+    //void X() { return m_X; }
+    //void Y() { return m_Y; }
+
+//    //! \brief Draw all this layers custom GLBuffers (ie. the actual OpenGL Vertices)
+//    virtual void drawGLBuf(float linesize);
+
+    //! \brief not sure why I needed the reference counting stuff.
+    short m_refcount;
+    void addref() { m_refcount++; }
+    bool unref() {
+        m_refcount--;
+        return (m_refcount <= 0);
+    }
+
+  protected:
+//    //! \brief Add a GLBuffer (vertex) object customized to this layer
+//    void addGLBuf(GLBuffer *buf) { mgl_buffers.push_back(buf); }
+//    void addVertexBuffer(gVertexBuffer *buf) { mv_buffers.push_back(buf); }
+
+    //QRect bounds; // bounds, relative to top of individual graph.
+    Day *m_day;
+    bool m_visible;
+    bool m_movable;
+    qint64 m_minx, m_maxx;
+    EventDataType m_miny, m_maxy;
+    EventDataType m_physminy, m_physmaxy;
+    ChannelID m_code;
+    short m_width;                   // reserved x pixels needed for this layer.  0==Depends on position..
+    short m_height;                  // reserved y pixels needed for this layer.  both 0 == expand to all free area.
+    short m_X;                       // offset for repositionable layers..
+    short m_Y;
+    short m_order;                     // order for positioning..
+    LayerPosition m_position;
+    QRect m_rect;
+    bool m_mouseover;
+    volatile bool m_recalculating;
+    LayerType m_layertype;
+public:
+
+//    //! \brief A vector containing all this layers custom drawing buffers
+//    QVector<GLBuffer *> mgl_buffers;
+//    QVector<gVertexBuffer *> mv_buffers;
+
+    //! \brief Mouse wheel moved somewhere over this layer
+    virtual bool wheelEvent(QWheelEvent *event, gGraph *graph) {
+        Q_UNUSED(event);
+        Q_UNUSED(graph);
+        return false;
+    }
+    //! \brief Mouse moved somewhere over this layer
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph) {
+        Q_UNUSED(event);
+        Q_UNUSED(graph);
+        return false;
+    }
+    //! \brief Mouse left or right button pressed somewhere on this layer
+    virtual bool mousePressEvent(QMouseEvent *event, gGraph *graph) {
+        Q_UNUSED(event);
+        Q_UNUSED(graph);
+        return false;
+    }
+    //! \brief Mouse button released that was originally pressed somewhere on this layer
+    virtual bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph) {
+        Q_UNUSED(event);
+        Q_UNUSED(graph);
+        return false;
+    }
+    //! \brief Mouse button double clicked somewhere on this layer
+    virtual bool mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph) {
+        Q_UNUSED(event);
+        Q_UNUSED(graph);
+        return false;
+    }
+    //! \brief A key was pressed on the keyboard while the graph area was focused.
+    virtual bool keyPressEvent(QKeyEvent *event, gGraph *graph) {
+        Q_UNUSED(event);
+        Q_UNUSED(graph);
+        return false;
+    }
+};
+
+/*! \class LayerGroup
+    \brief Contains a list of graph Layer objects
+    */
+class LayerGroup : public Layer
+{
+  public:
+    LayerGroup()
+        : Layer(NoChannel)
+    { }
+
+    virtual ~LayerGroup();
+
+    //! \brief Add Layer to this Layer Group
+    virtual void AddLayer(Layer *l);
+
+    //! \brief Returns the minimum time value for all Layers contained in this group (milliseconds since epoch)
+    virtual qint64 Minx();
+
+    //! \brief Returns the maximum time value for all Layers contained in this group (milliseconds since epoch)
+    virtual qint64 Maxx();
+
+    //! \brief Returns the minimum Y-axis value for all Layers contained in this group
+    virtual EventDataType Miny();
+
+    //! \brief Returns the maximum Y-axis value for all Layers contained in this group
+    virtual EventDataType Maxy();
+
+    //! \brief Check all layers contained and return true if none contain data
+    virtual bool isEmpty();
+
+    //! \brief Calls SetDay for all Layers contained in this object
+    virtual void SetDay(Day *d);
+
+//    //! \brief Calls drawGLBuf for all Layers contained in this object
+//    virtual void drawGLBuf(float linesize);
+
+    //! \brief Return the list of Layers this object holds
+    QVector<Layer *> &getLayers() { return layers; }
+
+  protected:
+    //! \brief Contains all Layer objects in this group
+    QVector<Layer *> layers;
+
+    //! \brief Mouse wheel moved somewhere over this LayerGroup
+    virtual bool wheelEvent(QWheelEvent *event, gGraph *graph);
+
+    //! \brief Mouse moved somewhere over this LayerGroup
+    virtual bool mouseMoveEvent(QMouseEvent *event, gGraph *graph);
+
+    //! \brief Mouse left or right button pressed somewhere on this LayerGroup
+    virtual bool mousePressEvent(QMouseEvent *event, gGraph *graph);
+
+    //! \brief Mouse button released that was originally pressed somewhere on this LayerGroup
+    virtual bool mouseReleaseEvent(QMouseEvent *event, gGraph *graph);
+
+    //! \brief Mouse button double clicked somewhere on this layerGroup
+    virtual bool mouseDoubleClickEvent(QMouseEvent *event, gGraph *graph);
+
+    //! \brief A key was pressed on the keyboard while the graph area was focused.
+    virtual bool keyPressEvent(QKeyEvent *event, gGraph *graph);
+
+};
+
+#endif // graphs_layer_h
diff --git a/sleepyhead/Resources.qrc b/sleepyhead/Resources.qrc
new file mode 100644
index 0000000..145044e
--- /dev/null
+++ b/sleepyhead/Resources.qrc
@@ -0,0 +1,51 @@
+<RCC>
+    <qresource prefix="/">
+        <file>icons/sdcard.png</file>
+        <file>icons/preferences.png</file>
+        <file>icons/overview.png</file>
+        <file>icons/moon.png</file>
+        <file>icons/go-home.png</file>
+        <file>icons/forward.png</file>
+        <file>icons/edit-find.png</file>
+        <file>icons/back.png</file>
+        <file>fonts/FreeSans.ttf</file>
+        <file>icons/refresh.png</file>
+        <file>docs/usage.html</file>
+        <file>icons/oximeter.png</file>
+        <file>docs/0.0.gif</file>
+        <file>docs/schema.xml</file>
+        <file>docs/channels.xml</file>
+        <file>icons/last.png</file>
+        <file>docs/release_notes.html</file>
+        <file>icons/save.png</file>
+        <file>docs/countries.txt</file>
+        <file>docs/tz.txt</file>
+        <file>icons/arrow-end.png</file>
+        <file>icons/arrow-left.png</file>
+        <file>icons/arrow-right.png</file>
+        <file>icons/smileyface.png</file>
+        <file>icons/sadface.png</file>
+        <file>icons/mask.png</file>
+        <file>icons/cubeoximeter.png</file>
+        <file>icons/trophy.png</file>
+        <file>icons/bookmark.png</file>
+        <file>icons/help.png</file>
+        <file>docs/tooltips.css</file>
+        <file>icons/session-off.png</file>
+        <file>icons/session-on.png</file>
+        <file>icons/bob-v3.0.png</file>
+        <file>docs/script.js</file>
+        <file>docs/sheep.png</file>
+        <file>icons/Jedimark.png</file>
+        <file>COPYING</file>
+        <file>icons/sdcard-lock.png</file>
+        <file>icons/statistics.png</file>
+        <file>icons/prs1.png</file>
+        <file>icons/cms50f.png</file>
+        <file>icons/rms9.png</file>
+        <file>icons/intellipap.png</file>
+        <file>icons/pushpin.png</file>
+        <file>icons/eye.png</file>
+        <file>icons/prs1_60s.png</file>
+    </qresource>
+</RCC>
diff --git a/sleepyhead/STYLE b/sleepyhead/STYLE
new file mode 100644
index 0000000..23641be
--- /dev/null
+++ b/sleepyhead/STYLE
@@ -0,0 +1,23 @@
+# Style definitions for Artistic Style.
+# Usage: astyle --options=STYLE
+
+--style=otbs  # "One True Brace Style"
+--max-code-length=99  # Maximum length of a single line.
+--lineend=linux  # Use \n, not \r\n.
+
+--attach-namespaces  # Attach brackets to a namespace statement.
+--attach-inlines  # Attach brackets to class and struct inline function definitions.
+
+--indent-modifiers  # Indent C++ class and struct access modifiers one half-indent.
+
+--indent-col1-comments  # Indent C++ comments beginning in column one, with the code.
+
+--break-blocks  # Pad empty lines around if, for, and while blocks.
+--pad-oper  # Insert space padding around operators.
+--pad-header  # Insert space padding after if, while, and for paren headers.
+--unpad-paren  # Remove extra space padding around parentheses on inside and outside.
+
+--align-pointer=name  # char* foo ==> char *foo. Also applies to references.
+
+--remove-brackets  # Remove brackets from one-line conditional statements.
+--keep-one-line-blocks  # don't break apart multiple statements on one line.
diff --git a/sleepyhead/SleepLib/calcs.cpp b/sleepyhead/SleepLib/calcs.cpp
new file mode 100644
index 0000000..b5c540b
--- /dev/null
+++ b/sleepyhead/SleepLib/calcs.cpp
@@ -0,0 +1,2073 @@
+/* Custom CPAP/Oximetry Calculations Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QMutex>
+#include <QFile>
+#include <QDataStream>
+#include <QTextStream>
+#include <cmath>
+#include <algorithm>
+
+#include "calcs.h"
+#include "profiles.h"
+
+bool SearchEvent(Session * session, ChannelID code, qint64 time, int dur, bool update=true)
+{
+    qint64 t, start;
+    QHash<ChannelID, QVector<EventList *> >::iterator it;
+    it = session->eventlist.find(code);
+    quint32 *tptr;
+
+    EventStoreType *dptr;
+
+    int cnt;
+
+    //qint64 rate;
+//    bool fixdurations = (session->machine()->loaderName() != STR_MACH_ResMed);
+
+    if (!p_profile->cpap->resyncFromUserFlagging()) {
+        update=false;
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator evend = session->eventlist.end();
+    if (it != evend) {
+        int el_size=it.value().size();
+        for (int i = 0; i < el_size; i++)  {
+            EventList *el = it.value()[i];
+            //            rate=el->rate();
+            cnt = el->count();
+
+            // why would this be necessary???
+            if (el->type() == EVL_Waveform) {
+                qDebug() << "Called SearchEvent on a waveform object!";
+                return false;
+            } else {
+                start = el->first();
+                tptr = el->rawTime();
+                dptr = el->rawData();
+
+                for (int j = 0; j < cnt; j++) {
+                    t = start + *tptr;
+
+                    // Move the position and set the duration
+                    qint64 end1 = time + 5000L;
+                    qint64 start1 = end1 - quint64(dur+10)*1000L;
+
+                    qint64 end2 = t + 5000L;
+                    qint64 start2 = end2 - quint64(*dptr+10)*1000L;
+
+                    bool overlap = (start1 <= end2) && (start2 <= end1);
+
+                    if (overlap) {
+                        if (update) {
+                            qint32 delta = time-start;
+                            if (delta >= 0) {
+                                *tptr = delta;
+                                *dptr = (EventStoreType)dur;
+                            }
+                        }
+                        return true;
+                    }
+                    tptr++;
+                    dptr++;
+                }
+            }
+        }
+    }
+
+    return false;
+}
+
+bool SearchApnea(Session *session, qint64 time, double dur)
+{
+    if (SearchEvent(session, CPAP_Obstructive, time, dur))
+        return true;
+
+    if (SearchEvent(session, CPAP_Apnea, time, dur))
+        return true;
+
+    if (SearchEvent(session, CPAP_ClearAirway, time, dur))
+        return true;
+
+    if (SearchEvent(session, CPAP_Hypopnea, time, dur))
+        return true;
+
+    if (SearchEvent(session, CPAP_UserFlag1, time, dur, false))
+        return true;
+
+    if (SearchEvent(session, CPAP_UserFlag2, time, dur, false))
+        return true;
+
+    return false;
+}
+
+// Sort BreathPeak by peak index
+bool operator<(const BreathPeak &p1, const BreathPeak &p2)
+{
+    return p1.start < p2.start;
+}
+
+//! \brief Filters input to output with a percentile filter with supplied width.
+//! \param samples Number of samples
+//! \param width number of surrounding samples to consider
+//! \param percentile fractional percentage, between 0 and 1
+void percentileFilter(EventDataType *input, EventDataType *output, int samples, int width,
+                      EventDataType percentile)
+{
+    if (samples <= 0) {
+        return;
+    }
+
+    if (percentile > 1) {
+        percentile = 1;
+    }
+
+    QVector<EventDataType> buf(width);
+    int s, e;
+    int z1 = width / 2;
+    int z2 = z1 + (width % 2);
+    int nm1 = samples - 1;
+    //int j;
+
+    // Scan through all of input
+    for (int k = 0; k < samples; k++) {
+
+        s = k - z1;
+        e = k + z2;
+
+        // Cap bounds
+        if (s < 0) { s = 0; }
+
+        if (e > nm1) { e = nm1; }
+
+        //
+        int j = 0;
+
+        for (int i = s; i < e; i++) {
+            buf[j++] = input[i];
+        }
+
+        j--;
+
+        EventDataType val = j * percentile;
+        EventDataType fl = floor(val);
+
+        // If even percentile, or already max value..
+        if ((val == fl) || (j >= width - 1)) {
+            nth_element(buf.begin(), buf.begin() + j, buf.begin() + width - 1);
+            val = buf[j];
+        } else {
+            // Percentile lies between two points, interpolate.
+            double v1, v2;
+            nth_element(buf.begin(), buf.begin() + j, buf.begin() + width - 1);
+            v1 = buf[j];
+            nth_element(buf.begin(), buf.begin() + j + 1, buf.begin() + width - 1);
+            v2 = buf[j + 1];
+
+            val = v1 + (v2 - v1) * (val - fl);
+        }
+
+        output[k] = val;
+    }
+}
+
+void xpassFilter(EventDataType *input, EventDataType *output, int samples, EventDataType weight)
+{
+    // prime the first value
+    output[0] = input[0];
+
+    for (int i = 1; i < samples; i++) {
+        output[i] = weight * input[i] + (1.0 - weight) * output[i - 1];
+    }
+
+    //output[samples-1]=input[samples-1];
+}
+
+FlowParser::FlowParser()
+{
+    m_session = nullptr;
+    m_flow = nullptr;
+    m_filtered = nullptr;
+    m_gain = 1;
+    m_samples = 0;
+    m_startsUpper = true;
+
+    // Allocate filter chain buffers..
+    m_filtered = (EventDataType *) malloc(max_filter_buf_size);
+}
+FlowParser::~FlowParser()
+{
+    free(m_filtered);
+    //    for (int i=0;i<num_filter_buffers;i++) {
+    //        free(m_buffers[i]);
+    //    }
+}
+void FlowParser::clearFilters()
+{
+    m_filters.clear();
+}
+
+EventDataType *FlowParser::applyFilters(EventDataType *data, int samples)
+{
+    EventDataType *in = nullptr, *out = nullptr;
+
+    if (m_filters.size() == 0) {
+        //qDebug() << "Trying to apply empty filter list in FlowParser..";
+        return nullptr;
+    }
+
+    for (int i = 0; i < num_filter_buffers; i++) {
+        m_buffers[i] = (EventDataType *) malloc(max_filter_buf_size);
+    }
+
+    int numfilt = m_filters.size();
+
+    for (int i = 0; i < numfilt; i++) {
+        if (i == 0) {
+            in = data;
+            out = m_buffers[0];
+
+            if (in == out) {
+                //qDebug() << "Error: If you need to use internal m_buffers as initial input, use the second one. No filters were applied";
+                return nullptr;
+            }
+        } else {
+            in = m_buffers[(i + 1) % num_filter_buffers];
+            out = m_buffers[i % num_filter_buffers];
+        }
+
+        // If final link in chain, pass it back out to input data
+        if (i == numfilt - 1) {
+            out = data;
+        }
+
+        Filter &filter = m_filters[i];
+
+        if (filter.type == FilterNone) {
+            // Just copy it..
+            memcpy(in, out, samples * sizeof(EventDataType));
+        } else if (filter.type == FilterPercentile) {
+            percentileFilter(in, out, samples, filter.param1, filter.param2);
+        } else if (filter.type == FilterXPass) {
+            xpassFilter(in, out, samples, filter.param1);
+        }
+    }
+
+    for (int i = 0; i < num_filter_buffers; i++) {
+        free(m_buffers[i]);
+    }
+
+    return out;
+}
+
+// Opens the flow rate EventList, applies the input filter chain, and calculates peaks
+void FlowParser::openFlow(Session *session, EventList *flow)
+{
+    if (!flow) {
+        qDebug() << "called FlowParser::processFlow() with a null EventList!";
+        return;
+    }
+
+    m_session = session;
+    m_flow = flow;
+    m_gain = flow->gain();
+    m_rate = flow->rate();
+    m_samples = flow->count();
+    EventStoreType *inraw = flow->rawData();
+
+    // Make sure we won't overflow internal buffers
+    if (m_samples > max_filter_buf_size) {
+        qDebug() << "Error: Sample size exceeds max_filter_buf_size in FlowParser::openFlow().. Capping!!!";
+        m_samples = max_filter_buf_size;
+    }
+
+    // Begin with the second internal buffer
+    EventDataType *buf = m_filtered;
+    // Apply gain to waveform
+    EventStoreType *eptr = inraw + m_samples;
+
+    // Convert from store type to floats..
+    for (; inraw < eptr; ++inraw) {
+        *buf++ = EventDataType(*inraw) * m_gain;
+    }
+
+    // Apply the rest of the filters chain
+    buf = applyFilters(m_filtered, m_samples);
+
+    // Scan for and create an index of each breath
+    calcPeaks(m_filtered, m_samples);
+}
+
+// Calculates breath upper & lower peaks for a chunk of EventList data
+void FlowParser::calcPeaks(EventDataType *input, int samples)
+{
+    if (samples <= 0) {
+        return;
+    }
+
+    EventDataType min = 0, max = 0, c, lastc = 0;
+
+    EventDataType zeroline = 0;
+
+    double rate = m_flow->rate();
+
+    double flowstart = m_flow->first();
+    double lasttime, time;
+
+    double peakmax = flowstart, peakmin = flowstart;
+
+    time = lasttime = flowstart;
+    breaths.clear();
+
+    // Estimate storage space needed using typical average breaths per minute.
+    m_minutes = double(m_flow->last() - m_flow->first()) / 60000.0;
+
+    const double avgbpm = 20; // average breaths per minute of a standard human
+    int guestimate = m_minutes * avgbpm;
+
+    // reserve some memory
+    breaths.reserve(guestimate);
+
+    // Prime min & max, and see which side of the zero line we are starting from.
+    c = input[0];
+    min = max = c;
+    lastc = c;
+    m_startsUpper = (c >= zeroline);
+
+    qint32 start = 0, middle = 0;
+
+
+    int sps = 1000 / m_rate;
+    int len = 0, lastk = 0;
+
+    qint64 sttime = time;
+
+    // For each samples, find the peak upper and lower breath components
+    for (int k = 0; k < samples; k++) {
+        c = input[k];
+
+        if (c >= zeroline) {
+
+            // Did we just cross the zero line going up?
+            if (lastc < zeroline) {
+                // This helps filter out dirty breaths..
+                len = k - start;
+
+                if ((max > 3) && ((max - min) > 8) && (len > sps) && (middle > start))  {
+
+                    // peak detection may not be needed..
+                    breaths.push_back(BreathPeak(min, max, start, middle, k));
+
+                    // Set max for start of the upper breath cycle
+                    max = c;
+                    peakmax = time;
+
+                    // Starting point of next breath cycle
+                    start = k;
+                    sttime = time;
+                }
+            } else if (c > max) {
+                // Update upper breath peak
+                max = c;
+                peakmax = time;
+            }
+        }
+
+        if (c < zeroline) {
+            // Did we just cross the zero line going down?
+
+            if (lastc >= zeroline) {
+                // Set min for start of the lower breath cycle
+                min = c;
+                peakmin = time;
+                middle = k;
+
+            } else if (c < min) {
+                // Update lower breath peak
+                min = c;
+                peakmin = time;
+            }
+
+        }
+
+        lasttime = time;
+        time += rate;
+        lastc = c;
+        lastk = k;
+    }
+}
+
+
+//! \brief Calculate Respiratory Rate, TidalVolume, Minute Ventilation, Ti & Te..
+// These are grouped together because, a) it's faster, and b) some of these calculations rely on others.
+void FlowParser::calc(bool calcResp, bool calcTv, bool calcTi, bool calcTe, bool calcMv)
+{
+    if (!m_session) {
+        return;
+    }
+
+    // Don't even bother if only a few breaths in this chunk
+    const int lowthresh = 4;
+    int nm = breaths.size();
+
+    if (nm < lowthresh) {
+        return;
+    }
+
+    const qint64 minute = 60000;
+
+
+    double start = m_flow->first();
+    double time = start;
+
+    int bs, be, bm;
+    double st, et, mt;
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // Respiratory Rate setup
+    /////////////////////////////////////////////////////////////////////////////////
+    EventDataType minrr = 0, maxrr = 0;
+    EventList *RR = nullptr;
+    quint32 *rr_tptr = nullptr;
+    EventStoreType *rr_dptr = nullptr;
+
+    if (calcResp) {
+        RR = m_session->AddEventList(CPAP_RespRate, EVL_Event);
+        minrr = RR->Min(), maxrr = RR->Max();
+        RR->setGain(0.2F);
+        RR->setFirst(time + minute);
+        RR->getData().resize(nm);
+        RR->getTime().resize(nm);
+        rr_tptr = RR->rawTime();
+        rr_dptr = RR->rawData();
+    }
+
+    int rr_count = 0;
+
+    double len, st2, et2, adj, stmin, b, rr = 0;
+    double len2;
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // Inspiratory / Expiratory Time setup
+    /////////////////////////////////////////////////////////////////////////////////
+    double lastte2 = 0, lastti2 = 0, lastte = 0, lastti = 0, te, ti, ti1, te1, c;
+    EventList *Te = nullptr, * Ti = nullptr;
+
+    if (calcTi) {
+        Ti = m_session->AddEventList(CPAP_Ti, EVL_Event);
+        Ti->setGain(0.02F);
+    }
+
+    if (calcTe) {
+        Te = m_session->AddEventList(CPAP_Te, EVL_Event);
+        Te->setGain(0.02F);
+    }
+
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // Tidal Volume setup
+    /////////////////////////////////////////////////////////////////////////////////
+    EventList *TV = nullptr;
+    EventDataType mintv = 0, maxtv = 0, tv = 0;
+    double val1, val2;
+    quint32 *tv_tptr = nullptr;
+    EventStoreType *tv_dptr = nullptr;
+    int tv_count = 0;
+
+    if (calcTv) {
+        TV = m_session->AddEventList(CPAP_TidalVolume, EVL_Event);
+        mintv = TV->Min(), maxtv = TV->Max();
+        TV->setGain(20);
+        TV->setFirst(start);
+        TV->getData().resize(nm);
+        TV->getTime().resize(nm);
+        tv_tptr = TV->rawTime();
+        tv_dptr = TV->rawData();
+    }
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // Minute Ventilation setup
+    /////////////////////////////////////////////////////////////////////////////////
+    EventList *MV = nullptr;
+    EventDataType mv;
+
+    if (calcMv) {
+        MV = m_session->AddEventList(CPAP_MinuteVent, EVL_Event);
+        MV->setGain(0.125); // gain set to 1/8th
+    }
+
+    EventDataType sps = (1000.0 / m_rate); // Samples Per Second
+
+
+    qint32 timeval = 0; // Time relative to start
+
+
+    BreathPeak * bpstr = breaths.data();
+    BreathPeak * bpend = bpstr + nm;
+
+    // For each breath...
+    for (BreathPeak * bp = bpstr; bp != bpend; ++bp) {
+        bs = bp->start;
+        bm = bp->middle;
+        be = bp->end;
+
+        // Calculate start, middle and end time of this breath
+        st = start + bs * m_rate;
+        mt = start + bm * m_rate;
+
+        timeval = be * m_rate;
+
+        et = start + timeval;
+
+        /////////////////////////////////////////////////////////////////////
+        // Calculate Inspiratory Time (Ti) for this breath
+        /////////////////////////////////////////////////////////////////////
+        if (calcTi) {
+            // Ti is simply the time between the start of a breath and it's midpoint
+
+            // Note the 50.0 is the gain value, to give it better resolution
+            // (and mt and st are in milliseconds)
+            ti = ((mt - st) / 1000.0) * 50.0;
+
+            // Average for a little smoothing
+            ti1 = (lastti2 + lastti + ti * 2) / 4.0;
+
+            Ti->AddEvent(mt, ti1);   // Add the event
+
+            // Track the last two values to use for averaging
+            lastti2 = lastti;
+            lastti = ti;
+        }
+
+        /////////////////////////////////////////////////////////////////////
+        // Calculate Expiratory Time (Te) for this breath
+        /////////////////////////////////////////////////////////////////////
+        if (calcTe) {
+            // Te is simply the time between the second half of the breath
+            te = ((et - mt) / 1000.0) * 50.0;
+
+            // Average last three values..
+            te1 = (lastte2 + lastte + te * 2 ) / 4.0;
+            Te->AddEvent(mt, te1);
+
+            lastte2 = lastte;
+            lastte = te;
+        }
+
+        /////////////////////////////////////////////////////////////////////
+        // Calculate TidalVolume
+        /////////////////////////////////////////////////////////////////////
+        if (calcTv) {
+            val1 = 0, val2 = 0;
+
+            // Scan the upper breath
+            for (int j = bs; j < bm; j++)  {
+                // convert flow to ml/s to L/min and divide by samples per second
+                c = double(qAbs(m_filtered[j])) * 1000.0 / 60.0 / sps;
+                val2 += c;
+                //val2+=c*c; // for RMS
+            }
+            tv = val2;
+
+            bool usebothhalves = false;
+            if (usebothhalves) {
+                for (int j = bm; j < be; j++)  {
+                    // convert flow to ml/s to L/min and divide by samples per second
+                    c = double(qAbs(m_filtered[j])) * 1000.0 / 60.0 / sps;
+                    val1 += c;
+                    //val1 += c*c; // for RMS
+                }
+                tv = (qAbs(val2) + qAbs(val1)) / 2;
+            }
+
+            // Add the other half here and average might make it more accurate
+            // But last time I tried it was pretty messy
+
+            // Perhaps needs a bit of history averaging..
+
+            // calculate root mean square
+            //double n=bm-bs;
+            //double q=(1/n)*val2;
+            //double x=sqrt(q)*2;
+            //val2=x;
+
+            if (tv < mintv) { mintv = tv; }
+
+            if (tv > maxtv) { maxtv = tv; }
+
+            *tv_tptr++ = timeval;
+            *tv_dptr++ = tv / 20.0;
+            tv_count++;
+
+        }
+
+        /////////////////////////////////////////////////////////////////////
+        // Respiratory Rate Calculations
+        /////////////////////////////////////////////////////////////////////
+        if (calcResp) {
+            stmin = et - minute;
+
+            if (stmin < start) {
+                stmin = start;
+            }
+
+            len = et - stmin;
+            rr = 0;
+            len2 = 0;
+
+            // Step back through last minute and count breaths
+            BreathPeak *bpstr1 = bpstr-1;
+            for (BreathPeak *p = bp; p != bpstr1; --p) {
+                st2 = start + double(p->start) * m_rate;
+                et2 = start + double(p->end) * m_rate;
+
+                if (et2 < stmin) {
+                    break;
+                }
+
+                len = et2 - st2;
+
+                if (st2 < stmin) {
+                    // Partial breath
+                    st2 = stmin;
+                    adj = et2 - st2;
+                    b = (1.0 / len) * adj;
+                    len2 += adj;
+                } else {
+                    b = 1;
+                    len2 += len;
+                }
+
+                rr += b;
+            }
+
+            if (len2 < minute) {
+                rr *= minute / len2;
+            }
+
+            // Calculate min & max
+            if (rr < minrr) {
+                minrr = rr;
+            }
+
+            if (rr > maxrr) {
+                maxrr = rr;
+            }
+
+            // Add manually.. (much quicker)
+            *rr_tptr++ = timeval;
+
+            // Use the same gains as ResMed..
+
+            *rr_dptr++ = rr * 5.0;
+            rr_count++;
+        }
+
+        if (calcMv && calcResp && calcTv) {
+            // Minute Ventilation is tidal volume times respiratory rate
+            mv = (tv / 1000.0) * rr;
+
+            // The 8.0 is the gain of the MV EventList to boost resolution
+            MV->AddEvent(et, mv * 8.0);
+        }
+    }
+
+    /////////////////////////////////////////////////////////////////////
+    // Respiratory Rate post filtering
+    /////////////////////////////////////////////////////////////////////
+
+    if (calcResp) {
+        RR->setMin(minrr);
+        RR->setMax(maxrr);
+        RR->setFirst(start);
+        RR->setLast(et);
+        RR->setCount(rr_count);
+    }
+
+    /////////////////////////////////////////////////////////////////////
+    // Tidal Volume post filtering
+    /////////////////////////////////////////////////////////////////////
+
+    if (calcTv) {
+        TV->setMin(mintv);
+        TV->setMax(maxtv);
+        TV->setFirst(start);
+        TV->setLast(et);
+        TV->setCount(tv_count);
+    }
+}
+
+void FlowParser::flagUserEvents(ChannelID code, EventDataType restriction, EventDataType duration)
+{
+    int numbreaths = breaths.size();
+    EventDataType val, mx, mn;
+
+    QVector<EventDataType> br;
+    QVector<qint32> bstart;
+    QVector<qint32> bend;
+
+    // Allocate some memory beforehand so it doesn't have to slow it down mid calculations
+    bstart.reserve(numbreaths * 2);
+    bend.reserve(numbreaths * 2);
+    br.reserve(numbreaths * 2);
+
+    double start = m_flow->first();
+    double st, et, dur;
+    qint64 len;
+
+    bool allowDuplicates = p_profile->cpap->userEventDuplicates();
+
+    // Get the Breath list, which is calculated by the previously run breath marker algorithm.
+    BreathPeak *bpstr = breaths.data();
+    BreathPeak *bpend = bpstr + numbreaths;
+
+    // Create a list containing the abs of min and max waveform flow for each breath
+    for (BreathPeak *p = bpstr; p != bpend; ++p) {
+        br.push_back(qAbs(p->max));
+        br.push_back(qAbs(p->min));
+    }
+
+    // The following ignores the outliers to get a cleaner cutoff value
+    // 60th percentile was chosen because it's a little more than median, and, well, reasons I can't remember specifically.. :-}
+
+    // Look for the 60th percentile of the abs'ed min/max values
+    const EventDataType perc = 0.6F;
+    int idx = float(br.size()) * perc;
+    nth_element(br.begin(), br.begin() + idx, br.end() - 1);
+
+    // Take this value as the peak
+    EventDataType peak = br[idx]; ;
+
+    // Scale the restriction percentage to the peak to find the cutoff value
+    EventDataType cutoffval = peak * (restriction / 100.0F);
+
+    int bs, bm, be, bs1, bm1, be1;
+
+    // For each Breath, search for flow restrictions
+    for (BreathPeak *p = bpstr; p != bpend; ++p) {
+
+        // Todo: Define these markers in the comments better
+        bs = p->start;   // breath start
+        bm = p->middle;  // breath middle
+        be = p->end;     // breath end
+
+        mx = p->max;
+        mn = p->min;
+
+        val = mx - mn;   // the total height from top to bottom of this breath
+
+        // Scan the breath in the flow data and stop at the first location more than the cutoff value
+        // (Only really needs to scan to the middle.. I'm not sure why I made it go all the way to the end.)
+        for (bs1 = bs; bs1 < be; bs1++) {
+            if (qAbs(m_filtered[bs1]) > cutoffval) {
+                break;
+            }
+        }
+
+        // if bs1 has reached the end, this means the entire marked breath is within the restriction
+
+        // Scan backwards from the middle to the start, stopping at the first value past the cutoff value
+        for (bm1 = bm; bm1 > bs; bm1--) {
+            if (qAbs(m_filtered[bm1]) > cutoffval) {
+                break;
+            }
+        }
+
+        // Now check if a value was found in the first half of the breath above the cutoff value
+        if (bm1 >= bs1) {
+            // Good breath... And add it as a beginning/end marker for the next stage
+            bstart.push_back(bs1);
+            bend.push_back(bm1);
+        } // else we crossed over and the first half of the breath is under the threshold, therefore has a flow restricted
+
+
+        // Now do the other half of the breath....
+
+        // Scan from middle to end of breath, stopping at first cutoff value
+        for (bm1 = bm; bm1 < be; bm1++) {
+            if (qAbs(m_filtered[bm1]) > cutoffval) {
+                break;
+            }
+        }
+
+        // Scan backwards from the end to the middle of the breath, stopping at the first cutoff value
+        for (be1 = be; be1 > bm; be1--) {
+            if (qAbs(m_filtered[be1]) > cutoffval) {
+                break;
+            }
+        }
+
+        // Check for crossover again
+        if (be1 >= bm1) {
+            // Good strong healthy breath.. add the beginning and end to the breath markers.
+            bstart.push_back(bm1);
+            bend.push_back(be1);
+        } // else crossed over again.. breathe damn you!
+
+        // okay, this looks like cruft..
+//        st = start + bs1 * m_rate;
+//        et = start + be1 * m_rate;
+    }
+
+    int bsize = bstart.size();   // Number of breath components over cutoff threshold
+    EventList *uf = nullptr;
+
+    // For each good breath marker, look at the gaps in between
+    for (int i = 0; i < bsize - 1; i++) {
+        bs = bend[i];         // start  at the end of the healthy breath
+        be = bstart[i + 1];   // look ahead to the beginning of the next one
+
+        // Calculate the start and end timestamps
+        st = start + bs * m_rate;
+        et = start + be * m_rate;
+
+        // Calculate the length of the flow restriction
+        len = et - st;
+        dur = len / 1000.0; // (scale to seconds, not milliseconds)
+
+
+        if (dur >= duration) { // is the event greater than the duration threshold?
+
+            // Unless duplicates have been specifically allowed, scan for any apnea's already detected by the machine
+            if (allowDuplicates || !SearchApnea(m_session, et, dur)) {
+                if (!uf) {
+                    // Create event list if not already done
+                    uf = m_session->AddEventList(code, EVL_Event);
+                }
+
+                // Add the user flag at the end
+                uf->AddEvent(et, dur);
+            }
+        }
+    }
+}
+
+void FlowParser::flagEvents()
+{
+    if (!p_profile->cpap->userEventFlagging()) { return; }
+
+    int numbreaths = breaths.size();
+
+    if (numbreaths < 5) { return; }
+
+    flagUserEvents(CPAP_UserFlag1, p_profile->cpap->userFlowRestriction(), p_profile->cpap->userEventDuration());
+    flagUserEvents(CPAP_UserFlag2, p_profile->cpap->userFlowRestriction2(), p_profile->cpap->userEventDuration2());
+}
+
+void calcRespRate(Session *session, FlowParser *flowparser)
+{
+    if (session->type() != MT_CPAP) { return; }
+
+    //    if (session->machine()->loaderName() != STR_MACH_PRS1) return;
+
+    if (!session->eventlist.contains(CPAP_FlowRate)) {
+        //qDebug() << "calcRespRate called without FlowRate waveform available";
+        return; //need flow waveform
+    }
+
+    bool trashfp;
+
+    if (!flowparser) {
+        flowparser = new FlowParser();
+        trashfp = true;
+        //qDebug() << "calcRespRate called without valid FlowParser object.. using a slow throw-away!";
+        //return;
+    } else {
+        trashfp = false;
+    }
+
+    bool calcResp = !session->eventlist.contains(CPAP_RespRate);
+    bool calcTv = !session->eventlist.contains(CPAP_TidalVolume);
+    bool calcTi = !session->eventlist.contains(CPAP_Ti);
+    bool calcTe = !session->eventlist.contains(CPAP_Te);
+    bool calcMv = !session->eventlist.contains(CPAP_MinuteVent);
+
+
+    int z = (calcResp ? 1 : 0) + (calcTv ? 1 : 0) + (calcMv ? 1 : 0);
+
+    // If any of these three missing, remove all, and switch all on
+    if (z > 0 && z < 3) {
+        if (!calcResp && !calcTv && !calcMv) {
+            calcTv = calcMv = calcResp = true;
+        }
+
+        QVector<EventList *> &list = session->eventlist[CPAP_RespRate];
+        int size = list.size();
+        for (int i = 0; i < size; ++i) {
+            delete list[i];
+        }
+
+        session->eventlist[CPAP_RespRate].clear();
+
+        QVector<EventList *> &list2 = session->eventlist[CPAP_TidalVolume];
+
+        size = list2.size();
+        for (int i = 0; i < size; ++i) {
+            delete list2[i];
+        }
+
+        session->eventlist[CPAP_TidalVolume].clear();
+
+        QVector<EventList *> &list3 = session->eventlist[CPAP_MinuteVent];
+
+        size = list3.size();
+        for (int i = 0; i < size; ++i) {
+            delete list3[i];
+        }
+
+        session->eventlist[CPAP_MinuteVent].clear();
+    }
+
+    flowparser->clearFilters();
+
+    // No filters works rather well with the new peak detection algorithm..
+    // Although the output could use filtering.
+
+    //flowparser->addFilter(FilterPercentile,7,0.5);
+    //flowparser->addFilter(FilterPercentile,5,0.5);
+    //flowparser->addFilter(FilterXPass,0.5);
+    EventList *flow;
+
+    QVector<EventList *> &EVL = session->eventlist[CPAP_FlowRate];
+    int size = EVL.size();
+
+    for (int ws = 0; ws < size; ++ws) {
+        flow = EVL[ws];
+
+        if (flow->count() > 20) {
+            flowparser->openFlow(session, flow);
+            flowparser->calc(calcResp, calcTv, calcTi , calcTe, calcMv);
+            flowparser->flagEvents();
+        }
+    }
+
+    if (trashfp) {
+        delete flowparser;
+    }
+}
+
+
+EventDataType calcAHI(Session *session, qint64 start, qint64 end)
+{
+    bool rdi = p_profile->general->calculateRDI();
+
+    double hours, ahi, cnt;
+
+    if (start < 0) {
+        // much faster..
+        hours = session->hours();
+        cnt = session->count(CPAP_Obstructive)
+              + session->count(CPAP_Hypopnea)
+              + session->count(CPAP_ClearAirway)
+              + session->count(CPAP_Apnea);
+
+        if (rdi) {
+            cnt += session->count(CPAP_RERA);
+        }
+
+        ahi = cnt / hours;
+    } else {
+        hours = double(end - start) / 3600000L;
+
+        if (hours == 0) { return 0; }
+
+        cnt = session->rangeCount(CPAP_Obstructive, start, end)
+              + session->rangeCount(CPAP_Hypopnea, start, end)
+              + session->rangeCount(CPAP_ClearAirway, start, end)
+              + session->rangeCount(CPAP_Apnea, start, end);
+
+        if (rdi) {
+            cnt += session->rangeCount(CPAP_RERA, start, end);
+        }
+
+        ahi = cnt / hours;
+    }
+
+    return ahi;
+}
+
+int calcAHIGraph(Session *session)
+{
+    bool calcrdi = session->machine()->loaderName() == "PRS1";
+
+    const qint64 window_step = 30000; // 30 second windows
+    double window_size = p_profile->cpap->AHIWindow();
+    qint64 window_size_ms = window_size * 60000L;
+
+    bool zeroreset = p_profile->cpap->AHIReset();
+
+    if (session->type() != MT_CPAP) { return 0; }
+
+    bool hasahi = session->eventlist.contains(CPAP_AHI);
+    bool hasrdi = session->eventlist.contains(CPAP_RDI);
+
+    if (hasahi && hasrdi) {
+        return 0;    // abort if already there
+    }
+
+    if (!(!hasahi && !hasrdi)) {
+        session->destroyEvent(CPAP_AHI);
+        session->destroyEvent(CPAP_RDI);
+    }
+
+    if (!session->channelExists(CPAP_Obstructive) &&
+            !session->channelExists(CPAP_Hypopnea) &&
+            !session->channelExists(CPAP_Apnea) &&
+            !session->channelExists(CPAP_ClearAirway) &&
+            !session->channelExists(CPAP_RERA)
+       ) { return 0; }
+
+    qint64 first = session->first(),
+           last = session->last(),
+           f;
+
+    EventList *AHI = new EventList(EVL_Event);
+    AHI->setGain(0.02F);
+    session->eventlist[CPAP_AHI].push_back(AHI);
+
+    EventList *RDI = nullptr;
+
+    if (calcrdi) {
+        RDI = new EventList(EVL_Event);
+        RDI->setGain(0.02F);
+        session->eventlist[CPAP_RDI].push_back(RDI);
+    }
+
+    EventDataType ahi, rdi;
+
+    qint64 ti = first, lastti = first;
+
+    double avgahi = 0;
+    double avgrdi = 0;
+    int cnt = 0;
+
+    double events;
+    double hours = (window_size / 60.0F);
+
+    if (zeroreset) {
+        // I personally don't see the point of resetting each hour.
+        do {
+            // For each window, in 30 second increments
+            for (qint64 t = ti; t < ti + window_size_ms; t += window_step) {
+                if (t > last) {
+                    break;
+                }
+
+                events = session->rangeCount(CPAP_Obstructive, ti, t)
+                         + session->rangeCount(CPAP_Hypopnea, ti, t)
+                         + session->rangeCount(CPAP_ClearAirway, ti, t)
+                         + session->rangeCount(CPAP_Apnea, ti, t);
+
+                ahi = events / hours;
+
+                AHI->AddEvent(t, ahi * 50);
+                avgahi += ahi;
+
+                if (calcrdi) {
+                    events += session->rangeCount(CPAP_RERA, ti, t);
+                    rdi = events / hours;
+                    RDI->AddEvent(t, rdi * 50);
+                    avgrdi += rdi;
+                }
+
+                cnt++;
+            }
+
+            lastti = ti;
+            ti += window_size_ms;
+        } while (ti < last);
+
+    } else {
+        for (ti = first; ti < last; ti += window_step) {
+            f = ti - window_size_ms;
+            //hours=window_size; //double(ti-f)/3600000L;
+
+            events = session->rangeCount(CPAP_Obstructive, f, ti)
+                     + session->rangeCount(CPAP_Hypopnea, f, ti)
+                     + session->rangeCount(CPAP_ClearAirway, f, ti)
+                     + session->rangeCount(CPAP_Apnea, f, ti);
+
+            ahi = events / hours;
+            avgahi += ahi;
+            AHI->AddEvent(ti, ahi * 50);
+
+            if (calcrdi) {
+                events += session->rangeCount(CPAP_RERA, f, ti);
+                rdi = events / hours;
+                RDI->AddEvent(ti, rdi * 50);
+                avgrdi += rdi;
+            }
+
+            cnt++;
+            lastti = ti;
+            ti += window_step;
+        }
+    }
+
+    AHI->AddEvent(last, 0);
+
+    if (calcrdi) {
+        RDI->AddEvent(last, 0);
+    }
+
+    if (!cnt) {
+        avgahi = 0;
+        avgrdi = 0;
+    } else {
+        avgahi /= double(cnt);
+        avgrdi /= double(cnt);
+    }
+
+    cnt++;
+    session->setAvg(CPAP_AHI, avgahi);
+
+    if (calcrdi) {
+        session->setAvg(CPAP_RDI, avgrdi);
+    }
+
+    return cnt;
+}
+struct TimeValue {
+    TimeValue() {
+        time = 0;
+        value = 0;
+    }
+    TimeValue(qint64 t, EventStoreType v) {
+        time = t;
+        value = v;
+    }
+    TimeValue(const TimeValue &copy) {
+        time = copy.time;
+        value = copy.value;
+    }
+    qint64 time;
+    EventStoreType value;
+};
+
+struct zMaskProfile {
+  public:
+    zMaskProfile(MaskType type, QString name);
+    ~zMaskProfile();
+
+    void reset() { pressureleaks.clear(); }
+    void scanLeaks(Session *session);
+    void scanPressure(Session *session);
+    void updatePressureMin();
+    void updateProfile(Session *session);
+
+    void load(Profile *profile);
+    void save();
+
+    QMap<EventStoreType, EventDataType> pressuremax;
+    QMap<EventStoreType, EventDataType> pressuremin;
+    QMap<EventStoreType, EventDataType> pressurecount;
+    QMap<EventStoreType, EventDataType> pressuretotal;
+    QMap<EventStoreType, EventDataType> pressuremean;
+    QMap<EventStoreType, EventDataType> pressurestddev;
+
+    QVector<TimeValue> Pressure;
+
+    EventDataType calcLeak(EventStoreType pressure);
+
+  protected:
+    static const quint32 version = 0;
+    void scanLeakList(EventList *leak);
+    void scanPressureList(Session *session, ChannelID code);
+
+    MaskType    m_type;
+    QString     m_name;
+    Profile      *m_profile;
+    QString     m_filename;
+
+    QMap<EventStoreType, QMap<EventStoreType, quint32> > pressureleaks;
+    EventDataType maxP, minP, maxL, minL, m_factor;
+};
+
+
+bool operator<(const TimeValue &p1, const TimeValue &p2)
+{
+    return p1.time < p2.time;
+}
+
+zMaskProfile::zMaskProfile(MaskType type, QString name)
+    : m_type(type), m_name(name)
+{
+}
+zMaskProfile::~zMaskProfile()
+{
+    save();
+}
+
+void zMaskProfile::load(Profile *profile)
+{
+    m_profile = profile;
+    m_filename = m_profile->Get("{" + STR_GEN_DataFolder + "}/MaskProfile.mp");
+    QFile f(m_filename);
+
+    if (!f.open(QFile::ReadOnly)) {
+        return;
+    }
+
+    QDataStream in(&f);
+    in.setVersion(QDataStream::Qt_4_6);
+    in.setByteOrder(QDataStream::LittleEndian);
+
+    quint32 m, v;
+    in >> m;
+    in >> v;
+
+    if (m != magic) {
+        qDebug() << "Magic wrong in zMaskProfile::load";
+    }
+
+    in >> pressureleaks;
+    f.close();
+}
+void zMaskProfile::save()
+{
+    if (m_filename.isEmpty()) {
+        return;
+    }
+
+    QFile f(m_filename);
+
+    if (!f.open(QFile::WriteOnly)) {
+        return;
+    }
+
+    QDataStream out(&f);
+    out.setVersion(QDataStream::Qt_4_6);
+    out.setByteOrder(QDataStream::LittleEndian);
+
+    out << (quint32)magic;
+    out << (quint32)version;
+
+    out << pressureleaks;
+    f.close();
+}
+
+void zMaskProfile::scanPressureList(Session *session, ChannelID code)
+{
+    QHash<ChannelID, QVector<EventList *> >::iterator it = session->eventlist.find(code);
+
+    if (it == session->eventlist.end()) return;
+
+    int prescnt = session->count(code);
+    Pressure.reserve(Pressure.size() + prescnt);
+
+    QVector<EventList *> &EVL = it.value();
+    int size = EVL.size();
+
+    for (int j = 0; j < size; ++j) {
+        EventList * el = EVL[j];
+
+        qint64 start = el->first();
+        int count = el->count();
+        EventStoreType *dptr = el->rawData();
+        EventStoreType *eptr = dptr + count;
+        quint32 *tptr = el->rawTime();
+        qint64 time;
+        EventStoreType pressure;
+
+        for (; dptr < eptr; dptr++) {
+            time = start + *tptr++;
+            pressure = *dptr;
+            Pressure.push_back(TimeValue(time, pressure));
+        }
+    }
+}
+void zMaskProfile::scanPressure(Session *session)
+{
+    Pressure.clear();
+
+    scanPressureList(session, CPAP_Pressure);
+    scanPressureList(session, CPAP_IPAP);
+
+    qSort(Pressure);
+}
+void zMaskProfile::scanLeakList(EventList *el)
+{
+    // Scans through Leak list, and builds a histogram of each leak value for each pressure.
+
+    qint64 start = el->first();
+    int count = el->count();
+    EventStoreType *dptr = el->rawData();
+    EventStoreType *eptr = dptr + count;
+    quint32 *tptr = el->rawTime();
+    //EventDataType gain=el->gain();
+
+    EventStoreType pressure, leak;
+
+    //EventDataType fleak;
+    QMap<EventStoreType, EventDataType>::iterator pmin;
+    qint64 ti;
+    bool found;
+
+    int psize = Pressure.size();
+    if (psize == 0) return;
+    TimeValue *tvstr = Pressure.data();
+    TimeValue *tvend = tvstr + (psize - 1);
+    TimeValue *p1, *p2;
+
+    // Scan through each leak item in event list
+    for (; dptr < eptr; dptr++) {
+        leak = *dptr;
+        ti = start + *tptr++;
+
+        found = false;
+        pressure = Pressure[0].value;
+
+        if (psize > 1) {
+            // Scan through pressure list to find pressure at this particular leak time
+            for (p1 = tvstr; p1 != tvend; ++p1) {
+                p2 = p1+1;
+
+                if ((p2->time > ti) && (p1->time <= ti)) {
+                    // leak within current pressure range
+                    pressure = p1->value;
+                    found = true;
+                    break;
+                } else if (p2->time == ti) {
+                    // can't remember why a added this condition...
+                    pressure = p2->value;
+                    found = true;
+                    break;
+                }
+
+
+//            for (int i = 0; i < Pressure.size() - 1; i++) {
+//                const TimeValue &p1 = Pressure[i];
+//                const TimeValue &p2 = Pressure[i + 1];
+
+//                if ((p2.time > ti) && (p1.time <= ti)) {
+//                    pressure = p1.value;
+//                    found = true;
+//                    break;
+//                } else if (p2.time == ti) {
+//                    pressure = p2.value;
+//                    found = true;
+//                    break;
+//                }
+            }
+        } else {
+            // were talking CPAP here with no ramp..
+            found = true;
+        }
+
+        if (found) {
+            // update the histogram of leak values for this pressure
+            pressureleaks[pressure][leak]++;
+            //            pmin=pressuremin.find(pressure);
+            //            fleak=EventDataType(leak) * gain;
+            //            if (pmin==pressuremin.end()) {
+            //                pressuremin[pressure]=fleak;
+            //                pressurecount[pressure]=pressureleaks[pressure][leak];
+            //            } else {
+            //                if (pmin.value() > fleak) {
+            //                    pmin.value()=fleak;
+            //                    pressurecount[pressure]=pressureleaks[pressure][leak];
+            //                }
+            //            }
+        }
+    }
+
+
+}
+void zMaskProfile::scanLeaks(Session *session)
+{
+    QHash<ChannelID, QVector<EventList *> >::iterator ELV = session->eventlist.find(CPAP_LeakTotal);
+
+    if (ELV == session->eventlist.end()) return;
+    QVector<EventList *> &elv = ELV.value();
+
+    int size=elv.size();
+    if (!size)
+        return;
+
+    QVector<EventList *>::iterator end = elv.end();
+    QVector<EventList *>::iterator it;
+    for (it = elv.begin(); it != end; ++it) {
+        scanLeakList(*it);
+    }
+}
+void zMaskProfile::updatePressureMin()
+{
+    QMap<EventStoreType, QMap<EventStoreType, quint32> >::iterator it;
+
+    EventStoreType pressure;
+    //EventDataType perc=0.1;
+    //EventDataType tmp,l1,l2;
+    //int idx1, idx2,
+    int lks;
+    double SN;
+    double percentile = 0.40;
+
+    double p = 100.0 * percentile;
+    double nth, nthi;
+
+    int sum1, sum2, w1, w2, N, k;
+
+
+    QMap<EventStoreType, QMap<EventStoreType, quint32> >::iterator plend = pressureleaks.end();
+
+    QMap<EventStoreType, quint32>::iterator lmend;
+    for (it = pressureleaks.begin(); it != plend; it++) {
+        pressure = it.key();
+        QMap<EventStoreType, quint32> &leakmap = it.value();
+        lks = leakmap.size();
+        SN = 0;
+
+        // First sum total counts of all leaks
+        lmend = leakmap.end();
+        for (QMap<EventStoreType, quint32>::iterator lit = leakmap.begin(); lit != lmend; ++lit) {
+            SN += lit.value();
+        }
+
+
+        nth = double(SN) * percentile; // index of the position in the unweighted set would be
+        nthi = floor(nth);
+
+        sum1 = 0, sum2 = 0;
+        w1 = 0, w2 = 0;
+
+        EventDataType v1 = 0, v2;
+
+        N = leakmap.size();
+        k = 0;
+
+        bool found = false;
+        double total = 0;
+
+        // why do this effectively twice? and k = size
+        for (QMap<EventStoreType, quint32>::iterator lit = leakmap.begin(); lit != lmend; ++lit, ++k) {
+            total += lit.value();
+        }
+
+        pressuretotal[pressure] = total;
+
+        for (QMap<EventStoreType, quint32>::iterator lit = leakmap.begin(); lit != lmend; ++lit, ++k) {
+            //for (k=0;k < N;k++) {
+            v1 = lit.key();
+            w1 = lit.value();
+            sum1 += w1;
+
+            if (sum1 > nthi) {
+                pressuremin[pressure] = v1;
+                pressurecount[pressure] = w1;
+                found = true;
+                break;
+            }
+
+            if (sum1 == nthi) {
+                break; // boundary condition
+            }
+        }
+
+        if (found) { continue; }
+
+        if (k >= N) {
+            pressuremin[pressure] = v1;
+            pressurecount[pressure] = w1;
+            continue;
+        }
+
+        v2 = (leakmap.begin() + (k + 1)).key();
+        w2 = (leakmap.begin() + (k + 1)).value();
+        sum2 = sum1 + w2;
+        // value lies between v1 and v2
+
+        double px = 100.0 / double(SN); // Percentile represented by one full value
+
+        // calculate percentile ranks
+        double p1 = px * (double(sum1) - (double(w1) / 2.0));
+        double p2 = px * (double(sum2) - (double(w2) / 2.0));
+
+        // calculate linear interpolation
+        double v = v1 + ((p - p1) / (p2 - p1)) * (v2 - v1);
+        pressuremin[pressure] = v;
+        pressurecount[pressure] = w1;
+
+    }
+}
+
+EventDataType zMaskProfile::calcLeak(EventStoreType pressure)
+{
+    if (maxP == minP) {
+        return pressuremin[pressure];
+    }
+
+    EventDataType leak = (pressure - minP) * (m_factor) + minL;
+    return leak;
+
+}
+
+void zMaskProfile::updateProfile(Session *session)
+{
+    scanPressure(session);
+    scanLeaks(session);
+    updatePressureMin();
+
+
+    if (pressuremin.size() <= 1) {
+        maxP = minP = 0;
+        maxL = minL = 0;
+        m_factor = 0;
+        return;
+    }
+
+    EventDataType p, l, tmp, mean, sum;
+    minP = 250, maxP = 0;
+    minL = 1000, maxL = 0;
+
+    long cnt = 0, vcnt;
+    int n;
+
+    EventDataType maxcnt, maxval, lastval, lastcnt;
+
+
+    QMap<EventStoreType, QMap<EventStoreType, quint32> >::iterator plend = pressureleaks.end();
+    QMap<EventStoreType, QMap<EventStoreType, quint32> >::iterator it = pressureleaks.begin();
+
+    QMap<EventStoreType, quint32>::iterator lit;
+    QMap<EventStoreType, quint32>::iterator lvend;
+    for (; it != plend; ++it) {
+        p = it.key();
+        l = pressuremin[p];
+        QMap<EventStoreType, quint32> &leakval = it.value();
+        cnt = 0;
+        vcnt = -1;
+        n = leakval.size();
+        sum = 0;
+
+        maxcnt = 0, maxval = 0, lastval = 0, lastcnt = 0;
+
+        lvend = leakval.end();
+        for (lit = leakval.begin(); lit != lvend; ++lit) {
+            cnt += lit.value();
+
+            if (lit.value() > maxcnt) {
+                lastcnt = maxcnt;
+                maxcnt = lit.value();
+                lastval = maxval;
+                maxval = lit.key();
+
+            }
+
+            sum += lit.key() * lit.value();
+
+            if (lit.key() == (EventStoreType)l) {
+                vcnt = lit.value();
+            }
+        }
+
+        pressuremean[p] = mean = sum / EventDataType(cnt);
+
+        if (lastval > 0) {
+            maxval = qMax(maxval, lastval); //((maxval*maxcnt)+(lastval*lastcnt)) / (maxcnt+lastcnt);
+        }
+
+        pressuremax[p] = lastval;
+        sum = 0;
+
+        for (lit = leakval.begin(); lit != lvend; lit++) {
+            tmp = lit.key() - mean;
+            sum += tmp * tmp;
+        }
+
+        pressurestddev[p] = tmp = sqrt(sum / EventDataType(n));
+
+        if (vcnt >= 0) {
+            tmp = 1.0 / EventDataType(cnt) * EventDataType(vcnt);
+
+        }
+    }
+
+    QMap<EventStoreType, EventDataType> pressureval;
+    QMap<EventStoreType, EventDataType> pressureval2;
+    EventDataType max = 0, tmp2, tmp3;
+
+    QMap<EventStoreType, EventDataType>::iterator ptit;
+    QMap<EventStoreType, EventDataType>::iterator ptend = pressuretotal.end();
+    for (ptit = pressuretotal.begin(); ptit != ptend; ++ptit) {
+        if (max < ptit.value()) { max = ptit.value(); }
+    }
+
+    for (ptit = pressuretotal.begin(); ptit != pressuretotal.end(); ptit++) {
+        p = ptit.key();
+        tmp = pressurecount[p];
+        tmp2 = ptit.value();
+
+        tmp3 = (tmp / tmp2) * (tmp2 / max);
+
+        if (tmp3 > 0.05) {
+            tmp = pressuremean[p];
+
+            if (tmp > 0) {
+                pressureval[p] = tmp; // / tmp2;
+
+                if (p < minP) { minP = p; }
+
+                if (p > maxP) { maxP = p; }
+
+                if (tmp < minL) { minL = tmp; }
+
+                if (tmp > maxL) { maxL = tmp; }
+            }
+        }
+    }
+
+    if ((maxP == minP)  || (minL == maxL) || (minP == 250) || (minL == 1000)) {
+        // crappy data set
+        maxP = minP = 0;
+        maxL = minL = 0;
+        m_factor = 0;
+        return;
+    }
+
+    m_factor = (maxL - minL) / (maxP - minP);
+
+    //    for (QMap<EventStoreType, EventDataType>::iterator it=pressuremin.begin();it!=pressuremin.end()-1;it++) {
+    //        p1=it.key();
+    //        p2=(it+1).key();
+    //        l1=it.value();
+    //        l2=(it+1).value();
+    //        if (l2 > l1) {
+    //            factor=(l2 - l1) / (p2 - p1);
+    //            sum+=factor;
+    //            cnt++;
+    //        }
+    //    }
+
+    //    m_factor=sum/double(cnt);
+
+    //    int i=0;
+    //    if (i==1) {
+    //        QFile f("/home/mark/leaks.csv");
+    //        f.open(QFile::WriteOnly);
+    //        QTextStream out(&f);
+    //        EventDataType p,l,c;
+    //        QString fmt;
+    //        for (QMap<EventStoreType, EventDataType>::iterator it=pressuremin.begin();it!=pressuremin.end();it++) {
+    //            p=EventDataType(it.key()/10.0);
+    //            l=it.value();
+    //            fmt=QString("%1,%2\n").arg(p,0,'f',1).arg(l);
+    //            out << fmt;
+    //        }
+
+    // cruft
+    //        for (QMap<EventStoreType, QMap<EventStoreType,quint32> >::iterator it=pressureleaks.begin();it!=pressureleaks.end();it++)  {
+    //            QMap<EventStoreType,quint32> & leakval=it.value();
+    //            for (QMap<EventStoreType,quint32>::iterator lit=leakval.begin();lit!=leakval.end();lit++) {
+    //                l=lit.key();
+    //                c=lit.value();
+    //                fmt=QString("%1,%2,%3\n").arg(p,0,'f',2).arg(l).arg(c);
+    //                out << fmt;
+    //            }
+    //        }
+    //        f.close();
+    //    }
+}
+
+
+void flagLargeLeaks(Session *session)
+{
+    // Already contains?
+    if (session->eventlist.contains(CPAP_LargeLeak))
+        return;
+
+    if (!session->eventlist.contains(CPAP_Leak))
+        return;
+
+    EventDataType threshold = p_profile->cpap->leakRedline();
+
+    if (threshold <= 0) {
+        return;
+    }
+
+
+    QVector<EventList *> & EVL = session->eventlist[CPAP_Leak];
+    int evlsize = EVL.size();
+
+    if (evlsize == 0)
+        return;
+
+    EventList * LL = nullptr;
+    qint64 time = 0;
+    EventDataType lastvalue;
+    qint64 leaktime;
+    for (int ec = 0; ec < evlsize; ++ec) {
+        EventList &el = *EVL[ec];
+        int count = el.count();
+        if (!count) continue;
+
+        leaktime = 0;
+        EventDataType leakvalue = 0;
+        lastvalue = -1;
+
+
+        for (int i=0; i < count; ++i) {
+            time = el.time(i);
+            EventDataType value = el.data(i);
+            if (value >= threshold) {
+                if (lastvalue < threshold) {
+                    leaktime = time;
+                    leakvalue = value;
+                }
+            } else if (lastvalue > threshold) {
+                if (!LL) {
+                    LL=session->AddEventList(CPAP_LargeLeak, EVL_Event);
+                }
+                int duration = (time - leaktime) / 1000L;
+                LL->AddEvent(time, duration);
+            }
+            lastvalue = value;
+        }
+
+    }
+
+    if (lastvalue > threshold) {
+        if (!LL) {
+            LL=session->AddEventList(CPAP_LargeLeak, EVL_Event);
+        }
+        int duration = (time - leaktime) / 1000L;
+        LL->AddEvent(time, duration);
+    }
+}
+
+QMutex zMaskmutex;
+zMaskProfile mmaskProfile(Mask_NasalPillows, "ResMed Swift FX");
+bool mmaskFirst = true;
+
+int calcLeaks(Session *session)
+{
+
+    if (session->type() != MT_CPAP) { return 0; }
+
+    if (session->eventlist.contains(CPAP_Leak)) { return 0; } // abort if already there
+
+    if (!session->eventlist.contains(CPAP_LeakTotal)) { return 0; } // can't calculate without this..
+
+    zMaskmutex.lock();
+    zMaskProfile *maskProfile = &mmaskProfile;
+
+    if (mmaskFirst) {
+        mmaskFirst = false;
+        maskProfile->load(p_profile);
+    }
+
+    //    if (!maskProfile) {
+    //        maskProfile=new zMaskProfile(Mask_NasalPillows,"ResMed Swift FX");
+    //    }
+    maskProfile->reset();
+    maskProfile->updateProfile(session);
+
+    EventList *leak = session->AddEventList(CPAP_Leak, EVL_Event, 1);
+
+    QVector<EventList *> & EVL = session->eventlist[CPAP_LeakTotal];
+    int evlsize = EVL.size();
+
+    TimeValue *p2, *pstr, *pend;
+
+    // can this go out of the loop?
+    int mppressize = maskProfile->Pressure.size();
+    pstr = maskProfile->Pressure.data();
+    pend = maskProfile->Pressure.data()+(mppressize-1);
+
+    for (int i = 0; i < evlsize; ++i) {
+        EventList &el = *EVL[i];
+        EventDataType gain = el.gain(), tmp, val;
+        int count = el.count();
+        EventStoreType *dptr = el.rawData();
+        EventStoreType *eptr = dptr + count;
+        quint32 *tptr = el.rawTime();
+        qint64 start = el.first(), ti;
+        EventStoreType pressure;
+        tptr = el.rawTime();
+        start = el.first();
+
+        bool found;
+
+        for (; dptr < eptr; ++dptr) {
+            tmp = EventDataType(*dptr) * gain;
+            ti = start + *tptr++;
+
+            found = false;
+            pressure = pstr->value;
+
+            for (TimeValue *p1 = pstr; p1 != pend; ++p1) {
+                p2 = p1+1;
+                if ((p2->time > ti) && (p1->time <= ti)) {
+                    pressure = p1->value;
+                    found = true;
+                    break;
+                } else if (p2->time == ti) {
+                    pressure = p2->value;
+                    found = true;
+                    break;
+                }
+            }
+
+//            for (int i = 0; i < mppressize - 1; ++i) {
+//                const TimeValue &p1 = &maskProfile->Pressure[i];
+//                const TimeValue &p2 = maskProfile->Pressure[i + 1];
+
+//                if ((p2.time > ti) && (p1.time <= ti)) {
+//                    pressure = p1.value;
+//                    found = true;
+//                    break;
+//                } else if (p2.time == ti) {
+//                    pressure = p2.value;
+//                    found = true;
+//                    break;
+//                }
+//            }
+
+            if (found) {
+                val = tmp - maskProfile->calcLeak(pressure);
+
+                if (val < 0) {
+                    val = 0;
+                }
+
+                leak->AddEvent(ti, val);
+            }
+        }
+    }
+
+    zMaskmutex.unlock();
+
+    return leak->count();
+}
+
+
+int calcPulseChange(Session *session)
+{
+    if (session->eventlist.contains(OXI_PulseChange)) { return 0; }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator it = session->eventlist.find(OXI_Pulse);
+
+    if (it == session->eventlist.end()) { return 0; }
+
+    EventDataType val, val2, change, tmp;
+    qint64 time, time2;
+    qint64 window = p_profile->oxi->pulseChangeDuration();
+    window *= 1000;
+
+    change = p_profile->oxi->pulseChangeBPM();
+
+    EventList *pc = new EventList(EVL_Event, 1, 0, 0, 0, 0, true);
+    pc->setFirst(session->first(OXI_Pulse));
+    qint64 lastt;
+    EventDataType lv = 0;
+    int li = 0;
+
+    int max;
+
+    int size = it.value().size();
+    for (int e = 0; e < size; ++e) {
+        EventList &el = *(it.value()[e]);
+
+        int elcount=el.count();
+        for (int i = 0; i < elcount; ++i) {
+            val = el.data(i);
+            time = el.time(i);
+
+
+            lastt = 0;
+            lv = change;
+            max = 0;
+
+            for (int j = i + 1; j < elcount; ++j) { // scan ahead in the window
+                time2 = el.time(j);
+
+                if (time2 > time + window) { break; }
+
+                val2 = el.data(j);
+                tmp = qAbs(val2 - val);
+
+                if (tmp > lv) {
+                    lastt = time2;
+
+                    if (tmp > max) { max = tmp; }
+
+                    //lv=tmp;
+                    li = j;
+                }
+            }
+
+            if (lastt > 0) {
+                qint64 len = (lastt - time) / 1000.0;
+                pc->AddEvent(lastt, len, tmp);
+                i = li;
+
+            }
+        }
+    }
+
+    if (pc->count() == 0) {
+        delete pc;
+        return 0;
+    }
+
+    session->eventlist[OXI_PulseChange].push_back(pc);
+    session->setMin(OXI_PulseChange, pc->Min());
+    session->setMax(OXI_PulseChange, pc->Max());
+    session->setCount(OXI_PulseChange, pc->count());
+    session->setFirst(OXI_PulseChange, pc->first());
+    session->setLast(OXI_PulseChange, pc->last());
+    return pc->count();
+}
+
+
+int calcSPO2Drop(Session *session)
+{
+    if (session->eventlist.contains(OXI_SPO2Drop)) { return 0; }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator it = session->eventlist.find(OXI_SPO2);
+
+    if (it == session->eventlist.end()) { return 0; }
+
+    EventDataType val, val2, change, tmp;
+    qint64 time, time2;
+    qint64 window = p_profile->oxi->spO2DropDuration();
+    window *= 1000;
+    change = p_profile->oxi->spO2DropPercentage();
+
+    EventList *pc = new EventList(EVL_Event, 1, 0, 0, 0, 0, true);
+    qint64 lastt;
+    EventDataType lv = 0;
+    int li = 0;
+
+    // Fix me.. Time scale varies.
+    //const unsigned ringsize=30;
+    //EventDataType ring[ringsize]={0};
+    //qint64 rtime[ringsize]={0};
+    //int rp=0;
+    int min;
+    int cnt = 0;
+    tmp = 0;
+
+    qint64 start = 0;
+
+    // Calculate median baseline
+    QList<EventDataType> med;
+
+    int evsize = it.value().size();
+    for (int e = 0; e < evsize; ++e) {
+        EventList &el = *(it.value()[e]);
+
+        int elcount = el.count();
+        for (int i = 0; i < elcount; i++) {
+            val = el.data(i);
+            time = el.time(i);
+
+            if (val > 0) { med.push_back(val); }
+
+            if (!start) { start = time; }
+
+            if (time > start + 3600000) { break; } // just look at the first hour
+
+            tmp += val;
+            cnt++;
+        }
+    }
+
+    EventDataType baseline = 0;
+
+    if (med.size() > 0) {
+        qSort(med);
+
+        int midx = float(med.size()) * 0.90;
+
+        if (midx > med.size() - 1) { midx = med.size() - 1; }
+
+        if (midx < 0) { midx = 0; }
+
+        baseline = med[midx];
+    }
+
+    session->settings[OXI_SPO2Drop] = baseline;
+    //EventDataType baseline=round(tmp/EventDataType(cnt));
+    EventDataType current;
+    qDebug() << "Calculated baseline" << baseline;
+
+    for (int e = 0; e < evsize; ++e) {
+        EventList &el = *(it.value()[e]);
+
+        int elcount = el.count();
+        for (int i = 0; i < elcount; ++i) {
+            current = el.data(i);
+
+            if (!current) { continue; }
+
+            time = el.time(i);
+            /*ring[rp]=val;
+            rtime[rp]=time;
+            rp++;
+            rp=rp % ringsize;
+            if (i<ringsize)  {
+                for (unsigned j=i;j<ringsize;j++) {
+                    ring[j]=val;
+                    rtime[j]=0;
+                }
+            }
+            tmp=0;
+            cnt=0;
+            for (unsigned j=0;j<ringsize;j++) {
+                if (rtime[j] > time-300000) {  // only look at recent entries..
+                    tmp+=ring[j];
+                    cnt++;
+                }
+            }
+            if (!cnt) {
+                unsigned j=abs((rp-1) % ringsize);
+                tmp=(ring[j]+val)/2;
+            } else tmp/=EventDataType(cnt); */
+
+            val = baseline;
+            lastt = 0;
+            lv = val;
+
+
+            min = val;
+
+            for (int j = i; j < elcount; ++j) { // scan ahead in the window
+                time2 = el.time(j);
+                //if (time2 > time+window) break;
+                val2 = el.data(j);
+
+                if (val2 > baseline - change) { break; }
+
+                lastt = time2;
+                li = j + 1;
+            }
+
+            if (lastt > 0) {
+                qint64 len = (lastt - time);
+
+                if (len >= window) {
+                    pc->AddEvent(lastt, len / 1000, val - min);
+                    i = li;
+                }
+            }
+        }
+    }
+
+    if (pc->count() == 0) {
+        delete pc;
+        return 0;
+    }
+
+    session->eventlist[OXI_SPO2Drop].push_back(pc);
+    session->setMin(OXI_SPO2Drop, pc->Min());
+    session->setMax(OXI_SPO2Drop, pc->Max());
+    session->setCount(OXI_SPO2Drop, pc->count());
+    session->setFirst(OXI_SPO2Drop, pc->first());
+    session->setLast(OXI_SPO2Drop, pc->last());
+    return pc->count();
+}
diff --git a/sleepyhead/SleepLib/calcs.h b/sleepyhead/SleepLib/calcs.h
new file mode 100644
index 0000000..b4eba75
--- /dev/null
+++ b/sleepyhead/SleepLib/calcs.h
@@ -0,0 +1,164 @@
+/* Custom CPAP/Oximetry Calculations Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef CALCS_H
+#define CALCS_H
+
+#include "day.h"
+
+//! param samples Number of samples
+//! width number of surrounding samples to consider
+//! percentile fractional percentage, between 0 and 1
+void percentileFilter(EventDataType *input, EventDataType *output, int samples, int width,
+                      EventDataType percentile);
+void xpassFilter(EventDataType *input, EventDataType *output, int samples, EventDataType weight);
+
+enum FilterType { FilterNone = 0, FilterPercentile, FilterXPass };
+
+struct Filter {
+    Filter(FilterType t, EventDataType p1, EventDataType p2, EventDataType p3) {
+        type = t;
+        param1 = p1;
+        param2 = p2;
+        param3 = p3;
+    }
+    Filter() {
+        type = FilterNone;
+        param1 = 0;
+        param2 = 0;
+        param3 = 0;
+    }
+    Filter(const Filter &copy) {
+        type = copy.type;
+        param1 = copy.param1;
+        param2 = copy.param2;
+        param3 = copy.param3;
+    }
+
+    FilterType type;
+    EventDataType param1;
+    EventDataType param2;
+    EventDataType param3;
+};
+
+struct BreathPeak {
+    BreathPeak() { min = 0; max = 0; start = 0; middle = 0; end = 0; } // peakmin=0; peakmax=0;  }
+    BreathPeak(EventDataType _min, EventDataType _max, qint32 _start, qint32 _middle,
+               qint32 _end) {//, qint64 _peakmin, qint64 _peakmax) {
+        min = _min;
+        max = _max;
+        start = _start;
+        middle = _middle;
+        end = _end;
+        //peakmax=_peakmax;
+        //peakmin=_peakmin;
+    }
+    BreathPeak(const BreathPeak &copy) {
+        min = copy.min;
+        max = copy.max;
+        start = copy.start;
+        middle = copy.middle;
+        end = copy.end;
+        //peakmin=copy.peakmin;
+        //peakmax=copy.peakmax;
+    }
+    int samplelength() { return end - start; }
+    int upperLength() { return middle - start; }
+    int lowerLength() { return end - middle; }
+
+    EventDataType min;   // peak value
+    EventDataType max;   // peak value
+    qint32 start;       // beginning zero cross
+    qint32 middle;         // ending zero cross
+    qint32 end;         // ending zero cross
+    //qint64 peakmin;     // min peak index
+    //qint64 peakmax;     // max peak index
+};
+
+bool operator<(const BreathPeak &p1, const BreathPeak &p2);
+
+const int num_filter_buffers = 2;
+
+const int max_filter_buf_size = 2097152 * sizeof(EventDataType);
+
+//! \brief Class to process Flow Rate waveform data
+class FlowParser
+{
+  public:
+    FlowParser();
+    ~FlowParser();
+
+    //! \brief Clears the (input) filter chain
+    void clearFilters();
+
+    //! \brief Applies the filter chain to input, with supplied number of samples
+    EventDataType *applyFilters(EventDataType *input, int samples);
+
+    //! \brief Add the filter
+    void addFilter(FilterType ft, EventDataType p1 = 0, EventDataType p2 = 0, EventDataType p3 = 0) {
+        m_filters.push_back(Filter(ft, p1, p2, p3));
+    }
+    //! \brief Opens the flow rate EventList, applies the input filter chain, and calculates peaks
+    void openFlow(Session *session, EventList *flow);
+
+    //! \brief Calculates the upper and lower breath peaks
+    void calcPeaks(EventDataType *input, int samples);
+
+    // Minute vent needs Resp & TV calcs made here..
+    void calc(bool calcResp, bool calcTv, bool calcTi, bool calcTe, bool calcMv);
+    void flagEvents();
+    void flagUserEvents(ChannelID code, EventDataType restriction, EventDataType duration);
+
+    /*void calcTidalVolume();
+    void calcRespRate();
+    void calcMinuteVent(); */
+
+
+    QList<Filter> m_filters;
+  protected:
+    QVector<BreathPeak> breaths;
+
+    int m_samples;
+    EventList *m_flow;
+    Session *m_session;
+    EventDataType m_gain;
+    EventDataType m_rate;
+    EventDataType m_minutes;
+    //! \brief The filtered waveform
+    EventDataType *m_filtered;
+    //! \brief BreathPeak's start on positive cycle?
+    bool m_startsUpper;
+  private:
+    EventDataType *m_buffers[num_filter_buffers];
+};
+
+bool SearchApnea(Session *session, qint64 time, double dur);
+
+//! \brief Calculate Respiratory Rate, Tidal Volume & Minute Ventilation for PRS1 data
+void calcRespRate(Session *session, FlowParser *flowparser = nullptr);
+
+//! \brief Calculates the sliding window AHI graph
+int calcAHIGraph(Session *session);
+
+//! \brief Calculates AHI for a session between start & end (a support function for the sliding window graph)
+EventDataType calcAHI(Session *session, qint64 start = -1, qint64 end = -1);
+
+//! \brief Scans for leaks over Redline and flags as large leaks, unless machine provided them already
+void flagLargeLeaks(Session *session);
+
+//! \brief Leaks calculations for PRS1
+int calcLeaks(Session *session);
+
+//! \brief Calculate Pulse change flagging, according to preferences
+int calcPulseChange(Session *session);
+
+//! \brief Calculate SPO2 Drop flagging, according to preferences
+int calcSPO2Drop(Session *session);
+
+
+#endif // CALCS_H
diff --git a/sleepyhead/SleepLib/common.cpp b/sleepyhead/SleepLib/common.cpp
new file mode 100644
index 0000000..e58ed01
--- /dev/null
+++ b/sleepyhead/SleepLib/common.cpp
@@ -0,0 +1,621 @@
+/* SleepLib Common Functions
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QDateTime>
+#include <QDir>
+#include <zlib.h>
+
+#include "profiles.h"
+
+// Used by internal settings
+
+
+const QString getDeveloperName()
+{
+    return STR_DeveloperName;
+}
+
+const QString getAppName()
+{
+    QString name = STR_AppName;
+#ifdef TEST_BUILD
+    name += STR_TestBuild;
+#endif
+    return name;
+}
+
+const QString getDefaultAppRoot()
+{
+    QString approot = STR_AppRoot;
+#ifdef TEST_BUILD
+    approot += STR_TestBuild;
+#endif
+    return approot;
+}
+
+
+qint64 timezoneOffset()
+{
+    static bool ok = false;
+    static qint64 _TZ_offset = 0;
+
+    if (ok) { return _TZ_offset; }
+
+    QDateTime d1 = QDateTime::currentDateTime();
+    QDateTime d2 = d1;
+    d1.setTimeSpec(Qt::UTC);
+    _TZ_offset = d2.secsTo(d1);
+    _TZ_offset *= 1000L;
+    return _TZ_offset;
+}
+
+QString weightString(float kg, UnitSystem us)
+{
+    if (us == US_Undefined) {
+        us = p_profile->general->unitSystem();
+    }
+
+    if (us == US_Metric) {
+        return QString("%1kg").arg(kg, 0, 'f', 2);
+    } else if (us == US_Archiac) {
+        int oz = (kg * 1000.0) / (float)ounce_convert;
+        int lb = oz / 16.0;
+        oz = oz % 16;
+        return QString("%1lb %2oz").arg(lb, 0, 10).arg(oz);
+    }
+
+    return ("Bad UnitSystem");
+}
+
+bool operator <(const ValueCount &a, const ValueCount &b)
+{
+    return a.value < b.value;
+}
+
+bool removeDir(const QString &path)
+{
+    bool result = true;
+    QDir dir(path);
+
+    if (dir.exists(path)) {
+        Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot | QDir::System | QDir::Hidden  |
+                  QDir::AllDirs | QDir::Files, QDir::DirsFirst)) {
+            if (info.isDir()) { // Recurse to remove this child directory
+                result = removeDir(info.absoluteFilePath());
+            } else { // File
+                result = QFile::remove(info.absoluteFilePath());
+            }
+
+            if (!result) {
+                return result;
+            }
+        }
+        result = dir.rmdir(path);
+    }
+
+    return result;
+}
+
+void copyPath(QString src, QString dst)
+{
+    QDir dir(src);
+    if (!dir.exists())
+        return;
+
+    // Recursively handle directories
+    foreach (QString d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
+        QString dst_path = dst + QDir::separator() + d;
+        dir.mkpath(dst_path);
+        copyPath(src + QDir::separator() + d, dst_path);
+    }
+
+    // Files
+    foreach (QString f, dir.entryList(QDir::Files)) {
+        QString srcFile = src + QDir::separator() + f;
+        QString destFile = dst + QDir::separator() + f;
+
+        if (!QFile::exists(destFile)) {
+            QFile::copy(srcFile, destFile);
+        }
+    }
+}
+
+
+
+QString STR_UNIT_CM;
+QString STR_UNIT_INCH;
+QString STR_UNIT_FOOT;
+QString STR_UNIT_POUND;
+QString STR_UNIT_OUNCE;
+QString STR_UNIT_KG;
+QString STR_UNIT_CMH2O;
+QString STR_UNIT_Hours;
+QString STR_UNIT_Minutes;
+QString STR_UNIT_Seconds;
+QString STR_UNIT_BPM;       // Beats per Minute
+QString STR_UNIT_LPM;       // Litres per Minute
+QString STR_UNIT_ml;        // MilliLitres
+QString STR_UNIT_Litres;
+QString STR_UNIT_Hz;
+QString STR_UNIT_EventsPerHour;
+QString STR_UNIT_BreathsPerMinute;
+QString STR_UNIT_Percentage;
+QString STR_UNIT_Unknown;
+QString STR_UNIT_Ratio;
+QString STR_UNIT_Severity;
+QString STR_UNIT_Degrees;
+
+QString STR_MessageBox_Question;
+QString STR_MessageBox_Error;
+QString STR_MessageBox_Warning;
+QString STR_MessageBox_Information;
+QString STR_MessageBox_Busy;
+QString STR_MessageBox_PleaseNote;
+QString STR_MessageBox_Yes;
+QString STR_MessageBox_No;
+QString STR_MessageBox_Cancel;
+QString STR_MessageBox_Destroy;
+QString STR_MessageBox_Save;
+
+QString STR_Empty_NoData;
+QString STR_Empty_Brick;
+QString STR_Empty_NoGraphs;
+QString STR_Empty_SummaryOnly;
+QString STR_Empty_NoSessions;
+
+
+QString STR_TR_BMI;         // Short form of Body Mass Index
+QString STR_TR_Weight;
+QString STR_TR_Zombie;
+QString STR_TR_PulseRate;   // Pulse / Heart rate
+QString STR_TR_SpO2;
+QString STR_TR_Plethy;      // Plethysomogram
+QString STR_TR_Pressure;
+
+QString STR_TR_Daily;
+QString STR_TR_Overview;
+QString STR_TR_Oximetry;
+
+QString STR_TR_Oximeter;
+QString STR_TR_EventFlags;
+
+QString STR_TR_Inclination;
+QString STR_TR_Orientation;
+
+
+// Machine type names.
+QString STR_TR_CPAP;    // Constant Positive Airway Pressure
+QString STR_TR_BIPAP;   // Bi-Level Positive Airway Pressure
+QString STR_TR_BiLevel; // Another name for BiPAP
+QString STR_TR_EPAP;    // Expiratory Positive Airway Pressure
+QString STR_TR_EPAPLo;  // Expiratory Positive Airway Pressure, Low
+QString STR_TR_EPAPHi;  // Expiratory Positive Airway Pressure, High
+QString STR_TR_IPAP;    // Inspiratory Positive Airway Pressure
+QString STR_TR_IPAPLo;  // Inspiratory Positive Airway Pressure, Low
+QString STR_TR_IPAPHi;  // Inspiratory Positive Airway Pressure, High
+QString STR_TR_APAP;    // Automatic Positive Airway Pressure
+QString STR_TR_ASV;     // Assisted Servo Ventilator
+QString STR_TR_STASV;
+
+QString STR_TR_Humidifier;
+
+QString STR_TR_H;       // Short form of Hypopnea
+QString STR_TR_OA;      // Short form of Obstructive Apnea
+QString STR_TR_UA;      // Short form of Unspecified Apnea
+QString STR_TR_CA;      // Short form of Clear Airway Apnea
+QString STR_TR_FL;      // Short form of Flow Limitation
+QString STR_TR_SA;      // Short form of SensAwake
+QString STR_TR_LE;      // Short form of Leak Event
+QString STR_TR_EP;      // Short form of Expiratory Puff
+QString STR_TR_VS;      // Short form of Vibratory Snore
+QString STR_TR_VS2;     // Short form of Secondary Vibratory Snore (Some Philips Respironics Machines have two sources)
+QString STR_TR_RERA;    // Acronym for Respiratory Effort Related Arousal
+QString STR_TR_PP;      // Short form for Pressure Pulse
+QString STR_TR_P;       // Short form for Pressure Event
+QString STR_TR_RE;      // Short form of Respiratory Effort Related Arousal
+QString STR_TR_NR;      // Short form of Non Responding event? (forgot sorry)
+QString STR_TR_NRI;     // Sorry I Forgot.. it's a flag on Intellipap machines
+QString STR_TR_O2;      // SpO2 Desaturation
+QString STR_TR_PC;      // Short form for Pulse Change
+QString STR_TR_UF1;     // Short form for User Flag 1
+QString STR_TR_UF2;     // Short form for User Flag 2
+QString STR_TR_UF3;     // Short form for User Flag 3
+
+
+
+QString STR_TR_PS;     // Short form of Pressure Support
+QString STR_TR_AHI;    // Short form of Apnea Hypopnea Index
+QString STR_TR_RDI;    // Short form of Respiratory Distress Index
+QString STR_TR_AI;     // Short form of Apnea Index
+QString STR_TR_HI;     // Short form of Hypopnea Index
+QString STR_TR_UAI;    // Short form of Uncatagorized Apnea Index
+QString STR_TR_CAI;    // Short form of Clear Airway Index
+QString STR_TR_FLI;    // Short form of Flow Limitation Index
+//QString STR_TR_SAI;    // Short form of SensAwake Index
+QString STR_TR_REI;    // Short form of RERA Index
+QString STR_TR_EPI;    // Short form of Expiratory Puff Index
+QString STR_TR_CSR;    // Short form of Cheyne Stokes Respiration
+QString STR_TR_PB;     // Short form of Periodic Breathing
+
+
+// Graph Titles
+QString STR_TR_IE;              // Inspiratory Expiratory Ratio
+QString STR_TR_InspTime;        // Inspiratory Time
+QString STR_TR_ExpTime;         // Expiratory Time
+QString STR_TR_RespEvent;       // Respiratory Event
+QString STR_TR_FlowLimitation;
+QString STR_TR_FlowLimit;
+//QString STR_TR_FlowLimitation;
+QString STR_TR_SensAwake;
+QString STR_TR_PatTrigBreath;   // Patient Triggered Breath
+QString STR_TR_TgtMinVent;      // Target Minute Ventilation
+QString STR_TR_TargetVent;      // Target Ventilation
+QString STR_TR_MinuteVent;      // Minute Ventilation
+QString STR_TR_TidalVolume;
+QString STR_TR_RespRate;        // Respiratory Rate
+QString STR_TR_Snore;
+QString STR_TR_Leak;
+QString STR_TR_Leaks;
+QString STR_TR_LargeLeak;
+QString STR_TR_LL;
+QString STR_TR_TotalLeaks;
+QString STR_TR_UnintentionalLeaks;
+QString STR_TR_MaskPressure;
+QString STR_TR_FlowRate;
+QString STR_TR_SleepStage;
+QString STR_TR_Usage;
+QString STR_TR_Sessions;
+QString STR_TR_PrRelief; // Pressure Relief
+
+QString STR_TR_Bookmarks;
+QString STR_TR_SleepyHead;
+
+QString STR_TR_Mode;
+QString STR_TR_Model;
+QString STR_TR_Brand;
+QString STR_TR_Serial;
+QString STR_TR_Series;
+QString STR_TR_Machine;
+QString STR_TR_Channel;
+QString STR_TR_Settings;
+
+QString STR_TR_Name;
+QString STR_TR_DOB;    // Date of Birth
+QString STR_TR_Phone;
+QString STR_TR_Address;
+QString STR_TR_Email;
+QString STR_TR_PatientID;
+QString STR_TR_Date;
+
+QString STR_TR_BedTime;
+QString STR_TR_WakeUp;
+QString STR_TR_MaskTime;
+QString STR_TR_Unknown;
+QString STR_TR_None;
+QString STR_TR_Ready;
+
+QString STR_TR_First;
+QString STR_TR_Last;
+QString STR_TR_Start;
+QString STR_TR_End;
+QString STR_TR_On;
+QString STR_TR_Off;
+QString STR_TR_Yes;
+QString STR_TR_No;
+
+QString STR_TR_Min;    // Minimum
+QString STR_TR_Max;    // Maximum
+QString STR_TR_Med;    // Median
+
+QString STR_TR_Average;
+QString STR_TR_Median;
+QString STR_TR_Avg;    // Short form of Average
+QString STR_TR_WAvg;   // Short form of Weighted Average
+
+void initializeStrings()
+{
+    STR_UNIT_CM = QObject::tr("cm");
+    STR_UNIT_INCH = QObject::tr("\"");
+    STR_UNIT_FOOT = QObject::tr("ft");
+    STR_UNIT_POUND = QObject::tr("lb");
+    STR_UNIT_OUNCE = QObject::tr("oz");
+    STR_UNIT_KG = QObject::tr("Kg");
+    STR_UNIT_CMH2O = QObject::tr("cmH2O");
+    STR_UNIT_Hours = QObject::tr("Hours");
+    STR_UNIT_Minutes = QObject::tr("Minutes");
+    STR_UNIT_Seconds = QObject::tr("Seconds");
+    STR_UNIT_EventsPerHour = QObject::tr("Events/hr"); // Events per hour
+    STR_UNIT_Percentage = QObject::tr("%");
+    STR_UNIT_Hz = QObject::tr("Hz");          // Hertz
+    STR_UNIT_BPM = QObject::tr("bpm");        // Beats per Minute
+    STR_UNIT_LPM = QObject::tr("L/min");      // Litres per Minute
+    STR_UNIT_Litres = QObject::tr("Litres");
+    STR_UNIT_ml = QObject::tr("ml");        // millilitres
+    STR_UNIT_BreathsPerMinute = QObject::tr("Breaths/min"); // Breaths per minute
+    STR_UNIT_Unknown = QObject::tr("?");
+    STR_UNIT_Ratio = QObject::tr("ratio");
+    STR_UNIT_Severity = QObject::tr("Severity (0-1)");
+    STR_UNIT_Degrees = QObject::tr("Degrees");
+
+    STR_MessageBox_Question = QObject::tr("Question");
+    STR_MessageBox_Error = QObject::tr("Error");
+    STR_MessageBox_Warning = QObject::tr("Warning");
+    STR_MessageBox_Information = QObject::tr("Information");
+    STR_MessageBox_Busy = QObject::tr("Busy");
+    STR_MessageBox_PleaseNote = QObject::tr("Please Note");
+
+    STR_Empty_NoData = QObject::tr("No Data Available");
+    STR_Empty_Brick = QObject::tr("Compliance Only :(");
+    STR_Empty_NoGraphs = QObject::tr("Graphs Switched Off");
+    STR_Empty_SummaryOnly = QObject::tr("Summary Only :(");
+    STR_Empty_NoSessions = QObject::tr("Sessions Switched Off");
+
+
+    // Dialog box options
+    STR_MessageBox_Yes = QObject::tr("&Yes");
+    STR_MessageBox_No = QObject::tr("&No");
+    STR_MessageBox_Cancel = QObject::tr("&Cancel");
+    STR_MessageBox_Destroy = QObject::tr("&Destroy");;
+    STR_MessageBox_Save = QObject::tr("&Save");
+
+    STR_TR_BMI = QObject::tr("BMI");              // Short form of Body Mass Index
+    STR_TR_Weight = QObject::tr("Weight");
+    STR_TR_Zombie = QObject::tr("Zombie");
+    STR_TR_PulseRate = QObject::tr("Pulse Rate"); // Pulse / Heart rate
+    STR_TR_SpO2 = QObject::tr("SpO2");
+    STR_TR_Plethy = QObject::tr("Plethy");        // Plethysomogram
+    STR_TR_Pressure = QObject::tr("Pressure");
+
+    STR_TR_Daily = QObject::tr("Daily");
+    STR_TR_Overview = QObject::tr("Overview");
+    STR_TR_Oximetry = QObject::tr("Oximetry");
+
+    STR_TR_Oximeter = QObject::tr("Oximeter");
+    STR_TR_EventFlags = QObject::tr("Event Flags");
+
+    // Machine type names.
+    STR_TR_CPAP = QObject::tr("CPAP");    // Constant Positive Airway Pressure
+    STR_TR_BIPAP = QObject::tr("BiPAP");  // Bi-Level Positive Airway Pressure
+    STR_TR_BiLevel = QObject::tr("Bi-Level"); // Another name for BiPAP
+    STR_TR_EPAP = QObject::tr("EPAP");    // Expiratory Positive Airway Pressure
+    STR_TR_EPAPLo = QObject::tr("Min EPAP"); // Lower Expiratory Positive Airway Pressure
+    STR_TR_EPAPHi = QObject::tr("Max EPAP"); // Higher Expiratory Positive Airway Pressure
+    STR_TR_IPAP = QObject::tr("IPAP");    // Inspiratory Positive Airway Pressure
+    STR_TR_IPAPLo = QObject::tr("Min IPAP"); // Lower Inspiratory Positive Airway Pressure
+    STR_TR_IPAPHi = QObject::tr("Max IPAP"); // Higher Inspiratory Positive Airway Pressure
+    STR_TR_APAP = QObject::tr("APAP");    // Automatic Positive Airway Pressure
+    STR_TR_ASV = QObject::tr("ASV");      // Assisted Servo Ventilator
+    STR_TR_STASV = QObject::tr("ST/ASV");
+
+    STR_TR_Humidifier = QObject::tr("Humidifier");
+
+    STR_TR_H = QObject::tr("H");      // Short form of Hypopnea
+    STR_TR_OA = QObject::tr("OA");    // Short form of Obstructive Apnea
+    STR_TR_UA = QObject::tr("A");     // Short form of Unspecified Apnea
+    STR_TR_CA = QObject::tr("CA");    // Short form of Clear Airway Apnea
+    STR_TR_FL = QObject::tr("FL");    // Short form of Flow Limitation
+    STR_TR_SA = QObject::tr("SA");    // Short form of Flow Limitation
+    STR_TR_LE = QObject::tr("LE");    // Short form of Leak Event
+    STR_TR_EP = QObject::tr("EP");    // Short form of Expiratory Puff
+    STR_TR_VS = QObject::tr("VS");    // Short form of Vibratory Snore
+    STR_TR_VS2 =
+        QObject::tr("VS2");  // Short form of Secondary Vibratory Snore (Some Philips Respironics Machines have two sources)
+    STR_TR_RERA = QObject::tr("RERA"); // Acronym for Respiratory Effort Related Arousal
+    STR_TR_PP = QObject::tr("PP");    // Short form for Pressure Pulse
+    STR_TR_P = QObject::tr("P");      // Short form for Pressure Event
+    STR_TR_RE = QObject::tr("RE");    // Short form of Respiratory Effort Related Arousal
+    STR_TR_NR = QObject::tr("NR");    // Short form of Non Responding event? (forgot sorry)
+    STR_TR_NRI = QObject::tr("NRI");  // Sorry I Forgot.. it's a flag on Intellipap machines
+    STR_TR_O2 = QObject::tr("O2");    // SpO2 Desaturation
+    STR_TR_PC = QObject::tr("PC");    // Short form for Pulse Change
+    STR_TR_UF1 = QObject::tr("UF1");    // Short form for User Flag 1
+    STR_TR_UF2 = QObject::tr("UF2");    // Short form for User Flag 2
+    STR_TR_UF3 = QObject::tr("UF3");    // Short form for User Flag 3
+
+    STR_TR_PS = QObject::tr("PS");    // Short form of Pressure Support
+    STR_TR_AHI = QObject::tr("AHI");  // Short form of Apnea Hypopnea Index
+    STR_TR_RDI = QObject::tr("RDI");  // Short form of Respiratory Distress Index
+    STR_TR_AI = QObject::tr("AI");    // Short form of Apnea Index
+    STR_TR_HI = QObject::tr("HI");    // Short form of Hypopnea Index
+    STR_TR_UAI = QObject::tr("UAI");  // Short form of Uncatagorized Apnea Index
+    STR_TR_CAI = QObject::tr("CAI");  // Short form of Clear Airway Index
+    STR_TR_FLI = QObject::tr("FLI");  // Short form of Flow Limitation Index
+//    STR_TR_SAI = QObject::tr("SAI");  // Short form of SleepAwake Index
+    STR_TR_REI = QObject::tr("REI");  // Short form of RERA Index
+    STR_TR_EPI = QObject::tr("EPI");  // Short form of Expiratory Puff Index
+    STR_TR_CSR = QObject::tr("ÇSR");  // Short form of Cheyne Stokes Respiration
+    STR_TR_PB = QObject::tr("PB");    // Short form of Periodic Breathing
+
+
+    // Graph Titles
+    STR_TR_IE = QObject::tr("IE");    // Inspiratory Expiratory Ratio
+    STR_TR_InspTime = QObject::tr("Insp. Time");  // Inspiratory Time
+    STR_TR_ExpTime = QObject::tr("Exp. Time");    // Expiratory Time
+    STR_TR_RespEvent = QObject::tr("Resp. Event");  // Respiratory Event
+    STR_TR_FlowLimitation = QObject::tr("Flow Limitation");
+    STR_TR_FlowLimit = QObject::tr("Flow Limit");
+    STR_TR_SensAwake = QObject::tr("SensAwake");
+    STR_TR_PatTrigBreath = QObject::tr("Pat. Trig. Breath"); // Patient Triggered Breath
+    STR_TR_TgtMinVent = QObject::tr("Tgt. Min. Vent");      // Target Minute Ventilation
+    STR_TR_TargetVent = QObject::tr("Target Vent.");        // Target Ventilation
+    STR_TR_MinuteVent = QObject::tr("Minute Vent."); // Minute Ventilation
+    STR_TR_TidalVolume = QObject::tr("Tidal Volume");
+    STR_TR_RespRate = QObject::tr("Resp. Rate");  // Respiratory Rate
+    STR_TR_Snore = QObject::tr("Snore");
+    STR_TR_Leak = QObject::tr("Leak");
+    STR_TR_Leaks = QObject::tr("Leaks");
+    STR_TR_LargeLeak = QObject::tr("Large Leak");
+    STR_TR_LL = QObject::tr("LL"); // Large Leak
+    STR_TR_TotalLeaks = QObject::tr("Total Leaks");
+    STR_TR_UnintentionalLeaks = QObject::tr("Unintentional Leaks");
+    STR_TR_MaskPressure = QObject::tr("MaskPressure");
+    STR_TR_FlowRate = QObject::tr("Flow Rate");
+    STR_TR_SleepStage = QObject::tr("Sleep Stage");
+    STR_TR_Usage = QObject::tr("Usage");
+    STR_TR_Sessions = QObject::tr("Sessions");
+    STR_TR_PrRelief = QObject::tr("Pr. Relief"); // Pressure Relief
+
+    STR_TR_Bookmarks = QObject::tr("Bookmarks");
+    STR_TR_SleepyHead = QObject::tr("SleepyHead");
+
+    STR_TR_Mode = QObject::tr("Mode");
+    STR_TR_Model = QObject::tr("Model");
+    STR_TR_Brand = QObject::tr("Brand");
+    STR_TR_Serial = QObject::tr("Serial");
+    STR_TR_Series = QObject::tr("Series");
+    STR_TR_Machine = QObject::tr("Machine");
+    STR_TR_Channel = QObject::tr("Channel");
+    STR_TR_Settings = QObject::tr("Settings");
+
+    STR_TR_Inclination = QObject::tr("Inclination");
+    STR_TR_Orientation = QObject::tr("Orientation");
+
+    STR_TR_Name = QObject::tr("Name");
+    STR_TR_DOB = QObject::tr("DOB");  // Date of Birth
+    STR_TR_Phone = QObject::tr("Phone");
+    STR_TR_Address = QObject::tr("Address");
+    STR_TR_Email = QObject::tr("Email");
+    STR_TR_PatientID = QObject::tr("Patient ID");
+    STR_TR_Date = QObject::tr("Date");
+
+    STR_TR_BedTime = QObject::tr("Bedtime");
+    STR_TR_WakeUp = QObject::tr("Wake-up");
+    STR_TR_MaskTime = QObject::tr("Mask Time");
+    STR_TR_Unknown = QObject::tr("Unknown");
+    STR_TR_None = QObject::tr("None");
+    STR_TR_Ready = QObject::tr("Ready");
+
+    STR_TR_First = QObject::tr("First");
+    STR_TR_Last = QObject::tr("Last");
+    STR_TR_Start = QObject::tr("Start");
+    STR_TR_End = QObject::tr("End");
+    STR_TR_On = QObject::tr("On");
+    STR_TR_Off = QObject::tr("Off");
+    STR_TR_Yes = QObject::tr("Yes");
+    STR_TR_No = QObject::tr("No");
+
+    STR_TR_Min = QObject::tr("Min");  // Minimum
+    STR_TR_Max = QObject::tr("Max");  // Maximum
+    STR_TR_Med = QObject::tr("Med");  // Median
+
+    STR_TR_Average = QObject::tr("Average");
+    STR_TR_Median = QObject::tr("Median");
+    STR_TR_Avg = QObject::tr("Avg");      // Average
+    STR_TR_WAvg = QObject::tr("W-Avg");   // Weighted Average
+}
+
+
+
+
+quint32 CRC32(const char * data, quint32 length)
+{
+  quint32 crc32 = 0xffffffff;
+
+  for (quint32 idx=0; idx<length; idx++) {
+
+    quint32 i = (data[idx]) ^ ((crc32) & 0x000000ff);
+
+    for(int j=8; j > 0; j--) {
+        if (i & 1) {
+            i = (i >> 1) ^ 0xedb88320;
+        } else {
+            i >>= 1;
+        }
+    }
+
+    crc32 = ((crc32) >> 8) ^ i;
+  }
+
+  return ~crc32;
+}
+
+quint32 crc32buf(const QByteArray& data)
+{
+    return CRC32(data.constData(), data.size());
+}
+
+// Gzip function
+QByteArray gCompress(const QByteArray& data)
+{
+    QByteArray compressedData = qCompress(data);
+    //  Strip the first six bytes (a 4-byte length put on by qCompress and a 2-byte zlib header)
+    // and the last four bytes (a zlib integrity check).
+    compressedData.remove(0, 6);
+    compressedData.chop(4);
+
+    QByteArray header;
+    QDataStream ds1(&header, QIODevice::WriteOnly);
+    // Prepend a generic 10-byte gzip header (see RFC 1952),
+    ds1 << quint16(0x1f8b)
+        << quint16(0x0800)
+        << quint16(0x0000)
+        << quint16(0x0000)
+        << quint16(0x000b);
+
+    // Append a four-byte CRC-32 of the uncompressed data
+    // Append 4 bytes uncompressed input size modulo 2^32
+    QByteArray footer;
+    QDataStream ds2(&footer, QIODevice::WriteOnly);
+    ds2.setByteOrder(QDataStream::LittleEndian);
+    ds2 << crc32buf(data)
+        << quint32(data.size());
+
+    return header + compressedData + footer;
+}
+
+
+// Pinched from http://stackoverflow.com/questions/2690328/qt-quncompress-gzip-data
+QByteArray gUncompress(const QByteArray &data)
+{
+    if (data.size() <= 4) {
+        qWarning("gUncompress: Input data is truncated");
+        return QByteArray();
+    }
+
+    QByteArray result;
+
+    int ret;
+    z_stream strm;
+    static const int CHUNK_SIZE = 1024;
+    char out[CHUNK_SIZE];
+
+    /* allocate inflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    strm.avail_in = data.size();
+    strm.next_in = (Bytef*)(data.data());
+
+    ret = inflateInit2(&strm, 15 +  32); // gzip decoding
+    if (ret != Z_OK)
+        return QByteArray();
+
+    // run inflate()
+    do {
+        strm.avail_out = CHUNK_SIZE;
+        strm.next_out = (Bytef*)(out);
+
+        ret = inflate(&strm, Z_NO_FLUSH);
+        Q_ASSERT(ret != Z_STREAM_ERROR);  // state not clobbered
+
+        switch (ret) {
+        case Z_NEED_DICT:
+            ret = Z_DATA_ERROR;     // and fall through
+        case Z_DATA_ERROR:
+        case Z_MEM_ERROR:
+            (void)inflateEnd(&strm);
+            return QByteArray();
+        }
+
+        result.append(out, CHUNK_SIZE - strm.avail_out);
+    } while (strm.avail_out == 0);
+
+    // clean up and return
+    inflateEnd(&strm);
+    return result;
+}
diff --git a/sleepyhead/SleepLib/common.h b/sleepyhead/SleepLib/common.h
new file mode 100644
index 0000000..d0ed158
--- /dev/null
+++ b/sleepyhead/SleepLib/common.h
@@ -0,0 +1,345 @@
+/* Common code and junk
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef COMMON_H
+#define COMMON_H
+
+#include <QString>
+#include <QColor>
+#include <QObject>
+
+#if QT_VERSION >= QT_VERSION_CHECK(4,8,0)
+
+#define DEBUG_EFFICIENCY 1
+
+#endif
+
+QByteArray gCompress(const QByteArray& data);
+QByteArray gUncompress(const QByteArray &data);
+
+const quint16 filetype_summary = 0;
+const quint16 filetype_data = 1;
+const quint16 filetype_sessenabled = 5;
+
+enum UnitSystem { US_Undefined, US_Metric, US_Archiac };
+
+typedef float EventDataType;
+
+struct ValueCount {
+    ValueCount() { value = 0; count = 0; p = 0; }
+    ValueCount( EventDataType val, qint64 cnt, double pp)
+        :value(val), count(cnt), p(pp) {}
+
+    ValueCount(const ValueCount &copy) {
+        value = copy.value;
+        count = copy.count;
+        p = copy.p;
+    }
+    EventDataType value;
+    qint64 count;
+    double p;
+};
+
+void copyPath(QString src, QString dst);
+
+
+// Primarily sort by value
+bool operator <(const ValueCount &a, const ValueCount &b);
+
+const float ounce_convert = 28.3495231F; // grams
+const float pound_convert = ounce_convert * 16;
+
+QString weightString(float kg, UnitSystem us = US_Undefined);
+
+//! \brief Mercilessly trash a directory
+bool removeDir(const QString &path);
+
+///Represents the exception for taking the median of an empty list
+class median_of_empty_list_exception:public std::exception{
+  virtual const char* what() const throw() {
+    return "Attempt to take the median of an empty list of numbers.  "
+      "The median of an empty list is undefined.";
+  }
+};
+
+///Return the median of a sequence of numbers defined by the random
+///access iterators begin and end.  The sequence must not be empty
+///(median is undefined for an empty set).
+///
+///The numbers must be convertible to double.
+template<class RandAccessIter>
+double median(RandAccessIter begin, RandAccessIter end)
+  throw (median_of_empty_list_exception)
+{
+  if (begin == end) { throw median_of_empty_list_exception(); }
+  std::size_t size = end - begin;
+  std::size_t middleIdx = size/2;
+  RandAccessIter target = begin + middleIdx;
+  std::nth_element(begin, target, end);
+
+  if (size % 2 != 0) { //Odd number of elements
+    return *target;
+  } else {            //Even number of elements
+    double a = *target;
+    RandAccessIter targetNeighbor= target-1;
+    std::nth_element(begin, targetNeighbor, end);
+    return (a+*targetNeighbor)/2.0;
+  }
+}
+
+
+#ifndef nullptr
+#define nullptr NULL
+#endif
+
+#ifdef TEST_BUILD
+const QString STR_TestBuild = "-Testing";
+#else
+const QString STR_TestBuild = "";
+#endif
+
+const QString getAppName();
+const QString getDeveloperName();
+const QString getDefaultAppRoot();
+
+void initializeStrings();
+
+
+enum OverlayDisplayType { ODT_Bars, ODT_TopAndBottom };
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+// Preference Name Strings
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+const QString STR_GEN_Profile = "Profile";
+const QString STR_GEN_SkipLogin = "SkipLoginScreen";
+const QString STR_GEN_UpdatesLastChecked = "UpdatesLastChecked";
+const QString STR_GEN_UpdatesAutoCheck = "Updates_AutoCheck";
+const QString STR_GEN_UpdateCheckFrequency = "Updates_CheckFrequency";
+const QString STR_GEN_DataFolder = "DataFolder";
+
+const QString STR_GEN_On = QObject::tr("On");
+const QString STR_GEN_Off = QObject::tr("Off");
+
+const QString STR_PREF_AllowEarlyUpdates = "AllowEarlyUpdates";
+const QString STR_PREF_ReimportBackup = "ReimportBackup";
+const QString STR_PREF_LastCPAPPath = "LastCPAPPath";
+
+const QString STR_MACH_ResMed = "ResMed";
+const QString STR_MACH_PRS1 = "PRS1";
+const QString STR_MACH_Journal = "Journal";
+const QString STR_MACH_Intellipap = "Intellipap";
+const QString STR_MACH_Weinmann= "Weinmann";
+const QString STR_MACH_FPIcon = "FPIcon";
+const QString STR_MACH_MSeries = "MSeries";
+const QString STR_MACH_CMS50 = "CMS50";
+const QString STR_MACH_ZEO = "Zeo";
+
+const QString STR_PREF_VersionString = "VersionString";
+const QString STR_PREF_Language = "Language";
+
+const QString STR_AppName = "SleepyHead";
+const QString STR_DeveloperName = "Jedimark";
+const QString STR_AppRoot = "SleepyHeadData";
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+// Commonly used translatable text strings
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+extern QString STR_UNIT_CM;
+extern QString STR_UNIT_INCH;
+extern QString STR_UNIT_FOOT;
+extern QString STR_UNIT_POUND;
+extern QString STR_UNIT_OUNCE;
+extern QString STR_UNIT_KG;
+extern QString STR_UNIT_CMH2O;
+extern QString STR_UNIT_Hours;
+extern QString STR_UNIT_Minutes;
+extern QString STR_UNIT_Seconds;
+extern QString STR_UNIT_BPM;       // Beats per Minute
+extern QString STR_UNIT_LPM;       // Litres per Minute
+extern QString STR_UNIT_ml;        // millilitres
+extern QString STR_UNIT_Litres;
+extern QString STR_UNIT_Hz;
+extern QString STR_UNIT_EventsPerHour;
+extern QString STR_UNIT_Percentage;
+extern QString STR_UNIT_BreathsPerMinute;
+extern QString STR_UNIT_Unknown;
+extern QString STR_UNIT_Ratio;
+extern QString STR_UNIT_Severity;
+extern QString STR_UNIT_Degrees;
+
+extern QString STR_MessageBox_Question;
+extern QString STR_MessageBox_Information;
+extern QString STR_MessageBox_Error;
+extern QString STR_MessageBox_Warning;
+extern QString STR_MessageBox_Busy;
+extern QString STR_MessageBox_PleaseNote;
+
+extern QString STR_MessageBox_Yes;
+extern QString STR_MessageBox_No;
+extern QString STR_MessageBox_Cancel;
+extern QString STR_MessageBox_Destroy;
+extern QString STR_MessageBox_Save;
+
+extern QString STR_Empty_NoData;
+extern QString STR_Empty_NoSessions;
+extern QString STR_Empty_Brick;
+extern QString STR_Empty_NoGraphs;
+extern QString STR_Empty_SummaryOnly;
+
+
+
+extern QString STR_TR_BMI;         // Short form of Body Mass Index
+extern QString STR_TR_Weight;
+extern QString STR_TR_Zombie;
+extern QString STR_TR_PulseRate;   // Pulse / Heart rate
+extern QString STR_TR_SpO2;
+extern QString STR_TR_Plethy;      // Plethysomogram
+extern QString STR_TR_Pressure;
+
+extern QString STR_TR_Daily;
+extern QString STR_TR_Overview;
+extern QString STR_TR_Oximetry;
+
+extern QString STR_TR_Oximeter;
+extern QString STR_TR_EventFlags;
+
+extern QString STR_TR_Inclination;
+extern QString STR_TR_Orientation;
+
+// Machine type names.
+extern QString STR_TR_CPAP;    // Constant Positive Airway Pressure
+extern QString STR_TR_BIPAP;   // Bi-Level Positive Airway Pressure
+extern QString STR_TR_BiLevel; // Another name for BiPAP
+extern QString STR_TR_EPAP;    // Expiratory Positive Airway Pressure
+extern QString STR_TR_EPAPLo;  // Expiratory Positive Airway Pressure, Low
+extern QString STR_TR_EPAPHi;  // Expiratory Positive Airway Pressure, High
+extern QString STR_TR_IPAP;    // Inspiratory Positive Airway Pressure
+extern QString STR_TR_IPAPLo;  // Inspiratory Positive Airway Pressure, Low
+extern QString STR_TR_IPAPHi;  // Inspiratory Positive Airway Pressure, High
+extern QString STR_TR_APAP;    // Automatic Positive Airway Pressure
+extern QString STR_TR_ASV;     // Assisted Servo Ventilator
+extern QString STR_TR_STASV;
+
+extern QString STR_TR_Humidifier;
+
+extern QString STR_TR_H;       // Short form of Hypopnea
+extern QString STR_TR_OA;      // Short form of Obstructive Apnea
+extern QString STR_TR_UA;      // Short form of Unspecified Apnea
+extern QString STR_TR_CA;      // Short form of Clear Airway Apnea
+extern QString STR_TR_FL;      // Short form of Flow Limitation
+extern QString STR_TR_SA;      // Short form of SensAwake
+extern QString STR_TR_LE;      // Short form of Leak Event
+extern QString STR_TR_EP;      // Short form of Expiratory Puff
+extern QString STR_TR_VS;      // Short form of Vibratory Snore
+extern QString
+STR_TR_VS2;     // Short form of Secondary Vibratory Snore (Some Philips Respironics Machines have two sources)
+extern QString STR_TR_RERA;    // Acronym for Respiratory Effort Related Arousal
+extern QString STR_TR_PP;      // Short form for Pressure Pulse
+extern QString STR_TR_P;       // Short form for Pressure Event
+extern QString STR_TR_RE;      // Short form of Respiratory Effort Related Arousal
+extern QString STR_TR_NR;      // Short form of Non Responding event? (forgot sorry)
+extern QString STR_TR_NRI;     // Sorry I Forgot.. it's a flag on Intellipap machines
+extern QString STR_TR_O2;      // SpO2 Desaturation
+extern QString STR_TR_PC;      // Short form for Pulse Change
+extern QString STR_TR_UF1;     // Short form for User Flag 1
+extern QString STR_TR_UF2;     // Short form for User Flag 2
+extern QString STR_TR_UF3;     // Short form for User Flag 3
+
+
+
+extern QString STR_TR_PS;     // Short form of Pressure Support
+extern QString STR_TR_AHI;    // Short form of Apnea Hypopnea Index
+extern QString STR_TR_RDI;    // Short form of Respiratory Distress Index
+extern QString STR_TR_AI;     // Short form of Apnea Index
+extern QString STR_TR_HI;     // Short form of Hypopnea Index
+extern QString STR_TR_UAI;    // Short form of Uncatagorized Apnea Index
+extern QString STR_TR_CAI;    // Short form of Clear Airway Index
+extern QString STR_TR_FLI;    // Short form of Flow Limitation Index
+extern QString STR_TR_REI;    // Short form of RERA Index
+extern QString STR_TR_EPI;    // Short form of Expiratory Puff Index
+extern QString STR_TR_CSR;    // Short form of Cheyne Stokes Respiration
+extern QString STR_TR_PB;     // Short form of Periodic Breathing
+
+
+// Graph Titles
+extern QString STR_TR_IE;              // Inspiratory Expiratory Ratio
+extern QString STR_TR_InspTime;        // Inspiratory Time
+extern QString STR_TR_ExpTime;         // Expiratory Time
+extern QString STR_TR_RespEvent;       // Respiratory Event
+extern QString STR_TR_FlowLimitation;
+extern QString STR_TR_FlowLimit;
+extern QString STR_TR_PatTrigBreath;   // Patient Triggered Breath
+extern QString STR_TR_TgtMinVent;      // Target Minute Ventilation
+extern QString STR_TR_TargetVent;      // Target Ventilation
+extern QString STR_TR_MinuteVent;      // Minute Ventilation
+extern QString STR_TR_TidalVolume;
+extern QString STR_TR_RespRate;        // Respiratory Rate
+extern QString STR_TR_Snore;
+extern QString STR_TR_Leak;
+extern QString STR_TR_LargeLeak;
+extern QString STR_TR_LL;
+extern QString STR_TR_Leaks;
+extern QString STR_TR_TotalLeaks;
+extern QString STR_TR_UnintentionalLeaks;
+extern QString STR_TR_MaskPressure;
+extern QString STR_TR_FlowRate;
+extern QString STR_TR_SleepStage;
+extern QString STR_TR_Usage;
+extern QString STR_TR_Sessions;
+extern QString STR_TR_PrRelief; // Pressure Relief
+extern QString STR_TR_SensAwake;
+
+extern QString STR_TR_Bookmarks;
+extern QString STR_TR_SleepyHead;
+
+extern QString STR_TR_Mode;
+extern QString STR_TR_Model;
+extern QString STR_TR_Brand;
+extern QString STR_TR_Series;
+extern QString STR_TR_Serial;
+extern QString STR_TR_Machine;
+extern QString STR_TR_Channel;
+extern QString STR_TR_Settings;
+
+extern QString STR_TR_Name;
+extern QString STR_TR_DOB;    // Date of Birth
+extern QString STR_TR_Phone;
+extern QString STR_TR_Address;
+extern QString STR_TR_Email;
+extern QString STR_TR_PatientID;
+extern QString STR_TR_Date;
+
+extern QString STR_TR_BedTime;
+extern QString STR_TR_WakeUp;
+extern QString STR_TR_MaskTime;
+extern QString STR_TR_Unknown;
+extern QString STR_TR_None;
+extern QString STR_TR_Ready;
+
+extern QString STR_TR_First;
+extern QString STR_TR_Last;
+extern QString STR_TR_Start;
+extern QString STR_TR_End;
+extern QString STR_TR_On;
+extern QString STR_TR_Off;
+extern QString STR_TR_Yes;
+extern QString STR_TR_No;
+
+
+extern QString STR_TR_Min;    // Minimum
+extern QString STR_TR_Max;    // Maximum
+extern QString STR_TR_Med;    // Median
+
+extern QString STR_TR_Average;
+extern QString STR_TR_Median;
+extern QString STR_TR_Avg;    // Short form of Average
+extern QString STR_TR_WAvg;   // Short form of Weighted Average
+
+#endif // COMMON_H
diff --git a/sleepyhead/SleepLib/day.cpp b/sleepyhead/SleepLib/day.cpp
new file mode 100644
index 0000000..7effcf8
--- /dev/null
+++ b/sleepyhead/SleepLib/day.cpp
@@ -0,0 +1,1590 @@
+/* SleepLib Day Class Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QMultiMap>
+
+#include <algorithm>
+#include <cmath>
+#include <limits>
+
+#include "day.h"
+#include "profiles.h"
+
+Day::Day()
+{
+    d_firstsession = true;
+    d_summaries_open = false;
+    d_events_open = false;
+    d_invalidate = true;
+
+}
+Day::~Day()
+{
+    for (QList<Session *>::iterator s = sessions.begin(); s != sessions.end(); ++s) {
+        delete(*s);
+    }
+}
+
+void Day::updateCPAPCache()
+{
+    d_count.clear();
+    d_sum.clear();
+    OpenSummary();
+    QList<ChannelID> channels = getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN);
+
+    int num_channels = channels.size();
+    for (int i=0; i< num_channels; ++i) {
+        ChannelID code = channels.at(i);
+        d_count[code] = count(code);
+        d_sum[code] = count(code);
+        d_machhours[MT_CPAP] = hours(MT_CPAP);
+    }
+}
+
+Session * Day::firstSession(MachineType type)
+{
+    for (int i=0; i<sessions.size(); i++) {
+        Session * sess = sessions.at(i);
+        if (!sess->enabled()) continue;
+        if (sess->type() == type) {
+            return sess;
+        }
+    }
+    return nullptr;
+}
+
+bool Day::addMachine(Machine *mach)
+{
+    invalidate();
+    if (!machines.contains(mach->type())) {
+        machines[mach->type()] = mach;
+        return true;
+    }
+    return false;
+}
+Machine *Day::machine(MachineType type)
+{
+    QHash<MachineType,Machine *>::iterator it = machines.find(type);
+    if (it != machines.end())
+        return it.value();
+    return nullptr;
+}
+
+QList<Session *> Day::getSessions(MachineType type, bool ignore_enabled)
+{
+    QList<Session *>::iterator it;
+    QList<Session *>::iterator sess_end = sessions.end();
+
+    QList<Session *> newlist;
+
+    for (it = sessions.begin(); it != sess_end; ++it) {
+        if (!ignore_enabled && !(*it)->enabled())
+            continue;
+
+        if ((*it)->type() == type)
+            newlist.append((*it));
+    }
+
+    return newlist;
+}
+
+Session *Day::find(SessionID sessid)
+{
+    QList<Session *>::iterator end=sessions.end();
+    for (QList<Session *>::iterator s = sessions.begin(); s != end; ++s) {
+        if ((*s)->session() == sessid) {
+            return (*s);
+        }
+    }
+
+    return nullptr;
+}
+
+void Day::addSession(Session *s)
+{
+    invalidate();
+    Q_ASSERT(s!=nullptr);
+    QHash<MachineType, Machine *>::iterator mi = machines.find(s->type());
+
+    if (mi != machines.end()) {
+        if (mi.value() != s->machine()) {
+            qDebug() << "SleepyHead can't add session" << s->session() << "to this day record, as it already contains a different machine of the same MachineType";
+            return;
+        }
+    } else {
+        machines[s->type()] = s->machine();
+    }
+
+    sessions.push_back(s);
+}
+EventDataType Day::calcMiddle(ChannelID code)
+{
+    int c = p_profile->general->prefCalcMiddle();
+
+    if (c == 0) {
+        return percentile(code, 0.5); // Median
+    } else if (c == 1 ) {
+        return wavg(code); // Weighted Average
+    } else {
+        return avg(code); // Average
+    }
+}
+EventDataType Day::calcMax(ChannelID code)
+{
+    return p_profile->general->prefCalcMax() ? percentile(code, 0.995) : Max(code);
+}
+EventDataType Day::calcPercentile(ChannelID code)
+{
+    double p = p_profile->general->prefCalcPercentile() / 100.0;
+    return percentile(code, p);
+}
+
+QString Day::calcMiddleLabel(ChannelID code)
+{
+    int c = p_profile->general->prefCalcMiddle();
+    if (c == 0) {
+        return QObject::tr("%1 %2").arg(STR_TR_Median).arg(schema::channel[code].label());
+    } else if (c == 1) {
+        return QObject::tr("%1 %2").arg(STR_TR_Average).arg(schema::channel[code].label());
+    } else {
+        return QObject::tr("%1 %2").arg(STR_TR_Average).arg(schema::channel[code].label());
+    }
+}
+QString Day::calcMaxLabel(ChannelID code)
+{
+    return QObject::tr("%1 %2").arg(p_profile->general->prefCalcMax() ? QObject::tr("Peak") : STR_TR_Max).arg(schema::channel[code].label());
+}
+QString Day::calcPercentileLabel(ChannelID code)
+{
+    return QObject::tr("%1% %2").arg(p_profile->general->prefCalcPercentile(),0, 'f',0).arg(schema::channel[code].label());
+}
+
+EventDataType Day::countInsideSpan(ChannelID span, ChannelID code)
+{
+    QList<Session *>::iterator end = sessions.end();
+    int count = 0;
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled()) {
+            count += sess.countInsideSpan(span, code);
+        }
+    }
+    return count;
+}
+
+EventDataType Day::lookupValue(ChannelID code, qint64 time, bool square)
+{
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled()) {
+            if ((time > sess.first()) && (time < sess.last())) {
+                if (sess.channelExists(code)) {
+                    return sess.SearchValue(code,time,square);
+                }
+            }
+        }
+    }
+    return 0;
+}
+
+
+EventDataType Day::timeAboveThreshold(ChannelID code, EventDataType threshold)
+{
+    EventDataType val = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled() && sess.m_availableChannels.contains(code)) {
+            val += sess.timeAboveThreshold(code,threshold);
+        }
+    }
+
+    return val;
+}
+
+EventDataType Day::timeBelowThreshold(ChannelID code, EventDataType threshold)
+{
+    EventDataType val = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled()) {
+            val += sess.timeBelowThreshold(code,threshold);
+        }
+    }
+
+    return val;
+}
+
+
+EventDataType Day::settings_sum(ChannelID code)
+{
+    EventDataType val = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled()) {
+            QHash<ChannelID, QVariant>::iterator set = sess.settings.find(code);
+
+            if (set != sess.settings.end()) {
+                val += set.value().toDouble();
+            }
+        }
+    }
+
+    return val;
+}
+
+EventDataType Day::settings_max(ChannelID code)
+{
+    EventDataType min = -std::numeric_limits<EventDataType>::max();
+    EventDataType max = min;
+    EventDataType value;
+
+    QList<Session *>::iterator end = sessions.end();
+    for(QList<Session *>::iterator it = sessions.begin(); it < end; ++it) {
+        Session &sess = *(*it);
+        if (sess.enabled()) {
+            value = sess.settings.value(code, min).toFloat();
+            if (value > max) {
+                max = value;
+            }
+        }
+    }
+
+    return max;
+}
+
+EventDataType Day::settings_min(ChannelID code)
+{
+    EventDataType max = std::numeric_limits<EventDataType>::max();
+    EventDataType min = max;
+    EventDataType value;
+
+    QList<Session *>::iterator end=sessions.end();
+
+    for(QList<Session *>::iterator it = sessions.begin(); it < end; ++it) {
+        Session &sess = *(*it);
+        if (sess.enabled()) {
+            value = sess.settings.value(code, max).toFloat();
+            if (value < min) {
+                min = value;
+            }
+        }
+    }
+
+    return min;
+}
+
+EventDataType Day::settings_avg(ChannelID code)
+{
+    EventDataType val = 0;
+    int cnt = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; it++) {
+        Session &sess = *(*it);
+        if (sess.enabled()) {
+            QHash<ChannelID, QVariant>::iterator set = sess.settings.find(code);
+
+            if (set != sess.settings.end()) {
+                val += set.value().toDouble();
+                cnt++;
+            }
+        }
+    }
+
+    val = (cnt > 0) ? val /= EventDataType(cnt) : val;
+
+    return val;
+}
+
+EventDataType Day::settings_wavg(ChannelID code)
+{
+    double s0 = 0, s1 = 0, s2 = 0, tmp;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; it++) {
+        Session &sess = *(*it);
+
+        if (sess.enabled()) {
+            QHash<ChannelID, QVariant>::iterator set = sess.settings.find(code);
+
+            if (set != sess.settings.end()) {
+                s0 = sess.hours();
+                tmp = set.value().toDouble();
+                s1 += tmp * s0;
+                s2 += s0;
+            }
+        }
+    }
+
+    if (s2 == 0) { return 0; }
+
+    tmp = (s1 / s2);
+    return tmp;
+}
+
+
+EventDataType Day::percentile(ChannelID code, EventDataType percentile)
+{
+    // Cache this calculation?
+    //    QHash<ChannelID, QHash<EventDataType, EventDataType> >::iterator pi;
+    //    pi=perc_cache.find(code);
+    //    if (pi!=perc_cache.end()) {
+    //        QHash<EventDataType, EventDataType> & hsh=pi.value();
+    //        QHash<EventDataType, EventDataType>::iterator hi=hsh.find(
+    //        if (hi!=pi.value().end()) {
+    //            return hi.value();
+    //        }
+    //    }
+
+    QHash<EventStoreType, qint64> wmap; // weight map
+
+    QHash<EventStoreType, qint64>::iterator wmapit;
+    qint64 SN = 0;
+
+    EventDataType lastgain = 0, gain = 0;
+    // First Calculate count of all events
+    bool timeweight;
+
+    QList<Session *>::iterator sess_end = sessions.end();
+    for (QList<Session *>::iterator sess_it = sessions.begin(); sess_it != sess_end; ++sess_it) {
+        Session &sess = *(*sess_it);
+        if (!sess.enabled()) { continue; }
+
+        QHash<ChannelID, QHash<EventStoreType, EventStoreType> >::iterator ei = sess.m_valuesummary.find(code);
+
+        if (ei == sess.m_valuesummary.end()) { continue; }
+
+        QHash<ChannelID, QHash<EventStoreType, quint32> >::iterator tei = sess.m_timesummary.find(code);
+        timeweight = (tei != sess.m_timesummary.end());
+        gain = sess.m_gain[code];
+
+        // Here's assuming gains don't change accross a days sessions
+        // Can't assume this in any multi day calculations..
+        if (lastgain > 0) {
+            if (gain != lastgain) {
+                qDebug() << "Gains differ across sessions: " << gain << lastgain;
+            }
+        }
+
+        lastgain = gain;
+
+        qint64 weight;
+
+        //qint64 tval;
+        if (timeweight) {
+            QHash<EventStoreType, quint32>::iterator teival_end = tei.value().end();
+            wmap.reserve(wmap.size() + tei.value().size());
+
+            for (QHash<EventStoreType, quint32>::iterator it = tei.value().begin(); it != teival_end; ++it) {
+                weight = it.value();
+                SN += weight;
+
+                wmap[it.key()] += weight;
+            }
+        } else {
+            QHash<EventStoreType, EventStoreType>::iterator eival_end = ei.value().end();
+
+            wmap.reserve(wmap.size() + ei.value().size());
+            for (QHash<EventStoreType, EventStoreType>::iterator it = ei.value().begin(); it != eival_end; ++it) {
+                weight = it.value();
+
+                SN += weight;
+
+                wmap[it.key()] += weight;
+            }
+        }
+    }
+
+    QVector<ValueCount> valcnt;
+
+    valcnt.resize(wmap.size());
+    // Build sorted list of value/counts
+
+    QHash<EventStoreType, qint64>::iterator wmap_end = wmap.end();
+    int ii=0;
+    for (QHash<EventStoreType, qint64>::iterator it = wmap.begin(); it != wmap_end; ++it) {
+        valcnt[ii++]=ValueCount(EventDataType(it.key()) * gain, it.value(), 0);
+    }
+
+    // sort by weight, then value
+    qSort(valcnt);
+
+    //double SN=100.0/double(N); // 100% / overall sum
+    double p = 100.0 * percentile;
+
+    double nth = double(SN) * percentile; // index of the position in the unweighted set would be
+    double nthi = floor(nth);
+
+    qint64 sum1 = 0, sum2 = 0;
+    qint64 w1, w2 = 0;
+    double v1 = 0, v2;
+
+    int N = valcnt.size();
+    int k = 0;
+
+    for (k = 0; k < N; k++) {
+        v1 = valcnt.at(k).value;
+        w1 = valcnt.at(k).count;
+        sum1 += w1;
+
+        if (sum1 > nthi) {
+            return v1;
+        }
+
+        if (sum1 == nthi) {
+            break; // boundary condition
+        }
+    }
+
+    if (k >= N) {
+        return v1;
+    }
+
+    if (valcnt.size() == 1) {
+        return valcnt[0].value;
+    }
+    v2 = valcnt[k + 1].value;
+    w2 = valcnt[k + 1].count;
+    sum2 = sum1 + w2;
+    // value lies between v1 and v2
+
+    double px = 100.0 / double(SN); // Percentile represented by one full value
+
+    // calculate percentile ranks
+    double p1 = px * (double(sum1) - (double(w1) / 2.0));
+    double p2 = px * (double(sum2) - (double(w2) / 2.0));
+
+    // calculate linear interpolation
+    double v = v1 + ((p - p1) / (p2 - p1)) * (v2 - v1);
+
+    return v;
+
+    //                p1.....p.............p2
+    //                37     55            70
+}
+
+EventDataType Day::p90(ChannelID code)
+{
+    return percentile(code, 0.90F);
+}
+
+EventDataType Day::rangeCount(ChannelID code, qint64 st, qint64 et)
+{
+    int cnt = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled()) {
+            cnt += sess.rangeCount(code, st, et);
+        }
+    }
+
+    return cnt;
+}
+EventDataType Day::rangeSum(ChannelID code, qint64 st, qint64 et)
+{
+    double val = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled()) {
+            val += sess.rangeSum(code, st, et);
+        }
+    }
+
+    return val;
+}
+EventDataType Day::rangeAvg(ChannelID code, qint64 st, qint64 et)
+{
+    double val = 0;
+    int cnt = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled()) {
+            val += sess.rangeSum(code, st, et);
+            cnt += sess.rangeCount(code, st,et);
+        }
+    }
+
+    if (cnt == 0) { return 0; }
+    val /= double(cnt);
+
+    return val;
+}
+EventDataType Day::rangeWavg(ChannelID code, qint64 st, qint64 et)
+{
+    double sum = 0;
+    double cnt = 0;
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+        QHash<ChannelID, QVector<EventList *> >::iterator EVEC = sess.eventlist.find(code);
+        if (EVEC == sess.eventlist.end()) continue;
+
+        QVector<EventList *>::iterator EL;
+        QVector<EventList *>::iterator EVEC_end = EVEC.value().end();
+        for (EL = EVEC.value().begin(); EL != EVEC_end; ++EL) {
+            EventList * el = *EL;
+            if (el->count() < 1) continue;
+            EventDataType lastdata = el->data(0);
+            qint64 lasttime = el->time(0);
+
+            if (lasttime < st)
+                lasttime = st;
+
+            for (unsigned i=1; i<el->count(); i++)  {
+                double data = el->data(i);
+                qint64 time = el->time(i);
+
+                if (time < st) {
+                    lasttime = st;
+                    lastdata = data;
+                    continue;
+                }
+
+                if (time > et) {
+                    time = et;
+                }
+
+                double duration = double(time - lasttime) / 1000.0;
+                sum += data * duration;
+                cnt += duration;
+
+                if (time >= et) break;
+
+                lasttime = time;
+                lastdata = data;
+            }
+        }
+    }
+    if (cnt < 0.000001)
+        return 0;
+    return sum / cnt;
+}
+
+
+// Boring non weighted percentile
+EventDataType Day::rangePercentile(ChannelID code, float p, qint64 st, qint64 et)
+{
+    int count = rangeCount(code, st,et);
+    QVector<EventDataType> list;
+    list.resize(count);
+    int idx = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+        QHash<ChannelID, QVector<EventList *> >::iterator EVEC = sess.eventlist.find(code);
+        if (EVEC == sess.eventlist.end()) continue;
+
+        QVector<EventList *>::iterator EL;
+        QVector<EventList *>::iterator EVEC_end = EVEC.value().end();
+        for (EL = EVEC.value().begin(); EL != EVEC_end; ++EL) {
+            EventList * el = *EL;
+            for (unsigned i=0; i<el->count(); i++)  {
+                qint64 time = el->time(i);
+                if ((time < st) || (time > et)) continue;
+                list[idx++] = el->data(i);
+            }
+        }
+    }
+
+    // TODO: use nth_element instead..
+    qSort(list);
+
+    float b = float(idx) * p;
+    int a = floor(b);
+    int c = ceil(b);
+
+    if ((a == c) || (c >= idx)) {
+        return list[a];
+    }
+
+    EventDataType v1 = list[a];
+    EventDataType v2 = list[c];
+
+    EventDataType diff = v2 - v1;  // the whole               == C-A
+
+    double ba = b - float(a);     // A....B...........C      == B-A
+
+    double val = v1 + diff * ba;
+
+    return val;
+}
+
+EventDataType Day::avg(ChannelID code)
+{
+    double val = 0;
+    // Cache this?
+    int cnt = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled()) {
+            val += sess.sum(code);
+            cnt += sess.count(code);
+        }
+    }
+
+    if (cnt == 0) { return 0; }
+    val /= double(cnt);
+
+    return val;
+}
+
+EventDataType Day::sum(ChannelID code)
+{
+    // Cache this?
+    EventDataType val = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled() && sess.m_sum.contains(code)) {
+            val += sess.sum(code);
+        }
+    }
+
+    return val;
+}
+
+EventDataType Day::wavg(ChannelID code)
+{
+    double s0 = 0, s1 = 0, s2 = 0;
+    qint64 d;
+
+    QList<Session *>::iterator end = sessions.end();
+
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+
+        if (sess.enabled() && sess.m_wavg.contains(code)) {
+            d = sess.length(); //.last(code)-sess.first(code);
+            s0 = double(d) / 3600000.0;
+
+            if (s0 > 0) {
+                s1 += sess.wavg(code) * s0;
+                s2 += s0;
+            }
+        }
+    }
+
+    if (s2 == 0) {
+        return 0;
+    }
+
+    return (s1 / s2);
+}
+
+// Total session time in milliseconds
+qint64 Day::total_time()
+{
+    qint64 d_totaltime = 0;
+    QMultiMap<qint64, bool> range;
+    //range.reserve(size()*2);
+
+    // Remember sessions may overlap..
+
+    qint64 first, last;
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+        int slicesize = sess.m_slices.size();
+
+        if (sess.enabled() && (sess.type() != MT_JOURNAL)) {
+            first = sess.first();
+            last = sess.last();
+
+            if (slicesize == 0) {
+                // This algorithm relies on non zero length, and correctly ordered sessions
+                if (last > first) {
+                    range.insert(first, 0);
+                    range.insert(last, 1);
+                    d_totaltime += sess.length();
+                }
+            } else {
+                for (int i=0; i<slicesize; ++i) {
+                    const SessionSlice & slice = sess.m_slices.at(i);
+                    if (slice.status == EquipmentOn) {
+                        range.insert(slice.start, 0);
+                        range.insert(slice.end, 1);
+                        d_totaltime += slice.end - slice.start;
+                    }
+                }
+            }
+        }
+    }
+
+    bool b;
+    int nest = 0;
+    qint64 ti = 0;
+    qint64 total = 0;
+
+    // This is my implementation of a typical "brace counting" algorithm mentioned here:
+    // http://stackoverflow.com/questions/7468948/problem-calculating-overlapping-date-ranges
+
+    QMultiMap<qint64, bool>::iterator rend = range.end();
+    for (QMultiMap<qint64, bool>::iterator rit = range.begin(); rit != rend; ++rit) {
+        b = rit.value();
+
+        if (!b) {
+            if (!ti) {
+                ti = rit.key();
+            }
+
+            nest++;
+        } else {
+            if (--nest <= 0) {
+                total += rit.key() - ti;
+                ti = 0;
+            }
+        }
+    }
+
+    if (total != d_totaltime) {
+        // They can overlap.. tough.
+//        qDebug() << "Sessions Times overlaps!" << total << d_totaltime;
+    }
+
+    return total; //d_totaltime;
+}
+
+// Total session time in milliseconds, only considering machinetype
+qint64 Day::total_time(MachineType type)
+{
+    qint64 d_totaltime = 0;
+    QMultiMap<qint64, bool> range;
+    //range.reserve(size()*2);
+
+    // Remember sessions may overlap..
+
+    qint64 first, last;
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session &sess = *(*it);
+        int slicesize = sess.m_slices.size();
+
+        if ((sess.type() == type) && sess.enabled()) {
+            first = sess.first();
+            last = sess.last();
+
+            // This algorithm relies on non zero length, and correctly ordered sessions
+            if (slicesize == 0) {
+                if (last > first) {
+                    range.insert(first, 0);
+                    range.insert(last, 1);
+                    d_totaltime += sess.length();
+                }
+            } else {
+                for (int i=0; i<slicesize; ++i) {
+                    const SessionSlice & slice = sess.m_slices.at(i);
+                    if (slice.status == EquipmentOn) {
+                        range.insert(slice.start, 0);
+                        range.insert(slice.end, 1);
+                        d_totaltime += slice.end - slice.start;
+                    }
+                }
+            }
+        }
+    }
+
+    bool b;
+    int nest = 0;
+    qint64 ti = 0;
+    qint64 total = 0;
+
+    // This is my implementation of a typical "brace counting" algorithm mentioned here:
+    // http://stackoverflow.com/questions/7468948/problem-calculating-overlapping-date-ranges
+
+    QMultiMap<qint64, bool>::iterator rend = range.end();
+    for (QMultiMap<qint64, bool>::iterator rit = range.begin(); rit != rend; ++rit) {
+        b = rit.value();
+
+        if (!b) {
+            if (!ti) {
+                ti = rit.key();
+            }
+
+            nest++;
+        } else {
+            if (--nest <= 0) {
+                total += rit.key() - ti;
+                ti = 0;
+            }
+        }
+    }
+
+    if (total != d_totaltime) {
+        // They can overlap.. tough.
+//        qDebug() << "Sessions Times overlaps!" << total << d_totaltime;
+    }
+
+    return total; //d_totaltime;
+}
+
+
+bool Day::hasEnabledSessions()
+{
+    QList<Session *>::iterator end = sessions.end();
+
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        if ((*it)->enabled()) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool Day::hasEnabledSessions(MachineType type)
+{
+    QList<Session *>::iterator end = sessions.end();
+
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        if (((*it)->type() == type) && (*it)->enabled()) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+/*EventDataType Day::percentile(ChannelID code,double percent)
+{
+    double val=0;
+    int cnt=0;
+
+    for (QList<Session *>::iterator s=sessions.begin();s!=sessions.end();s++) {
+        Session & sess=*(*s);
+        if (sess.eventlist.find(code)!=sess.eventlist.end()) {
+            val+=sess.percentile(code,percent);
+            cnt++;
+        }
+    }
+    if (cnt==0) return 0;
+    return EventDataType(val/cnt);
+
+}*/
+
+qint64 Day::first(ChannelID code)
+{
+    qint64 date = 0;
+    qint64 tmp;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess=*(*it);
+
+        if (sess.enabled()) {
+            tmp = sess.first(code);
+
+            if (!tmp) { continue; }
+
+            if (!date) {
+                date = tmp;
+            } else {
+                if (tmp < date) { date = tmp; }
+            }
+        }
+    }
+
+    return date;
+}
+
+qint64 Day::last(ChannelID code)
+{
+    qint64 date = 0;
+    qint64 tmp;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; it++) {
+        Session & sess = *(*it);
+
+        if (sess.enabled()) {
+            tmp = sess.last(code);
+
+            if (!tmp) { continue; }
+
+            if (!date) {
+                date = tmp;
+            } else {
+                if (tmp > date) { date = tmp; }
+            }
+        }
+    }
+
+    return date;
+}
+
+EventDataType Day::Min(ChannelID code)
+{
+    EventDataType min = 0;
+    EventDataType tmp;
+    bool first = true;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; it++) {
+        Session & sess = *(*it);
+
+        if (sess.enabled() && sess.m_min.contains(code)) {
+
+            tmp = sess.Min(code);
+
+            if (first) {
+                min = tmp;
+                first = false;
+            } else {
+                if (tmp < min) { min = tmp; }
+            }
+        }
+    }
+
+    return min;
+}
+
+EventDataType Day::physMin(ChannelID code)
+{
+    EventDataType min = 0;
+    EventDataType tmp;
+    bool first = true;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.enabled() && sess.m_min.contains(code)) {
+
+            tmp = sess.physMin(code);
+
+            if (first) {
+                min = tmp;
+                first = false;
+            } else {
+                if (tmp < min) { min = tmp; }
+            }
+        }
+    }
+
+    return min;
+}
+
+bool Day::hasData(ChannelID code, SummaryType type)
+{
+    bool has = false;
+
+    QList<Session *>::iterator end = sessions.end();
+
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+        if (sess.type() == MT_JOURNAL) continue;
+
+        if (sess.enabled()) {
+            switch (type) {
+            //        case ST_90P:
+            //            has=sess->m_90p.contains(code);
+            //            break;
+            case ST_PERC:
+                has = sess.m_valuesummary.contains(code);
+                break;
+
+            case ST_MIN:
+                has = sess.m_min.contains(code);
+                break;
+
+            case ST_MAX:
+                has = sess.m_max.contains(code);
+                break;
+
+            case ST_CNT:
+                has = sess.m_cnt.contains(code);
+                break;
+
+            case ST_AVG:
+                has = sess.m_avg.contains(code);
+                break;
+
+            case ST_WAVG:
+                has = sess.m_wavg.contains(code);
+                break;
+
+            case ST_CPH:
+                has = sess.m_cph.contains(code);
+                break;
+
+            case ST_SPH:
+                has = sess.m_sph.contains(code);
+                break;
+
+            case ST_FIRST:
+                has = sess.m_firstchan.contains(code);
+                break;
+
+            case ST_LAST:
+                has = sess.m_lastchan.contains(code);
+                break;
+
+            case ST_SUM:
+                has = sess.m_sum.contains(code);
+                break;
+
+            default:
+                break;
+            }
+
+            if (has) { break; }
+        }
+    }
+
+    return has;
+}
+
+EventDataType Day::Max(ChannelID code)
+{
+    EventDataType max = 0;
+    EventDataType tmp;
+    bool first = true;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.enabled() && sess.m_max.contains(code)) {
+
+            tmp = sess.Max(code);
+
+            if (first) {
+                max = tmp;
+                first = false;
+            } else {
+                if (tmp > max) { max = tmp; }
+            }
+        }
+    }
+
+    return max;
+}
+
+EventDataType Day::physMax(ChannelID code)
+{
+    EventDataType max = 0;
+    EventDataType tmp;
+    bool first = true;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.enabled() && sess.m_max.contains(code)) {
+            tmp = sess.physMax(code);
+
+            if (first) {
+                max = tmp;
+                first = false;
+            } else {
+                if (tmp > max) { max = tmp; }
+            }
+        }
+    }
+
+    return max;
+}
+EventDataType Day::cph(ChannelID code)
+{
+    double sum = 0;
+
+    //EventDataType h=0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.enabled() && sess.m_cnt.contains(code)) {
+            sum += sess.count(code);
+        }
+    }
+
+    sum /= hours();
+    return sum;
+}
+
+EventDataType Day::sph(ChannelID code)
+{
+    EventDataType sum = 0;
+    EventDataType h = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.enabled() && sess.m_sum.contains(code)) {
+            sum += sess.sum(code) / 3600.0; //*sessions[i]->hours();
+            //h+=sessions[i]->hours();
+        }
+    }
+
+    h = hours();
+    sum = (100.0 / h) * sum;
+    return sum;
+}
+
+EventDataType Day::count(ChannelID code)
+{
+    EventDataType total = 0;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.enabled() && sess.m_cnt.contains(code)) {
+            total += sess.count(code);
+        }
+    }
+
+    return total;
+}
+
+bool Day::summaryOnly()
+{
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+        if (sess.summaryOnly())
+            return true;
+    }
+    return false;
+}
+
+bool Day::settingExists(ChannelID id)
+{
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.enabled()) {
+            QHash<ChannelID, QVariant>::iterator set = sess.settings.find(id);
+
+            if (set != sess.settings.end()) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+bool Day::eventsLoaded()
+{
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.eventsLoaded()) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+bool Day::channelExists(ChannelID id)
+{
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.enabled() && sess.eventlist.contains(id)) {
+            return true;
+        }
+    }
+
+    return false;
+}
+bool Day::hasEvents() {
+    int s=sessions.size();
+    for (int i=0; i<s; ++i) {
+        if (sessions.at(i)->eventlist.size() > 0) return true;
+    }
+    return false;
+}
+
+bool Day::channelHasData(ChannelID id)
+{
+    QList<Session *>::iterator end = sessions.end();
+
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if (sess.enabled()) {
+            if (sess.m_cnt.contains(id)) {
+                return true;
+            }
+
+            if (sess.eventlist.contains(id)) {
+                return true;
+            }
+
+            if (sess.m_valuesummary.contains(id)) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+void Day::OpenEvents()
+{
+//    if (d_events_open)
+//        return;
+    Q_FOREACH(Session * session, sessions) {
+        if (session->type() != MT_JOURNAL)
+            session->OpenEvents();
+    }
+    d_events_open = true;
+}
+
+void Day::OpenSummary()
+{
+    if (d_summaries_open) return;
+    Q_FOREACH(Session * session, sessions) {
+        session->LoadSummary();
+    }
+    d_summaries_open = true;
+}
+
+
+void Day::CloseEvents()
+{
+    Q_FOREACH(Session * session, sessions) {
+        session->TrashEvents();
+    }
+    d_events_open = false;
+}
+
+QList<ChannelID> Day::getSortedMachineChannels(MachineType type, quint32 chantype)
+{
+    QList<ChannelID> available;
+    QHash<MachineType, Machine *>::iterator mi_end = machines.end();
+    for (QHash<MachineType, Machine *>::iterator mi = machines.begin(); mi != mi_end; mi++) {
+        if (mi.key() != type) continue;
+        available.append(mi.value()->availableChannels(chantype));
+    }
+
+    QMultiMap<int, ChannelID> order;
+
+    for (int i=0; i < available.size(); ++i) {
+        ChannelID code = available.at(i);
+        order.insert(schema::channel[code].order(), code);
+    }
+
+    QMultiMap<int, ChannelID>::iterator it;
+
+    QList<ChannelID> channels;
+    for (it = order.begin(); it != order.end(); ++it) {
+        ChannelID code = it.value();
+        channels.append(code);
+    }
+    return channels;
+}
+
+
+QList<ChannelID> Day::getSortedMachineChannels(quint32 chantype)
+{
+    QList<ChannelID> available;
+    QHash<MachineType, Machine *>::iterator mi_end = machines.end();
+    for (QHash<MachineType, Machine *>::iterator mi = machines.begin(); mi != mi_end; mi++) {
+        if (mi.key() == MT_JOURNAL) continue;
+        available.append(mi.value()->availableChannels(chantype));
+    }
+
+    QMultiMap<int, ChannelID> order;
+
+    for (int i=0; i < available.size(); ++i) {
+        ChannelID code = available.at(i);
+        order.insert(schema::channel[code].order(), code);
+    }
+
+    QMultiMap<int, ChannelID>::iterator it;
+
+    QList<ChannelID> channels;
+    for (it = order.begin(); it != order.end(); ++it) {
+        ChannelID code = it.value();
+        channels.append(code);
+    }
+    return channels;
+}
+
+qint64 Day::first(MachineType type)
+{
+    qint64 date = 0;
+    qint64 tmp;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if ((sess.type() == type) && sess.enabled()) {
+            tmp = sess.first();
+
+            if (!tmp) { continue; }
+
+            if (!date) {
+                date = tmp;
+            } else {
+                if (tmp < date) { date = tmp; }
+            }
+        }
+    }
+
+    return date;
+}
+
+qint64 Day::first()
+{
+    qint64 date = 0;
+    qint64 tmp;
+
+    QList<Session *>::iterator end = sessions.end();
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+        if (sess.type() == MT_JOURNAL) continue;
+        if (sess.enabled()) {
+            tmp = sess.first();
+
+            if (!tmp) { continue; }
+
+            if (!date) {
+                date = tmp;
+            } else {
+                if (tmp < date) { date = tmp; }
+            }
+        }
+    }
+
+    return date;
+}
+
+//! \brief Returns the last session time of this day
+qint64 Day::last()
+{
+    qint64 date = 0;
+    qint64 tmp;
+
+    QList<Session *>::iterator end = sessions.end();
+
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+        if (sess.type() == MT_JOURNAL) continue;
+
+        if (sess.enabled()) {
+            tmp = sess.last();
+
+            if (!tmp) { continue; }
+
+            if (!date) {
+                date = tmp;
+            } else {
+                if (tmp > date) { date = tmp; }
+            }
+        }
+    }
+
+    return date;
+}
+
+qint64 Day::last(MachineType type)
+{
+    qint64 date = 0;
+    qint64 tmp;
+
+    QList<Session *>::iterator end = sessions.end();
+
+
+    for (QList<Session *>::iterator it = sessions.begin(); it != end; ++it) {
+        Session & sess = *(*it);
+
+        if ((sess.type() == type) && sess.enabled()) {
+            tmp = sess.last();
+
+            if (!tmp) { continue; }
+
+            if (!date) {
+                date = tmp;
+            } else {
+                if (tmp > date) { date = tmp; }
+            }
+        }
+    }
+
+    return date;
+}
+
+bool Day::removeSession(Session *sess)
+{
+    MachineType mt = sess->type();
+    bool b = sessions.removeAll(sess) > 0;
+    if (!searchMachine(mt)) {
+        machines.remove(mt);
+    }
+    return b;
+}
+bool Day::searchMachine(MachineType mt) {
+    for (int i=0;  i < sessions.size(); ++i) {
+        if (sessions.at(i)->type() == mt)
+            return true;
+    }
+    return false;
+}
+
+
+QString Day::getCPAPMode()
+{
+    Machine * mach = machine(MT_CPAP);
+    if (!mach) return STR_MessageBox_Error;
+
+    CPAPLoader * loader = qobject_cast<CPAPLoader *>(mach->loader());
+
+    ChannelID modechan = loader->CPAPModeChannel();
+
+    schema::Channel & chan = schema::channel[modechan];
+
+    int mode = (CPAPMode)(int)qRound(settings_wavg(modechan));
+
+    return chan.option(mode);
+
+
+//    if (mode == MODE_CPAP) {
+//        return QObject::tr("Fixed");
+//    } else if (mode == MODE_APAP) {
+//        return QObject::tr("Auto");
+//    } else if (mode == MODE_BILEVEL_FIXED ) {
+//        return QObject::tr("Fixed Bi-Level");
+//    } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+//        return QObject::tr("Auto Bi-Level (Fixed PS)");
+//    } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
+//        return QObject::tr("Auto Bi-Level (Variable PS)");
+//    }  else if (mode == MODE_ASV) {
+//        return QObject::tr("ASV Fixed EPAP");
+//    } else if (mode == MODE_ASV_VARIABLE_EPAP) {
+//        return QObject::tr("ASV Variable EPAP");
+//    }
+//    return STR_TR_Unknown;
+}
+
+QString Day::getPressureRelief()
+{
+    Machine * mach = machine(MT_CPAP);
+    if (!mach) return STR_MessageBox_Error;
+
+    CPAPLoader * loader = qobject_cast<CPAPLoader *>(mach->loader());
+
+    if (!loader) return STR_MessageBox_Error;
+
+    QString pr_str;
+
+    ChannelID pr_level_chan = loader->PresReliefLevel();
+    ChannelID pr_mode_chan = loader->PresReliefMode();
+
+    if ((pr_mode_chan != NoChannel) && settingExists(pr_mode_chan)) {
+        int pr_mode = qRound(settings_wavg(pr_mode_chan));
+        pr_str = QObject::tr("%1%2").arg(loader->PresReliefLabel()).arg(schema::channel[pr_mode_chan].option(pr_mode));
+
+        int pr_level = -1;
+        if (pr_level_chan != NoChannel && settingExists(pr_level_chan)) {
+            pr_level = qRound(settings_wavg(pr_level_chan));
+        }
+        if (pr_level >= 0) pr_str += QString(" %1").arg(schema::channel[pr_level_chan].option(pr_level));
+    } else pr_str = STR_TR_None;
+    return pr_str;
+}
+
+
+QString Day::getPressureSettings()
+{
+    Q_ASSERT(machine(MT_CPAP) != nullptr);
+
+    CPAPMode mode = (CPAPMode)(int)settings_max(CPAP_Mode);
+    QString units = schema::channel[CPAP_Pressure].units();
+
+    if (mode == MODE_CPAP) {
+        return QObject::tr("Fixed %1 (%2)").arg(settings_min(CPAP_Pressure)).arg(units);
+    } else if (mode == MODE_APAP) {
+        return QObject::tr("Min %1 Max %2 (%3)").arg(settings_min(CPAP_PressureMin)).arg(settings_max(CPAP_PressureMax)).arg(units);
+    } else if (mode == MODE_BILEVEL_FIXED ) {
+        return QObject::tr("EPAP %1 IPAP %2 (%3)").arg(settings_min(CPAP_EPAP),0,'f',1).arg(settings_max(CPAP_IPAP),0,'f',1).arg(units);
+    } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+        return QObject::tr("PS %1 over %2-%3 (%4)").arg(settings_max(CPAP_PS),0,'f',1).arg(settings_min(CPAP_EPAPLo),0,'f',1).arg(settings_max(CPAP_IPAPHi),0,'f',1).arg(units);
+    } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
+        return QObject::tr("Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)").arg(settings_min(CPAP_EPAPLo),0,'f',1).arg(settings_max(CPAP_IPAPHi),0,'f',1).arg(settings_min(CPAP_PSMin),0,'f',1).arg(settings_max(CPAP_PSMax),0,'f',1).arg(units);
+    } else if (mode == MODE_ASV) {
+        return QObject::tr("EPAP %1 PS %2-%3 (%6)").arg(settings_min(CPAP_EPAP),0,'f',1).arg(settings_min(CPAP_PSMin),0,'f',1).arg(settings_max(CPAP_PSMax),0,'f',1).arg(units);
+    } else if (mode == MODE_ASV_VARIABLE_EPAP) {
+        return QObject::tr("Min EPAP %1 Max IPAP %2 PS %3-%4 (%5)").
+                arg(settings_min(CPAP_EPAPLo),0,'f',1).
+                arg(settings_max(CPAP_IPAPHi),0,'f',1).
+                arg(settings_max(CPAP_PSMin),0,'f',1).
+                arg(settings_min(CPAP_PSMax),0,'f',1).
+                arg(units);
+    }
+
+    return STR_TR_Unknown;
+}
+
+
+EventDataType Day::calc(ChannelID code, ChannelCalcType type)
+{
+    EventDataType value;
+
+    switch(type) {
+    case Calc_Min:
+        value = Min(code);
+        break;
+    case Calc_Middle:
+        value = calcMiddle(code);
+        break;
+    case Calc_Perc:
+        value = calcPercentile(code);
+        break;
+    case Calc_Max:
+        value = calcMax(code);
+        break;
+    case Calc_UpperThresh:
+        value = schema::channel[code].upperThreshold();
+        break;
+    case Calc_LowerThresh:
+        value = schema::channel[code].lowerThreshold();
+        break;
+    case Calc_Zero:
+    default:
+        value = 0;
+        break;
+    };
+    return value;
+}
diff --git a/sleepyhead/SleepLib/day.h b/sleepyhead/SleepLib/day.h
new file mode 100644
index 0000000..5e3e2a5
--- /dev/null
+++ b/sleepyhead/SleepLib/day.h
@@ -0,0 +1,326 @@
+/* SleepLib Day Class Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef DAY_H
+#define DAY_H
+
+#include "SleepLib/common.h"
+#include "SleepLib/machine_common.h"
+#include "SleepLib/machine.h"
+#include "SleepLib/event.h"
+#include "SleepLib/session.h"
+
+/*! \class OneTypePerDay
+    \brief An Exception class to catch multiple machine records per day
+    */
+class OneTypePerDay
+{
+};
+
+class Machine;
+class Session;
+
+/*! \class Day
+    \brief Contains a list of all Sessions for single date, for a single machine
+    */
+class Day
+{
+  public:
+    Day();
+    ~Day();
+
+    //! \brief Add a new machine to this day record
+    bool addMachine(Machine *m);
+
+    //! \brief Returns a machine record if present of specified machine type
+    Machine *machine(MachineType type);
+
+    //! \brief Returns a list of sessions for the specified machine type
+    QList<Session *> getSessions(MachineType type, bool ignore_enabled = false);
+
+    //! \brief Add Session to this Day object (called during Load)
+    void addSession(Session *s);
+
+    EventDataType rangeCount(ChannelID code, qint64 st, qint64 et);
+    EventDataType rangeSum(ChannelID code, qint64 st, qint64 et);
+    EventDataType rangeAvg(ChannelID code, qint64 st, qint64 et);
+    EventDataType rangeWavg(ChannelID code, qint64 st, qint64 et);
+    EventDataType rangePercentile(ChannelID code, float p, qint64 st, qint64 et);
+
+    //! \brief Returns the count of all this days sessions' events for this day
+    EventDataType count(ChannelID code);
+
+    //! \brief Returns the Minimum of all this sessions' events for this day
+    EventDataType Min(ChannelID code);
+
+    //! \brief Returns the Maximum of all sessions' events for this day
+    EventDataType Max(ChannelID code);
+
+    //! \brief Returns the Minimum of all this sessions' events for this day
+    EventDataType physMin(ChannelID code);
+
+    //! \brief Returns the Maximum of all sessions' events for this day
+    EventDataType physMax(ChannelID code);
+
+    //! \brief Returns the Count-per-hour of all sessions' events for this day
+    EventDataType cph(ChannelID code);
+
+    //! \brief Returns the Sum-per-hour of all this sessions' events for this day
+    EventDataType sph(ChannelID code);
+
+    //! \brief Returns (and caches) the 90th Percentile of all this sessions' events for this day
+    EventDataType p90(ChannelID code);
+
+    //! \brief Returns the Average of all this sessions' events for this day
+    EventDataType avg(ChannelID code);
+
+    //! \brief Returns the Sum of all this sessions' events for this day
+    EventDataType sum(ChannelID code);
+
+    //! \brief Returns the Time-Weighted Average of all this sessions' events for this day
+    EventDataType wavg(ChannelID code);
+
+    //! \brief Returns a requested Percentile of all this sessions' events for this day
+    EventDataType percentile(ChannelID code, EventDataType percentile);
+
+    //! \brief Returns if the cache contains SummaryType information about the requested code
+    bool hasData(ChannelID code, SummaryType type);
+
+    inline bool hasMachine(MachineType mt) const { return machines.contains(mt); }
+
+    bool searchMachine(MachineType mt);
+
+    //! \brief Returns the Average of all Sessions setting 'code' for this day
+    EventDataType settings_avg(ChannelID code);
+
+    //! \brief Returns the Time-Weighted Average of all Sessions setting 'code' for this day
+    EventDataType settings_wavg(ChannelID code);
+
+    //! \brief Returns the Sum of all Sessions setting 'code' for this day
+    EventDataType settings_sum(ChannelID code);
+
+    //! \brief Returns the Minimum of all Sessions setting 'code' for this day
+    EventDataType settings_min(ChannelID code);
+
+    //! \brief Returns the Maximum of all Sessions setting 'code' for this day
+    EventDataType settings_max(ChannelID code);
+
+    //! \brief Returns the amount of time (in decimal minutes) the Channel spent above the threshold
+    EventDataType timeAboveThreshold(ChannelID code, EventDataType threshold);
+
+    //! \brief Returns the amount of time (in decimal minutes) the Channel spent below the threshold
+    EventDataType timeBelowThreshold(ChannelID code, EventDataType threshold);
+
+    //! \brief Returns the value for Channel code at a given time
+    EventDataType lookupValue(ChannelID code, qint64 time, bool square);
+
+    //! \brief Returns the count of code events inside span flag event durations
+    EventDataType countInsideSpan(ChannelID span, ChannelID code);
+
+
+    //! \brief Returns the first session time of this day
+    qint64 first();
+
+    //! \brief Returns the last session time of this day
+    qint64 last();
+
+    //! \brief Returns the first session time of this machine type for this day
+    qint64 first(MachineType type);
+
+    //! \brief Returns the last session time of this machine type for this day
+    qint64 last(MachineType type);
+
+
+    // //! \brief Sets the first session time of this day
+    // void setFirst(qint64 val) { d_first=val; }
+
+    // //! \brief Sets the last session time of this day
+    // void setLast(qint64 val) { d_last=val; }
+
+    //! \brief Returns the last session time of this day for the supplied Channel code
+    qint64 first(ChannelID code);
+
+    //! \brief Returns the last session time of this day for the supplied Channel code
+    qint64 last(ChannelID code);
+
+    //! \brief Returns the total time in milliseconds for this day
+    qint64 total_time();
+
+    //! \brief Returns the total time in milliseconds for this day for given machine type
+    qint64 total_time(MachineType type);
+
+    //! \brief Returns true if this day has enabled sessions for supplied machine type
+    bool hasEnabledSessions(MachineType);
+
+    //! \brief Returns true if this day has enabled sessions
+    bool hasEnabledSessions();
+
+    //! \brief Return the total time in decimal hours for this day
+    EventDataType hours() {
+        if (!d_invalidate) return d_hours;
+        d_invalidate = false;
+        return d_hours = double(total_time()) / 3600000.0;
+    }
+    EventDataType hours(MachineType type) {
+        QHash<MachineType, EventDataType>::iterator it = d_machhours.find(type);
+        if (it == d_machhours.end()) {
+            return d_machhours[type] = double(total_time(type)) / 3600000.0;
+        }
+        return it.value();
+    }
+
+    //! \brief Return the session indexed by i
+    Session *operator [](int i) { return sessions[i]; }
+
+    //! \brief Return the first session as a QVector<Session*>::iterator
+    QList<Session *>::iterator begin() { return sessions.begin(); }
+    //! \brief Return the end session record as a QVector<Session*>::iterator
+    QList<Session *>::iterator end() { return sessions.end(); }
+
+    //! \brief Check if day contains SummaryOnly records
+    bool summaryOnly();
+
+    //! \brief Finds and returns the index of a session, otherwise -1 if it's not there
+    int find(Session *sess) { return sessions.indexOf(sess); }
+
+    Session *find(SessionID sessid);
+
+    //! \brief Returns the number of Sessions in this day record
+    int size() { return sessions.size(); }
+
+    //! \brief Loads all Events files for this Days Sessions
+    void OpenEvents();
+    void OpenSummary();
+
+
+    //! \brief Closes all Events files for this Days Sessions
+    void CloseEvents();
+
+    //! \brief Returns true if this Day contains loaded Event Data for this channel.
+    bool channelExists(ChannelID id);
+
+    //! \brief Returns true if session events are loaded
+    bool eventsLoaded();
+
+    //! \brief Returns true if this Day contains loaded Event Data or a cached count for this channel
+    bool channelHasData(ChannelID id);
+
+    //! \brief Returns true if this day contains the supplied settings Channel id
+    bool settingExists(ChannelID id);
+
+    //! \brief Removes a session from this day
+    bool removeSession(Session *sess);
+
+    //! \brief Returns a list of channels of supplied types, according to channel orders
+    QList<ChannelID> getSortedMachineChannels(quint32 chantype);
+
+    //! \brief Returns a list of machine specific channels of supplied types, according to channel orders
+    QList<ChannelID> getSortedMachineChannels(MachineType type, quint32 chantype);
+
+    // Some ugly CPAP specific stuff
+    QString getCPAPMode();
+    QString getPressureRelief();
+    QString getPressureSettings();
+
+    // Some more very much CPAP only related stuff
+
+    //! \brief Calculate AHI (Apnea Hypopnea Index)
+    EventDataType calcAHI() {
+        EventDataType c = count(CPAP_Hypopnea) + count(CPAP_Obstructive) + count(CPAP_Apnea) + count(CPAP_ClearAirway);
+        EventDataType minutes = hours(MT_CPAP) * 60.0;
+        return (c * 60.0) / minutes;
+    }
+
+    //! \brief Calculate RDI (Respiratory Disturbance Index)
+    EventDataType calcRDI() {
+        EventDataType c = count(CPAP_Hypopnea) + count(CPAP_Obstructive) + count(CPAP_Apnea) + count(CPAP_ClearAirway) + count(CPAP_RERA);
+        EventDataType minutes = hours(MT_CPAP) * 60.0;
+        return (c * 60.0) / minutes;
+    }
+
+    //! \brief Percent of night for specified channel
+    EventDataType calcPON(ChannelID code) {
+        EventDataType c = sum(code);
+        EventDataType minutes = hours(MT_CPAP) * 60.0;
+
+        return (100.0 / minutes) * (c / 60.0);
+    }
+
+    //! \brief Calculate index (count per hour) for specified channel
+    EventDataType calcIdx(ChannelID code) {
+        EventDataType c = count(code);
+        EventDataType minutes = hours(MT_CPAP) * 60.0;
+
+        return (c * 60.0) / minutes;
+    }
+
+    //! \brief SleepyyHead Events Index, AHI combined with SleepyHead detected events.. :)
+    EventDataType calcSHEI() {
+        EventDataType c = count(CPAP_Hypopnea) + count(CPAP_Obstructive) + count(CPAP_Apnea) + count(CPAP_ClearAirway) + count(CPAP_UserFlag1) + count(CPAP_UserFlag2);
+        EventDataType minutes = hours(MT_CPAP) * 60.0;
+        return (c * 60.0) / minutes;
+    }
+    //! \brief Total duration of all Apnea/Hypopnea events in seconds,
+    EventDataType calcTTIA() {
+        EventDataType c = sum(CPAP_Hypopnea) + sum(CPAP_Obstructive) + sum(CPAP_Apnea) + sum(CPAP_ClearAirway);
+        return c;
+    }
+    bool hasEvents();
+
+    // According to preferences..
+    EventDataType calcMiddle(ChannelID code);
+    EventDataType calcMax(ChannelID code);
+    EventDataType calcPercentile(ChannelID code);
+    static QString calcMiddleLabel(ChannelID code);
+    static QString calcMaxLabel(ChannelID code);
+    static QString calcPercentileLabel(ChannelID code);
+
+    EventDataType calc(ChannelID code, ChannelCalcType type);
+
+    Session * firstSession(MachineType type);
+
+    //! \brief A QList containing all Sessions objects for this day
+    QList<Session *> sessions;
+
+    QHash<MachineType, Machine *> machines;
+
+    void incUseCounter() { d_useCounter++; }
+    void decUseCounter() { d_useCounter--; if (d_useCounter<0) d_useCounter = 0; }
+    int useCounter() { return d_useCounter; }
+
+
+    void invalidate() {
+        d_invalidate = true;
+        d_machhours.clear();
+    }
+
+    void updateCPAPCache();
+
+    inline QDate date() const { return d_date; }
+    void setDate(QDate date) { d_date = date; }
+  protected:
+
+
+
+    QHash<ChannelID, QHash<EventDataType, EventDataType> > perc_cache;
+    //qint64 d_first,d_last;
+  private:
+    bool d_firstsession;
+    int d_useCounter;
+    bool d_summaries_open;
+    bool d_events_open;
+    float d_hours;
+    QHash<MachineType, EventDataType> d_machhours;
+    QHash<ChannelID, long> d_count;
+    QHash<ChannelID, double> d_sum;
+    bool d_invalidate;
+    QDate d_date;
+};
+
+
+#endif // DAY_H
diff --git a/sleepyhead/SleepLib/event.cpp b/sleepyhead/SleepLib/event.cpp
new file mode 100644
index 0000000..0451f51
--- /dev/null
+++ b/sleepyhead/SleepLib/event.cpp
@@ -0,0 +1,332 @@
+/* SleepLib Event Class Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QDebug>
+#include "event.h"
+
+EventList::EventList(EventListType et, EventDataType gain, EventDataType offset, EventDataType min,
+                     EventDataType max, double rate, bool second_field)
+    : m_type(et), m_gain(gain), m_offset(offset), m_min(min), m_max(max), m_rate(rate),
+      m_second_field(second_field)
+{
+    m_first = m_last = 0;
+    m_count = 0;
+
+    if (min == max) { // Update Min & Max unless forceably set here..
+        m_update_minmax = true;
+        m_min2 = m_min = 999999999.0F;
+        m_max2 = m_max = -999999999.0F;
+    } else {
+        m_update_minmax = false;
+    }
+
+    m_data.reserve(2048);
+
+    // Reserve a few to increase performace??
+}
+
+void EventList::clear()
+{
+    m_min2 = m_min = 999999999.0F;
+    m_max2 = m_max = -999999999.0F;
+    m_update_minmax = true;
+    m_first = m_last = 0;
+    m_count = 0;
+
+    m_data.clear();
+    m_data2.clear();
+    m_time.clear();
+
+}
+
+qint64 EventList::time(quint32 i) const
+{
+    if (m_type == EVL_Event) {
+        return m_first + qint64(m_time[i]);
+    }
+
+    return m_first + qint64((EventDataType(i) * m_rate));
+}
+
+EventDataType EventList::data(quint32 i)
+{
+    return EventDataType(m_data[i]) * m_gain;
+}
+
+EventDataType EventList::data2(quint32 i)
+{
+    return EventDataType(m_data2[i]);
+}
+
+void EventList::AddEvent(qint64 time, EventStoreType data)
+{
+    // Apply gain & offset
+    EventDataType val = EventDataType(data) * m_gain; // ignoring m_offset
+
+    if (m_update_minmax) {
+        if (m_count == 0) {
+            m_max = m_min = val;
+        } else {
+            m_min = (val < m_min) ? val : m_min;
+            m_max = (val > m_max) ? val : m_max;
+        }
+    }
+
+    if (!m_first) {
+        m_first = time;
+        m_last = time;
+    }
+
+    if (m_first > time) {
+        // Crud.. Update all the previous records
+        // This really shouldn't happen.
+        qDebug() << "Unordered time detected in AddEvent().";
+
+        qint32 delta = (m_first - time);
+
+        for (quint32 i = 0; i < m_count; ++i) {
+            m_time[i] -= delta;
+        }
+
+        m_first = time;
+    }
+
+    if (m_last < time) {
+        m_last = time;
+    }
+
+    quint32 delta = (time - m_first);
+
+    m_data.push_back(data);
+    m_time.push_back(delta);
+    m_count++;
+}
+
+void EventList::AddEvent(qint64 time, EventStoreType data, EventStoreType data2)
+{
+    AddEvent(time, data);
+
+    if (!m_second_field)
+        return;
+
+    m_min2 = (data2 < m_min2) ? data2 : m_min2;
+    m_max2 = (data2 > m_max2) ? data2 : m_max2;
+
+    m_data2.push_back(data2);
+}
+
+// Adds a consecutive waveform chunk
+void EventList::AddWaveform(qint64 start, qint16 *data, int recs, qint64 duration)
+{
+    if (m_type != EVL_Waveform) {
+        qWarning() << "Attempted to add waveform data to non-waveform object";
+        return;
+    }
+
+    if (!m_rate) {
+        qWarning() << "Attempted to add waveform without setting sample rate";
+        return;
+    }
+
+    qint64 last = start + duration;
+
+    if (!m_first) {
+        m_first = start;
+        m_last = last;
+    }
+
+    if (m_last > start) {
+        //qWarning() << "Attempted to add waveform with previous timestamp";
+        // return;
+
+        // technically start should equal m_last+1 sample.. check this too.
+    }
+
+    if (m_last < last) {
+        m_last = last;
+    }
+
+    // TODO: Check waveform chunk really is contiguous
+    //double rate=duration/recs;
+
+    //realloc buffers.
+    int r = m_count;
+    m_count += recs;
+    m_data.resize(m_count);
+
+  //  EventStoreType *edata = m_data.data();
+
+    EventStoreType raw;
+ //   qint16 *ep = data + recs;
+    qint16 *sp = data;
+//    EventStoreType *dp = &edata[r];
+
+    if (m_update_minmax) {
+        EventDataType min = m_min, max = m_max, val, gain = m_gain;
+
+        for (int i=0; i < recs; ++i ) {
+            m_data[r++] = raw = *sp++;
+            val = EventDataType(raw) * gain + m_offset;
+            if (min > val) { min = val; }
+            if (max < val) { max = val; }
+        }
+//        for (sp = data; sp < ep; ++sp) {
+//            *dp++ = raw = *sp;
+//            val = EventDataType(raw) * gain + m_offset;
+
+//            if (min > val) { min = val; }
+
+//            if (max < val) { max = val; }
+//        }
+
+        m_min = min;
+        m_max = max;
+    } else {
+        //register EventDataType val,gain=m_gain;
+        for (int i=0; i < recs; ++i) {
+            m_data[i] = *sp++;
+        }
+//        for (sp = data; sp < ep; ++sp) {
+//            *dp++ = *sp;
+//            //val=EventDataType(raw)*gain;
+//        }
+    }
+
+}
+void EventList::AddWaveform(qint64 start, unsigned char *data, int recs, qint64 duration)
+{
+    if (m_type != EVL_Waveform) {
+        qWarning() << "Attempted to add waveform data to non-waveform object";
+        return;
+    }
+
+    if (!m_rate) {
+        qWarning() << "Attempted to add waveform without setting sample rate";
+        return;
+    }
+
+    // duration=recs*rate;
+    qint64 last = start + duration;
+
+    if (!m_first) {
+        m_first = start;
+        m_last = last;
+    }
+
+    if (m_last > start) {
+        //qWarning() << "Attempted to add waveform with previous timestamp";
+        // return;
+
+        // technically start should equal m_last+1 sample.. check this too.
+    }
+
+    if (m_last < last) {
+        m_last = last;
+    }
+
+    // TODO: Check waveform chunk really is contiguos
+
+    //realloc buffers.
+    int r = m_count;
+    m_count += recs;
+    m_data.resize(m_count);
+
+    EventStoreType *edata = m_data.data();
+    EventStoreType raw;
+    EventDataType val;
+
+    unsigned char *sp;
+    unsigned char *ep = data + recs;
+    EventStoreType *dp = &edata[r];
+
+    if (m_update_minmax) {
+        // ignoring m_offset
+        for (sp = data; sp < ep; ++sp) {
+            raw = *sp;
+            val = EventDataType(raw) * m_gain;
+
+            if (m_min > val) { m_min = val; }
+
+            if (m_max < val) { m_max = val; }
+
+            *dp++ = raw;
+        }
+    } else {
+        for (sp = data; sp < ep; ++sp) {
+            raw = *sp;
+            //val = EventDataType(raw) * m_gain;
+            *dp++ = raw;
+        }
+    }
+}
+
+void EventList::AddWaveform(qint64 start, char *data, int recs, qint64 duration)
+{
+    if (m_type != EVL_Waveform) {
+        qWarning() << "Attempted to add waveform data to non-waveform object";
+        return;
+    }
+
+    if (!m_rate) {
+        qWarning() << "Attempted to add waveform without setting sample rate";
+        return;
+    }
+
+    // duration=recs*rate;
+    qint64 last = start + duration;
+
+    if (!m_first) {
+        m_first = start;
+        m_last = last;
+    } else {
+        if (m_last > start) {
+            //qWarning() << "Attempted to add waveform with previous timestamp";
+            //return;
+
+            // technically start should equal m_last+1 sample.. check this too.
+        }
+
+        if (m_last < last) {
+            m_last = last;
+        }
+    }
+
+    // TODO: Check waveform chunk really is contiguos
+
+    //realloc buffers.
+
+    int r = m_count;
+    m_count += recs;
+    m_data.resize(m_count);
+
+    EventStoreType *edata = m_data.data();
+    EventStoreType raw;
+    EventDataType val; // FIXME: sstangl: accesses random memory
+
+    char *sp;
+    char *ep = data + recs;
+    EventStoreType *dp = &edata[r];
+
+    if (m_update_minmax) {
+        for (sp = data; sp < ep; ++sp) {
+            raw = *sp;
+            val = EventDataType(raw) * m_gain + m_offset;
+
+            if (m_min > val) { m_min = val; }
+            if (m_max < val) { m_max = val; }
+
+            *dp++ = raw;
+        }
+    } else {
+        for (sp = data; sp < ep; ++sp) {
+            raw = *sp;
+     //       val = EventDataType(raw) * m_gain + m_offset;
+            *dp++ = raw;
+        }
+    }
+}
diff --git a/sleepyhead/SleepLib/event.h b/sleepyhead/SleepLib/event.h
new file mode 100644
index 0000000..71ff1cf
--- /dev/null
+++ b/sleepyhead/SleepLib/event.h
@@ -0,0 +1,188 @@
+/* SleepLib Event Class Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef EVENT_H
+#define EVENT_H
+
+#include <QDateTime>
+
+#include "machine_common.h"
+
+//! \brief EventLists can either be Waveform or Event types
+enum EventListType { EVL_Waveform, EVL_Event };
+
+/*! \class EventList
+    \author Mark Watkins <jedimark_at_users.sourceforge.net>
+    \brief EventLists contains waveforms at a specified rate, or a list of event and time data.
+    */
+class EventList
+{
+    friend class Session;
+
+  public:
+    EventList(EventListType et, EventDataType gain = 1.0, EventDataType offset = 0.0,
+              EventDataType min = 0.0, EventDataType max = 0.0, double rate = 0.0,
+              bool second_field = false);
+
+    //! \brief Wipe the event list so it can be reused
+    void clear();
+
+    /*! \brief Add an event starting at time, containing data to this event list
+      Note, data2 is only used if second_field is specified in the constructor */
+    void AddEvent(qint64 time, EventStoreType data);
+    void AddEvent(qint64 time, EventStoreType data, EventStoreType data2);
+    void AddWaveform(qint64 start, qint16 *data, int recs, qint64 duration);
+    void AddWaveform(qint64 start, unsigned char *data, int recs, qint64 duration);
+    void AddWaveform(qint64 start, char *data, int recs, qint64 duration);
+
+    //! \brief Returns a count of records contained in this EventList
+    inline quint32 count() const { return m_count; }
+
+    //! \brief Manually sets a count of records contained in this EventList
+    void setCount(quint32 count) { m_count = count; }
+
+    //! \brief Returns a raw ("ungained") data value from index position i
+    inline EventStoreType raw(int i)  const { return m_data[i]; }
+
+    //! \brief Returns a raw ("ungained") data2 value from index position i
+    inline EventStoreType raw2(int i) const { return m_data2[i]; }
+
+    //! \brief Returns a data value multiplied by gain from index position i
+    EventDataType data(quint32 i);
+
+    //! \brief Returns a data2 value multiplied by gain from index position i
+    EventDataType data2(quint32 i);
+
+    //! \brief Returns either the timestamp for the i'th event, or calculates the waveform time position i
+    qint64 time(quint32 i) const;
+
+    //! \brief Returns true if this EventList uses the second data field
+    bool hasSecondField() { return m_second_field; }
+
+    //! \brief Returns the first events/waveforms starting time in milliseconds since epoch
+    inline qint64 first() const { return m_first; }
+
+    //! \brief Returns the last events/waveforms ending time in milliseconds since epoch
+    inline qint64 last() const { return m_last; }
+
+    //! \brief Returns the timespan covered by this EventList, in milliseconds since epoch
+    inline qint64 duration() { return m_last - m_first; }
+
+    //! \brief Sets the first events/waveforms starting time in milliseconds since epoch
+    void setFirst(qint64 val) { m_first = val; }
+    //! \brief Sets the last events/waveforms ending time in milliseconds since epoch
+    void setLast(qint64 val) { m_last = val; }
+
+    //! \brief Set this EventList to either EVL_Waveform or EVL_Event type
+    void setType(EventListType type) { m_type = type; }
+
+    //! \brief Change the gain multiplier value
+    void setGain(EventDataType v) { m_gain = v; }
+
+    //! \brief Change the gain offset value
+    void setOffset(EventDataType v) { m_offset = v; }
+
+    //! \brief Set the Minimum value for data
+    void setMin(EventDataType v) { m_min = v; }
+
+    //! \brief Set the Maximum value for data
+    void setMax(EventDataType v) { m_max = v; }
+
+    //! \brief Set the Minimum value for data2
+    void setMin2(EventDataType v) { m_min2 = v; }
+
+    //! \brief Set the Maximum value for data2
+    void setMax2(EventDataType v) { m_max2 = v; }
+
+    //! \brief Set the sample rate
+    void setRate(EventDataType v) { m_rate = v; }
+
+    //void setCode(ChannelID id) { m_code=id; }
+
+    //! \brief Return the Minimum data value
+    inline EventDataType Min() { return m_min; }
+
+    //! \brief Return the Maximum data value
+     inline EventDataType Max() { return m_max; }
+
+    //! \brief Return the Minimum data2 value
+    inline EventDataType min2() { return m_min2; }
+
+    //! \brief Return the Maximum data value
+    inline EventDataType max2() { return m_max2; }
+
+    //! \brief Return the gain value
+    inline EventDataType gain() const { return m_gain; }
+
+    //! \brief Return the gain offset
+    inline EventDataType offset() { return m_offset; }
+
+    //! \brief Return the sample rate
+    inline EventDataType rate() { return m_rate; }
+
+    //! \brief Return the EventList type, either EVL_Waveform or EVL_Event
+    inline EventListType type() { return m_type; }
+    //inline const ChannelID & code() { return m_code; }
+
+    //! \brief Returns whether or not min/max values are updated while adding events
+    inline const bool &update_minmax() { return m_update_minmax; }
+
+    //! \brief Returns the dimension (units type) of the contained data object
+    QString dimension() { return m_dimension; }
+
+    //! \brief Sets the dimension (units type) of the contained data object
+    void setDimension(QString dimension) { m_dimension = dimension; }
+
+    //! \brief Returns the data storage vector
+    QVector<EventStoreType> &getData() { return m_data; }
+
+    //! \brief Returns the data2 storage vector
+    QVector<EventStoreType> &getData2() { return m_data2; }
+
+    //! \brief Returns the time storage vector (only used in EVL_Event types)
+    QVector<quint32> &getTime() { return m_time; }
+
+    // Don't mess with these without considering the consequences
+    void rawDataResize(quint32 i) { m_data.resize(i); m_count = i; }
+    void rawData2Resize(quint32 i) { m_data2.resize(i); m_count = i; }
+    void rawTimeResize(quint32 i) { m_time.resize(i); m_count = i; }
+    EventStoreType *rawData() { return m_data.data(); }
+    EventStoreType *rawData2() { return m_data2.data(); }
+    quint32 *rawTime() { return m_time.data(); }
+
+  protected:
+    //! \brief The time storage vector, in 32bits delta format, added as offsets to m_first
+    QVector<quint32> m_time;
+
+    //! \brief The "ungained" raw data storage vector
+    QVector<EventStoreType> m_data;
+
+    //! \brief The "ungained" raw data2 storage vector
+    QVector<EventStoreType> m_data2;
+    //ChannelID m_code;
+
+    //! \brief Either EVL_Waveform or EVL_Event
+    EventListType m_type;
+
+    //! \brief Count of events
+    quint32 m_count;
+
+    EventDataType m_gain;
+    EventDataType m_offset;
+    EventDataType m_min, m_min2;
+    EventDataType m_max, m_max2;
+    EventDataType m_rate;     // Waveform sample rate
+
+    QString m_dimension;
+
+    qint64 m_first, m_last;
+    bool m_update_minmax;
+    bool m_second_field;
+};
+
+#endif // EVENT_H
diff --git a/sleepyhead/SleepLib/journal.cpp b/sleepyhead/SleepLib/journal.cpp
new file mode 100644
index 0000000..f7a9970
--- /dev/null
+++ b/sleepyhead/SleepLib/journal.cpp
@@ -0,0 +1,299 @@
+/* SleepLib Journal Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+
+#include "journal.h"
+#include "machine_common.h"
+#include <QDomDocument>
+#include <QDomElement>
+#include <QFile>
+#include <QTextStream>
+#include <QDir>
+#include <QMessageBox>
+
+const int journal_data_version = 1;
+
+JournalEntry::JournalEntry(QDate date)
+{
+    Machine * jmach = p_profile->GetMachine(MT_JOURNAL);
+    if (!jmach) {
+        MachineInfo info(MT_JOURNAL,0, "Journal", QObject::tr("Journal Data"), QString(), QString(), QString(), QObject::tr("SleepyHead"), QDateTime::currentDateTime(), journal_data_version);
+
+        // Using machine ID 1 rather than a random number, so in future, if profile.xml gets screwed up they'll get their data back..
+        // TODO: Perhaps search for unlinked journal folders here to save some anger and frustration? :P
+
+        MachineID machid = 1;
+        QString path = p_profile->Get("{" + STR_GEN_DataFolder + "}");
+        QDir dir(path);
+        QStringList filters;
+        filters << "Journal_*";
+        QStringList dirs = dir.entryList(filters,QDir::Dirs);
+        int journals = dirs.size();
+        if (journals > 0) {
+            QString tmp = dirs[0].section("_", -1);
+            bool ok;
+            machid = tmp.toUInt(&ok, 16);
+            if (!ok) {
+                QMessageBox::warning(nullptr, STR_MessageBox_Warning,
+                    QObject::tr("SleepyHead found an old Journal folder, but it looks like it's been renamed:")+"\n\n"+
+                    QString("%1").arg(dirs[0])+
+                    QObject::tr("SleepyHead will not touch this folder, and will create a new one instead.")+"\n\n"+
+                    QObject::tr("Please be careful when playing in SleepyHead's profile folders :-P"), QMessageBox::Ok);
+
+                // User renamed the folder.. report this
+                machid = 1;
+            }
+            if (journals > 1) {
+                QMessageBox::warning(nullptr, STR_MessageBox_Warning,
+                    QObject::tr("For some reason, sleepyHead couldn't find a journal object record in your profile, but did find multiple Journal data folders.")+"\n\n"+
+                    QObject::tr("SleepyHead picked only the first one of these, and will use it in future:")+"\n\n"+
+                    QString("%1").arg(dirs[0])+
+                    QObject::tr("If your old data is missing, copy the contents of all the other Journal_XXXXXXX folders to this one manually."), QMessageBox::Ok);
+                // more then one.. report this.
+            }
+        }
+        jmach = MachineLoader::CreateMachine(info, machid);
+    }
+
+    m_date = date;
+    session = nullptr;
+    day = p_profile->GetDay(date, MT_JOURNAL);
+    if (!day) {
+        session = day->firstSession(MT_JOURNAL);
+    } else {
+        // Doesn't exist.. create a new one..
+        session = new Session(jmach,0);
+        qint64 st,et;
+        QDateTime dt(date,QTime(22,0)); // 10pm localtime
+        st=qint64(dt.toTime_t())*1000L;
+        et=st+3600000L;
+        session->set_first(st);
+        session->set_last(et);
+
+        // Let it live in memory...but not on disk unless data is changed...
+        jmach->AddSession(session);
+    }
+}
+JournalEntry::~JournalEntry()
+{
+    if (session && session->IsChanged()) {
+        Save();
+    }
+}
+
+
+bool JournalEntry::Save()
+{
+    if (session && session->IsChanged()) {
+        qDebug() << "Saving journal session for" << m_date;
+
+        // just need to write bookmarks, the rest are already stored in the session
+        QVariantList start;
+        QVariantList end;
+        QStringList notes;
+
+        int size = bookmarks.size();
+        for (int i=0; i<size; ++i) {
+            const Bookmark & bm = bookmarks.at(i);
+            start.append(bm.start);
+            end.append(bm.end);
+            notes.append(bm.notes);
+        }
+        session->settings[Bookmark_Start] = start;
+        session->settings[Bookmark_End] = end;
+        session->settings[Bookmark_Notes] = notes;
+
+        session->settings[LastUpdated] = QDateTime::currentDateTime().toTime_t();
+
+        session->StoreSummary();
+        return true;
+    }
+    return false;
+}
+
+QString JournalEntry::notes()
+{
+    QHash<ChannelID, QVariant>::iterator it;
+    if (session && ((it=session->settings.find(Journal_Notes)) != session->settings.end())) {
+        return it.value().toString();
+    }
+    return QString();
+}
+void JournalEntry::setNotes(QString notes)
+{
+    if (!session) return;
+    session->settings[Journal_Notes] = notes;
+    session->SetChanged(true);
+}
+EventDataType JournalEntry::weight()
+{
+    QHash<ChannelID, QVariant>::iterator it;
+    if (session && ((it = session->settings.find(Journal_Weight)) != session->settings.end())) {
+        return it.value().toFloat();
+    }
+    return 0;
+}
+void JournalEntry::setWeight(EventDataType weight)
+{
+    if (!session) return;
+    session->settings[Journal_Weight] = weight;
+    session->SetChanged(true);
+}
+int JournalEntry::zombie()
+{
+    QHash<ChannelID, QVariant>::iterator it;
+    if (session && ((it = session->settings.find(Journal_ZombieMeter)) != session->settings.end())) {
+        return it.value().toFloat();
+    }
+    return 0;
+}
+void JournalEntry::setZombie(int zombie)
+{
+    if (!session) return;
+    session->settings[Journal_ZombieMeter] = zombie;
+    session->SetChanged(true);
+}
+
+QList<Bookmark> & JournalEntry::getBookmarks()
+{
+    bookmarks.clear();
+    if (!session || !session->settings.contains(Bookmark_Start)) {
+        return bookmarks;
+    }
+
+    QVariantList start=session->settings[Bookmark_Start].toList();
+    QVariantList end=session->settings[Bookmark_End].toList();
+    QStringList notes=session->settings[Bookmark_Notes].toStringList();
+
+    int size = start.size();
+    for (int i=0; i < size; ++i) {
+        bookmarks.append(Bookmark(start.at(i).toLongLong(), end.at(i).toLongLong(), notes.at(i)));
+    }
+    return bookmarks;
+}
+
+void JournalEntry::addBookmark(qint64 start, qint64 end, QString note)
+{
+    bookmarks.append(Bookmark(start,end,note));
+    session->SetChanged(true);
+}
+
+void JournalEntry::delBookmark(qint64 start, qint64 end)
+{
+    bool removed;
+    do {
+        removed = false;
+        int size = bookmarks.size();
+        for (int i=0; i<size; ++i) {
+            const Bookmark & bm = bookmarks.at(i);
+            if ((bm.start == start) && (bm.end == end)) {
+                bookmarks.removeAt(i);
+                session->SetChanged(true); // make sure it gets saved later..
+                removed=true;
+                break;
+            }
+        }
+    } while (removed); // clean up any stupid duplicates just in case.. :P
+    // if I wanted to be nice above, I could add the note string to the search as well..
+    // (some users might be suprised to see the lot go with the same start and end index)
+}
+
+void BackupJournal(QString filename)
+{
+    QDomDocument doc("SleepyHead Journal");
+
+    QDomElement droot = doc.createElement(STR_AppName);
+    doc.appendChild(droot);
+
+    QDomElement root = doc.createElement("Journal");
+    root.setAttribute("username", p_profile->user->userName());
+    droot.appendChild(root);
+
+
+    QDate first = p_profile->FirstDay(MT_JOURNAL);
+    QDate last = p_profile->LastDay(MT_JOURNAL);
+
+    QDate date = first.addDays(-1);
+    do {
+        date = date.addDays(1);
+
+        Day * journal = p_profile->GetDay(date, MT_JOURNAL);
+        if (!journal) continue;
+        Session * sess = journal->firstSession(MT_JOURNAL);
+        if (!sess) continue;
+        QDomElement day = doc.createElement("day");
+        day.setAttribute("date", date.toString());
+
+        //notes.setAttribute("date", date.toString());
+
+        if (journal->settingExists(Journal_Notes)) {
+            QString notedata = sess->settings[Journal_Notes].toString();
+            QDomElement notes = doc.createElement("note");
+            notes.appendChild(doc.createCDATASection(notedata));
+            day.appendChild(notes);
+        }
+        if (journal->settingExists(Journal_Weight)) {
+            EventDataType weight = sess->settings[Journal_Weight].toFloat();
+            day.setAttribute("weight", weight);
+        }
+        if (journal->settingExists(Journal_ZombieMeter)) {
+            int zombie = sess->settings[Journal_ZombieMeter].toInt();
+            day.setAttribute("zombie", zombie);
+        }
+        if (journal->settingExists(LastUpdated)) {
+            QDateTime dt = sess->settings[LastUpdated].toDateTime();
+            day.setAttribute("lastupdated", dt.toTime_t());
+        }
+        if (journal->settingExists(Bookmark_Start)) {
+            QVariantList start=sess->settings[Bookmark_Start].toList();
+            QVariantList end=sess->settings[Bookmark_End].toList();
+            QStringList notes=sess->settings[Bookmark_Notes].toStringList();
+            QDomElement bookmarks = doc.createElement("bookmarks");
+
+            int size = start.size();
+            for (int i=0; i< size; i++) {
+                QDomElement bookmark = doc.createElement("bookmark");
+                bookmark.setAttribute("start",start.at(i).toString());
+                bookmark.setAttribute("end",end.at(i).toString());
+                bookmark.setAttribute("notes",notes.at(i));
+                bookmarks.appendChild(bookmark);
+            }
+            day.appendChild(bookmarks);
+        }
+        root.appendChild(day);
+
+    } while (date <= last);
+    QFile file(filename);
+
+    if (!file.open(QIODevice::WriteOnly)) {
+        return;
+    }
+
+    QTextStream ts(&file);
+    ts << doc.toString();
+    file.close();
+}
+
+DayController::DayController()
+{
+    journal = nullptr;
+    cpap = nullptr;
+    oximeter = nullptr;
+}
+DayController::~DayController()
+{
+    delete journal;
+}
+
+void DayController::setDate(QDate date)
+{
+    if (journal) {
+        delete journal;
+    }
+    journal = new JournalEntry(date);
+}
diff --git a/sleepyhead/SleepLib/journal.h b/sleepyhead/SleepLib/journal.h
new file mode 100644
index 0000000..9bbcfd6
--- /dev/null
+++ b/sleepyhead/SleepLib/journal.h
@@ -0,0 +1,80 @@
+/* SleepLib Journal Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+
+#ifndef JOURNAL_H
+#define JOURNAL_H
+
+#include "SleepLib/profiles.h"
+
+void BackupJournal(QString filename);
+
+class Bookmark {
+public:
+    Bookmark() {
+        start = end = 0;
+    }
+    Bookmark(const Bookmark & copy) {
+        start = copy.start;
+        end = copy.end;
+        notes = copy.notes;
+    }
+    Bookmark(qint64 start, qint64 end, QString notes):
+    start(start), end(end), notes(notes) {}
+
+    qint64 start;
+    qint64 end;
+    QString notes;
+};
+
+class JournalEntry
+{
+public:
+    JournalEntry(QDate date);
+    ~JournalEntry();
+    bool Save();
+
+    QString notes();
+    void setNotes(QString notes);
+
+    EventDataType weight();
+    void setWeight(EventDataType weight);
+    int zombie();
+    void setZombie(int zombie);
+
+    QList<Bookmark> & getBookmarks();
+    void addBookmark(qint64 start, qint64 end, QString note);
+    void delBookmark(qint64 start, qint64 end);
+
+
+protected:
+    QDate m_date;
+    QList<Bookmark> bookmarks;
+    Day * day;
+    Session * session;
+    bool newsession;
+};
+
+void BackupJournal(QString filename);
+
+
+class DayController
+{
+    DayController();
+    ~DayController();
+
+    void setDate(QDate date);
+
+    QDate m_date;
+    JournalEntry * journal;
+    Day * cpap;
+    Day * oximeter;
+
+};
+
+#endif // JOURNAL_H
diff --git a/sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp b/sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp
new file mode 100644
index 0000000..89f0331
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/cms50_loader.cpp
@@ -0,0 +1,679 @@
+/* SleepLib CMS50X Loader Implementation
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the cms50_data_version in cms50_loader.h when making changes to this loader
+// that change loader behaviour or modify channels.
+//********************************************************************************************
+
+#include <QApplication>
+#include <QDir>
+#include <QString>
+#include <QDataStream>
+#include <QDateTime>
+#include <QFile>
+#include <QDebug>
+#include <QList>
+#include <QMessageBox>
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QPushButton>
+
+using namespace std;
+
+#include "cms50_loader.h"
+#include "SleepLib/machine.h"
+#include "SleepLib/session.h"
+
+CMS50Loader::CMS50Loader()
+{
+    m_type = MT_OXIMETER;
+    m_abort = false;
+    m_streaming = false;
+    m_importing = false;
+    imp_callbacks = 0;
+
+    m_vendorID = 0x10c4;
+    m_productID = 0xea60;
+    cms50dplus = false;
+
+    oxirec = nullptr;
+
+    startTimer.setParent(this);
+    resetTimer.setParent(this);
+
+}
+
+CMS50Loader::~CMS50Loader()
+{
+}
+
+bool CMS50Loader::Detect(const QString &path)
+{
+    if (p_profile->oxi->oximeterType() == 1) {
+        return true;
+    }
+
+    Q_UNUSED(path);
+    return false;
+}
+
+int CMS50Loader::Open(QString path)
+{
+    // Only one active Oximeter module at a time, set in preferences
+
+    m_itemCnt = 0;
+    m_itemTotal = 0;
+
+    m_abort = false;
+    m_importing = false;
+
+    started_import = false;
+    started_reading = false;
+    finished_import = false;
+    setStatus(NEUTRAL);
+
+    imp_callbacks = 0;
+    cb_reset = 0;
+
+    m_time.start();
+
+    if (oxirec) {
+        trashRecords();
+    }
+
+    // Cheating using path for two serial oximetry modes
+
+    if (path.compare("import") == 0) {
+        for (int i=0; i<5; ++i) {
+            resetDevice();
+            serial.flush();
+//            QThread::msleep(50);
+            QApplication::processEvents();
+        }
+        serial.clear();
+
+        setStatus(IMPORTING);
+
+        startTimer.stop();
+        startImportTimeout();
+        return 1;
+    } else if (path.compare("live") == 0) {
+        for (int i=0; i<5; ++i) {
+            resetDevice();
+            serial.flush();
+            QApplication::processEvents();
+        }
+        serial.clear();
+
+        m_startTime = QDateTime::currentDateTime();
+
+        oxirec = new QVector<OxiRecord>;
+        oxisessions[m_startTime] = oxirec;
+
+        setStatus(LIVE);
+        return 1;
+    }
+    QString ext = path.section(".",1);
+    if ((ext.compare("spo2", Qt::CaseInsensitive)==0) || (ext.compare("spo", Qt::CaseInsensitive)==0) || (ext.compare("spor", Qt::CaseInsensitive)==0)) {
+        // try to read and process SpoR file..
+        return readSpoRFile(path) ? 1 : 0;
+    }
+
+    return 0;
+}
+
+
+void CMS50Loader::processBytes(QByteArray bytes)
+{
+    // Sync to start of message type we are interested in
+    quint8 c;
+    quint8 msgcode = 0x80;
+
+    int idx=0;
+    int bytesread = bytes.size();
+    while ((idx < bytesread) && (((c=(quint8)bytes.at(idx)) & msgcode)!=msgcode)) {
+        if (buffer.length()>0) {
+            // If buffer is the start of a valid but short frame, add to it..
+            buffer.append(c);
+        }// otherwise dump these bytes, as they are out of sequence.
+        ++idx;
+    }
+
+    // Copy the rest to the buffer.
+    buffer.append(bytes.mid(idx));
+
+    int available = buffer.length();
+
+    switch (status()) {
+    case IMPORTING:
+        idx = doImportMode();
+        break;
+    case LIVE:
+        idx = doLiveMode();
+        break;
+    default:
+        ;
+//        qDebug() << "Device mode not supported by" << loaderName();
+    }
+
+    if (idx >= available) {
+        buffer.clear();
+    } else if (idx > 0) {
+        // Trim any processed bytes from the buffer.
+        buffer = buffer.mid(idx);
+    }
+
+    if (buffer.length() > 0) {
+        // If what's left doesn't start with a marker bit, dump it
+        if (((unsigned char)buffer.at(0) & 0x80) != 0x80) {
+            buffer.clear();
+        }
+    }
+
+}
+
+int CMS50Loader::doImportMode()
+{
+    int available = buffer.size();
+  //  Q_ASSERT(!finished_import);
+    int hour,minute;
+    int idx = 0;
+    while (idx < available) {
+        unsigned char c=(unsigned char)buffer.at(idx);
+        if (!started_import) {
+            // There are three [0xf2 0xXX 0xXX] trio's at start of recording
+            // Followed by [0xfX 0xXX 0xXX] trios containing spo2 and pulse till the end of recording
+
+            // Scan for first header trio starting byte.
+            if (c != 0xf2) {
+                idx++;
+                continue;
+            }
+
+            // sometimes a f2 starting trio can be corrupted by live data
+            // peek ahead and see where the f2 headers are
+            int f2cnt = 0;
+            int f2idx[3] = {-1};
+
+            for (int i=0; i < 30; ++i) {
+
+                if ((idx + i) >= available) {
+                    qDebug() << "Not enough bytes to read CMS50 headers";
+                    break;
+                }
+
+                c = (unsigned char)buffer.at(idx+i);
+
+                if (c == 0xf2) {
+                    f2idx[f2cnt++] = idx+i;
+                    if (f2cnt >= 3)
+                        break;  // got all 3 headers
+
+                    // Skip the following two bytes
+                    i += 2;
+                }
+            }
+
+            if (f2cnt<3) {
+                qDebug() << "Did not get all header Trio's";
+            }
+
+            f2cnt--;
+
+            // CHECK: Check there might be length data after the last header trio..
+
+
+            received_bytes=0;
+            bool badheader = false;
+
+            // Look for the best of three headers trios
+            int bestf2 = 0;
+
+            if ((f2cnt >= 1) && ((f2idx[1] - f2idx[0]) == 3)) {
+                bestf2 = f2idx[0];
+            } else if ((f2cnt >= 2) && ((f2idx[2] - f2idx[1]) == 3)) {
+                bestf2 = f2idx[1];
+            } else {
+                bestf2 = f2idx[f2cnt];
+
+                // ouch.. check if f0 starts afterwards
+                if (((unsigned char)buffer.at(bestf2+3) & 0xf0) != 0xf0) {
+                    // crap.. bad time
+                    badheader = true;
+                }
+            }
+
+            if (!badheader) {
+                hour = (unsigned char)buffer.at(bestf2 + 1) & 0x7f;
+                minute = (unsigned char)buffer.at(bestf2 + 2) & 0x7f;
+            } else {
+                hour = 0;
+                minute = 0;
+            }
+
+            // Either a CMS50D+, has a bad header, or it's really midnight, set a flag anyway for later to help choose the right sync time
+            cms50dplus = (hour == 0) && (minute == 0);
+
+            MachineInfo info = newInfo();
+            info.model = cms50dplus ? QObject::tr("CMS50D+") : QObject::tr("CMS50E/F");
+            info.serial = QString();
+            Machine * mach = CreateMachine(info);
+
+            qDebug() << QString("Receiving Oximeter transmission %1:%2").arg(hour).arg(minute);
+            // set importing to true or whatever..
+
+            finished_import = false;
+            started_import = true;
+            started_reading = false;
+
+            m_importing = true;
+
+            m_itemCnt=0;
+            m_itemTotal=5000;
+
+            killTimers();
+            qDebug() << "Getting ready for import";
+
+            oxirec = new QVector<OxiRecord>;
+            oxirec->reserve(30000);
+
+            QDate oda=QDate::currentDate();
+            QTime oti=QTime(hour,minute); // Only CMS50E/F's have a realtime clock. CMS50D+ will set this to midnight
+
+
+            // If the oximeter record time is more than the current time, then assume it was from the day before
+            // Or should I use split time preference instead??? Foggy Confusements..
+            if (oti > QTime::currentTime()) {
+                oda = oda.addDays(-1);
+            }
+
+            m_startTime = QDateTime(oda,oti);
+
+            oxisessions[m_startTime] = oxirec;
+            qDebug() << "Session start (according to CMS50)" << m_startTime << hex << buffer.at(idx + 1) << buffer.at(idx + 2) << ":" << dec << hour << minute ;
+
+            cb_reset = 1;
+
+            // CMS50D+ needs an end timer because it just stops dead after uploading
+            resetTimer.singleShot(2000,this,SLOT(resetImportTimeout()));
+
+            QStringList data;
+
+            int len = f2idx[f2cnt]+3;
+            for (int i=idx; i < len; ++i) {
+                data.append(QString::number((unsigned char)buffer.at(i),16));
+            }
+            qDebug() << "CMS50 Record Header bytes:" << data.join(",");
+
+            idx = len;
+
+            // peek ahead to see if there really is data length bytes..
+            data.clear();
+            for (int i=0; i < 12; ++i) {
+                if ((idx+i) > available) break;
+                data.push_back(QString::number((unsigned char)buffer.at(idx+i), 16));
+            }
+            qDebug() << "bytes directly following header trio's:" << data.join(",");
+
+        } else { // have started import
+            if ((c & 0xf0) == 0xf0) { // Data trio
+                started_reading=true; // Sometimes errornous crap is sent after data rec header
+
+                // Recording import
+                if ((idx + 2) >= available) {
+                    return idx;
+                }
+
+                quint8 pulse=(unsigned char)((buffer.at(idx + 1) & 0x7f) | ((c & 1) << 7));
+                quint8 spo2=(unsigned char)buffer.at(idx + 2) & 0xff;
+
+                oxirec->append(OxiRecord(pulse,spo2));
+                received_bytes+=3;
+
+                // TODO: Store the data to the session
+
+                emit updateProgress(0, 0);
+
+                idx += 3;
+            } else if (!started_reading) { // have not got a valid trio yet, skip...
+                idx += 1;
+            } else {
+                // scan ahead for another 0xf0 in case it's corrupted..
+                bool resync = false;
+
+                for (int i=idx; i < available; ++i) {
+                    c=(unsigned char)buffer.at(i);
+                    if ((c & 0xf0) == 0xf0) {
+                        idx = i;
+                        resync = true;
+                        break;
+                    }
+                }
+
+                if (!resync) {
+                    // Data transfer has completed
+                    finished_import = true;
+                    killTimers();
+                    m_importing = false;
+                    m_status = NEUTRAL;
+                    emit importComplete(this);
+                    resetTimer.singleShot(2000, this, SLOT(shutdownPorts()));
+                    return available;
+                }
+            }
+        }
+    }
+
+    if (!started_import) {
+        imp_callbacks = 0;
+    } else {
+        imp_callbacks++;
+    }
+
+    return idx;
+}
+
+int CMS50Loader::doLiveMode()
+{
+    Q_ASSERT(oxirec != nullptr);
+
+    int available = buffer.size();
+    int idx = 0;
+
+    QByteArray plethy;
+    while (idx < available-5) {
+        if (((unsigned char)buffer.at(idx) & 0x80) != 0x80) {
+            idx++;
+            continue;
+        }
+        int pwave=(unsigned char)buffer.at(idx + 1);
+        int pbeat=(unsigned char)buffer.at(idx + 2);
+        int pulse=((unsigned char)buffer.at(idx + 3) & 0x7f) | ((pbeat & 0x40) << 1);
+        int spo2=(unsigned char)buffer.at(idx + 4) & 0x7f;
+
+        oxirec->append(OxiRecord(pulse, spo2));
+        plethy.append(pwave);
+
+        idx += 5;
+    }
+    emit updatePlethy(plethy);
+
+    return idx;
+}
+
+void CMS50Loader::resetDevice() // Switch CMS50D+ device to live streaming mode
+{
+    //qDebug() << "Sending reset code to CMS50 device";
+    //m_port->flush();
+
+    static unsigned char b1[3]={0xf6,0xf6,0xf6};
+
+    if (serial.write((char *)b1,3) == -1) {
+        qDebug() << "Couldn't write data reset bytes to CMS50";
+    }
+
+    QApplication::processEvents();
+}
+
+void CMS50Loader::requestData() // Switch CMS50D+ device to record transmission mode
+{
+    static unsigned char b1[2]={0xf5,0xf5};
+
+    //qDebug() << "Sending request code to CMS50 device";
+    if (serial.write((char *)b1,2) == -1) {
+        qDebug() << "Couldn't write data request bytes to CMS50";
+    }
+    QApplication::processEvents();
+}
+
+void CMS50Loader::killTimers()
+{
+    startTimer.stop();
+    resetTimer.stop();
+}
+
+void CMS50Loader::startImportTimeout()
+{
+    if (!m_streaming)
+        return;
+
+    if (started_import) {
+        return;
+    }
+    Q_ASSERT(finished_import == false);
+
+    //qDebug() << "Starting oximeter import timeout";
+
+    // Wait until events really are jammed on the CMS50D+ before re-requesting data.
+
+    const int delay = 500;
+
+    if (m_abort) {
+        m_streaming = false;
+        closeDevice();
+        return;
+    }
+
+    if (imp_callbacks == 0) { // Frozen, but still hasn't started?
+        m_itemCnt = m_time.elapsed();
+        if (m_itemCnt > START_TIMEOUT) { // Give up after START_TIMEOUT
+            closeDevice();
+            abort();
+            QMessageBox::warning(nullptr, STR_MessageBox_Error, "<h2>"+tr("Could not get data transmission from oximeter.")+"<br/><br/>"+tr("Please ensure you select 'upload' from the oximeter devices menu.")+"</h2>");
+            return;
+        } else {
+            // Note: Newer CMS50 devices transmit from user input, but there is no way of differentiating between models
+            requestData();
+        }
+        emit updateProgress(m_itemCnt, START_TIMEOUT);
+
+        // Schedule another callback to make sure it's started
+        startTimer.singleShot(delay, this, SLOT(startImportTimeout()));
+    }
+}
+
+void CMS50Loader::resetImportTimeout()
+{
+    if (finished_import) {
+        return;
+    }
+
+    if (imp_callbacks != cb_reset) {
+        // Still receiving data.. reset timer
+        qDebug() << "Still receiving data in resetImportTimeout()" << imp_callbacks << cb_reset;
+        if (resetTimer.isActive())
+            resetTimer.stop();
+
+        if (!finished_import) resetTimer.singleShot(2000, this, SLOT(resetImportTimeout()));
+    } else {
+        qDebug() << "Oximeter device stopped transmitting.. Transfer complete";
+        // We were importing, but now are done
+        if (!finished_import && (started_import && started_reading)) {
+            qDebug() << "Switching CMS50 back to live mode and finalizing import";
+            // Turn back on live streaming so the end of capture can be dealt with
+            resetTimer.stop();
+
+            resetDevice(); // Send Reset to CMS50D+
+            serial.flush();
+            QThread::msleep(200);
+            resetDevice(); // Send Reset to CMS50D+
+            serial.flush();
+            serial.clear();
+            //started_import = false;
+           // finished_import = true;
+            //m_streaming=false;
+
+            //closeDevice();
+            //emit transferComplete();
+            //doImportComplete();
+            return;
+        }
+        qDebug() << "Should CMS50 resetImportTimeout reach here?";
+        // else what???
+    }
+    cb_reset = imp_callbacks;
+}
+
+void CMS50Loader::shutdownPorts()
+{
+    closeDevice();
+}
+
+
+
+
+bool CMS50Loader::readSpoRFile(QString path)
+{
+    QFile file(path);
+    if (!file.exists()) {
+        return false;
+    }
+
+    if (!file.open(QFile::ReadOnly)) {
+        return false;
+    }
+
+    bool spo2header = false;
+    QString ext = path.section('.', -1);
+    if (ext.compare("spo2",Qt::CaseInsensitive) == 0) {
+        spo2header = true;
+    }
+
+    QByteArray data;
+
+    qint64 filesize = file.size();
+    data = file.readAll();
+    QDataStream in(data);
+    in.setByteOrder(QDataStream::LittleEndian);
+    quint16 pos;
+    in >> pos;
+
+    in.skipRawData(pos - 2);
+
+    //long size = data.size();
+    int bytes_per_record = 2;
+
+    if (!spo2header) {
+        // next is 0x0002
+        // followed by 16bit duration in seconds
+
+        // Read date and time (it's a 16bit charset)
+
+        char dchr[20];
+        int j = 0;
+        for (int i = 0; i < 18 * 2; i += 2) {
+            dchr[j++] = data.at(8 + i);
+        }
+
+        dchr[j] = 0;
+        if (dchr[0]) {
+            QString dstr(dchr);
+            m_startTime = QDateTime::fromString(dstr, "MM/dd/yy HH:mm:ss");
+            if (m_startTime.date().year() < 2000) { m_startTime = m_startTime.addYears(100); }
+        } else {
+            m_startTime = QDateTime(QDate::currentDate(), QTime(0,0,0));
+        }
+    } else { // !spo2header
+
+        quint32 samples = 0; // number of samples
+
+        quint32 year, month, day;
+        quint32 hour, minute, second;
+
+        if (data.at(pos) != 1) {
+            qWarning() << ".spo2 file" << path << "might be a different";
+        }
+
+        // Unknown cruft header...
+        in.skipRawData(200);
+
+        in >> year >> month >> day;
+        in >> hour >> minute >> second;
+
+        m_startTime = QDateTime(QDate(year, month, day), QTime(hour, minute, second));
+
+        // ignoring it for now
+        pos += 0x1c + 200;
+
+        in >> samples;
+
+        int remainder = filesize - pos;
+
+        bytes_per_record = remainder / samples;
+        qDebug() << samples << "samples of" << bytes_per_record << "bytes each";
+
+        // CMS50I .spo2 data have 4 digits, a 16bit, followed by spo2 then pulse
+
+    }
+
+    oxirec = new QVector<OxiRecord>;
+    oxisessions[m_startTime] = oxirec;
+
+    unsigned char o2, pr;
+    quint16 un;
+
+    // Read all Pulse and SPO2 data
+    do {
+        if (bytes_per_record > 2) {
+            in >> un;
+        }
+        in >> o2;
+        in >> pr;
+
+        if ((o2 == 0x7f) && (pr == 0xff)) {
+            o2 = pr = 0;
+            un = 0;
+        }
+
+        if (spo2header) {
+            oxirec->append(OxiRecord(pr, o2));
+        } else {
+            oxirec->append(OxiRecord(o2, pr));
+        }
+    } while (!in.atEnd());
+
+
+//    for (int i = pos; i < size - 2;) {
+//        o2 = (unsigned char)(data.at(i + 1));
+//        pr = (unsigned char)(data.at(i + 0));
+//        oxirec->append(OxiRecord(pr, o2));
+//        i += 2;
+//    }
+
+    // processing gets done later
+    return true;
+}
+
+void CMS50Loader::process()
+{
+    // Just clean up any extra crap before oximeterimport parses the oxirecords..
+    return;
+//    if (!oxirec)
+//        return;
+//    int size=oxirec->size();
+//    if (size<10)
+//        return;
+
+}
+
+
+
+static bool cms50_initialized = false;
+
+void CMS50Loader::Register()
+{
+    if (cms50_initialized) { return; }
+
+    qDebug() << "Registering CMS50Loader";
+    RegisterLoader(new CMS50Loader());
+    cms50_initialized = true;
+}
+
diff --git a/sleepyhead/SleepLib/loader_plugins/cms50_loader.h b/sleepyhead/SleepLib/loader_plugins/cms50_loader.h
new file mode 100644
index 0000000..e9b5d56
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/cms50_loader.h
@@ -0,0 +1,95 @@
+/* SleepLib CMS50X Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef CMS50LOADER_H
+#define CMS50LOADER_H
+
+#include "SleepLib/serialoximeter.h"
+
+const QString cms50_class_name = "CMS50";
+const int cms50_data_version = 4;
+
+
+/*! \class CMS50Loader
+    \brief Importer for CMS50 Oximeter
+    */
+class CMS50Loader : public SerialOximeter
+{
+Q_OBJECT
+  public:
+
+
+    CMS50Loader();
+    virtual ~CMS50Loader();
+
+    virtual bool Detect(const QString &path);
+    virtual int Open(QString path);
+
+    static void Register();
+
+    virtual int Version() { return cms50_data_version; }
+    virtual const QString &loaderName() { return cms50_class_name; }
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_OXIMETER, 0, cms50_class_name, QObject::tr("Contec"), QObject::tr("CMS50"), QString(), QString(), QObject::tr("CMS50"), QDateTime::currentDateTime(), cms50_data_version);
+    }
+
+
+  //  Machine *CreateMachine();
+
+    virtual void process();
+
+    virtual bool isStartTimeValid() { return !cms50dplus; }
+
+protected slots:
+//    virtual void dataAvailable();
+    virtual void resetImportTimeout();
+    virtual void startImportTimeout();
+    virtual void shutdownPorts();
+
+protected:
+
+    bool readSpoRFile(QString path);
+    virtual void processBytes(QByteArray bytes);
+
+    int doImportMode();
+    int doLiveMode();
+
+    virtual void killTimers();
+
+    // Switch CMS50D+ device to live streaming mode
+    virtual void resetDevice();
+
+    // Switch CMS50D+ device to record transmission mode
+    void requestData();
+
+  private:
+    EventList *PULSE;
+    EventList *SPO2;
+
+    QTime m_time;
+
+    QByteArray buffer;
+
+    bool started_import;
+    bool finished_import;
+    bool started_reading;
+    bool cms50dplus;
+
+    int cb_reset,imp_callbacks;
+
+    int received_bytes;
+
+    int m_itemCnt;
+    int m_itemTotal;
+
+
+};
+
+
+#endif // CMS50LOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/cms50f37_loader.cpp b/sleepyhead/SleepLib/loader_plugins/cms50f37_loader.cpp
new file mode 100644
index 0000000..207dcbd
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/cms50f37_loader.cpp
@@ -0,0 +1,965 @@
+/* SleepLib CMS50X Loader Implementation
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the cms50_data_version in cms50_loader.h when making changes to this loader
+// that change loader behaviour or modify channels.
+//********************************************************************************************
+
+#include <QProgressBar>
+#include <QApplication>
+#include <QDir>
+#include <QString>
+#include <QDataStream>
+#include <QDateTime>
+#include <QFile>
+#include <QDebug>
+#include <QList>
+#include <QMessageBox>
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QPushButton>
+
+using namespace std;
+
+#include "cms50f37_loader.h"
+#include "SleepLib/machine.h"
+#include "SleepLib/session.h"
+
+extern QProgressBar *qprogress;
+
+CMS50F37Loader::CMS50F37Loader()
+{
+    m_type = MT_OXIMETER;
+    m_abort = false;
+    m_streaming = false;
+    m_importing = false;
+    started_reading = false;
+
+    imp_callbacks = 0;
+
+    m_vendorID = 0x10c4;
+    m_productID = 0xea60;
+
+    oxirec = nullptr;
+
+    startTimer.setParent(this);
+    resetTimer.setParent(this);
+
+    duration_divisor = 2;
+
+    model = QString();
+    vendor = QString();
+
+}
+
+CMS50F37Loader::~CMS50F37Loader()
+{
+}
+
+bool CMS50F37Loader::openDevice()
+{
+    if (port.isEmpty()) {
+        bool b = scanDevice("",m_vendorID, m_productID);
+        if (!b) {
+            b = scanDevice("rfcomm", 0, 0); // Linux
+        }
+        if (!b) {
+            return false;
+        }
+    }
+    serial.setPortName(port);
+    if (!serial.open(QSerialPort::ReadWrite))
+        return false;
+
+    // forward this stuff
+
+    // Set up serial port attributes
+    serial.setBaudRate(QSerialPort::Baud115200);
+    serial.setParity(QSerialPort::NoParity);
+    serial.setStopBits(QSerialPort::OneStop);
+    serial.setDataBits(QSerialPort::Data8);
+    serial.setFlowControl(QSerialPort::NoFlowControl);
+
+    m_streaming = true;
+    m_abort = false;
+    m_importing = false;
+
+    // connect relevant signals
+    connect(&serial,SIGNAL(readyRead()), this, SLOT(dataAvailable()));
+
+    started_import = false;
+    started_reading = false;
+    finished_import = false;
+
+    resetDevice();
+    return true;
+}
+
+bool CMS50F37Loader::Detect(const QString &path)
+{
+    if (p_profile->oxi->oximeterType() == 0) {
+        return true;
+    }
+    Q_UNUSED(path);
+    return false;
+}
+
+int CMS50F37Loader::Open(QString path)
+{
+    // Only one active Oximeter module at a time, set in preferences
+
+    m_itemCnt = 0;
+    m_itemTotal = 0;
+
+    m_abort = false;
+    m_importing = false;
+
+    started_import = false;
+    started_reading = false;
+    finished_import = false;
+    setStatus(NEUTRAL);
+
+    imp_callbacks = 0;
+    cb_reset = 0;
+
+    m_time.start();
+
+    if (oxirec) {
+        trashRecords();
+    }
+
+    // Cheating using path for two serial oximetry modes
+
+    if (path.compare("import") == 0) {
+        serial.clear();
+
+        sequence = 0;
+        buffer.clear();
+
+//        nextCommand();
+        setStatus(IMPORTING);
+
+        return 1;
+    } else if (path.compare("live") == 0) {
+        return 0;
+    }
+    QString ext = path.section(".",1);
+    if ((ext.compare("spo2", Qt::CaseInsensitive)==0) || (ext.compare("spo", Qt::CaseInsensitive)==0) || (ext.compare("spor", Qt::CaseInsensitive)==0)) {
+        // try to read and process SpoR file..
+        return readSpoRFile(path) ? 1 : 0;
+    }
+
+    return 0;
+}
+
+unsigned char cms50_sequence[] = { 0xa7, 0xa2, 0xa0, 0xb0, 0xac, 0xb3, 0xad, 0xa3, 0xab, 0xa4, 0xa5, 0xaf, 0xa7, 0xa2, 0xa6 };
+
+const int TIMEOUT = 2000;
+
+
+const quint8 COMMAND_CMS50_HELLO1 = 0xa7;
+const quint8 COMMAND_CMS50_HELLO2 = 0xa2;
+const quint8 COMMAND_GET_SESSION_COUNT = 0xA3;
+const quint8 COMMAND_GET_SESSION_TIME = 0xA5;
+const quint8 COMMAND_GET_SESSION_DURATION = 0xA4;
+const quint8 COMMAND_GET_USER_INFO = 0xAB;
+const quint8 COMMAND_GET_SESSION_DATA = 0xA6;
+const quint8 COMMAND_GET_OXIMETER_DEVICEID = 0xAA;
+const quint8 COMMAND_GET_OXIMETER_INFO = 0xb0;
+const quint8 COMMAND_GET_OXIMETER_MODEL = 0xA8;
+const quint8 COMMAND_GET_OXIMETER_VENDOR = 0xA9;
+const quint8 COMMAND_SESSION_ERASE = 0xAE;
+
+
+int cms50_seqlength = sizeof(cms50_sequence);
+
+
+QString CMS50F37Loader::getUser()
+{
+    if (!user.isEmpty()) return user;
+
+    sendCommand(COMMAND_GET_USER_INFO);
+
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while (user.isEmpty() && (time.elapsed() < TIMEOUT));
+
+    return user;
+}
+
+QString CMS50F37Loader::getVendor()
+{
+    if (!vendor.isEmpty()) return vendor;
+
+    sendCommand(COMMAND_GET_OXIMETER_VENDOR);
+
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while (vendor.isEmpty() && (time.elapsed() < TIMEOUT));
+    return vendor;
+}
+
+QString CMS50F37Loader::getModel()
+{
+    if (!model.isEmpty()) return model;
+
+    modelsegments = 0;
+    sendCommand(COMMAND_GET_OXIMETER_MODEL);
+
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while ((modelsegments < 2) && (time.elapsed() < TIMEOUT));
+
+    // Give a little more time for the second one..
+    QThread::msleep(100);
+    QApplication::processEvents();
+
+    if (model.startsWith("CMS50I") || model.startsWith("CMS50H")) {
+        duration_divisor = 4;
+    } else {
+        duration_divisor = 2;
+    }
+    return model;
+}
+
+QString CMS50F37Loader::getDeviceString()
+{
+    return QString("%1 %2").arg(getVendor()).arg(getModel());
+}
+
+QString CMS50F37Loader::getDeviceID()
+{
+    if (!devid.isEmpty()) return devid;
+
+    sendCommand(COMMAND_GET_OXIMETER_DEVICEID);
+
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while (devid.isEmpty() && (time.elapsed() < TIMEOUT));
+    return devid;
+}
+
+int CMS50F37Loader::getSessionCount()
+{
+    session_count = -1;
+    sendCommand(COMMAND_GET_SESSION_COUNT);
+
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while ((session_count < 0) && (time.elapsed() < TIMEOUT));
+
+    return session_count;
+}
+
+int CMS50F37Loader::getOximeterInfo()
+{
+    device_info = -1;
+    sendCommand(COMMAND_GET_OXIMETER_INFO);
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while ((device_info < 0) && (time.elapsed() < TIMEOUT));
+
+    return device_info;
+}
+
+int CMS50F37Loader::getDuration(int session)
+{
+    getOximeterInfo();
+
+    duration = -1;
+    sendCommand(COMMAND_GET_SESSION_DURATION, session);
+
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while ((duration < 0) && (time.elapsed() < TIMEOUT));
+
+    return duration / duration_divisor;
+}
+
+
+QDateTime CMS50F37Loader::getDateTime(int session)
+{
+    imp_date = QDate();
+    imp_time = QTime();
+    sendCommand(COMMAND_GET_SESSION_TIME, session);
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while ((imp_date.isNull() || imp_time.isNull()) && (time.elapsed() < TIMEOUT));
+
+    if (imp_date.isNull() || imp_time.isNull())
+        return QDateTime();
+
+    return QDateTime(imp_date, imp_time);
+}
+
+
+void CMS50F37Loader::processBytes(QByteArray bytes)
+{
+    static quint8 resimport = 0;
+    int data;
+
+    QString tmpstr;
+
+    int lengths[32] = { 0, 0, 9, 9, 9, 9, 4, 8, 8, 6, 4, 4, 2, 0, 3, 8, 3, 9, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
+    buffer.append(bytes);
+    int size = buffer.size();
+
+    int idx = 0;
+    int len;
+
+    int year, month, day;
+
+    quint8 pulse;
+
+    do {
+        quint8 res = buffer.at(idx);
+
+        len = lengths[res & 0x1f];
+
+        if ((idx+len) > size)
+            break;
+
+        if (started_reading && (res != resimport)) {
+            len = 0;
+        }
+
+        if (len == 0) {
+            // lost sync
+            if (started_reading) {
+                while (idx < size) {
+                    res = buffer.at(idx++);
+                    if (res == resimport) break;
+                }
+                // add a dummy to make up for it.
+                qDebug() << "lost sync, padding...";
+                oxirec->append(OxiRecord(0,0,0));
+            }
+            continue;
+        }
+        for (int i = 1; i < len; i++) {
+            buffer[idx+i] = buffer[idx+i] ^ 0x80;
+        }
+
+        if (!started_reading) switch(res) {
+        case 0x02: // Model name string (there are two in sequnce.. second might be the next chunk!)
+            data = buffer.at(idx+1);
+            if (data == 0) {
+                model = QString(buffer.mid(idx+3, 6));
+                modelsegments++;
+            } else {
+                QString extra = QString(buffer.mid(idx+3, 6));
+                model += extra.trimmed();
+                modelsegments++;
+                qDebug() << "Model:" << model;
+            }
+            break;
+        case 0x03: // Vendor string
+            data = buffer.at(idx+1);
+            if (data == 0) {
+                vendor = QString(buffer.mid(idx+2, 6));
+                qDebug() << "Vendor:" << vendor;
+            }
+            break;
+
+        case 0x04: // Device Identifiers
+            for (int i = 2, msb = buffer.at(idx+1); i < len; i++, msb>>= 1) {
+                buffer[idx+i] = (buffer[idx+i] & 0x7f) | (msb & 0x01 ? 0x80 : 0);
+            }
+
+            devid = QString(buffer.mid(idx+2, 7));
+            qDebug() << "Device ID:" << devid;
+            break;
+
+            // COMMAND_GET_USER_INFO
+        case 0x05: // 5,80,80,f5,f3,e5,f2,80,80
+            // User
+            user = QString(buffer.mid(idx+3).trimmed());
+            qDebug() << "0x05:" << user;
+
+            break;
+        case 0x6: // 6,80,80,87
+            data = buffer.at(idx+3) ^ 0x80;
+            break;
+
+            // COMMAND_GET_SESSION_TIME
+        case 0x07: // 7,80,80,80,94,8e,88,92
+
+            for (int i = 2, msb = buffer.at(idx+1); i < len; i++, msb>>= 1) {
+                buffer[idx+i] = (buffer[idx+i] & 0x7f) | (msb & 0x01 ? 0x80 : 0);
+            }
+
+            year = QString().sprintf("%02i%02i",buffer.at(idx+4), buffer.at(idx+5)).toInt();
+            month = QString().sprintf("%02i", buffer.at(idx+6)).toInt();
+            day = QString().sprintf("%02i", buffer.at(idx+7)).toInt();
+
+            imp_date = QDate(year,month,day);
+            qDebug() << imp_date;
+            break;
+
+            // COMMAND_GET_SESSION_DURATION
+        case 0x08: // 8,80,80,80,a4,81,80,80  // 00, 00, 24, 01, 00, 00
+
+            duration = ((buffer.at(idx+1) & 0x4) << 5);
+            duration |= buffer.at(idx+4);
+            duration |= (buffer.at(idx+5) | ((buffer.at(idx+1) & 0x8) << 4)) << 8;
+            duration |= (buffer.at(idx+6) | ((buffer.at(idx+1) & 0x10) << 3)) << 16;
+            break;
+
+            // COMMAND_GET_SESSION_COUNT
+        case 0x0a: // a,80,80,81
+            session_count = buffer.at(idx+3);
+            break;
+
+        case 0x0b:
+            timectr++;
+            break;
+
+            // COMMAND_CMS50_HELLO1 && COMMAND_CMS50_HELLO2
+        case 0xc: // a7 & a2  // responds with: c,80
+            data = buffer.at(idx+1);
+            break;
+        case 0x0e: // e,80,81
+            break;
+        case 0x10: // 10,80,81
+            data = buffer.at(idx+2);
+            break;
+
+            // COMMAND_GET_OXIMETER_INFO
+        case 0x11: // 11,80,81,81,80,80,80,80,80
+            device_info = buffer.at(idx+3);
+            break;
+
+            // COMMAND_GET_SESSION_TIME
+        case 0x12: // 12,80,80,80,82,a6,92,80
+            tmpstr = QString().sprintf("%02i:%02i:%02i",buffer.at(idx+4), buffer.at(idx+5), buffer.at(idx+6));
+            imp_time = QTime::fromString(tmpstr, "HH:mm:ss");
+            qDebug() << imp_time;
+
+            break;
+        case 0x13: // 13,80,a0,a0,a0,a0,a0,a0,a0
+            break;
+        case 0x14: //14,80,80,80,80,80,80,80,80
+            break;
+
+        case 0x09: // cms50i data sequence
+        case 0x0f: // f,80,de,c2,de,c2,de,c2  cms50F data...
+            if (!started_import) {
+                started_import = true;
+                started_reading = true;
+                finished_import = false;
+
+                m_importing = true;
+
+                m_itemCnt=0;
+                m_itemTotal=duration;
+
+                have_perfindex = (res == 0x9);
+
+                oxirec = new QVector<OxiRecord>;
+                oxirec->reserve(30000);
+
+                oxisessions[m_startTime] = oxirec;
+
+                cb_reset = 1;
+
+                resetTimer.singleShot(2000,this,SLOT(resetImportTimeout()));
+                resimport = res;
+            }
+
+            break;
+        default:
+            qDebug() << "unknown cms50 result?" << hex << (int)res;
+            break;
+        }
+
+        if (res == 0x09) {
+            // 9,80,e1,c4,ce,82  // cms50i data
+
+            quint8 * buf = &((quint8 *)buffer.data())[idx];
+
+            quint8 msb = buf[1];
+            for (int i = 2; i < len-1; i++, msb >>= 1) {
+                buf[i] = (buf[i] & 0x7f) | ((msb & 0x01) ? 0x80 : 0);
+            }
+
+            quint16 pi = buf[4] | buf[5] << 8;
+            pulse = buf[3];
+            quint8 spo2 = buf[2] & 0x7f;
+            qDebug() << "Pulse=" << pulse << "SPO2=" << spo2 << "Pi=" << pi;
+
+            oxirec->append(((spo2 == 0) || (pulse == 0)) ? OxiRecord(0,0,0) : OxiRecord(pulse, spo2, pi));
+        } else if (res == 0x0f) {
+            // f,80,de,c2,de,c2,de,c2  cms50F data...
+
+            for (int i = 2, msb = buffer.at(idx+1); i < len; i++, msb>>= 1) {
+                buffer[idx+i] = (buffer[idx+i] & 0x7f) | (msb & 0x01 ? 0x80 : 0);
+            }
+
+            pulse = buffer.at(idx+3);
+            oxirec->append((pulse == 0xff) ? OxiRecord(0,0) : OxiRecord(pulse, buffer.at(idx+2)));
+
+            pulse = buffer.at(idx+5);
+            oxirec->append((pulse == 0xff) ? OxiRecord(0,0) : OxiRecord(pulse, buffer.at(idx+4)));
+
+            pulse = buffer.at(idx+7);
+            oxirec->append((pulse == 0xff) ? OxiRecord(0,0) : OxiRecord(pulse, buffer.at(idx+6)));
+        }
+
+        QStringList str;
+        for (int i=0; i < len; ++i) {
+            str.append(QString::number((unsigned char)buffer.at(idx + i),16));
+        }
+
+        if (!started_import) {
+          //  startTimer.singleShot(2000, this, SLOT(requestData()));
+            qDebug() << "Read:" << len << size << str.join(",");
+        } else {
+            qDebug() << "Import:" << len << size << str.join(",");
+        }
+
+        idx += len;
+    } while (idx < size);
+
+
+    if (!started_import) {
+        imp_callbacks = 0;
+    } else {
+        emit updateProgress(oxirec->size(), duration);
+
+        imp_callbacks++;
+    }
+
+    buffer = buffer.mid(idx);
+}
+
+
+//int CMS50F37Loader::doLiveMode()
+//{
+//    Q_ASSERT(oxirec != nullptr);
+
+//    int available = buffer.size();
+//    int idx = 0;
+
+//    QByteArray plethy;
+//    while (idx < available-5) {
+//        if (((unsigned char)buffer.at(idx) & 0x80) != 0x80) {
+//            idx++;
+//            continue;
+//        }
+//        int pwave=(unsigned char)buffer.at(idx + 1);
+//        int pbeat=(unsigned char)buffer.at(idx + 2);
+//        int pulse=((unsigned char)buffer.at(idx + 3) & 0x7f) | ((pbeat & 0x40) << 1);
+//        int spo2=(unsigned char)buffer.at(idx + 4) & 0x7f;
+
+//        oxirec->append(OxiRecord(pulse, spo2));
+//        plethy.append(pwave);
+
+//        idx += 5;
+//    }
+//    emit updatePlethy(plethy);
+
+//    return idx;
+//}
+
+
+void CMS50F37Loader::sendCommand(quint8 c)
+{
+    quint8 cmd[] = { 0x7d, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+    cmd[2] |= (c & 0x7f);
+
+    QString out;
+    for (int i=0;i < 9;i++) out += QString().sprintf("%02X ",cmd[i]);
+    qDebug() << "Write:" << out;
+
+    if (serial.write((char *)cmd, 9) == -1) {
+        qDebug() << "Couldn't write data reset bytes to CMS50";
+    }
+}
+
+void CMS50F37Loader::sendCommand(quint8 c, quint8 c2)
+{
+    quint8 cmd[] = { 0x7d, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+    cmd[2] |= (c & 0x7f);
+    cmd[4] |= (c2 & 0x7f);
+
+    QString out;
+    for (int i=0; i < 9; ++i) out += QString().sprintf("%02X ",cmd[i]);
+    qDebug() << "Write:" << out;
+
+    if (serial.write((char *)cmd, 9) == -1) {
+        qDebug() << "Couldn't write data reset bytes to CMS50";
+    }
+}
+
+void CMS50F37Loader::eraseSession(int user, int session)
+{
+    quint8 cmd[] = { 0x7d, 0x81, COMMAND_SESSION_ERASE, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+
+    cmd[3] = (user & 0x7f) | 0x80;
+    cmd[4] = (session & 0x7f) | 0x80;
+
+    QString out;
+    for (int i=0; i < 9; ++i) out += QString().sprintf("%02X ",cmd[i]);
+    qDebug() << "Write:" << out;
+
+    if (serial.write((char *)cmd, 9) == -1) {
+        qDebug() << "Couldn't write data reset bytes to CMS50";
+    }
+
+    int z = timectr;
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while ((timectr == z) && (time.elapsed() < TIMEOUT));
+}
+
+
+void CMS50F37Loader::setDeviceID(QString str)
+{
+    str.truncate(7);
+    if (str.length() < 7) {
+        str = QString(" ").repeated(7-str.length()) + str;
+    }
+    quint8 cmd[] = { 0x04, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+
+    quint8 msb = 0;
+
+    QByteArray ba = str.toLocal8Bit();
+    for (int i=6; i >= 0; i--) {
+        msb <<= 1;
+        msb |= (ba.at(i) >> 7) & 1;
+        cmd[i+2] = ba.at(i) | 0x80;
+    }
+
+    cmd[1] = msb | 0x80;
+
+    QString out;
+    for (int i=0; i < 9; ++i) out += QString().sprintf("%02X ",cmd[i]);
+    qDebug() << "Write:" << out;
+
+    if (serial.write((char *)cmd, 9) == -1) {
+        qDebug() << "Couldn't write data reset bytes to CMS50";
+    }
+
+    // Supposed to return 0x04 command, so reset devid..
+    devid = QString();
+
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while (devid.isEmpty() && (time.elapsed() < TIMEOUT));
+}
+
+void CMS50F37Loader::syncClock()
+{
+    QDate date = QDate::currentDate();
+    int year = date.year();
+    quint8 yh = year / 100;
+    quint8 yl = year % 100;
+    quint8 mon = date.month();
+    quint8 day = date.day();
+    quint8 wd = date.dayOfWeek() % 7;
+
+    quint8 datecmd[] = { 0x7d, 0x81, 0xb2, yh | 0x80, yl |0x80, mon|0x80, day|0x80, wd|0x80, 0x80 };
+
+    timectr = 0;
+    if (serial.write((char *)datecmd, 9) == -1) {
+        qDebug() << "Couldn't write data reset bytes to CMS50";
+    }
+
+    QTime time;
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while ((timectr == 0) && (time.elapsed() < TIMEOUT));
+
+
+    QThread::msleep(100);
+    QApplication::processEvents();
+
+    QTime ctime = QTime::currentTime();
+    quint8 h = ctime.hour();
+    quint8 m = ctime.minute();
+    quint8 s = ctime.second();
+
+    quint8 timecmd[] = { 0x7d, 0x81, 0xb1, h | 0x80, m |0x80, s|0x80, 0x80, 0x80, 0x80 };
+
+    timectr = 0;
+    if (serial.write((char *)timecmd, 9) == -1) {
+        qDebug() << "Couldn't write data reset bytes to CMS50";
+    }
+
+    time.start();
+    do {
+        QApplication::processEvents();
+    } while ((timectr == 0) && (time.elapsed() < TIMEOUT));
+}
+
+
+void CMS50F37Loader::nextCommand()
+{
+    if (++sequence < cms50_seqlength) {
+        // Send the next command packet in sequence
+        sendCommand(cms50_sequence[sequence]);
+    } else {
+        qDebug() << "Run out of startup tasks to do and import failed!";
+    }
+}
+
+void CMS50F37Loader::getSessionData(int session)
+{
+    resetDevice();
+    selected_session = session;
+    requestData();
+}
+
+void CMS50F37Loader::resetDevice()
+{
+    sendCommand(COMMAND_CMS50_HELLO1);
+    QThread::msleep(100);
+    QApplication::processEvents();
+    sendCommand(COMMAND_CMS50_HELLO2);
+    QThread::msleep(100);
+    QApplication::processEvents();
+}
+
+void CMS50F37Loader::requestData()
+{
+    sendCommand(COMMAND_GET_SESSION_DATA, selected_session);
+}
+
+void CMS50F37Loader::killTimers()
+{
+    if (resetTimer.isActive()) resetTimer.stop();
+    if (startTimer.isActive()) startTimer.stop();
+}
+
+void CMS50F37Loader::startImportTimeout()
+{
+}
+
+void CMS50F37Loader::resetImportTimeout()
+{
+    if (finished_import) {
+        return;
+    }
+
+    if (imp_callbacks != cb_reset) {
+        // Still receiving data.. reset timer
+        qDebug() << "Still receiving data in resetImportTimeout()" << imp_callbacks << cb_reset;
+        if (resetTimer.isActive())
+            resetTimer.stop();
+
+        if (!finished_import) resetTimer.singleShot(2000, this, SLOT(resetImportTimeout()));
+    } else {
+        qDebug() << "Oximeter device stopped transmitting.. Transfer complete";
+        // We were importing, but now are done
+        if (!finished_import && (started_import && started_reading)) {
+            qDebug() << "Switching CMS50 back to live mode and finalizing import";
+            // Turn back on live streaming so the end of capture can be dealt with
+
+
+            killTimers();
+
+            finished_import = true;
+            m_streaming = false;
+            m_importing = false;
+            started_reading = false;
+            started_import = false;
+
+            emit importComplete(this);
+
+            m_status = NEUTRAL;
+
+            shutdownPorts();
+
+            return;
+        }
+        qDebug() << "Should CMS50 resetImportTimeout reach here?";
+        // else what???
+    }
+    cb_reset = imp_callbacks;
+}
+
+void CMS50F37Loader::shutdownPorts()
+{
+    closeDevice();
+}
+
+
+
+
+bool CMS50F37Loader::readSpoRFile(QString path)
+{
+    QFile file(path);
+    if (!file.exists()) {
+        return false;
+    }
+
+    if (!file.open(QFile::ReadOnly)) {
+        return false;
+    }
+
+    bool spo2header = false;
+    QString ext = path.section('.', -1);
+    if (ext.compare("spo2",Qt::CaseInsensitive) == 0) {
+        spo2header = true;
+    }
+
+    QByteArray data;
+
+    qint64 filesize = file.size();
+    data = file.readAll();
+    QDataStream in(data);
+    in.setByteOrder(QDataStream::LittleEndian);
+    quint16 pos;
+    in >> pos;
+
+    in.skipRawData(pos - 2);
+
+    //long size = data.size();
+    int bytes_per_record = 2;
+
+    if (!spo2header) {
+        // next is 0x0002
+        // followed by 16bit duration in seconds
+
+        // Read date and time (it's a 16bit charset)
+
+        char dchr[20];
+        int j = 0;
+        for (int i = 0; i < 18 * 2; i += 2) {
+            dchr[j++] = data.at(8 + i);
+        }
+
+        dchr[j] = 0;
+        if (dchr[0]) {
+            QString dstr(dchr);
+            m_startTime = QDateTime::fromString(dstr, "MM/dd/yy HH:mm:ss");
+            if (m_startTime.date().year() < 2000) { m_startTime = m_startTime.addYears(100); }
+        } else {
+            m_startTime = QDateTime(QDate::currentDate(), QTime(0,0,0));
+        }
+    } else { // !spo2header
+
+        quint32 samples = 0; // number of samples
+
+        quint32 year, month, day;
+        quint32 hour, minute, second;
+
+        if (data.at(pos) != 1) {
+            qWarning() << ".spo2 file" << path << "might be a different";
+        }
+
+        // Unknown cruft header...
+        in.skipRawData(200);
+
+        in >> year >> month >> day;
+        in >> hour >> minute >> second;
+
+        m_startTime = QDateTime(QDate(year, month, day), QTime(hour, minute, second));
+
+        // ignoring it for now
+        pos += 0x1c + 200;
+
+        in >> samples;
+
+        int remainder = filesize - pos;
+
+        bytes_per_record = remainder / samples;
+        qDebug() << samples << "samples of" << bytes_per_record << "bytes each";
+
+        // CMS50I .spo2 data have 4 digits, a 16bit, followed by spo2 then pulse
+
+    }
+
+    oxirec = new QVector<OxiRecord>;
+    oxisessions[m_startTime] = oxirec;
+
+    unsigned char o2, pr;
+    quint16 un;
+
+    // Read all Pulse and SPO2 data
+    do {
+        if (bytes_per_record > 2) {
+            in >> un;
+        }
+        in >> o2;
+        in >> pr;
+
+        if ((o2 == 0x7f) && (pr == 0xff)) {
+            o2 = pr = 0;
+            un = 0;
+        }
+
+        if (spo2header) {
+            oxirec->append(OxiRecord(pr, o2));
+        } else {
+            oxirec->append(OxiRecord(o2, pr));
+        }
+    } while (!in.atEnd());
+
+
+//    for (int i = pos; i < size - 2;) {
+//        o2 = (unsigned char)(data.at(i + 1));
+//        pr = (unsigned char)(data.at(i + 0));
+//        oxirec->append(OxiRecord(pr, o2));
+//        i += 2;
+//    }
+
+    // processing gets done later
+    return true;
+}
+
+void CMS50F37Loader::process()
+{
+    // Just clean up any extra crap before oximeterimport parses the oxirecords..
+    return;
+//    if (!oxirec)
+//        return;
+//    int size=oxirec->size();
+//    if (size<10)
+//        return;
+
+}
+
+
+
+static bool cms50f37_initialized = false;
+
+void CMS50F37Loader::Register()
+{
+    if (cms50f37_initialized) { return; }
+
+    qDebug() << "Registering CMS50F37Loader";
+    RegisterLoader(new CMS50F37Loader());
+    cms50f37_initialized = true;
+}
+
diff --git a/sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h b/sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h
new file mode 100644
index 0000000..5eb65c8
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/cms50f37_loader.h
@@ -0,0 +1,154 @@
+/* SleepLib CMS50X Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef CMS50F37LOADER_H
+#define CMS50F37LOADER_H
+
+#include "SleepLib/serialoximeter.h"
+
+const QString cms50f37_class_name = "CMS50F37";
+const int cms50f37_data_version = 0;
+
+
+/*! \class CMS5037Loader
+    \brief Bulk Importer for newer CMS50 oximeters
+    */
+class CMS50F37Loader : public SerialOximeter
+{
+Q_OBJECT
+  public:
+
+
+    CMS50F37Loader();
+    virtual ~CMS50F37Loader();
+
+    virtual bool Detect(const QString &path);
+    virtual int Open(QString path);
+    virtual bool openDevice();
+
+
+    static void Register();
+
+    virtual int Version() { return cms50f37_data_version; }
+    virtual const QString &loaderName() { return cms50f37_class_name; }
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_OXIMETER, 0, cms50f37_class_name, QObject::tr("Contec"), QObject::tr("CMS50F3.7"), QString(), QString(), QObject::tr("CMS50F"), QDateTime::currentDateTime(), cms50f37_data_version);
+    }
+
+
+  //  Machine *CreateMachine();
+
+    virtual void process();
+
+    virtual bool isStartTimeValid() { return true; }
+
+    virtual QString getUser();
+    virtual QString getModel();
+    virtual QString getVendor();
+    virtual QString getDeviceString();
+
+    virtual QDateTime getDateTime(int session);
+    virtual int getDuration(int session);
+    virtual int getSessionCount();
+    virtual int getOximeterInfo();
+    virtual void eraseSession(int user, int session);
+
+    virtual void syncClock();
+    virtual QString getDeviceID();
+    virtual void setDeviceID(QString);
+
+
+    virtual void setDuration(int d) { duration=d; }
+
+    virtual bool commandDriven() { return true; }
+
+
+    virtual void getSessionData(int session);
+
+
+    // Switch device to record transmission mode
+    void requestData();
+
+
+protected slots:
+//    virtual void dataAvailable();
+    virtual void resetImportTimeout();
+    virtual void startImportTimeout();
+    virtual void shutdownPorts();
+
+
+
+    void nextCommand();
+
+
+protected:
+
+    bool readSpoRFile(QString path);
+    virtual void processBytes(QByteArray bytes);
+
+//    int doLiveMode();
+
+    virtual void killTimers();
+
+    void sendCommand(quint8 c);
+    void sendCommand(quint8 c, quint8 c2);
+
+
+    // Switch device to live streaming mode
+    virtual void resetDevice();
+
+
+
+  private:
+
+    int sequence;
+
+    EventList *PULSE;
+    EventList *SPO2;
+
+    QTime m_time;
+
+    QByteArray buffer;
+
+    bool started_import;
+    bool finished_import;
+    bool started_reading;
+
+    int cb_reset,imp_callbacks;
+
+    int received_bytes;
+
+    int m_itemCnt;
+    int m_itemTotal;
+
+    QDate imp_date;
+    QTime imp_time;
+
+    QString user;
+
+    unsigned char current_command;
+
+    volatile int session_count;
+    volatile int duration;
+    int device_info;
+    QString model;
+    QString vendor;
+    QString devid;
+
+    int duration_divisor;
+    int selected_session;
+
+    int timectr;
+
+    int modelsegments;
+
+};
+
+
+#endif // CMS50F37LOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/icon_loader.cpp b/sleepyhead/SleepLib/loader_plugins/icon_loader.cpp
new file mode 100644
index 0000000..208c205
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/icon_loader.cpp
@@ -0,0 +1,938 @@
+/* SleepLib Fisher & Paykel Icon Loader Implementation
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QDir>
+#include <QProgressBar>
+#include <QMessageBox>
+#include <QDataStream>
+#include <QTextStream>
+#include <cmath>
+
+#include "icon_loader.h"
+
+extern QProgressBar *qprogress;
+
+const QString FPHCARE = "FPHCARE";
+
+FPIcon::FPIcon(MachineID id)
+    : CPAP(id)
+{
+}
+
+FPIcon::~FPIcon()
+{
+}
+
+FPIconLoader::FPIconLoader()
+{
+    m_buffer = nullptr;
+    m_type = MT_CPAP;
+}
+
+FPIconLoader::~FPIconLoader()
+{
+}
+
+bool FPIconLoader::Detect(const QString & givenpath)
+{
+    QDir dir(givenpath);
+
+    if (!dir.exists()) {
+        return false;
+    }
+
+    // F&P Icon have a folder called FPHCARE in the root directory
+    if (!dir.exists(FPHCARE)) {
+        return false;
+    }
+
+    // CHECKME: I can't access F&P ICON data right now
+    if (!dir.exists("FPHCARE/ICON")) {
+        return false;
+    }
+
+    return true;
+}
+
+
+int FPIconLoader::Open(QString path)
+{
+    QString newpath;
+
+    path = path.replace("\\", "/");
+
+    if (path.endsWith("/")) {
+        path.chop(1);
+    }
+
+    if (path.endsWith("/" + FPHCARE)) {
+        newpath = path;
+    } else {
+        newpath = path + "/" + FPHCARE;
+    }
+
+    newpath += "/ICON/";
+
+    QString filename;
+
+    QDir dir(newpath);
+
+    if ((!dir.exists() || !dir.isReadable())) {
+        return -1;
+    }
+
+    dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+    dir.setSorting(QDir::Name);
+    QFileInfoList flist = dir.entryInfoList();
+
+    QStringList SerialNumbers;
+
+    bool ok;
+
+    for (int i = 0; i < flist.size(); i++) {
+        QFileInfo fi = flist.at(i);
+        QString filename = fi.fileName();
+
+        filename.toInt(&ok);
+
+        if (ok) {
+            SerialNumbers.push_back(filename);
+        }
+    }
+
+    Machine *m;
+
+    QString npath;
+
+    int c = 0;
+    for (int i = 0; i < SerialNumbers.size(); i++) {
+        MachineInfo info = newInfo();
+        info.serial = SerialNumbers[i];
+        m = CreateMachine(info);
+
+        npath = newpath + "/" + info.serial;
+
+        try {
+            if (m) {
+                c+=OpenMachine(m, npath);
+            }
+        } catch (OneTypePerDay e) {
+            Q_UNUSED(e)
+            p_profile->DelMachine(m);
+            MachList.erase(MachList.find(info.serial));
+            QMessageBox::warning(nullptr, tr("Import Error"),
+                                 tr("This Machine Record cannot be imported in this profile.")+"\n\n"+tr("The Day records overlap with already existing content."),
+                                 QMessageBox::Ok);
+            delete m;
+        }
+    }
+
+    return c;
+}
+
+struct FPWaveChunk {
+    FPWaveChunk() {
+        st = 0;
+        duration = 0;
+        flow = nullptr;
+        pressure = nullptr;
+        leak = nullptr;
+        file = 0;
+    }
+    FPWaveChunk(qint64 start, qint64 dur, int f) { st = start; duration = dur; file = f, flow = nullptr; leak = nullptr; pressure = nullptr; }
+    FPWaveChunk(const FPWaveChunk &copy) {
+        st = copy.st;
+        duration = copy.duration;
+        flow = copy.flow;
+        leak = copy.leak;
+        pressure = copy.pressure;
+        file = copy.file;
+    }
+    qint64 st;
+    qint64 duration;
+    int file;
+    EventList *flow;
+    EventList *leak;
+    EventList *pressure;
+};
+
+bool operator<(const FPWaveChunk &a, const FPWaveChunk &b)
+{
+    return (a.st < b.st);
+}
+
+int FPIconLoader::OpenMachine(Machine *mach, QString &path)
+{
+    qDebug() << "Opening FPIcon " << path;
+    QDir dir(path);
+
+    if (!dir.exists() || (!dir.isReadable())) {
+        return -1;
+    }
+
+    dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+    dir.setSorting(QDir::Name);
+    QFileInfoList flist = dir.entryInfoList();
+
+    QString filename, fpath;
+
+    if (qprogress) { qprogress->setValue(0); }
+
+    QStringList summary, log, flw, det;
+    Sessions.clear();
+
+    for (int i = 0; i < flist.size(); i++) {
+        QFileInfo fi = flist.at(i);
+        filename = fi.fileName();
+        fpath = path + "/" + filename;
+
+        if (filename.left(3).toUpper() == "SUM") {
+            summary.push_back(fpath);
+            OpenSummary(mach, fpath);
+        } else if (filename.left(3).toUpper() == "DET") {
+            det.push_back(fpath);
+        } else if (filename.left(3).toUpper() == "FLW") {
+            flw.push_back(fpath);
+        } else if (filename.left(3).toUpper() == "LOG") {
+            log.push_back(fpath);
+        }
+    }
+
+    for (int i = 0; i < det.size(); i++) {
+        OpenDetail(mach, det[i]);
+    }
+
+    for (int i = 0; i < flw.size(); i++) {
+        OpenFLW(mach, flw[i]);
+    }
+
+    SessionID sid;//,st;
+    float hours, mins;
+
+    qDebug() << "Last 20 Sessions";
+
+    int cnt = 0;
+    QDateTime dt;
+    QString a;
+
+    if (Sessions.size() > 0) {
+
+        QMap<SessionID, Session *>::iterator it = Sessions.end();
+        it--;
+
+        dt = QDateTime::fromTime_t(qint64(it.value()->first()) / 1000L);
+        QDate date = dt.date().addDays(-7);
+        it++;
+
+        do {
+            it--;
+            Session *sess = it.value();
+            sid = sess->session();
+            hours = sess->hours();
+            mins = hours * 60;
+            dt = QDateTime::fromTime_t(sid);
+
+            if (sess->channelDataExists(CPAP_FlowRate)) { a = "(flow)"; }
+            else { a = ""; }
+
+            qDebug() << cnt << ":" << dt << "session" << sid << "," << mins << "minutes" << a;
+
+            if (dt.date() < date) { break; }
+
+            ++cnt;
+
+        } while (it != Sessions.begin());
+
+    }
+        //    qDebug() << "Unmatched Sessions";
+        //    QList<FPWaveChunk> chunks;
+        //    for (QMap<int,QDate>::iterator dit=FLWDate.begin();dit!=FLWDate.end();dit++) {
+        //        int k=dit.key();
+        //        //QDate date=dit.value();
+        ////        QList<Session *> values = SessDate.values(date);
+        //        for (int j=0;j<FLWTS[k].size();j++) {
+
+        //            FPWaveChunk chunk(FLWTS[k].at(j),FLWDuration[k].at(j),k);
+        //            chunk.flow=FLWMapFlow[k].at(j);
+        //            chunk.leak=FLWMapLeak[k].at(j);
+        //            chunk.pressure=FLWMapPres[k].at(j);
+
+        //            chunks.push_back(chunk);
+
+        //            zz=FLWTS[k].at(j)/1000;
+        //            dur=double(FLWDuration[k].at(j))/60000.0;
+        //            bool b,c=false;
+        //            if (Sessions.contains(zz)) b=true; else b=false;
+        //            if (b) {
+        //                if (Sessions[zz]->channelDataExists(CPAP_FlowRate)) c=true;
+        //            }
+        //            qDebug() << k << "-" <<j << ":" << zz << qRound(dur) << "minutes" << (b ? "*" : "") << (c ? QDateTime::fromTime_t(zz).toString() : "");
+        //        }
+        //    }
+        //    qSort(chunks);
+        //    bool b,c;
+        //    for (int i=0;i<chunks.size();i++) {
+        //        const FPWaveChunk & chunk=chunks.at(i);
+        //        zz=chunk.st/1000;
+        //        dur=double(chunk.duration)/60000.0;
+        //        if (Sessions.contains(zz)) b=true; else b=false;
+        //        if (b) {
+        //            if (Sessions[zz]->channelDataExists(CPAP_FlowRate)) c=true;
+        //        }
+        //        qDebug() << chunk.file << ":" << i << zz << dur << "minutes" << (b ? "*" : "") << (c ? QDateTime::fromTime_t(zz).toString() : "");
+        //    }
+
+    int c = Sessions.size();
+    finishAddingSessions();
+    mach->Save();
+
+
+    return c;
+}
+
+// !\brief Convert F&P 32bit date format to 32bit UNIX Timestamp
+quint32 convertDate(quint32 timestamp)
+{
+    quint16 day, month,hour=0, minute=0, second=0;
+    quint16 year;
+
+
+    day = timestamp & 0x1f;
+    month = (timestamp  >> 5) & 0x0f;
+    year = 2000 + ((timestamp  >> 9) & 0x3f);
+    timestamp >>= 15;
+    second = timestamp & 0x3f;
+    minute = (timestamp >> 6) & 0x3f;
+    hour = (timestamp >> 12);
+
+    QDateTime dt = QDateTime(QDate(year, month, day), QTime(hour, minute, second),Qt::UTC);
+
+//    Q_ASSERT(dt.isValid());
+//    if ((year == 2013) && (month == 9) && (day == 18)) {
+//        // this is for testing.. set a breakpoint on here and
+//        int i=5;
+//    }
+
+
+    // From Rudd's data set compared to times reported from his F&P software's report (just the time bits left over)
+    // 90514 = 00:06:18 WET 23:06:18 UTC 09:06:18 AEST
+    // 94360 = 01:02:24 WET
+    // 91596 = 00:23:12 WET
+    // 19790 = 23:23:50 WET
+
+    return dt.addSecs(-54).toTime_t();
+}
+
+quint32 convertFLWDate(quint32 timestamp) // Bit format: hhhhhmmmmmmssssssYYYYYYMMMMDDDDD
+{
+    quint16 day, month, hour, minute, second;
+    quint16 year;
+
+    day = timestamp & 0x1f;
+    month = (timestamp  >> 5) & 0x0f;
+    year = 2000 + ((timestamp  >> 9) & 0x3f);
+    timestamp >>= 15;
+    second = timestamp & 0x3f;
+    minute = (timestamp >> 6) & 0x3f;
+    hour = (timestamp >> 12);
+
+    QDateTime dt = QDateTime(QDate(year, month, day), QTime(hour, minute, second), Qt::UTC);
+
+    if(!dt.isValid()){
+        dt = QDateTime(QDate(2015,1,1), QTime(0,0,1));
+    }
+//    Q_ASSERT(dt.isValid());
+//    if ((year == 2013) && (month == 9) && (day == 18)) {
+//        int i=5;
+//    }
+    // 87922 23:23:50 WET
+    return dt.addSecs(-54).toTime_t();
+}
+
+//QDateTime FPIconLoader::readFPDateTime(quint8 *data)
+//{
+//    quint32 ts = (data[3] << 24) | (data[2] << 16) | ((data[1] << 8) | data[0]); // ^ 0xc00000;
+//    // 0x20a41b18
+
+//    quint8 day = ts & 0x1f; // 0X18      24
+//    ts >>= 5;               // 10520D8
+//    quint8 month = ts & 0x0f; // 0X08      8
+//    ts >>= 4;               // 10520D
+//    quint8 year = ts & 0x3f; // 0X0D      13
+//    ts >>= 6;               // 4148
+//    quint8 second = ts & 0x3f; // 0X08      8
+//    ts >>= 6;               // 20A
+//    quint8 minute = ts & 0x3f; // 0A        10
+//    ts >>= 6;               // 10
+//    quint8 hour = ts & 0x1f; // 10        16
+//    QDate date = QDate(2000 + year, month, day);
+//    QTime time = QTime(hour, minute, second);
+//    QDateTime datetime = QDateTime(date, time, Qt::UTC);
+//    return datetime;
+//}
+
+/*
+ *in >> a1;
+in >> a2;
+t1=a2 << 8 | a1;
+
+if (t1==0xfafe)
+    break;
+
+day=t1 & 0x1f;
+month=(t1 >> 5) & 0x0f;
+year=2000+((t1 >> 9) & 0x3f);
+
+in >> a1;
+in >> a2;
+
+ts=((a2 << 8) | a1) << 1;
+ts|=(t1 >> 15) & 1;
+
+second=(ts & 0x3f);
+minute=(ts >> 6) & 0x3f;
+hour=(ts >> 12) & 0x1f; */
+
+
+
+// FLW Header Structure
+// 0x0000-0x01fe
+// newline (0x0d) seperated list of machine information strings.
+// magic?         0201
+// version        1.5.0
+// serial number  12 digits
+// Machine Series "ICON"
+// Machine Model  "Auto"
+// Remainder of header is 0 filled...
+// 0x01ff 8 bit additive sum checksum byte of previous header bytes
+
+// 0x0200-0x0203 32bit timestamp in
+bool FPIconLoader::OpenFLW(Machine *mach, QString filename)
+{
+    Q_UNUSED(mach);
+
+    quint32 ts;
+    double ti;
+
+    EventList *flow = nullptr, * pressure = nullptr;
+
+    qDebug() << filename;
+    QFile file(filename);
+
+    if (!file.open(QFile::ReadOnly)) {
+        qDebug() << "Couldn't open" << filename;
+        return false;
+    }
+
+    QByteArray header = file.read(0x200);
+    if (header.size() != 0x200) {
+        qDebug() << "Short file" << filename;
+        return false;
+    }
+
+    unsigned char hsum = 0x0;
+    for (int i = 0; i < 0x1ff; i++) { hsum ^= header[i]; }
+    if (hsum != header[0x1ff]) {
+        qDebug() << "Header checksum mismatch" << filename;
+    }
+
+    QTextStream htxt(&header);
+    QString h1, version, fname, serial, model, type;
+    htxt >> h1;
+    htxt >> version;
+    htxt >> fname;
+    htxt >> serial;
+    htxt >> model;
+    htxt >> type;
+
+    if (mach->model().isEmpty()) {
+        mach->setModel(model+" "+type);
+    }
+
+    QByteArray buf = file.read(4);
+    unsigned char * data = (unsigned char *)buf.data();
+
+    quint32 t2 = data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24;
+
+    // this line is probably superflous crud.
+    if (t2 == 0xffffffff) return false;
+
+    QByteArray block = file.readAll();
+    file.close();
+    data = (unsigned char *)block.data();
+
+    // Abort if crapy
+    if (!(data[103]==0xff && data[104]==0xff))
+        return false;
+
+    ts = convertFLWDate(t2);
+
+    if (ts > QDateTime(QDate(2015,1,1), QTime(0,0,0)).toTime_t()) {
+        return false;
+    }
+
+
+    ti = qint64(ts) * 1000L;
+
+    QMap<SessionID, Session *>::iterator sit = Sessions.find(ts);
+
+    Session *sess;
+
+    bool newsess = false;
+
+    if (sit != Sessions.end()) {
+        sess = sit.value();
+ //       qDebug() << filenum << ":" << date << sess->session() << ":" << sess->hours() * 60.0;
+    } else {
+        // Create a session
+        qint64 k = -1;
+        Session *s1 = nullptr;
+        sess = nullptr;
+
+        sit = Sessions.end();
+        if (Sessions.begin() != sit) {
+            do {
+                sit--;
+                s1 = sit.value();
+                qint64 z = qAbs(qint64(sit.key()) - qint64(ts));
+                if (z < 3600) {
+                    if ((k < 0) || (k > z)) {
+                        k = z;
+                        sess = s1;
+                    }
+                }
+            } while (sit != Sessions.begin());
+        }
+
+        if (sess) {
+            sess->set_first(ti);
+            sess->setFirst(CPAP_FlowRate, ti);
+            sess->setFirst(CPAP_MaskPressure, ti);
+        } else {
+            sess = new Session(mach, ts);
+            sess->set_first(ti);
+            sess->setFirst(CPAP_FlowRate, ti);
+            sess->setFirst(CPAP_MaskPressure, ti);
+            newsess = true;
+//            qDebug() << filenum << ":" << date << "couldn't find matching session for" << ts;
+        }
+    }
+    const int samples_per_block = 50;
+    const double rate = 1000.0 / double(samples_per_block);
+
+
+    // F&P Overwrites this file, not appends to it.
+    flow = new EventList(EVL_Waveform, 1.0F, 0, 0, 0, rate);
+    pressure = new EventList(EVL_Event, 0.01F, 0, 0, 0, rate * double(samples_per_block));
+
+    flow->setFirst(ti);
+    pressure->setFirst(ti);
+
+    quint16 endMarker;
+    qint8 offset;         // offset from center for this block
+    quint16 pres;       // mask pressure
+
+    qint16 tmp;
+
+    qint16 samples[samples_per_block];
+
+    EventDataType val;
+
+    unsigned char *p = data;
+    int datasize = block.size();
+    unsigned char *end = data+datasize;
+    do {
+        endMarker = *((quint16 *)p);
+        if (endMarker == 0xffff) {
+            p += 2;
+            continue;
+        }
+        if (endMarker == 0x7fff) {
+            break;
+        }
+        offset = ((qint8*)p)[102];
+        for (int i=0; i< samples_per_block; ++i) {
+            tmp = ((char *)p)[1] << 8 | p[0];
+            p += 2;
+            // Assuming Litres per hour, converting to litres per minute and applying offset?
+            // As in should be 60.0?
+            val = (EventDataType(tmp) / 100.0) - offset;
+            samples[i] = val;
+        }
+        flow->AddWaveform(ti, samples, samples_per_block, rate);
+
+        pres = *((quint16 *)p);
+        pressure->AddEvent(ti, pres);
+
+        ti += samples_per_block * rate;
+
+        p+=3; // (offset too)
+    } while (p < end);
+
+    if (endMarker != 0x7fff) {
+        qDebug() << fname << "waveform does not end with the corrent marker" << hex << endMarker;
+    }
+
+    if (sess) {
+        sess->setLast(CPAP_FlowRate, ti);
+        sess->setLast(CPAP_MaskPressure, ti);
+        sess->eventlist[CPAP_FlowRate].push_back(flow);
+        sess->eventlist[CPAP_MaskPressure].push_back(pressure);
+    }
+
+    if (newsess) {
+        addSession(sess);
+    }
+
+    if (p_profile->session->backupCardData()) {
+        QString backup = mach->getBackupPath()+"FPHCARE/ICON/"+serial.right(serial.size()-4)+"/";
+        QDir dir;
+        QString newname = QString("FLW%1.FPH").arg(ts);
+        dir.mkpath(backup);
+        dir.cd(backup);
+        if (!dir.exists(newname)) {
+            file.copy(backup+newname);
+        }
+    }
+
+
+    return true;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////
+// Open Summary file
+////////////////////////////////////////////////////////////////////////////////////////////
+bool FPIconLoader::OpenSummary(Machine *mach, QString filename)
+{
+    qDebug() << filename;
+    QByteArray header;
+    QFile file(filename);
+
+    if (!file.open(QFile::ReadOnly)) {
+        qDebug() << "Couldn't open" << filename;
+        return false;
+    }
+
+    header = file.read(0x200);
+
+    if (header.size() != 0x200) {
+        qDebug() << "Short file" << filename;
+        return false;
+    }
+
+    unsigned char hsum = 0xff;
+
+    for (int i = 0; i < 0x1ff; i++) {
+        hsum += header[i];
+    }
+
+    if (hsum != header[0x1ff]) {
+        qDebug() << "Header checksum mismatch" << filename;
+    }
+
+    QTextStream htxt(&header);
+    QString h1, version, fname, serial, model, type;
+    htxt >> h1;
+    htxt >> version;
+    htxt >> fname;
+    htxt >> serial;
+    htxt >> model;
+    htxt >> type;
+
+    mach->setModel(model + " " + type);
+
+    QByteArray data;
+    data = file.readAll();
+
+    QDataStream in(data);
+    in.setVersion(QDataStream::Qt_4_8);
+    in.setByteOrder(QDataStream::LittleEndian);
+
+    quint32 ts;
+    //QByteArray line;
+    unsigned char a1, a2, a3, a4, a5, p1, p2,  p3, p4, p5, j1, j2, j3 , j4, j5, j6, j7, x1, x2;
+
+    quint16 d1, d2, d3;
+
+    int runtime, usage;
+
+    QDate date;
+
+    do {
+        in >> ts;
+        if (ts == 0xffffffff)
+            break;
+        if ((ts & 0xfafe) == 0xfafe)
+            break;
+
+        ts = convertDate(ts);
+
+        // the following two quite often match in value
+        in >> a1;  // 0x04 Run Time
+        in >> a2;  // 0x05 Usage Time
+        runtime = a1 * 360; // durations are in tenth of an hour intervals
+        usage = a2 * 360;
+
+        in >> a3;  // 0x06  // Ramps???
+        in >> a4;  // 0x07  // a pressure value?
+        in >> a5;  // 0x08  // ?? varies.. always less than 90% leak..
+
+        in >> d1;  // 0x09
+        in >> d2;  // 0x0b
+        in >> d3;  // 0x0d   // 90% Leak value..
+
+        in >> p1;  // 0x0f
+        in >> p2;  // 0x10
+
+        in >> j1;  // 0x11
+        in >> j2;  // 0x12  // Apnea Events
+        in >> j3;  // 0x13  // Hypopnea events
+        in >> j4;  // 0x14  // Flow Limitation events
+        in >> j5;  // 0x15
+        in >> j6;  // 0x16
+        in >> j7;  // 0x17
+
+        in >> p3;  // 0x18
+        in >> p4;  // 0x19
+        in >> p5;  // 0x1a
+
+        in >> x1;  // 0x1b
+        in >> x2;  // 0x1c    // humidifier setting
+
+        if (!mach->SessionExists(ts)) {
+            Session *sess = new Session(mach, ts);
+            sess->really_set_first(qint64(ts) * 1000L);
+            sess->really_set_last(qint64(ts + usage) * 1000L);
+            sess->SetChanged(true);
+
+            sess->setCount(CPAP_Obstructive, j2);
+            sess->setCph(CPAP_Obstructive, j2 / (float(usage)/3600.00));
+
+            sess->setCount(CPAP_Hypopnea, j3);
+            sess->setCph(CPAP_Hypopnea, j3 / (float(usage)/3600.00));
+
+            sess->setCount(CPAP_FlowLimit, j4);
+            sess->setCph(CPAP_FlowLimit, j4 / (float(usage)/3600.00));
+
+            SessDate.insert(date, sess);
+
+            //            sess->setCount(CPAP_Obstructive,j1);
+            //            sess->setCount(CPAP_Hypopnea,j2);
+            //            sess->setCount(CPAP_ClearAirway,j3);
+            //            sess->setCount(CPAP_Apnea,j4);
+            //sess->setCount(CPAP_,j5);
+            if (p1 != p2) {
+                sess->settings[CPAP_Mode] = (int)MODE_APAP;
+                sess->settings[CPAP_PressureMin] = p3 / 10.0;
+                sess->settings[CPAP_PressureMax] = p4 / 10.0;
+            } else {
+                sess->settings[CPAP_Mode] = (int)MODE_CPAP;
+                sess->settings[CPAP_Pressure] = p1 / 10.0;
+            }
+
+            sess->settings[CPAP_HumidSetting] = x2;
+            //sess->settings[CPAP_PresReliefType]=PR_SENSAWAKE;
+            Sessions[ts] = sess;
+
+            addSession(sess);
+        }
+    } while (!in.atEnd());
+
+    if (p_profile->session->backupCardData()) {
+        QString backup = mach->getBackupPath()+"FPHCARE/ICON/"+serial.right(serial.size()-4)+"/";
+        QDir dir;
+        QString newname = QString("SUM%1.FPH").arg(QDate::currentDate().year(),4,10,QChar('0'));
+        dir.mkpath(backup);
+        dir.cd(backup);
+        if (!dir.exists(newname)) {
+            file.copy(backup+newname);
+        }
+    }
+
+    return true;
+}
+
+bool FPIconLoader::OpenDetail(Machine *mach, QString filename)
+{
+    Q_UNUSED(mach);
+
+    qDebug() << filename;
+    QByteArray header;
+    QFile file(filename);
+
+    if (!file.open(QFile::ReadOnly)) {
+        qDebug() << "Couldn't open" << filename;
+        return false;
+    }
+
+    header = file.read(0x200);
+
+    if (header.size() != 0x200) {
+        qDebug() << "Short file" << filename;
+        return false;
+    }
+
+    // Calculate and test checksum
+    unsigned char hsum = 0;
+    for (int i = 0; i < 0x1ff; i++) {
+        hsum += header[i];
+    }
+
+    if (hsum != header[0x1ff]) {
+        qDebug() << "Header checksum mismatch" << filename;
+    }
+
+    QTextStream htxt(&header);
+    QString h1, version, fname, serial, model, type;
+    htxt >> h1;
+    htxt >> version;
+    htxt >> fname;
+    htxt >> serial;
+    htxt >> model;
+    htxt >> type;
+
+    QByteArray index = file.read(0x800);
+    if (index.size()!=0x800) {
+        // faulty file..
+        return false;
+    }
+    QDataStream in(index);
+    quint32 ts;
+
+    in.setVersion(QDataStream::Qt_4_6);
+    in.setByteOrder(QDataStream::LittleEndian);
+
+    QVector<quint32> times;
+    QVector<quint16> start;
+    QVector<quint8> records;
+
+    quint16 strt;
+    quint8 recs;
+
+    int totalrecs = 0;
+
+    do {
+        in >> ts;
+        if (ts == 0xffffffff) break;
+        if ((ts & 0xfafe) == 0xfafe) break;
+
+        ts = convertDate(ts);
+
+        in >> strt;
+        in >> recs;
+        totalrecs += recs;
+
+        if (Sessions.contains(ts)) {
+            times.push_back(ts);
+            start.push_back(strt);
+            records.push_back(recs);
+        }
+    } while (!in.atEnd());
+
+    QByteArray databytes = file.readAll();
+
+    in.setVersion(QDataStream::Qt_4_6);
+    in.setByteOrder(QDataStream::BigEndian);
+
+    // 5 byte repeating patterns
+
+    quint8 *data = (quint8 *)databytes.data();
+
+    qint64 ti;
+    quint8 pressure, leak, a1, a2, a3, a4;
+//    quint8 sa1, sa2;  // The two sense awake bits per 2 minutes
+    SessionID sessid;
+    Session *sess;
+    int idx;
+
+    for (int r = 0; r < start.size(); r++) {
+        sessid = times[r];
+        sess = Sessions[sessid];
+        ti = qint64(sessid) * 1000L;
+        sess->really_set_first(ti);
+
+        EventList *LK = sess->AddEventList(CPAP_LeakTotal, EVL_Event, 1);
+        EventList *PR = sess->AddEventList(CPAP_Pressure, EVL_Event, 0.1F);
+        EventList *OA = sess->AddEventList(CPAP_Obstructive, EVL_Event);
+        EventList *H = sess->AddEventList(CPAP_Hypopnea, EVL_Event);
+        EventList *FL = sess->AddEventList(CPAP_FlowLimit, EVL_Event);
+        EventList *SA = sess->AddEventList(CPAP_SensAwake, EVL_Event);
+
+        unsigned stidx = start[r];
+        int rec = records[r];
+
+        idx = stidx * 15;
+
+        quint8 bitmask;
+        for (int i = 0; i < rec; ++i) {
+            for (int j = 0; j < 3; ++j) {
+                pressure = data[idx];
+                PR->AddEvent(ti+120000, pressure);
+
+                leak = data[idx + 1];
+                LK->AddEvent(ti+120000, leak);
+
+                a1 = data[idx + 2];   // [0..5] Obstructive flag, [6..7] Unknown
+                a2 = data[idx + 3];   // [0..5] Hypopnea,         [6..7] Unknown
+                a3 = data[idx + 4];   // [0..5] Flow Limitation,  [6..7] SensAwake bitflags, 1 per minute
+
+                // Sure there isn't 6 SenseAwake bits?
+                //  a4 = (a1 >> 6) << 4 | ((a2 >> 6) << 2) | (a3 >> 6);
+
+                // this does the same thing as behaviour
+                a4 = (a3 >> 7) << 3 | ((a3 >> 6) & 1);
+
+                bitmask = 1;
+                for (int k = 0; k < 6; k++) {  // There are 6 flag sets per 2 minutes
+                    if (a1 & bitmask) { OA->AddEvent(ti, 1); }
+                    if (a2 & bitmask) { H->AddEvent(ti, 1); }
+                    if (a3 & bitmask) { FL->AddEvent(ti, 1); }
+                    if (a4 & bitmask) { SA->AddEvent(ti, 1); }
+
+                    bitmask <<= 1;
+                    ti += 20000L;  // Increment 20 seconds
+                }
+
+                idx += 5;
+            }
+        }
+
+        //  sess->really_set_last(ti-360000L);
+        //        sess->SetChanged(true);
+        //       addSession(sess,profile);
+    }
+    if (p_profile->session->backupCardData()) {
+        unsigned char *data = (unsigned char *)index.data();
+        ts = data[0] | data[1] << 8 | data[2] << 16 | data[3] << 24;
+        ts = convertDate(ts);
+
+        QString backup = mach->getBackupPath()+"FPHCARE/ICON/"+serial.right(serial.size()-4)+"/";
+        QDir dir;
+        QString newname = QString("DET%1.FPH").arg(ts);
+
+        dir.mkpath(backup);
+        dir.cd(backup);
+        if (!dir.exists(newname)) {
+            file.copy(backup+newname);
+        }
+    }
+
+    return 1;
+}
+
+bool fpicon_initialized = false;
+void FPIconLoader::Register()
+{
+    if (fpicon_initialized) { return; }
+
+    qDebug() << "Registering F&P Icon Loader";
+    RegisterLoader(new FPIconLoader());
+    //InitModelMap();
+    fpicon_initialized = true;
+}
diff --git a/sleepyhead/SleepLib/loader_plugins/icon_loader.h b/sleepyhead/SleepLib/loader_plugins/icon_loader.h
new file mode 100644
index 0000000..06a91da
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/icon_loader.h
@@ -0,0 +1,110 @@
+/* SleepLib Fisher & Paykel Icon Loader Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef ICON_LOADER_H
+#define ICON_LOADER_H
+
+#include <QMultiMap>
+#include "SleepLib/machine.h"
+#include "SleepLib/machine_loader.h"
+#include "SleepLib/profiles.h"
+
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the following value when making changes to this loaders implementation.
+//
+const int fpicon_data_version = 3;
+//
+//********************************************************************************************
+
+/*! \class FPIcon
+    \brief F&P Icon customized machine object
+    */
+class FPIcon: public CPAP
+{
+  public:
+    FPIcon(MachineID id = 0);
+    virtual ~FPIcon();
+};
+
+
+const int fpicon_load_buffer_size = 1024 * 1024;
+
+
+const QString fpicon_class_name = STR_MACH_FPIcon;
+
+/*! \class FPIconLoader
+    \brief Loader for Fisher & Paykel Icon data
+    This is only relatively recent addition and still needs more work
+    */
+
+class FPIconLoader : public CPAPLoader
+{
+  public:
+    FPIconLoader();
+    virtual ~FPIconLoader();
+
+    //! \brief Detect if the given path contains a valid Folder structure
+    virtual bool Detect(const QString & path);
+
+    //! \brief Scans path for F&P Icon data signature, and Loads any new data
+    virtual int Open(QString path);
+
+    int OpenMachine(Machine *mach, QString &path);
+
+    bool OpenSummary(Machine *mach, QString path);
+    bool OpenDetail(Machine *mach, QString path);
+    bool OpenFLW(Machine *mach, QString filename);
+
+    //! \brief Returns SleepLib database version of this F&P Icon loader
+    virtual int Version() { return fpicon_data_version; }
+
+    //! \brief Returns the machine class name of this CPAP machine, "FPIcon"
+    virtual const QString &loaderName() { return fpicon_class_name; }
+
+    // ! \brief Creates a machine object, indexed by serial number
+    //Machine *CreateMachine(QString serial);
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_CPAP, 0, fpicon_class_name, QObject::tr("Fisher & Paykel"), QString(), QString(), QString(), QObject::tr("ICON"), QDateTime::currentDateTime(), fpicon_data_version);
+    }
+
+
+    //! \brief Registers this MachineLoader with the master list, so F&P Icon data can load
+    static void Register();
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Now for some CPAPLoader overrides
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    virtual QString presRelType() { return QObject::tr(""); } // might not need this one
+
+    virtual ChannelID presRelSet() { return NoChannel; }
+    virtual ChannelID presRelLevel() { return NoChannel; }
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+  protected:
+    QDateTime readFPDateTime(quint8 *data);
+
+    QString last;
+    QHash<QString, Machine *> MachList;
+    QMap<SessionID, Session *> Sessions;
+    QMultiMap<QDate, Session *> SessDate;
+    //QMap<int,QList<EventList *> > FLWMapFlow;
+    //QMap<int,QList<EventList *> > FLWMapLeak;
+    //QMap<int,QList<EventList *> > FLWMapPres;
+    //QMap<int,QList<qint64> > FLWDuration;
+    //QMap<int,QList<qint64> > FLWTS;
+    //QMap<int,QDate> FLWDate;
+
+    unsigned char *m_buffer;
+};
+
+#endif // ICON_LOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp b/sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp
new file mode 100644
index 0000000..070d501
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/intellipap_loader.cpp
@@ -0,0 +1,619 @@
+/* SleepLib (DeVilbiss) Intellipap Loader Implementation
+ *
+ * Notes: Intellipap requires the SmartLink attachment to access this data.
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QDir>
+#include <QProgressBar>
+
+#include "intellipap_loader.h"
+
+extern QProgressBar *qprogress;
+
+ChannelID INTP_SmartFlexMode, INTP_SmartFlexLevel;
+
+Intellipap::Intellipap(MachineID id)
+    : CPAP(id)
+{
+}
+
+Intellipap::~Intellipap()
+{
+}
+
+IntellipapLoader::IntellipapLoader()
+{
+    const QString INTELLIPAP_ICON = ":/icons/intellipap.png";
+    QString s = newInfo().series;
+    m_pixmap_paths[s] = INTELLIPAP_ICON;
+    m_pixmaps[s] = QPixmap(INTELLIPAP_ICON);
+
+    m_buffer = nullptr;
+    m_type = MT_CPAP;
+}
+
+IntellipapLoader::~IntellipapLoader()
+{
+}
+
+bool IntellipapLoader::Detect(const QString & givenpath)
+{
+    QDir dir(givenpath);
+
+    if (!dir.exists()) {
+        return false;
+    }
+
+    // Intellipap has a folder called SL in the root directory
+    if (!dir.cd("SL")) {
+        return false;
+    }
+
+    // Check for the settings file inside the SL folder
+    if (!dir.exists("SET1")) {
+        return false;
+    }
+
+    return true;
+}
+
+int IntellipapLoader::Open(QString path)
+{
+    // Check for SL directory
+    // Check for DV5MFirm.bin?
+    QString newpath;
+
+    path = path.replace("\\", "/");
+
+    QString dirtag = "SL";
+
+    if (path.endsWith("/" + dirtag)) {
+        return -1;
+        //newpath=path;
+    } else {
+        newpath = path + "/" + dirtag;
+    }
+
+    QString filename;
+
+    //////////////////////////
+    // Parse the Settings File
+    //////////////////////////
+    filename = newpath + "/SET1";
+    QFile f(filename);
+
+    if (!f.exists()) { return -1; }
+
+    f.open(QFile::ReadOnly);
+    QTextStream tstream(&f);
+
+    const QString INT_PROP_Serial = "Serial";
+    const QString INT_PROP_Model = "Model";
+    const QString INT_PROP_Mode = "Mode";
+    const QString INT_PROP_MaxPressure = "Max Pressure";
+    const QString INT_PROP_MinPressure = "Min Pressure";
+    const QString INT_PROP_IPAP = "IPAP";
+    const QString INT_PROP_EPAP = "EPAP";
+    const QString INT_PROP_PS = "PS";
+    const QString INT_PROP_RampPressure = "Ramp Pressure";
+    const QString INT_PROP_RampTime = "Ramp Time";
+
+    const QString INT_PROP_HourMeter = "Usage Hours";
+    const QString INT_PROP_ComplianceMeter = "Compliance Hours";
+    const QString INT_PROP_ErrorCode = "Error";
+    const QString INT_PROP_LastErrorCode = "Long Error";
+    const QString INT_PROP_LowUseThreshold = "Low Usage";
+    const QString INT_PROP_SmartFlex = "SmartFlex";
+    const QString INT_PROP_SmartFlexMode = "SmartFlexMode";
+
+
+    QHash<QString, QString> lookup;
+        lookup["Sn"] = INT_PROP_Serial;
+        lookup["Mn"] = INT_PROP_Model;
+        lookup["Mo"] = INT_PROP_Mode;     // 0 cpap, 1 auto
+        //lookup["Pn"]="??";
+        lookup["Pu"] = INT_PROP_MaxPressure;
+        lookup["Pl"] = INT_PROP_MinPressure;
+        lookup["Pi"] = INT_PROP_IPAP;
+        lookup["Pe"] = INT_PROP_EPAP;  // == WF on Auto models
+        lookup["Ps"] = INT_PROP_PS;             // == WF on Auto models, Pressure support
+        //lookup["Ds"]="??";
+        //lookup["Pc"]="??";
+        lookup["Pd"] = INT_PROP_RampPressure;
+        lookup["Dt"] = INT_PROP_RampTime;
+        //lookup["Ld"]="??";
+        //lookup["Lh"]="??";
+        //lookup["FC"]="??";
+        //lookup["FE"]="??";
+        //lookup["FL"]="??";
+        lookup["A%"]="ApneaThreshold";
+        lookup["Ad"]="ApneaDuration";
+        lookup["H%"]="HypopneaThreshold";
+        lookup["Hd"]="HypopneaDuration";
+        //lookup["Pi"]="??";
+        //lookup["Pe"]="??";
+        lookup["Ri"]="SmartFlexIRnd";  // Inhale Rounding (0-5)
+        lookup["Re"]="SmartFlexERnd"; // Inhale Rounding (0-5)
+        //lookup["Bu"]="??"; // WF
+        //lookup["Ie"]="??"; // 20
+        //lookup["Se"]="??"; // 05    //Inspiratory trigger?
+        //lookup["Si"]="??"; // 05    // Expiratory Trigger?
+        //lookup["Mi"]="??"; // 0
+        lookup["Uh"]="HoursMeter"; // 0000.0
+        lookup["Up"]="ComplianceMeter"; // 0000.00
+        //lookup["Er"]="ErrorCode";, // E00
+        //lookup["El"]="LongErrorCode"; // E00 00/00/0000
+        //lookup["Hp"]="??";, // 1
+        //lookup["Hs"]="??";, // 02
+        //lookup["Lu"]="LowUseThreshold"; // defaults to 0 (4 hours)
+        lookup["Sf"] = INT_PROP_SmartFlex;
+        lookup["Sm"] = INT_PROP_SmartFlexMode;
+        lookup["Ks=s"]="Ks_s";
+        lookup["Ks=i"]="ks_i";
+
+    QHash<QString, QString> set1;
+    QHash<QString, QString>::iterator hi;
+
+    Machine *mach = nullptr;
+
+    MachineInfo info = newInfo();
+
+
+    bool ok;
+
+    EventDataType min_pressure = 0, max_pressure = 0, ramp_pressure = 0, set_epap = 0, set_ipap = 0, set_ps = 0, ramp_time = 0;
+
+    int papmode = 0, smartflex = 0, smartflexmode = 0;
+    while (1) {
+        QString line = tstream.readLine();
+
+        if ((line.length() <= 2) ||
+                (line.isNull())) { break; }
+
+        QString key = line.section("\t", 0, 0).trimmed();
+        hi = lookup.find(key);
+
+        if (hi != lookup.end()) {
+            key = hi.value();
+        }
+
+        QString value = line.section("\t", 1).trimmed();
+
+        if (key == INT_PROP_Mode) {
+            papmode = value.toInt(&ok);
+        } else if (key == INT_PROP_Serial) {
+            info.serial = value;
+        } else if (key == INT_PROP_Model) {
+            info.model = value;
+        } else if (key == INT_PROP_MinPressure) {
+            min_pressure = value.toFloat() / 10.0;
+        } else if (key == INT_PROP_MaxPressure) {
+            max_pressure = value.toFloat() / 10.0;
+        } else if (key == INT_PROP_IPAP) {
+            set_ipap = value.toFloat() / 10.0;
+        } else if (key == INT_PROP_EPAP) {
+            set_epap = value.toFloat() / 10.0;
+        } else if (key == INT_PROP_PS) {
+            set_ps = value.toFloat() / 10.0;
+        } else if (key == INT_PROP_RampPressure) {
+            ramp_pressure = value.toFloat() / 10.0;
+        } else if (key == INT_PROP_RampTime) {
+            ramp_time = value.toFloat() / 10.0;
+        } else if (key == INT_PROP_SmartFlex) {
+            smartflex = value.toInt();
+        } else if (key == INT_PROP_SmartFlexMode) {
+            smartflexmode = value.toInt();
+        } else {
+            set1[key] = value;
+        }
+        qDebug() << key << "=" << value;
+    }
+
+    CPAPMode mode = MODE_UNKNOWN;
+
+    switch (papmode) {
+    case 0:
+        mode = MODE_CPAP;
+        break;
+    case 1:
+        mode = (set_epap > 0) ? MODE_BILEVEL_FIXED : MODE_APAP;
+        break;
+    default:
+        qDebug() << "New machine mode";
+    }
+
+    if (!info.serial.isEmpty()) {
+        mach = CreateMachine(info);
+    }
+
+    if (!mach) {
+        qDebug() << "Couldn't get Intellipap machine record";
+        return -1;
+    }
+
+    QString backupPath = mach->getBackupPath();
+    QString copypath = path;
+
+    if (QDir::cleanPath(path).compare(QDir::cleanPath(backupPath)) != 0) {
+        copyPath(path, backupPath);
+    }
+
+
+    // Refresh properties data..
+    for (QHash<QString, QString>::iterator i = set1.begin(); i != set1.end(); i++) {
+        mach->properties[i.key()] = i.value();
+    }
+
+    f.close();
+
+    ///////////////////////////////////////////////
+    // Parse the Session Index (U File)
+    ///////////////////////////////////////////////
+    unsigned char buf[27];
+    filename = newpath + "/U";
+    f.setFileName(filename);
+
+    if (!f.exists()) { return -1; }
+
+    QVector<quint32> SessionStart;
+    QVector<quint32> SessionEnd;
+    QHash<SessionID, Session *> Sessions;
+
+    quint32 ts1, ts2;//, length;
+    //unsigned char cs;
+    f.open(QFile::ReadOnly);
+    int cnt = 0;
+    QDateTime epoch(QDate(2002, 1, 1), QTime(0, 0, 0), Qt::UTC); // Intellipap Epoch
+    int ep = epoch.toTime_t();
+
+    do {
+        cnt = f.read((char *)buf, 9);
+        // big endian
+        ts1 = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
+        ts2 = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
+        // buf[8] == ??? What is this byte? A Bit Field? A checksum?
+        ts1 += ep;
+        ts2 += ep;
+        SessionStart.append(ts1);
+        SessionEnd.append(ts2);
+    } while (cnt > 0);
+
+    qDebug() << "U file logs" << SessionStart.size() << "sessions.";
+    f.close();
+
+    ///////////////////////////////////////////////
+    // Parse the Session Data (L File)
+    ///////////////////////////////////////////////
+    filename = newpath + "/L";
+    f.setFileName(filename);
+
+    if (!f.exists()) { return -1; }
+
+    f.open(QFile::ReadOnly);
+    long size = f.size();
+    int recs = size / 26;
+    m_buffer = new unsigned char [size];
+
+    if (size != f.read((char *)m_buffer, size)) {
+        qDebug()  << "Couldn't read 'L' data" << filename;
+        return -1;
+    }
+
+    Session *sess;
+    SessionID sid;
+    QHash<SessionID,qint64> rampstart;
+    QHash<SessionID,qint64> rampend;
+
+    for (int i = 0; i < SessionStart.size(); i++) {
+        sid = SessionStart[i];
+
+        if (mach->SessionExists(sid)) {
+            // knock out the already imported sessions..
+            SessionStart[i] = 0;
+            SessionEnd[i] = 0;
+        } else if (!Sessions.contains(sid)) {
+            sess = Sessions[sid] = new Session(mach, sid);
+
+            sess->really_set_first(qint64(sid) * 1000L);
+         //   sess->really_set_last(qint64(SessionEnd[i]) * 1000L);
+
+            rampstart[sid] = 0;
+            rampend[sid] = 0;
+            sess->SetChanged(true);
+            if (mode >= MODE_BILEVEL_FIXED) {
+                sess->AddEventList(CPAP_IPAP, EVL_Event);
+                sess->AddEventList(CPAP_EPAP, EVL_Event);
+                sess->AddEventList(CPAP_PS, EVL_Event);
+            } else {
+                sess->AddEventList(CPAP_Pressure, EVL_Event);
+            }
+
+            sess->AddEventList(INTELLIPAP_Unknown1, EVL_Event);
+            sess->AddEventList(INTELLIPAP_Unknown2, EVL_Event);
+
+            sess->AddEventList(CPAP_LeakTotal, EVL_Event);
+            sess->AddEventList(CPAP_MaxLeak, EVL_Event);
+            sess->AddEventList(CPAP_TidalVolume, EVL_Event);
+            sess->AddEventList(CPAP_MinuteVent, EVL_Event);
+            sess->AddEventList(CPAP_RespRate, EVL_Event);
+            sess->AddEventList(CPAP_Snore, EVL_Event);
+
+            sess->AddEventList(CPAP_Obstructive, EVL_Event);
+            sess->AddEventList(CPAP_VSnore, EVL_Event);
+            sess->AddEventList(CPAP_Hypopnea, EVL_Event);
+            sess->AddEventList(CPAP_NRI, EVL_Event);
+            sess->AddEventList(CPAP_LeakFlag, EVL_Event);
+            sess->AddEventList(CPAP_ExP, EVL_Event);
+
+
+        } else {
+            // If there is a double up, null out the earlier session
+            // otherwise there will be a crash on shutdown.
+            for (int z = 0; z < SessionStart.size(); z++) {
+                if (SessionStart[z] == (quint32)sid) {
+                    SessionStart[z] = 0;
+                    SessionEnd[z] = 0;
+                    break;
+                }
+            }
+
+            QDateTime d = QDateTime::fromTime_t(sid);
+            qDebug() << sid << "has double ups" << d;
+            /*Session *sess=Sessions[sid];
+            Sessions.erase(Sessions.find(sid));
+            delete sess;
+            SessionStart[i]=0;
+            SessionEnd[i]=0; */
+        }
+    }
+
+    long pos = 0;
+    int rampval = 0;
+    sid = 0;
+    SessionID lastsid = 0;
+
+    int last_minp=0, last_maxp=0, last_ps=0, last_pres = 0;
+
+    for (int i = 0; i < recs; i++) {
+        // convert timestamp to real epoch
+        ts1 = ((m_buffer[pos] << 24) | (m_buffer[pos + 1] << 16) | (m_buffer[pos + 2] << 8) | m_buffer[pos + 3]) + ep;
+
+        for (int j = 0; j < SessionStart.size(); j++) {
+            sid = SessionStart[j];
+
+            if (!sid) { continue; }
+
+            if ((ts1 >= (quint32)sid) && (ts1 <= SessionEnd[j])) {
+                Session *sess = Sessions[sid];
+
+                qint64 time = quint64(ts1) * 1000L;
+                sess->really_set_last(time);
+                sess->settings[CPAP_Mode] = mode;
+
+                int minp = m_buffer[pos + 0x13];
+                int maxp = m_buffer[pos + 0x14];
+                int ps = m_buffer[pos + 0x15];
+                int pres = m_buffer[pos + 0xd];
+
+                if (mode >= MODE_BILEVEL_FIXED) {
+                    rampval = maxp;
+                } else {
+                    rampval = minp;
+                }
+
+                qint64 rs = rampstart[sid];
+
+                if (pres < rampval) {
+                    if (!rs) {
+                        // ramp started
+
+
+//                        int rv = pres-rampval;
+//                        double ramp =
+
+                        rampstart[sid] = time;
+                    }
+                    rampend[sid] = time;
+                } else {
+                    if (rs > 0) {
+                        if (!sess->eventlist.contains(CPAP_Ramp)) {
+                            sess->AddEventList(CPAP_Ramp, EVL_Event);
+                        }
+                        int duration = (time - rs) / 1000L;
+                        sess->eventlist[CPAP_Ramp][0]->AddEvent(time, duration);
+
+                        rampstart.remove(sid);
+                        rampend.remove(sid);
+                    }
+                }
+
+
+                // Do this after ramp, because ramp calcs might need to insert interpolated pressure samples
+                if (mode >= MODE_BILEVEL_FIXED) {
+
+                    sess->settings[CPAP_EPAP] = float(minp) / 10.0;
+                    sess->settings[CPAP_IPAP] = float(maxp) / 10.0;
+
+                    sess->settings[CPAP_PS] = float(ps) / 10.0;
+
+
+                    sess->eventlist[CPAP_IPAP][0]->AddEvent(time, float(pres) / 10.0);
+                    sess->eventlist[CPAP_EPAP][0]->AddEvent(time, float(pres-ps) / 10.0);
+//                   rampval = maxp;
+
+                } else {
+                    sess->eventlist[CPAP_Pressure][0]->AddEvent(time, float(pres) / 10.0); // current pressure
+//                    rampval = minp;
+
+                    if (mode == MODE_APAP) {
+                        sess->settings[CPAP_PressureMin] = float(minp) / 10.0;
+                        sess->settings[CPAP_PressureMax] = float(maxp) / 10.0;
+                    } else if (mode == MODE_CPAP) {
+                        sess->settings[CPAP_Pressure] = float(maxp) / 10.0;
+                    }
+                }
+
+
+                sess->eventlist[CPAP_LeakTotal][0]->AddEvent(time, m_buffer[pos + 0x7]); // "Average Leak"
+                sess->eventlist[CPAP_MaxLeak][0]->AddEvent(time, m_buffer[pos + 0x6]); // "Max Leak"
+
+                int rr = m_buffer[pos + 0xa];
+                sess->eventlist[CPAP_RespRate][0]->AddEvent(time, rr); // Respiratory Rate
+               // sess->eventlist[INTELLIPAP_Unknown1][0]->AddEvent(time, m_buffer[pos + 0xf]); //
+                sess->eventlist[INTELLIPAP_Unknown1][0]->AddEvent(time, m_buffer[pos + 0xc]);
+
+                sess->eventlist[CPAP_Snore][0]->AddEvent(time, m_buffer[pos + 0x4]); //4/5??
+
+                if (m_buffer[pos+0x4] > 0) {
+                    sess->eventlist[CPAP_VSnore][0]->AddEvent(time, m_buffer[pos + 0x5]);
+                }
+
+                // 0x0f == Leak Event
+                // 0x04 == Snore?
+                if (m_buffer[pos + 0xf] > 0) { // Leak Event
+                    sess->eventlist[CPAP_LeakFlag][0]->AddEvent(time, m_buffer[pos + 0xf]);
+                }
+
+                if (m_buffer[pos + 0x5] > 4) { // This matches Exhale Puff.. not sure why 4
+                    //MW: Are the lower 2 bits something else?
+
+                    sess->eventlist[CPAP_ExP][0]->AddEvent(time, m_buffer[pos + 0x5]);
+                }
+
+                if (m_buffer[pos + 0x10] > 0) {
+                    sess->eventlist[CPAP_Obstructive][0]->AddEvent(time, m_buffer[pos + 0x10]);
+                }
+
+                if (m_buffer[pos + 0x11] > 0) {
+                    sess->eventlist[CPAP_Hypopnea][0]->AddEvent(time, m_buffer[pos + 0x11]);
+                }
+
+                if (m_buffer[pos + 0x12] > 0) { // NRI // is this == to RERA?? CA??
+                    sess->eventlist[CPAP_NRI][0]->AddEvent(time, m_buffer[pos + 0x12]);
+                }
+
+                quint16 tv = (m_buffer[pos + 0x8] << 8) | m_buffer[pos + 0x9]; // correct
+
+                sess->eventlist[CPAP_TidalVolume][0]->AddEvent(time, tv);
+
+                EventDataType mv = tv * rr; // MinuteVent=TidalVolume * Respiratory Rate
+                sess->eventlist[CPAP_MinuteVent][0]->AddEvent(time, mv / 1000.0);
+                break;
+            } else {
+            }
+            lastsid = sid;
+        }
+
+        pos += 26;
+    }
+
+    // Close any open ramps and store the event.
+    QHash<SessionID,qint64>::iterator rit;
+    QHash<SessionID,qint64>::iterator rit_end = rampstart.end();
+
+    for (rit = rampstart.begin(); rit != rit_end; ++rit) {
+        qint64 rs = rit.value();
+        SessionID sid = rit.key();
+        if (rs > 0) {
+            qint64 re = rampend[rit.key()];
+
+            Session *sess = Sessions[sid];
+            if (!sess->eventlist.contains(CPAP_Ramp)) {
+                sess->AddEventList(CPAP_Ramp, EVL_Event);
+            }
+
+            int duration = (re - rs) / 1000L;
+            sess->eventlist[CPAP_Ramp][0]->AddEvent(re, duration);
+            rit.value() = 0;
+
+        }
+    }
+
+    for (int i = 0; i < SessionStart.size(); i++) {
+        SessionID sid = SessionStart[i];
+
+        if (sid) {
+            sess = Sessions[sid];
+
+            if (!sess) continue;
+
+//            quint64 first = qint64(sid) * 1000L;
+            quint64 last = qint64(SessionEnd[i]) * 1000L;
+
+            if (sess->last() > 0) {
+             //   sess->really_set_last(last);
+
+
+                sess->settings[INTP_SmartFlexLevel] = smartflex;
+
+                if (smartflexmode == 0) {
+                    sess->settings[INTP_SmartFlexMode] = PM_FullTime;
+                } else {
+                    sess->settings[INTP_SmartFlexMode] = PM_RampOnly;
+                }
+
+                sess->settings[CPAP_RampPressure] = ramp_pressure;
+                sess->settings[CPAP_RampTime] = ramp_time;
+
+                sess->UpdateSummaries();
+
+                addSession(sess);
+            } else {
+                delete sess;
+            }
+
+        }
+    }
+
+    finishAddingSessions();
+    mach->Save();
+
+
+    delete [] m_buffer;
+
+    if (qprogress) { qprogress->setValue(100); }
+
+    f.close();
+
+    int c = Sessions.size();
+    return c;
+}
+
+void IntellipapLoader::initChannels()
+{
+    using namespace schema;
+    Channel * chan = nullptr;
+    channel.add(GRP_CPAP, chan = new Channel(INTP_SmartFlexMode = 0x1165, SETTING,  MT_CPAP,  SESSION,
+        "INTPSmartFlexMode", QObject::tr("SmartFlex Mode"),
+        QObject::tr("Intellipap pressure relief mode."),
+        QObject::tr("SmartFlex Mode"),
+        "", DEFAULT, Qt::green));
+
+
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, QObject::tr("Ramp Only"));
+    chan->addOption(2, QObject::tr("Full Time"));
+
+    channel.add(GRP_CPAP, chan = new Channel(INTP_SmartFlexLevel = 0x1169, SETTING,  MT_CPAP,  SESSION,
+        "INTPSmartFlexLevel", QObject::tr("SmartFlex Level"),
+        QObject::tr("Intellipap pressure relief level."),
+        QObject::tr("SmartFlex Level"),
+        "", DEFAULT, Qt::green));
+}
+
+bool intellipap_initialized = false;
+void IntellipapLoader::Register()
+{
+    if (intellipap_initialized) { return; }
+
+    qDebug() << "Registering IntellipapLoader";
+    RegisterLoader(new IntellipapLoader());
+    //InitModelMap();
+    intellipap_initialized = true;
+
+}
diff --git a/sleepyhead/SleepLib/loader_plugins/intellipap_loader.h b/sleepyhead/SleepLib/loader_plugins/intellipap_loader.h
new file mode 100644
index 0000000..108bdb9
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/intellipap_loader.h
@@ -0,0 +1,94 @@
+/* Intellipap Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef INTELLIPAP_LOADER_H
+#define INTELLIPAP_LOADER_H
+
+#include "SleepLib/machine.h" // Base class: MachineLoader
+#include "SleepLib/machine_loader.h"
+#include "SleepLib/profiles.h"
+
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the following value when making changes to this loaders implementation.
+//
+const int intellipap_data_version = 3;
+//
+//********************************************************************************************
+
+/*! \class Intellipap
+    \brief Intellipap customized machine object
+    */
+class Intellipap: public CPAP
+{
+  public:
+    Intellipap(MachineID id = 0);
+    virtual ~Intellipap();
+};
+
+
+const int intellipap_load_buffer_size = 1024 * 1024;
+
+extern ChannelID INTP_SmartFlexMode;
+extern ChannelID INTP_SmartFlexLevel;
+
+const QString intellipap_class_name = STR_MACH_Intellipap;
+
+/*! \class IntellipapLoader
+    \brief Loader for DeVilbiss Intellipap Auto data
+    This is only relatively recent addition and still needs more work
+    */
+class IntellipapLoader : public CPAPLoader
+{
+  public:
+    IntellipapLoader();
+    virtual ~IntellipapLoader();
+
+    //! \brief Detect if the given path contains a valid Folder structure
+    virtual bool Detect(const QString & path);
+
+    //! \brief Scans path for Intellipap data signature, and Loads any new data
+    virtual int Open(QString path);
+
+    //! \brief Returns SleepLib database version of this IntelliPap loader
+    virtual int Version() { return intellipap_data_version; }
+
+    //! \brief Returns the machine class name of this IntelliPap, "Intellipap"
+    virtual const QString &loaderName() { return intellipap_class_name; }
+
+    //! \brief Creates a machine object, indexed by serial number
+ //   Machine *CreateMachine(QString serial);
+
+    //! \brief Registers this MachineLoader with the master list, so Intellipap data can load
+    static void Register();
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_CPAP, 0, intellipap_class_name, QObject::tr("DeVilbiss"), QString(), QString(), QString(), QObject::tr("Intellipap"), QDateTime::currentDateTime(), intellipap_data_version);
+    }
+    virtual void initChannels();
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Now for some CPAPLoader overrides
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    virtual QString presRelLabel() { return QObject::tr("SmartFlex Settings"); } // might not need this one
+
+    virtual ChannelID presReliefMode() { return INTP_SmartFlexMode; }
+    virtual ChannelID presRelLevel() { return INTP_SmartFlexLevel; }
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  protected:
+    QString last;
+
+    unsigned char *m_buffer;
+};
+
+
+#endif // INTELLIPAP_LOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/md300w1_loader.cpp b/sleepyhead/SleepLib/loader_plugins/md300w1_loader.cpp
new file mode 100644
index 0000000..bac7194
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/md300w1_loader.cpp
@@ -0,0 +1,236 @@
+/* SleepLib ChoiceMMed MD300W1 Oximeter Loader Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the md300w1_data_version in md300w1_loader.h when making changes to this
+// loader that change loader behaviour or modify channels.
+//********************************************************************************************
+
+#include <QProgressBar>
+#include <QApplication>
+#include <QDir>
+#include <QString>
+#include <QDateTime>
+#include <QFile>
+#include <QDebug>
+#include <QList>
+#include <QMessageBox>
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QPushButton>
+
+using namespace std;
+
+#include "md300w1_loader.h"
+#include "SleepLib/machine.h"
+#include "SleepLib/session.h"
+
+extern QProgressBar *qprogress;
+
+MD300W1Loader::MD300W1Loader()
+{
+    m_type = MT_OXIMETER;
+    m_abort = false;
+    m_streaming = false;
+    m_importing = false;
+    imp_callbacks = 0;
+
+    // have no idea.. assuming it's another CP2102 USB UART, which won't help detection :/
+    m_vendorID = 0;
+    m_productID = 0;
+
+    startTimer.setParent(this);
+    resetTimer.setParent(this);
+
+}
+
+MD300W1Loader::~MD300W1Loader()
+{
+}
+
+bool MD300W1Loader::Detect(const QString &path)
+{
+    Q_UNUSED(path);
+    return false;
+}
+
+int MD300W1Loader::Open(QString path)
+{
+    // Only one active Oximeter module at a time, set in preferences
+
+    m_itemCnt = 0;
+    m_itemTotal = 0;
+
+    m_abort = false;
+    m_importing = false;
+
+    started_import = false;
+    started_reading = false;
+    finished_import = false;
+
+    imp_callbacks = 0;
+    cb_reset = 0;
+
+    m_time.start();
+
+    // Cheating using path for two serial oximetry modes
+
+    if (path.compare("import") == 0) {
+        setStatus(IMPORTING);
+
+        startTimer.stop();
+        startImportTimeout();
+        return 1;
+    } else if (path.compare("live") == 0) {
+        m_startTime = oxitime = QDateTime::currentDateTime();
+        setStatus(LIVE);
+        return 1;
+    }
+    QString ext = path.section(".",1);
+    if (ext.compare("dat", Qt::CaseInsensitive)==0) {
+        // try to read and process SpoR file..
+        return readDATFile(path) ? 1 : 0;
+    }
+
+    return 0;
+}
+
+
+void MD300W1Loader::processBytes(QByteArray bytes)
+{
+    Q_UNUSED(bytes);
+    return;
+}
+
+int MD300W1Loader::doImportMode()
+{
+    return 0;
+}
+
+int MD300W1Loader::doLiveMode()
+{
+    return 0;
+}
+
+// Switch MD300W1 device to live streaming mode
+void MD300W1Loader::resetDevice()
+{
+}
+
+// Switch MD300W1 device to record transmission mode
+void MD300W1Loader::requestData()
+{
+}
+
+void MD300W1Loader::killTimers()
+{
+    startTimer.stop();
+    resetTimer.stop();
+}
+
+void MD300W1Loader::startImportTimeout()
+{
+    return;
+}
+
+void MD300W1Loader::resetImportTimeout()
+{
+    return;
+}
+
+
+// MedView .dat file (ChoiceMMed MD300B, MD300KI, MD300I, MD300W1, MD300C318, MD2000A)
+// Format:
+// Bytes  0  (1  2)
+//        id    n
+// n*11   0  1  2  3  4  5  6  7  8  9  10
+//        0  0  id yr mm dd hh mm ss o2 pulse
+// report title etc.
+
+bool MD300W1Loader::readDATFile(QString path)
+{
+    QFile file(path);
+    if (!file.exists()) {
+        return false;
+    }
+
+    if (!file.open(QFile::ReadOnly)) {
+        return false;
+    }
+
+    QByteArray data;
+
+    data = file.readAll();
+    long size = data.size();
+
+    // Number of records
+    int n = ((unsigned char)data.at(2) << 8) | (unsigned char)data.at(1);
+
+    // CHECKME:
+    if (size < (n*11)+3) {
+        qDebug() << "Short MD300W1 .dat file" << path;
+        return false;
+    }
+
+
+    unsigned char o2, pr;
+
+    qint32 lasttime=0, ts=0;
+    int gap;
+    for (int pos = 0; pos < n; ++pos) {
+        int i = 3 + (pos * 11);
+        QString datestr = QString().sprintf("%02d/%02d/%02d %02d:%02d:%02d",(unsigned char)data.at(i+4),(unsigned char)data.at(i+5),(unsigned char)data.at(i+3),(unsigned char)data.at(i+6),(unsigned char)data.at(i+7),(unsigned char)data.at(i+8));
+        QDateTime datetime = QDateTime::fromString(datestr,"MM/dd/yy HH:mm:ss");
+        if (datetime.date().year() < 2000) datetime = datetime.addYears(100);
+        ts = datetime.toTime_t();
+        gap = ts - lasttime;
+        if (gap > 1) {
+            if (gap < 360) {
+                // Less than 5 minutes? Merge session
+                gap--;
+                // fill with zeroes
+                for (int j = 0; j < gap; j++) {
+                    oxirec->append(OxiRecord(0,0));
+                }
+            } else {
+                // Create a new session
+                oxirec = new QVector<OxiRecord>;
+                oxisessions[datetime] = oxirec;
+            }
+        }
+
+        pr=(unsigned char)(data.at(i+10));
+        o2=(unsigned char)(data.at(i+9));
+
+        oxirec->append(OxiRecord(pr, o2));
+
+        lasttime = ts;
+    }
+
+    // processing gets done later
+    return true;
+}
+
+void MD300W1Loader::process()
+{
+}
+
+
+static bool MD300W1_initialized = false;
+
+void MD300W1Loader::Register()
+{
+    if (MD300W1_initialized) { return; }
+
+    qDebug() << "Registering MD300W1Loader";
+    RegisterLoader(new MD300W1Loader());
+    MD300W1_initialized = true;
+}
+
diff --git a/sleepyhead/SleepLib/loader_plugins/md300w1_loader.h b/sleepyhead/SleepLib/loader_plugins/md300w1_loader.h
new file mode 100644
index 0000000..a974eb7
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/md300w1_loader.h
@@ -0,0 +1,91 @@
+/* SleepLib ChoiceMMed MD300W1 Oximeter Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef MD300W1LOADER_H
+#define MD300W1LOADER_H
+
+#include "SleepLib/serialoximeter.h"
+
+const QString md300w1_class_name = "MD300W1";
+const int md300w1_data_version = 1;
+
+
+/*! \class MD300W1Loader
+    \brief Importer for ChoiceMMed MD300W1 data format..
+    */
+class MD300W1Loader : public SerialOximeter
+{
+Q_OBJECT
+  public:
+    MD300W1Loader();
+    virtual ~MD300W1Loader();
+
+    virtual bool Detect(const QString &path);
+    virtual int Open(QString path);
+
+    static void Register();
+
+    virtual int Version() { return md300w1_data_version; }
+    virtual const QString &loaderName() { return md300w1_class_name; }
+
+    // Machine *CreateMachine();
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_OXIMETER, 0, md300w1_class_name, QObject::tr("ChoiceMMed"), QString(), QString(), QString(), QObject::tr("MD300"), QDateTime::currentDateTime(), md300w1_data_version);
+    }
+
+
+    virtual void process();
+
+    virtual bool isStartTimeValid() { return true; }
+
+protected slots:
+    virtual void resetImportTimeout();
+    virtual void startImportTimeout();
+
+protected:
+
+    bool readDATFile(QString path);
+    virtual void processBytes(QByteArray bytes);
+
+    int doImportMode();
+    int doLiveMode();
+
+    virtual void killTimers();
+
+    // Switch MD300W1 device to live streaming mode
+    virtual void resetDevice();
+
+    // Switch MD300W1 device to record transmission mode
+    void requestData();
+
+  private:
+    EventList *PULSE;
+    EventList *SPO2;
+
+    QTime m_time;
+
+    QByteArray buffer;
+
+    bool started_import;
+    bool finished_import;
+    bool started_reading;
+    QDateTime oxitime;
+
+    int cb_reset,imp_callbacks;
+
+    int received_bytes;
+
+    int m_itemCnt;
+    int m_itemTotal;
+
+
+};
+
+
+#endif // MD300W1LOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/mseries_loader.cpp b/sleepyhead/SleepLib/loader_plugins/mseries_loader.cpp
new file mode 100644
index 0000000..3e1c407
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/mseries_loader.cpp
@@ -0,0 +1,491 @@
+/* SleepLib RemStar M-Series Loader Implementation
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QDir>
+#include <QProgressBar>
+
+#include "mseries_loader.h"
+extern QProgressBar *qprogress;
+
+
+
+MSeries::MSeries(MachineID id)
+    : CPAP(id)
+{
+}
+
+MSeries::~MSeries()
+{
+}
+
+MSeriesLoader::MSeriesLoader()
+{
+    m_type = MT_CPAP;
+
+    epoch = QDateTime(QDate(2000, 1, 1), QTime(0, 0, 0), Qt::UTC).toTime_t();
+    epoch -= QDateTime(QDate(1970, 1, 1), QTime(0, 0, 0), Qt::UTC).toTime_t();
+}
+
+MSeriesLoader::~MSeriesLoader()
+{
+}
+
+//struct MSeriesHeader {
+//    quint8   b1;            //0x52
+//    quint32  a32;           //0x00000049
+//    quint16  u16[8];
+//    quint8   b2;            //0x02
+//    char     setname[16];
+//    char     firstname[25];
+//    char     lastname[25];
+//    char     serial[50];
+//    quint16  b3;            //0x00
+//    quint16  b4;            //0x66
+//    quint16  b5;            //0xff
+
+//} __attribute__((packed));
+/*
+
+blockLayoutOffsets   {
+            cardInformationBlock = 0,
+                brandID = 0,
+                cardType = 2,
+                cardVersion = 3
+                startUIDB = 4
+                endUIDB = 6,
+                startCPB = 8,
+                endCPB = 10,
+                startCDCB = 12,
+                endCDCB = 14,
+                startCDB = 0x10,
+                endCDB = 0x12,
+                checksum = 20,
+
+            userIDBlock = 0x15
+                personalID = 1,
+                patientFName = 0x11,
+                patientLName = 0x2a,
+                serialNumber = 0x43,
+                modelNumber = 0x4d,
+                textData = 0x57
+                checksum = 0x77,
+
+            cardPrescriptionBlock = 0x8d,
+
+
+            cardDataControlBlock = 0xa3,
+                validFlagOne = 3,
+                headPtrOne = 4,
+                tailPtrOne = 6,
+                cdbChecksumOne = 8,
+                validFlagTwo = 9
+                headPtrTwo = 10,
+                tailPtrTwo = 12,
+                cdbChecksumTwo = 14,
+
+            cardDataBlock = 0xb2,
+                basicCompliance = 1,
+                fosq = 2,
+                Invalid = 0xff,
+                sleepProfile = 8,
+                sleepProfile2 = 10,
+                sleepProfile3 = 14,
+                sleepTrend = 9,
+                sleepTrend2 = 11,
+                sleepTrend3 = 15,
+                smartAutoCPAPProfile = 3,
+                smartAutoCPAPTrend = 4,
+                ventCompliance2 = 13,
+                ventilatorCompliance = 7,
+                ventilatorProfile = 6,
+                ventProfile2 = 12
+                startChar = 0xfe,
+                stopChar = 0x7f
+                    */
+
+
+int MSeriesLoader::Open(QString path)
+{
+    // Until a smartcard reader is written, this is not an auto-scanner.. it just opens a block file..
+
+    QFile file(path);
+
+    if (!file.exists()) { return 0; }
+
+    if (file.size() != 32768) { // Check filesize matches smartcard?
+        return 0;
+    }
+
+    if (!file.open(QFile::ReadOnly)) {
+        qDebug() << "Couldn't open M-Series file:" << path;
+        return 0;
+    }
+
+    QByteArray block = file.readAll();
+
+
+    // Thanks to Phil Gillam for the pointers on this one..
+
+    const unsigned char *cardinfo = (unsigned char *)block.data();
+    quint16 magic = cardinfo[0] << 8 | cardinfo[1];
+
+    if (magic != 0x5249) { // "RI" Respironics Magic number
+        return 0;
+    }
+
+    //quint8 cardtype=cardinfo[2];
+    //quint8 cardver=cardinfo[3];
+
+    quint16 user_offset = (cardinfo[4] << 8) | cardinfo[5];
+    //quint16 rx_offset=(cardinfo[8] << 8) | cardinfo[9];
+    quint16 control_offset = (cardinfo[12] << 8) | cardinfo[13];
+    //quint16 data_offset=(cardinfo[16] << 8) | cardinfo[17];
+
+
+    const char *userinfo = block.data() + user_offset;
+    QString setname = QString(userinfo + 0x1);
+    QString firstname = QString(userinfo + 0x11);
+    QString lastname = QString(userinfo + 0x2a);
+    QString serial = QString(userinfo + 0x43);
+    serial.truncate(10);
+    QString model = QString(userinfo + 0x4d);
+    QString textdata = QString(userinfo + 0x57);
+    quint8 userinfochk = *(userinfo + 0x77);
+    quint8 tmp = 0;
+
+    for (int i = 0; i < 0x77; i++) {
+        tmp += userinfo[i];
+    }
+
+    if (tmp != userinfochk) {
+        qDebug() << "MSeries UserInfo block checksum failure" << path;
+    }
+
+    //const unsigned char * rxblock=(unsigned char *)block.data()+rx_offset;
+
+    unsigned char *controlblock = (unsigned char *)block.data() + control_offset;
+    quint16 count = controlblock[0] << 8 | controlblock[1]; // number of control blocks
+
+    if (controlblock[1] != controlblock[2]) {
+        qDebug() << "Control block count does not match." << path;
+    }
+
+    QList<quint16> head, tail;
+    controlblock += 3;
+    quint16 datastarts, dataends, tmp16, h16, t16;
+
+    if (controlblock[0]) {
+        datastarts = controlblock[1] | (controlblock[2] << 8);
+        dataends = controlblock[3] | (controlblock[4] << 8);
+    }
+
+    controlblock += 6;
+
+    if (controlblock[0]) {
+        if ((controlblock[1] | (controlblock[2] << 8)) != datastarts) {
+            qDebug() << "Non matching card size start identifier" << path;
+        }
+
+        if ((controlblock[3] | (controlblock[4] << 8)) != dataends) {
+            qDebug() << "Non matching card size end identifier" << path;
+        }
+    }
+
+    controlblock += 6;
+    count -= 2;
+
+    tmp16 = controlblock[0] | controlblock[1] << 8;
+
+    controlblock += 2;
+
+    for (int i = 0; i < count / 2; i++) {
+        if (controlblock[0]) {
+            h16 = controlblock[1] | (controlblock[2] << 8);
+            t16 = controlblock[3] | (controlblock[4] << 8);
+            head.push_back(h16);
+            tail.push_back(t16);
+        }
+
+        controlblock += 6;
+
+        if (controlblock[0]) {
+            if ((controlblock[1] | (controlblock[2] << 8)) != h16) {
+                qDebug() << "Non matching control block head value" << path;
+            }
+
+            if ((controlblock[3] | (controlblock[4] << 8)) != t16) {
+                qDebug() << "Non matching control block tail value" << path;
+            }
+        }
+
+        controlblock += 6;
+    }
+
+    unsigned char *cb = controlblock;
+    quint16 u1, u2, u3, u4, d1;
+    quint32 ts, st, lt;
+    QDateTime dt;
+    QDate date;
+    QTime time;
+
+    for (int chk = 0; chk < 7; chk++) {
+        ts = cb[0] << 24 | cb[1] << 16 | cb[2] << 8 | cb[3];
+        //ts-=epoch;
+        dt = QDateTime::fromTime_t(ts);
+        date = dt.date();
+        time = dt.time();
+        qDebug() << "New Sparse Chunk" << chk << dt << hex << ts;
+
+        cb += 4;
+        quint8 sum = 0;
+
+        for (int i = 0; i < 0x268; i++) { sum += cb[i]; }
+
+        if (cb[0x268] == sum) {
+            qDebug() << "Checksum bad for block" << chk << path;
+        }
+
+        cb += 0x26a;
+    }
+
+    unsigned char *endcard = (unsigned char *)block.data() + dataends;
+    bool done = false;
+    qint64 ti;
+    int cnt = 0;
+
+    do {
+        ts = cb[0] << 24 | cb[1] << 16 | cb[2] << 8 | cb[3];
+        lt = st = ts;
+        ti = qint64(ts) * 1000L;
+        dt = QDateTime::fromTime_t(ts);
+        date = dt.date();
+        time = dt.time();
+        qDebug() << "Details New Data Chunk" << cnt << dt << hex << ts;
+
+        cb += 4;
+
+        do {
+            if (cb[0] == 0xfe) { // not sure what this means
+                cb++;
+            }
+
+            u1 = cb[0] << 8 | cb[1]; // expecting 0xCXXX
+
+            if (u1 == 0xffff) { // adjust timestamp code
+                cb += 2;
+                u1 = cb[0];
+                cb++;
+
+                if (cb[0] == 0xfe) {
+                    u1 = cb[0] << 8 | cb[1]; // fe 0a, followed by timestamp
+                    cb += 2;
+                    break; // start on the next timestamp
+                }
+            } else {
+                if ((cb[0] & 0xc0) == 0xc0) {
+                    cb += 2;
+                    u1 &= 0x0fff; // time delta??
+                    lt = ts;
+                    ts = st + (u1 * 60);
+                    ti = qint64(ts) * 1000L;
+
+                    d1 = cb[0] << 8 | cb[1];
+                    u2 = cb[2] << 8 | cb[3];
+                    u3 = cb[4] << 8 | cb[5];
+                    u4 = cb[6] << 8 | cb[7];
+
+                    if ((d1 != 0xf302) || (u2 != 0xf097) || (u3 != 0xf2ff) || (u4 != 0xf281)) {
+                        qDebug() << "Lost details sync reading M-Series file" << path;
+                        return false;
+                    }
+
+                    cb += 8;
+                } else { cb++; }
+
+                dt = QDateTime::fromTime_t(ts);
+                qDebug() << "Details Data Chunk" << cnt++ << dt;
+
+                do {
+                    d1 = cb[0] << 8 | cb[1];
+                    cb += 2;
+
+                    if (d1 == 0x7f0a) { // end of entire block
+                        done = true;
+                        break;
+                    }
+
+                    if ((d1 & 0xb000) == 0xb000) {
+                        qDebug() << "Duration" << (d1 & 0x7ff);
+                        break; // end of section
+                    }
+
+                    // process binary data..
+                    // 64 c0
+                } while (cb < endcard);
+            }
+        } while (cb < endcard && !done);
+    } while (cb < endcard && !done);
+
+    done = false;
+    //bool first=true;
+    quint8 exch;
+    cnt = 0;
+
+    do {
+        u1 = cb[0] << 8 | cb[1];
+
+        if (u1 != 0xfe0b) {
+            done = true;
+            break;
+        }
+
+        cb += 2;
+        st = ts = cb[0] << 24 | cb[1] << 16 | cb[2] << 8 | cb[3];
+        dt = QDateTime::fromTime_t(ts);
+        date = dt.date();
+        time = dt.time();
+        //qDebug() << "Summary Data Chunk" << cnt << dt << hex << ts;
+        cb += 4;
+
+        while (cb < endcard) {
+            if (((cb[0] & 0xc0) != 0xc0) || ((cb[0] & 0xf0) == 0xf0)) {
+                // what is this for??
+                exch = cb[0];
+                cb++;
+            }
+
+            u1 = (cb[0] << 8 | cb[1]) & 0x7ff; // time delta
+
+            u2 = (cb[2] << 8 | cb[3]) & 0x7ff; // 0xBX XX??
+            ts = st + u1 * 60;
+            dt = QDateTime::fromTime_t(ts);
+            //qDebug() << "Summary Sub Chunk" << dt << u1 << u2 << hex << ts;
+            cb += 4;
+
+            if (cb[0] == 0xff) { break; }
+        }
+
+        cb++; // ff;
+
+        //        05905: "22 48 00 00 04 01 01 5C 9E 30 00 F0 00 01 73 00 00 00 F2  Sat Jul 9 2011 10:44:25"
+        //        05905: "20 58 00 00 00 00 00 32 69 88 00 70 00 01 73 00 00 00 AF  Sun Jul 10 2011 05:09:21"
+        //        05906: "22 00 00 00 0B 00 01 4E 79 F8 02 70 00 01 73 00 00 00 56  Sun Jul 10 2011 10:27:05"
+        //        05907: "21 4C 00 00 11 00 01 5C 95 F8 01 F0 00 01 73 00 00 00 54  Mon Jul 11 2011 10:59:42"
+        //        05908: "20 A8 00 00 02 00 01 4E 7D 88 00 F0 00 01 73 00 00 00 90  Tue Jul 12 2011 03:44:38"
+        //        05909: "21 94 00 00 34 01 01 6A 96 D8 01 70 00 01 73 00 00 00 FC  Tue Jul 12 2011 10:30:49"
+        //        05910: "21 84 00 00 19 01 01 6A A2 30 00 F0 00 01 73 00 00 00 3E  Wed Jul 13 2011 10:30:14"
+        //        05911: "22 38 00 00 3F 01 01 86 B2 A0 00 F1 00 01 73 00 00 00 F4  Thu Jul 14 2011 10:01:50"
+        //        05912: "21 68 00 00 36 01 01 5C 91 F8 02 70 00 01 73 00 00 00 BF  Fri Jul 15 2011 10:46:33"
+        //        05913: "22 6C 0E 00 A1 01 01 78 AB 10 00 F0 00 01 73 00 00 00 9A  Sat Jul 16 2011 10:44:56"
+
+
+        // 0x04 Vibratory Snore
+        cnt++;
+        QString a;
+
+        for (int i = 0; i < 0x13; i++) {
+            a += QString().sprintf("%02X ", cb[i]);
+        }
+
+        a += " " + date.toString() + " " + time.toString();
+        qDebug() << a;
+        cb += 0x13;
+    } while (cb < endcard && !done);
+
+    //graph data
+    //starts with timestamp.. or time delta if high bit is set.
+
+    //    validFlagOne = 3,
+    //    headPtrOne = 4,
+    //    tailPtrOne = 6,
+    //    cdbChecksumOne = 8,
+    //    validFlagTwo = 9
+    //    headPtrTwo = 10,
+    //    tailPtrTwo = 12,
+    //    cdbChecksumTwo = 14,
+
+    //    const char * datablock=block.data()+data_offset;
+    //    quint8 basicCompliance=datablock[1];
+    //    quint8 fosq=datablock[2];
+    //    quint8 smartAutoCPAPProfile=datablock[3];
+    //    quint8 smartAutoCPAPTrend=datablock[4];
+    //    quint8 ventProfile=datablock[6];
+    //    quint8 ventCompliance1=datablock[7];
+    //    quint8 sleepProfile1=datablock[8];
+    //    quint8 sleepTrend1=datablock[9];
+    //    quint8 sleepProfile2=datablock[10];
+    //    quint8 sleepTrend2=datablock[11];
+    //    quint8 ventProfile2=datablock[12];
+    //    quint8 ventCompliance2=datablock[13];
+    //    quint8 sleepProfile3=datablock[14];
+    //    quint8 sleepTrend3=datablock[15];
+
+
+    // 0xa6: 01 00 b2 7f ff 31
+    // 0xac: 01 00 b2 7f ff 31
+
+    // 0xb2: ??? block... ?
+    // 0xb2: 00 00
+
+    // 0xb4: 01 36 a3 36 a2 b2    // the last bytes of all these are 8 bit additive checksums.
+    // 0xba: 01 36 a3 36 a2 b2
+    // 0xc0: 01 00 26 00 07 2e
+    // 0xc6: 01 00 26 00 07 2e
+    // 0xcc: 01 52 5a 58 e6 eb
+    // 0xd2: 01 52 5a 58 e6 eb
+
+    // repeat 8 times
+    // 0xd8: 4e 1a 4a fe
+    // 268 bytes
+    // 1 byte checksum
+    // starting at 0xD8, with timestamp?
+    // 8 blocks of 0x26e in size
+
+    // idx 0x159 =
+
+    //    basicCompliance = 1,
+    //    fosq = 2,
+    //    sleepProfile = 8,
+    //    sleepProfile2 = 10,
+    //    sleepProfile3 = 14,
+    //    sleepTrend = 9,
+    //    sleepTrend2 = 11,
+    //    sleepTrend3 = 15,
+    //    smartAutoCPAPProfile = 3,
+    //    smartAutoCPAPTrend = 4,
+    //    ventCompliance2 = 13,
+    //    ventilatorCompliance = 7,
+    //    ventilatorProfile = 6,
+    //    ventProfile2 = 12
+
+    //    Invalid = 0xff,
+    //    startChar = 0xfe,
+    //    stopChar = 0x7f
+
+
+    //Machine *mach=CreateMachine(serial,profile);
+
+
+    // 0xcount till next block (between f3 02... blocks)
+    // 0xc0 00 // varies
+    // 0xf3 02 f0 97 f2 ff f2 81
+
+    return 1;
+}
+
+
+bool mseries_initialized = false;
+void MSeriesLoader::Register()
+{
+    if (mseries_initialized) { return; }
+
+    qDebug() << "Registering RemStar M-Series Loader";
+    RegisterLoader(new MSeriesLoader());
+    //InitModelMap();
+    mseries_initialized = true;
+}
diff --git a/sleepyhead/SleepLib/loader_plugins/mseries_loader.h b/sleepyhead/SleepLib/loader_plugins/mseries_loader.h
new file mode 100644
index 0000000..905bd77
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/mseries_loader.h
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * SleepLib RemStar M-Series Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef MSERIES_LOADER_H
+#define MSERIES_LOADER_H
+
+#include "SleepLib/machine.h"
+#include "SleepLib/machine_loader.h"
+#include "SleepLib/profiles.h"
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the following value when making changes to this loaders implementation.
+//
+const int mseries_data_version = 2;
+//
+//********************************************************************************************
+
+/*! \class MSeries
+    \brief RemStar M-Series customized machine object
+    */
+class MSeries: public CPAP
+{
+  public:
+    MSeries(MachineID id = 0);
+    virtual ~MSeries();
+};
+
+
+const int mseries_load_buffer_size = 1024 * 1024;
+
+
+const QString mseries_class_name = STR_MACH_MSeries;
+
+class MSeriesLoader : public MachineLoader
+{
+  public:
+    MSeriesLoader();
+    virtual ~MSeriesLoader();
+
+    //! \brief Detect if the given path contains a valid Folder structure
+    virtual bool Detect(const QString & path) { Q_UNUSED(path); return false; }
+
+    //! \brief Opens M-Series block device
+    virtual int Open(QString file);
+
+    //! \brief Returns the database version of this loader
+    virtual int Version() { return mseries_data_version; }
+
+    //! \brief Return the loaderName, in this case "MSeries"
+    virtual const QString &loaderName() { return mseries_class_name; }
+
+    //! \brief Create a new PRS1 machine record, indexed by Serial number.
+   // Machine *CreateMachine(QString serial);
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_CPAP, 0, mseries_class_name, QObject::tr("Respironics"), QString(), QString(), QString(), QObject::tr("M-Series"), QDateTime::currentDateTime(), mseries_data_version);
+    }
+
+    //! \brief Register this Module to the list of Loaders, so it knows to search for PRS1 data.
+    static void Register();
+  protected:
+    QHash<QString, Machine *> MachList;
+    quint32 epoch;
+};
+
+#endif // MSERIES_LOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp b/sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp
new file mode 100644
index 0000000..736a6ee
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/prs1_loader.cpp
@@ -0,0 +1,2725 @@
+/* SleepLib PRS1 Loader Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QApplication>
+#include <QString>
+#include <QDateTime>
+#include <QDir>
+#include <QFile>
+#include <QDataStream>
+#include <QMessageBox>
+#include <QProgressBar>
+#include <QDebug>
+#include <cmath>
+#include "SleepLib/schema.h"
+#include "prs1_loader.h"
+#include "SleepLib/session.h"
+#include "SleepLib/calcs.h"
+
+
+//const int PRS1_MAGIC_NUMBER = 2;
+//const int PRS1_SUMMARY_FILE=1;
+//const int PRS1_EVENT_FILE=2;
+//const int PRS1_WAVEFORM_FILE=5;
+
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the prs1_data_version in prs1_loader.h when making changes to this loader
+// that change loader behaviour or modify channels.
+//********************************************************************************************
+
+
+extern QProgressBar *qprogress;
+
+QHash<int, QString> ModelMap;
+
+#define PRS1_CRC_CHECK
+
+#ifdef PRS1_CRC_CHECK
+typedef quint16 crc_t;
+
+static const crc_t crc_table[256] = {
+    0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+    0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+    0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+    0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+    0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+    0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+    0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+    0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+    0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+    0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+    0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+    0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+    0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+    0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+    0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+    0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+    0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+    0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+    0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+    0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+    0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+    0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+    0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+    0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+    0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+    0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+    0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+    0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+    0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+    0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+    0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+    0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+};
+
+crc_t CRC16(const unsigned char *data, size_t data_len)
+{
+    crc_t crc = 0;
+    unsigned int tbl_idx;
+
+    while (data_len--) {
+        tbl_idx = (crc ^ *data) & 0xff;
+        crc = (crc_table[tbl_idx] ^ (crc >> 8)) & 0xffff;
+
+        data++;
+    }
+
+    return crc & 0xffff;
+}
+#endif
+
+enum FlexMode { FLEX_None, FLEX_CFlex, FLEX_CFlexPlus, FLEX_AFlex, FLEX_RiseTime, FLEX_BiFlex, FLEX_Unknown  };
+
+ChannelID PRS1_TimedBreath = 0, PRS1_HeatedTubing = 0;
+
+PRS1::PRS1(MachineID id): CPAP(id)
+{
+}
+PRS1::~PRS1()
+{
+
+}
+
+
+/*! \struct WaveHeaderList
+    \brief Used in PRS1 Waveform Parsing */
+struct WaveHeaderList {
+    quint16 interleave;
+    quint8  sample_format;
+    WaveHeaderList(quint16 i, quint8 f) { interleave = i; sample_format = f; }
+};
+
+
+PRS1Loader::PRS1Loader()
+{
+    const QString PRS1_ICON = ":/icons/prs1.png";
+    const QString PRS1_60_ICON = ":/icons/prs1_60s.png";
+
+    QString s = newInfo().series;
+    m_pixmap_paths["System One"] = PRS1_ICON;
+    m_pixmaps["System One"] = QPixmap(PRS1_ICON);
+    m_pixmap_paths["System One (60 Series)"] = PRS1_60_ICON;
+    m_pixmaps["System One (60 Series)"] = QPixmap(PRS1_60_ICON);
+
+    //genCRCTable();  // find what I did with this..
+    m_type = MT_CPAP;
+}
+
+PRS1Loader::~PRS1Loader()
+{
+}
+
+bool isdigit(QChar c)
+{
+    if ((c >= '0') && (c <= '9')) { return true; }
+
+    return false;
+}
+
+const QString PR_STR_PSeries = "P-Series";
+
+
+// Tests path to see if it has (what looks like) a valid PRS1 folder structure
+bool PRS1Loader::Detect(const QString & path)
+{
+    QString newpath = checkDir(path);
+
+    return !newpath.isEmpty();
+}
+
+
+QString PRS1Loader::checkDir(const QString & path)
+{
+    QString newpath = path;
+
+    newpath.replace("\\", "/");
+
+    if (!newpath.endsWith("/" + PR_STR_PSeries)) {
+        newpath = path + "/" + PR_STR_PSeries;
+    }
+
+    QDir dir(newpath);
+
+    if ((!dir.exists() || !dir.isReadable())) {
+        return QString();
+    }
+    qDebug() << "PRS1Loader::Detect path=" << newpath;
+
+    QFile lastfile(newpath+"/last.txt");
+
+    bool exists = true;
+    if (!lastfile.exists()) {
+        lastfile.setFileName(newpath+"/LAST.TXT");
+        if (!lastfile.exists())
+            exists = false;
+    }
+
+    QString machpath;
+    if (exists) {
+        if (!lastfile.open(QIODevice::ReadOnly)) {
+            qDebug() << "PRS1Loader: last.txt exists but I couldn't open it!";
+        } else {
+            QTextStream ts(&lastfile);
+            QString serial = ts.readLine(64).trimmed();
+            lastfile.close();
+
+            machpath = newpath+"/"+serial;
+
+            if (!QDir(machpath).exists()) {
+                machpath = QString();
+            }
+        }
+    }
+
+    if (machpath.isEmpty()) {
+        QDir dir(newpath);
+        QStringList dirs = dir.entryList(QDir::NoDotAndDotDot | QDir::Dirs);
+        if (dirs.size() > 0) {
+            machpath = dirs[0];
+        }
+    }
+
+
+    return machpath;
+}
+
+void parseModel(MachineInfo & info, QString modelnum)
+{
+    info.modelnumber = modelnum;
+    if (!modelnum.endsWith("P")) {
+        qDebug() << "Weird PRS1 Model number" << modelnum;
+    }
+    modelnum.chop(1);
+    int country = modelnum[modelnum.length() - 1].digitValue();
+    modelnum.chop(1);
+    int ser = modelnum[modelnum.length() - 1].digitValue();
+    modelnum.chop(1);
+    bool ok;
+    int typ = modelnum.toInt(&ok);
+
+    switch (typ) {
+    case 4: // cpap
+        info.model = QObject::tr("RemStar Plus with C-Flex+");
+        break;
+    case 5: // apap
+        info.model = QObject::tr("RemStar Auto with A-Flex");
+        break;
+    case 6: // bipap
+        info.model = QObject::tr("RemStar BiPAP Pro with Bi-Flex");
+        break;
+    case 7: // bipap auto
+        info.model = QObject::tr("RemStar BiPAP Auto with Bi-Flex");
+        break;
+    case 9: // asv
+        info.model = QObject::tr("BiPAP autoSV Advanced");
+        break;
+    case 10: // Avaps
+        info.model = QObject::tr("BiPAP AVAPS");
+        break;
+    default:
+        info.model = QObject::tr("Unknown Model");
+    }
+
+    switch (ser) {
+    case 5:
+        info.series = QObject::tr("System One");
+        break;
+    case 6:
+        info.series = QObject::tr("System One (60 Series)");
+        break;
+    default:
+        info.series = QObject::tr("unknown");
+        break;
+
+    }
+    switch (country) {
+    case '0':
+        break;
+    case '1':
+        break;
+    default:
+        break;
+    }
+}
+
+bool PRS1Loader::PeekProperties(MachineInfo & info, QString filename, Machine * mach)
+{
+    QFile f(filename);
+    if (!f.open(QFile::ReadOnly)) {
+        return false;
+    }
+    QTextStream in(&f);
+    do {
+        QString line = in.readLine();
+        QStringList pair = line.split("=");
+
+        bool skip = false;
+
+        if (pair[0].contains("ModelNumber", Qt::CaseInsensitive)) {
+            QString modelnum = pair[1];
+            parseModel(info, modelnum);
+            skip = true;
+        }
+        if (pair[0].contains("SerialNumber", Qt::CaseInsensitive)) {
+            info.serial = pair[1];
+            skip = true;
+        }
+        if (!mach || skip) continue;
+
+        mach->properties[pair[0]] = pair[1];
+
+    } while (!in.atEnd());
+    return true;
+}
+
+
+MachineInfo PRS1Loader::PeekInfo(const QString & path)
+{
+    QString newpath = checkDir(path);
+    if (newpath.isEmpty())
+        return MachineInfo();
+
+    MachineInfo info = newInfo();
+    info.serial = newpath.section("/", -1);
+
+    PeekProperties(info, newpath+"/properties.txt");
+    return info;
+}
+
+
+int PRS1Loader::Open(QString path)
+{
+    QString newpath;
+    path = path.replace("\\", "/");
+
+    if (path.endsWith("/" + PR_STR_PSeries)) {
+        newpath = path;
+    } else {
+        newpath = path + "/" + PR_STR_PSeries;
+    }
+
+    qDebug() << "PRS1Loader::Open path=" << newpath;
+
+    QDir dir(newpath);
+
+    if ((!dir.exists() || !dir.isReadable())) {
+        return -1;
+    }
+
+    dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+    dir.setSorting(QDir::Name);
+    QFileInfoList flist = dir.entryInfoList();
+
+    QStringList SerialNumbers;
+    QStringList::iterator sn;
+
+    for (int i = 0; i < flist.size(); i++) {
+        QFileInfo fi = flist.at(i);
+        QString filename = fi.fileName();
+
+        if (fi.isDir() && (filename.size() > 4) && (isdigit(filename[1])) && (isdigit(filename[2]))) {
+            SerialNumbers.push_back(filename);
+        } else if (filename.toLower() == "last.txt") { // last.txt points to the current serial number
+            QString file = fi.canonicalFilePath();
+            QFile f(file);
+
+            if (!fi.isReadable()) {
+                qDebug() << "PRS1Loader: last.txt exists but I couldn't read it!";
+                continue;
+            }
+
+            if (!f.open(QIODevice::ReadOnly)) {
+                qDebug() << "PRS1Loader: last.txt exists but I couldn't open it!";
+                continue;
+            }
+
+            last = f.readLine(64);
+            last = last.trimmed();
+            f.close();
+        }
+    }
+
+    if (SerialNumbers.empty()) { return -1; }
+
+    int c = 0;
+
+    for (sn = SerialNumbers.begin(); sn != SerialNumbers.end(); sn++) {
+        if ((*sn)[0].isLetter()) {
+            c += OpenMachine(newpath + "/" + *sn);
+        }
+    }
+    for (sn = SerialNumbers.begin(); sn != SerialNumbers.end(); sn++) {
+        if (!(*sn)[0].isLetter()) {
+            c += OpenMachine(newpath + "/" + *sn);
+        }
+    }
+
+    return c;
+}
+
+/*bool PRS1Loader::ParseProperties(Machine *m, QString filename)
+{
+    QFile f(filename);
+
+    if (!f.open(QIODevice::ReadOnly)) {
+        return false;
+    }
+
+    QString line;
+    QHash<QString, QString> prop;
+
+    QString s = f.readLine();
+    QChar sep = '=';
+    QString key, value;
+
+    MachineInfo info = newInfo();
+    bool ok;
+
+    while (!f.atEnd()) {
+        key = s.section(sep, 0, 0);
+
+        if (key == s) { continue; }
+
+        value = s.section(sep, 1).trimmed();
+
+        if (value == s) { continue; }
+
+        if (key.contains("serialnumber",Qt::CaseInsensitive)) {
+            info.serial = value;
+        } else if (key.contains("modelnumber",Qt::CaseInsensitive)) {
+            parseModel(info, value);
+        } else {
+            if (key.contains("producttype", Qt::CaseInsensitive)) {
+                int i = value.toInt(&ok, 16);
+
+                if (ok) {
+                    if (ModelMap.find(i) != ModelMap.end()) {
+                        info.model = ModelMap[i];
+                    }
+                }
+            }
+            prop[key] = value;
+        }
+        s = f.readLine();
+    }
+
+    if (info.serial != m->serial()) {
+        qDebug() << "Serial Number in PRS1 properties.txt doesn't match machine record";
+    }
+    m->setInfo(info);
+
+    for (QHash<QString, QString>::iterator i = prop.begin(); i != prop.end(); i++) {
+        m->properties[i.key()] = i.value();
+    }
+
+    f.close();
+    return true;
+}*/
+
+int PRS1Loader::OpenMachine(QString path)
+{
+    Q_ASSERT(p_profile != nullptr);
+
+    qDebug() << "Opening PRS1 " << path;
+    QDir dir(path);
+
+    if (!dir.exists() || (!dir.isReadable())) {
+        return 0;
+    }
+
+    dir.setFilter(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+    dir.setSorting(QDir::Name);
+    QFileInfoList flist = dir.entryInfoList();
+
+    QString filename;
+
+    if (qprogress) { qprogress->setValue(0); }
+
+    QStringList paths;
+
+    int sessionid_base = 10;
+
+    QString propertyfile;
+
+    for (int i = 0; i < flist.size(); i++) {
+        QFileInfo fi = flist.at(i);
+        filename = fi.fileName();
+
+        if (fi.isDir()) {
+            if ((filename[0].toLower() == 'p') && (isdigit(filename[1]))) {
+                // p0, p1, p2.. etc.. folders contain the session data
+                paths.push_back(fi.canonicalFilePath());
+            } else if (filename.toLower() == "e") {
+                // Error files..
+                // Reminder: I have been given some info about these. should check it over.
+            }
+        } else if (filename.compare("properties.txt",Qt::CaseInsensitive) == 0) {
+            propertyfile = fi.canonicalFilePath();
+        } else if (filename.compare("PROP.TXT",Qt::CaseInsensitive) == 0) {
+            sessionid_base = 16;
+            propertyfile = fi.canonicalFilePath();
+        }
+    }
+
+    MachineInfo info = newInfo();
+    // Have a peek first to get the serial number.
+    PeekProperties(info, propertyfile);
+
+    QString modelstr = info.modelnumber;
+
+    if (modelstr.endsWith("P"))
+        modelstr.chop(1);
+
+    bool ok;
+    int model = modelstr.toInt(&ok);
+    if (ok) {
+        int series = ((model / 10) % 10);
+        int type = (model / 100);
+
+        // Assumption is made here all PRS1 machines less than 450P are not data capable.. this could be wrong one day.
+        if ((type < 4) && p_profile->cpap->brickWarning()) {
+            QApplication::processEvents();
+            QMessageBox::information(QApplication::activeWindow(),
+                                     QObject::tr("Non Data Capable Machine"),
+                                     QString(QObject::tr("Your Philips Respironics CPAP machine (Model %1) is unfortunately not a data capable model.")+"\n\n"+
+                                             QObject::tr("I'm sorry to report that SleepyHead can only track hours of use and very basic settings for this machine.")).
+                                     arg(info.modelnumber),QMessageBox::Ok);
+            p_profile->cpap->setBrickWarning(false);
+
+        }
+
+        // A bit of protection against future annoyances..
+        if (((series != 5) && (series != 6)) || (type >= 10)) {
+            QMessageBox::information(QApplication::activeWindow(),
+                                     QObject::tr("Machine Unsupported"),
+                                     QObject::tr("Sorry, your Philips Respironics CPAP machine (Model %1) is not supported yet.").arg(info.modelnumber) +"\n\n"+
+                                     QObject::tr("JediMark needs a .zip copy of this machines' SD card and matching Encore .pdf reports to make it work with SleepyHead.")
+                                     ,QMessageBox::Ok);
+
+            return -1;
+        }
+    } else {
+        // model number didn't parse.. Meh... Silently ignore it
+//        QMessageBox::information(QApplication::activeWindow(),
+//                                 QObject::tr("Machine Unsupported"),
+//                                 QObject::tr("SleepyHead could not parse the model number, this machine can not be imported..") +"\n\n"+
+//                                 QObject::tr("JediMark needs a .zip copy of this machines' SD card and matching Encore .pdf reports to make it work with SleepyHead.")
+//                                ,QMessageBox::Ok);
+        return -1;
+    }
+
+
+    // Which is needed to get the right machine record..
+    Machine *m = CreateMachine(info);
+
+    // This time supply the machine object so it can populate machine properties..
+    PeekProperties(m->info, propertyfile, m);
+
+    QString backupPath = m->getBackupPath() + path.section("/", -2);
+
+    if (QDir::cleanPath(path).compare(QDir::cleanPath(backupPath)) != 0) {
+        copyPath(path, backupPath);
+    }
+
+
+    SessionID sid;
+    long ext;
+
+    int size = paths.size();
+
+    sesstasks.clear();
+    new_sessions.clear(); // this hash is used by OpenFile
+
+
+    PRS1Import * task = nullptr;
+    // Note, I have observed p0/p1/etc folders containing duplicates session files (in Robin Sanders data.)
+
+    // for each p0/p1/p2/etc... folder
+    for (int p=0; p < size; ++p) {
+        dir.setPath(paths.at(p));
+
+        if (!dir.exists() || !dir.isReadable()) { continue; }
+
+        flist = dir.entryInfoList();
+
+        // Scan for individual session files
+        for (int i = 0; i < flist.size(); i++) {
+            QFileInfo fi = flist.at(i);
+
+            QString ext_s = fi.fileName().section(".", -1);
+            ext = ext_s.toInt(&ok);
+            if (!ok) {
+                // not a numerical extension
+                continue;
+            }
+
+            QString session_s = fi.fileName().section(".", 0, -2);
+            sid = session_s.toInt(&ok, sessionid_base);
+            if (!ok) {
+                // not a numerical session ID
+                continue;
+            }
+
+            if (m->SessionExists(sid)) {
+                // Skip already imported session
+                continue;
+            }
+
+            if ((ext == 5) || (ext == 6)) {
+                // Waveform files aren't grouped... so we just want to add the filename for later
+                QHash<SessionID, PRS1Import *>::iterator it = sesstasks.find(sid);
+                if (it != sesstasks.end()) {
+                    task = it.value();
+                } else {
+                    // Should probably check if session already imported has this data missing..
+
+                    // Create the group if we see it first..
+                    task = new PRS1Import(this, sid, m);
+                    sesstasks[sid] = task;
+                    queTask(task);
+                }
+
+                if (ext == 5) {
+                    if (!task->wavefile.isEmpty()) continue;
+                    task->wavefile = fi.canonicalFilePath();
+                } else if (ext == 6) {
+                    if (!task->oxifile.isEmpty()) continue;
+                    task->oxifile = fi.canonicalFilePath();
+                }
+
+                continue;
+            }
+
+            // Parse the data chunks and read the files..
+            QList<PRS1DataChunk *> Chunks = ParseFile(fi.canonicalFilePath());
+
+            for (int i=0; i < Chunks.size(); ++i) {
+                PRS1DataChunk * chunk = Chunks.at(i);
+
+                if (ext <= 1) {
+                    const unsigned char * data = (unsigned char *)chunk->m_data.constData();
+
+                    if (data[0x00] != 0) {
+                        delete chunk;
+                        continue;
+                    }
+                }
+
+                SessionID chunk_sid = chunk->sessionid;
+                if (m->SessionExists(sid)) {
+                    delete chunk;
+                    continue;
+                }
+
+
+                task = nullptr;
+                QHash<SessionID, PRS1Import *>::iterator it = sesstasks.find(chunk_sid);
+                if (it != sesstasks.end()) {
+                    task = it.value();
+                } else {
+                    task = new PRS1Import(this, chunk_sid, m);
+                    sesstasks[chunk_sid] = task;
+                    // save a loop an que this now
+                    queTask(task);
+                }
+                switch (ext) {
+                case 0:
+                    if (task->compliance) continue;
+                    task->compliance = chunk;
+                    break;
+                case 1:
+                    if (task->summary) continue;
+                    task->summary = chunk;
+                    break;
+                case 2:
+                    if (task->event) continue;
+                    task->event = chunk;
+                    break;
+                default:
+                    break;
+                }
+            }
+        }
+    }
+
+
+    int tasks = countTasks();
+    runTasks(p_profile->session->multithreading());
+    finishAddingSessions();
+
+    return m->unsupported() ? -1 : tasks;
+}
+
+bool PRS1Import::ParseF5Events()
+{
+    ChannelID Codes[] = {
+        PRS1_00, PRS1_01, CPAP_Pressure, CPAP_EPAP, CPAP_PressurePulse, CPAP_Obstructive,
+        CPAP_ClearAirway, CPAP_Hypopnea, PRS1_08,  CPAP_FlowLimit, PRS1_0A, CPAP_CSR,
+        PRS1_0C, CPAP_VSnore, PRS1_0E, PRS1_0F,
+        CPAP_LargeLeak, // Large leak apparently
+        CPAP_LeakTotal, PRS1_12
+    };
+
+    int ncodes = sizeof(Codes) / sizeof(ChannelID);
+    EventList *Code[0x20] = {nullptr};
+
+    EventList *OA = session->AddEventList(CPAP_Obstructive, EVL_Event);
+    EventList *HY = session->AddEventList(CPAP_Hypopnea, EVL_Event);
+    EventList *CSR = session->AddEventList(CPAP_CSR, EVL_Event);
+    EventList *LEAK = session->AddEventList(CPAP_LeakTotal, EVL_Event);
+    EventList *LL = session->AddEventList(CPAP_LargeLeak, EVL_Event);
+    EventList *SNORE = session->AddEventList(CPAP_Snore, EVL_Event);
+    EventList *IPAP = session->AddEventList(CPAP_IPAP, EVL_Event, 0.1F);
+    EventList *EPAP = session->AddEventList(CPAP_EPAP, EVL_Event, 0.1F);
+    EventList *PS = session->AddEventList(CPAP_PS, EVL_Event, 0.1F);
+    EventList *IPAPLo = session->AddEventList(CPAP_IPAPLo, EVL_Event, 0.1F);
+    EventList *IPAPHi = session->AddEventList(CPAP_IPAPHi, EVL_Event, 0.1F);
+    EventList *RR = session->AddEventList(CPAP_RespRate, EVL_Event);
+    EventList *PTB = session->AddEventList(CPAP_PTB, EVL_Event);
+    EventList *TB = session->AddEventList(PRS1_TimedBreath, EVL_Event);
+
+    EventList *MV = session->AddEventList(CPAP_MinuteVent, EVL_Event);
+    EventList *TV = session->AddEventList(CPAP_TidalVolume, EVL_Event, 10.0F);
+
+
+    EventList *CA = session->AddEventList(CPAP_ClearAirway, EVL_Event);
+    EventList *FL = session->AddEventList(CPAP_FlowLimit, EVL_Event);
+    EventList *VS = session->AddEventList(CPAP_VSnore, EVL_Event);
+  //  EventList *VS2 = session->AddEventList(CPAP_VSnore2, EVL_Event);
+
+    //EventList * PRESSURE=nullptr;
+    //EventList * PP=nullptr;
+
+    EventDataType data[10];//,tmp;
+
+
+    //qint64 start=timestamp;
+    qint64 t = qint64(event->timestamp) * 1000L;
+    session->updateFirst(t);
+    qint64 tt;
+    int pos = 0;
+    int cnt = 0;
+    short delta;//,duration;
+    QDateTime d;
+    bool badcode = false;
+    unsigned char lastcode3 = 0, lastcode2 = 0, lastcode = 0, code = 0;
+    int lastpos = 0, startpos = 0, lastpos2 = 0, lastpos3 = 0;
+
+    int size = event->m_data.size();
+    unsigned char * buffer = (unsigned char *)event->m_data.data();
+
+    while (pos < size) {
+        lastcode3 = lastcode2;
+        lastcode2 = lastcode;
+        lastcode = code;
+        lastpos3 = lastpos2;
+        lastpos2 = lastpos;
+        lastpos = startpos;
+        startpos = pos;
+        code = buffer[pos++];
+
+        if (code >= ncodes) {
+            qDebug() << "Illegal PRS1 code " << hex << int(code) << " appeared at " << hex << startpos;
+            qDebug() << "1: (" << int(lastcode) << hex << lastpos << ")";
+            qDebug() << "2: (" << int(lastcode2) << hex << lastpos2 << ")";
+            qDebug() << "3: (" << int(lastcode3) << hex << lastpos3 << ")";
+            return false;
+        }
+
+        if (code == 0) {
+        } else if (code != 0x12) {
+            delta = buffer[pos];
+            //duration=buffer[pos+1];
+            //delta=buffer[pos+1] << 8 | buffer[pos];
+            pos += 2;
+            t += qint64(delta) * 1000L;
+        }
+
+        ChannelID cpapcode = Codes[(int)code];
+        //EventDataType PS;
+        tt = t;
+        cnt++;
+        int fc = 0;
+
+        switch (code) {
+        case 0x00: // Unknown (ASV Pressure value)
+            // offset?
+            data[0] = buffer[pos++];
+            fc++;
+
+            if (!buffer[pos - 1]) { // WTH???
+                data[1] = buffer[pos++];
+                fc++;
+            }
+
+            if (!buffer[pos - 1]) {
+                data[2] = buffer[pos++];
+                fc++;
+            }
+
+            break;
+
+        case 0x01: // Unknown
+            if (!Code[1]) {
+                if (!(Code[1] = session->AddEventList(cpapcode, EVL_Event, 0.1F))) { return false; }
+            }
+
+            Code[1]->AddEvent(t, 0);
+            break;
+
+        case 0x02: // Pressure ???
+            data[0] = buffer[pos++];
+            //            if (!Code[2]) {
+            //                if (!(Code[2]=session->AddEventList(cpapcode,EVL_Event,0.1))) return false;
+            //            }
+            //            Code[2]->AddEvent(t,data[0]);
+            break;
+
+        case 0x04: // Pressure Pulse??
+            data[0] = buffer[pos++];
+
+//            if (!Code[3]) {
+//                if (!(Code[3] = session->AddEventList(cpapcode, EVL_Event))) { return false; }
+//            }
+
+            TB->AddEvent(t, data[0]);
+            break;
+
+        case 0x05:
+            //code=CPAP_Obstructive;
+            data[0] = buffer[pos++];
+            tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
+            OA->AddEvent(tt, data[0]);
+            break;
+
+        case 0x06:
+            //code=CPAP_ClearAirway;
+            data[0] = buffer[pos++];
+            tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
+
+            CA->AddEvent(tt, data[0]);
+            break;
+
+        case 0x07:
+            //code=CPAP_Hypopnea;
+            data[0] = buffer[pos++];
+            tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
+            HY->AddEvent(tt, data[0]);
+            break;
+
+        case 0x08: // ???
+            data[0] = buffer[pos++];
+            tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
+            qDebug() << "Code 8 found at " << hex << pos - 1 << " " << tt;
+
+            if (!Code[10]) {
+                if (!(Code[10] = session->AddEventList(cpapcode, EVL_Event))) { return false; }
+            }
+
+            //????
+            //data[1]=buffer[pos++]; // ???
+            Code[10]->AddEvent(tt, data[0]);
+            pos++;
+            break;
+
+        case 0x09: // ASV Codes
+            //code=CPAP_FlowLimit;
+            data[0] = buffer[pos++];
+            tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
+
+            FL->AddEvent(tt, data[0]);
+
+            break;
+
+        case 0x0a:
+            data[0] = buffer[pos++];
+            tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
+
+            if (!Code[7]) {
+                if (!(Code[7] = session->AddEventList(cpapcode, EVL_Event))) { return false; }
+            }
+
+            Code[7]->AddEvent(tt, data[0]);
+            break;
+
+
+        case 0x0b: // Cheyne Stokes
+            data[0] = ((unsigned char *)buffer)[pos + 1] << 8 | ((unsigned char *)buffer)[pos];
+            //data[0]*=2;
+            pos += 2;
+            data[1] = ((unsigned char *)buffer)[pos]; //|buffer[pos+1] << 8
+            pos += 1;
+            //tt-=delta;
+            tt -= qint64(data[1]) * 1000L;
+
+            if (!CSR) {
+                if (!(CSR = session->AddEventList(cpapcode, EVL_Event))) {
+                    qDebug() << "!CSR addeventlist exit";
+                    return false;
+                }
+            }
+
+            CSR->AddEvent(tt, data[0]);
+            break;
+
+        case 0x0c:
+            data[0] = buffer[pos++];
+            tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
+            qDebug() << "Code 12 found at " << hex << pos - 1 << " " << tt;
+
+            if (!Code[8]) {
+                if (!(Code[8] = session->AddEventList(cpapcode, EVL_Event))) { return false; }
+            }
+
+            Code[8]->AddEvent(tt, data[0]);
+            pos += 2;
+            break;
+
+        case 0x0d: // All the other ASV graph stuff.
+            IPAP->AddEvent(t, data[0] = buffer[pos++]); // 00=IAP
+            data[4] = buffer[pos++];
+            IPAPLo->AddEvent(t, data[4]);               // 01=IAP Low
+            data[5] = buffer[pos++];
+            IPAPHi->AddEvent(t, data[5]);               // 02=IAP High
+            LEAK->AddEvent(t, buffer[pos++]);           // 03=LEAK
+            RR->AddEvent(t, buffer[pos++]);             // 04=Breaths Per Minute
+            PTB->AddEvent(t, buffer[pos++]);            // 05=Patient Triggered Breaths
+            MV->AddEvent(t, buffer[pos++]);             // 06=Minute Ventilation
+            //tmp=buffer[pos++] * 10.0;
+            TV->AddEvent(t, buffer[pos++]);             // 07=Tidal Volume
+            SNORE->AddEvent(t, data[2] = buffer[pos++]); // 08=Snore
+
+            if (data[2] > 0) {
+                if (!VS) {
+                    if (!(VS = session->AddEventList(CPAP_VSnore, EVL_Event))) {
+                        qDebug() << "!VS eventlist exit";
+                        return false;
+                    }
+                }
+
+                VS->AddEvent(t, 0); //data[2]); // VSnore
+            }
+
+            EPAP->AddEvent(t, data[1] = buffer[pos++]); // 09=EPAP
+            data[2] = data[0] - data[1];
+            PS->AddEvent(t, data[2]);           // Pressure Support
+            if (event->familyVersion >= 1) {
+                data[0] = buffer[pos++];
+
+            }
+            break;
+
+        case 0x03: // BIPAP Pressure
+            qDebug() << "0x03 Observed in ASV data!!????";
+
+            data[0] = buffer[pos++];
+            data[1] = buffer[pos++];
+            //            data[0]/=10.0;
+            //            data[1]/=10.0;
+            //            session->AddEvent(new Event(t,CPAP_EAP, 0, data, 1));
+            //            session->AddEvent(new Event(t,CPAP_IAP, 0, &data[1], 1));
+            break;
+
+        case 0x11: // Not Leak Rate
+            qDebug() << "0x11 Observed in ASV data!!????";
+            //if (!Code[24]) {
+            //   Code[24]=new EventList(cpapcode,EVL_Event);
+            //}
+            //Code[24]->AddEvent(t,buffer[pos++]);
+            break;
+
+        case 0x0e: // Unknown
+            qDebug() << "0x0E Observed in ASV data!!????";
+            data[0] = buffer[pos++]; // << 8) | buffer[pos];
+            //session->AddEvent(new Event(t,cpapcode, 0, data, 1));
+            break;
+
+        case 0x10: // Unknown
+            data[0] = buffer[pos + 1] << 8 | buffer[pos];
+            pos += 2;
+            data[1] = buffer[pos++];
+
+            tt = t - qint64(data[1]) * 1000L;
+            LL->AddEvent(tt, data[0]);
+
+//            qDebug() << "0x10 Observed in ASV data!!????";
+//            data[0] = buffer[pos++]; // << 8) | buffer[pos];
+//            data[1] = buffer[pos++];
+//            data[2] = buffer[pos++];
+            //session->AddEvent(new Event(t,cpapcode, 0, data, 3));
+            break;
+
+        case 0x0f:
+            qDebug() << "0x0f Observed in ASV data!!????";
+
+            data[0] = buffer[pos + 1] << 8 | buffer[pos];
+            pos += 2;
+            data[1] = buffer[pos]; //|buffer[pos+1] << 8
+            pos += 1;
+            tt -= qint64(data[1]) * 1000L;
+            //session->AddEvent(new Event(tt,cpapcode, 0, data, 2));
+            break;
+
+        case 0x12: // Summary
+            qDebug() << "0x12 Observed in ASV data!!????";
+            data[0] = buffer[pos++];
+            data[1] = buffer[pos++];
+            data[2] = buffer[pos + 1] << 8 | buffer[pos];
+            pos += 2;
+            //session->AddEvent(new Event(t,cpapcode, 0, data,3));
+            break;
+
+        default:  // ERROR!!!
+            qWarning() << "Some new fandangled PRS1 code detected " << hex << int(code) << " at " << pos - 1;
+            badcode = true;
+            break;
+        }
+
+        if (badcode) {
+            break;
+        }
+    }
+
+    session->updateLast(t);
+    session->m_cnt.clear();
+    session->m_cph.clear();
+    session->settings[CPAP_IPAPLo] = session->Min(CPAP_IPAPLo);
+    session->settings[CPAP_IPAPHi] = session->Max(CPAP_IPAPHi);
+    session->settings[CPAP_PSMax] = session->Max(CPAP_IPAPHi) - session->Min(CPAP_EPAP);
+    session->settings[CPAP_PSMin] = session->Min(CPAP_IPAPLo) - session->Min(CPAP_EPAP);
+
+    session->m_valuesummary[CPAP_Pressure].clear();
+    session->m_valuesummary.erase(session->m_valuesummary.find(CPAP_Pressure));
+
+    return true;
+
+}
+
+bool PRS1Import::ParseF0Events()
+{
+    unsigned char code=0;
+    EventList *Code[0x20] = {0};
+    EventDataType data[10];
+    int cnt = 0;
+    short delta;
+    int tdata;
+    int pos;
+    qint64 t = qint64(event->timestamp) * 1000L, tt;
+
+    session->updateFirst(t);
+
+    EventList *OA = session->AddEventList(CPAP_Obstructive, EVL_Event);
+    EventList *HY = session->AddEventList(CPAP_Hypopnea, EVL_Event);
+    EventList *CSR = session->AddEventList(CPAP_CSR, EVL_Event);
+    EventList *LEAK = session->AddEventList(CPAP_LeakTotal, EVL_Event);
+    EventList *SNORE = session->AddEventList(CPAP_Snore, EVL_Event);
+
+    EventList *PP = session->AddEventList(CPAP_PressurePulse, EVL_Event);
+    EventList *RE = session->AddEventList(CPAP_RERA, EVL_Event);
+    EventList *CA = session->AddEventList(CPAP_ClearAirway, EVL_Event);
+    EventList *FL = session->AddEventList(CPAP_FlowLimit, EVL_Event);
+    EventList *VS = session->AddEventList(CPAP_VSnore, EVL_Event);
+    EventList *VS2 = session->AddEventList(CPAP_VSnore2, EVL_Event);
+    //EventList *T1 = session->AddEventList(CPAP_Test1, EVL_Event, 0.1);
+
+    Code[12] = session->AddEventList(PRS1_0B, EVL_Event);
+    Code[17] = session->AddEventList(PRS1_0E, EVL_Event);
+    EventList * LL = session->AddEventList(CPAP_LargeLeak, EVL_Event);
+
+    EventList *PRESSURE = nullptr;
+    EventList *EPAP = nullptr;
+    EventList *IPAP = nullptr;
+    EventList *PS = nullptr;
+
+    //session->AddEventList(CPAP_VSnore, EVL_Event);
+    //EventList * VS=session->AddEventList(CPAP_Obstructive, EVL_Event);
+    unsigned char lastcode3 = 0, lastcode2 = 0, lastcode = 0;
+    int lastpos = 0, startpos = 0, lastpos2 = 0, lastpos3 = 0;
+
+    int size = event->m_data.size();
+    unsigned char * buffer = (unsigned char *)event->m_data.data();
+
+    for (pos = 0; pos < size;) {
+        lastcode3 = lastcode2;
+        lastcode2 = lastcode;
+        lastcode = code;
+        lastpos3 = lastpos2;
+        lastpos2 = lastpos;
+        lastpos = startpos;
+        startpos = pos;
+        code = buffer[pos++];
+
+        if (code > 0x12) {
+            qDebug() << "Illegal PRS1 code " << hex << int(code) << " appeared at " << hex << startpos;
+            qDebug() << "1: (" << hex << int(lastcode) << hex << lastpos << ")";
+            qDebug() << "2: (" << hex << int(lastcode2) << hex << lastpos2 << ")";
+            qDebug() << "3: (" << hex << int(lastcode3) << hex << lastpos3 << ")";
+            return false;
+        }
+
+        if (code != 0x12) {
+            delta = buffer[pos + 1] << 8 | buffer[pos];
+            pos += 2;
+            t += qint64(delta) * 1000L;
+            tt = t;
+        }
+
+        cnt++;
+
+        switch (code) {
+
+        case 0x00: // Unknown 00
+            if (!Code[0]) {
+                if (!(Code[0] = session->AddEventList(PRS1_00, EVL_Event))) { return false; }
+            }
+
+            Code[0]->AddEvent(t, buffer[pos++]);
+
+            if ((event->family == 0) && (event->familyVersion >= 4)) {
+                pos++;
+            }
+
+            break;
+
+        case 0x01: // Unknown
+            if (!Code[1]) {
+                if (!(Code[1] = session->AddEventList(PRS1_01, EVL_Event))) { return false; }
+            }
+
+            Code[1]->AddEvent(t, 0);
+
+            if ((event->family == 0) && (event->familyVersion >= 4)) {
+                if (!PRESSURE) {
+                    PRESSURE = session->AddEventList(CPAP_Pressure, EVL_Event, 0.1F);
+
+                    if (!PRESSURE) { return false; }
+                }
+
+                PRESSURE->AddEvent(t, buffer[pos++]);
+            }
+
+            break;
+
+        case 0x02: // Pressure
+            if ((event->family == 0) && (event->familyVersion >= 4)) {  // BiPAP Pressure
+                if (!EPAP) {
+                    if (!(EPAP = session->AddEventList(CPAP_EPAP, EVL_Event, 0.1F))) { return false; }
+
+                    if (!(IPAP = session->AddEventList(CPAP_IPAP, EVL_Event, 0.1F))) { return false; }
+
+                    if (!(PS = session->AddEventList(CPAP_PS, EVL_Event, 0.1F))) { return false; }
+                }
+
+                EPAP->AddEvent(t, data[0] = buffer[pos++]);
+                IPAP->AddEvent(t, data[1] = buffer[pos++]);
+                PS->AddEvent(t, data[1] - data[0]);
+            } else {
+                if (!PRESSURE) {
+                    PRESSURE = session->AddEventList(CPAP_Pressure, EVL_Event, 0.1F);
+
+                    if (!PRESSURE) { return false; }
+                }
+
+                PRESSURE->AddEvent(t, buffer[pos++]);
+            }
+
+            break;
+
+        case 0x03: // BIPAP Pressure
+            if (!EPAP) {
+                if (!(EPAP = session->AddEventList(CPAP_EPAP, EVL_Event, 0.1F))) { return false; }
+
+                if (!(IPAP = session->AddEventList(CPAP_IPAP, EVL_Event, 0.1F))) { return false; }
+
+                if (!(PS = session->AddEventList(CPAP_PS, EVL_Event, 0.1F))) { return false; }
+            }
+
+            EPAP->AddEvent(t, data[0] = buffer[pos++]);
+            IPAP->AddEvent(t, data[1] = buffer[pos++]);
+            PS->AddEvent(t, data[1] - data[0]);
+            break;
+
+        case 0x04: // Pressure Pulse
+
+            PP->AddEvent(t, buffer[pos++]);
+            break;
+
+        case 0x05: // RERA
+            data[0] = buffer[pos++];
+            tt = t - (qint64(data[0]) * 1000L);
+
+            RE->AddEvent(tt, data[0]);
+            break;
+
+        case 0x06: // Obstructive Apoanea
+            data[0] = buffer[pos++];
+            tt = t - (qint64(data[0]) * 1000L);
+            OA->AddEvent(tt, data[0]);
+            break;
+
+        case 0x07: // Clear Airway
+            data[0] = buffer[pos++];
+            tt = t - (qint64(data[0]) * 1000L);
+
+            CA->AddEvent(tt, data[0]);
+            break;
+
+        case 0x0a: // Hypopnea
+            data[0] = buffer[pos++];
+            tt = t - (qint64(data[0]) * 1000L);
+            HY->AddEvent(tt, data[0]);
+            break;
+
+        case 0x0c: // Flow Limitation
+            data[0] = buffer[pos++];
+            tt = t - (qint64(data[0]) * 1000L);
+
+            FL->AddEvent(tt, data[0]);
+            break;
+
+        case 0x0b: // Hypopnea related code
+            data[0] = buffer[pos++];
+            data[1] = buffer[pos++];
+
+            // FIXME
+            Code[12]->AddEvent(t, data[0]);
+            break;
+
+        case 0x0d: // Vibratory Snore
+            VS->AddEvent(t, 0);
+            break;
+
+        case 0x11: // Leak Rate & Snore Graphs
+            data[0] = buffer[pos++];
+            data[1] = buffer[pos++];
+
+            LEAK->AddEvent(t, data[0]);
+            SNORE->AddEvent(t, data[1]);
+
+            if (data[1] > 0) {
+                VS2->AddEvent(t, data[1]);
+            }
+
+            if ((event->family == 0) && (event->familyVersion >= 4)) {
+                data[0] = buffer[pos];
+
+                pos++;
+            }
+
+            break;
+
+        case 0x0e: // Unknown
+
+            data[0] = ((char *)buffer)[pos++];
+            data[1] = buffer[pos++]; //(buffer[pos+1] << 8) | buffer[pos];
+            //data[0]/=10.0;
+            //pos+=2;
+            data[2] = buffer[pos++];
+
+            tdata = unsigned(data[1]) << 8 | unsigned(data[0]);
+            Code[17]->AddEvent(t, tdata);
+            //qDebug() << hex << data[0] << data[1] << data[2];
+            //session->AddEvent(new Event(t,cpapcode, 0, data, 3));
+            //tt-=data[1]*1000;
+            //session->AddEvent(new Event(t,CPAP_CSR, data, 2));
+            break;
+
+        case 0x10: // Large Leak
+            data[0] = buffer[pos + 1] << 8 | buffer[pos];
+            pos += 2;
+            data[1] = buffer[pos++];
+
+            tt = t - qint64(data[1]) * 1000L;
+            LL->AddEvent(tt, data[0]);
+            break;
+
+        case 0x0f: // Cheyne Stokes Respiration
+            data[0] = buffer[pos + 1] << 8 | buffer[pos];
+            pos += 2;
+            data[1] = buffer[pos++];
+            tt = t - qint64(data[1]) * 1000L;
+            CSR->AddEvent(tt, data[0]);
+            break;
+
+        case 0x12: // Summary
+            data[0] = buffer[pos++];
+            data[1] = buffer[pos++];
+            data[2] = buffer[pos + 1] << 8 | buffer[pos];
+            pos += 2;
+
+//            if (!Code[24]) {
+//                if (!(Code[24] = session->AddEventList(PRS1_12, EVL_Event))) { return false; }
+//            }
+
+//            Code[24]->AddEvent(t, data[0]);
+            break;
+
+        default:
+            // ERROR!!!
+            qWarning() << "Some new fandangled PRS1 code detected in" << event->sessionid << hex
+                       << int(code) << " at " << pos - 1;
+            return false;
+        }
+    }
+
+    session->updateLast(t);
+    session->m_cnt.clear();
+    session->m_cph.clear();
+    session->m_lastchan.clear();
+    session->m_firstchan.clear();
+    session->m_valuesummary[CPAP_Pressure].clear();
+    session->m_valuesummary.erase(session->m_valuesummary.find(CPAP_Pressure));
+
+    return true;
+}
+
+
+bool PRS1Import::ParseCompliance()
+{
+    const unsigned char * data = (unsigned char *)compliance->m_data.constData();
+
+    if (data[0x00] > 0) {
+        return false;
+    }
+
+    session->settings[CPAP_Mode] = (int)MODE_CPAP;
+
+    EventDataType min_pressure = float(data[0x03]) / 10.0;
+   // EventDataType max_pressure = float(data[0x04]) / 10.0;
+
+    session->settings[CPAP_Pressure] = min_pressure;
+
+
+    int ramp_time = data[0x06];
+    EventDataType ramp_pressure = float(data[0x07]) / 10.0;
+
+    session->settings[CPAP_RampTime] = (int)ramp_time;
+    session->settings[CPAP_RampPressure] = ramp_pressure;
+
+
+    quint8 flex = data[0x09];
+    int flexlevel = flex & 0x03;
+
+
+    FlexMode flexmode = FLEX_Unknown;
+
+    flex &= 0xf8;
+    bool split = false;
+
+    if (flex & 0x40) {  // This bit defines the Flex setting for the CPAP component of the Split night
+        split = true;
+    }
+    if (flex & 0x80) { // CFlex bit
+        if (flex & 8) { // Plus bit
+            flexmode = FLEX_CFlexPlus;
+        } else {
+            flexmode = FLEX_CFlex;
+        }
+    } else flexmode = FLEX_None;
+
+    session->settings[PRS1_FlexMode] = (int)flexmode;
+    session->settings[PRS1_FlexLevel] = (int)flexlevel;
+    session->setSummaryOnly(true);
+    //session->settings[CPAP_SummaryOnly] = true;
+
+    session->settings[PRS1_HumidStatus] = (bool)(data[0x0A] & 0x80);        // Humidifier Connected
+    session->settings[PRS1_HumidLevel] = (int)(data[0x0A] & 7);          // Humidifier Value
+
+    // need to parse a repeating structure here containing lengths of mask on/off..
+    // 0x03 = mask on
+    // 0x01 = mask off
+
+    qint64 start = qint64(compliance->timestamp) * 1000L;
+    qint64 tt = start;
+
+    int len = compliance->size()-3;
+    int pos = 0x11;
+    do {
+        quint8 c = data[pos++];
+        quint64 duration = data[pos] | data[pos+1] << 8;
+        pos+=2;
+        duration *= 1000L;
+        SliceStatus status;
+        if (c == 0x03) {
+            status = EquipmentOn;
+        } else if (c == 0x02) {
+            status = EquipmentLeaking;
+        } else if (c == 0x01) {
+            status = EquipmentOff;
+        } else {
+            qDebug() << compliance->sessionid << "Wasn't expecting" << c;
+            break;
+        }
+        session->m_slices.append(SessionSlice(tt, tt + duration, status));
+        qDebug() << compliance->sessionid << "Added Slice" << tt << (tt+duration) << status;
+
+        tt += duration;
+    } while (pos < len);
+
+    session->set_first(start);
+    session->set_last(tt);
+
+    // Bleh!! There is probably 10 different formats for these useless piece of junk machines
+    return true;
+}
+
+bool PRS1Import::ParseSummaryF0()
+{
+    const unsigned char * data = (unsigned char *)summary->m_data.constData();
+
+    if (data[0x00] > 0) {
+        return false;
+    }
+
+    session->set_first(qint64(summary->timestamp) * 1000L);
+
+    CPAPMode cpapmode = MODE_UNKNOWN;
+
+    switch (data[0x02]) {  // PRS1 mode   // 0 = CPAP, 2 = APAP
+    case 0x00:
+        cpapmode = MODE_CPAP;
+        break;
+    case 0x01:
+        cpapmode = MODE_BILEVEL_FIXED;
+        break;
+    case 0x02:
+        cpapmode = MODE_APAP;
+        break;
+    case 0x03:
+        cpapmode = MODE_BILEVEL_AUTO_VARIABLE_PS;
+    }
+
+    EventDataType min_pressure = float(data[0x03]) / 10.0;
+    EventDataType max_pressure = float(data[0x04]) / 10.0;
+    EventDataType ps  = float(data[0x05]) / 10.0; // pressure support
+
+    if (cpapmode == MODE_CPAP) {
+        session->settings[CPAP_Pressure] = min_pressure;
+    } else if (cpapmode == MODE_APAP) {
+        session->settings[CPAP_PressureMin] = min_pressure;
+        session->settings[CPAP_PressureMax] = max_pressure;
+    } else if (cpapmode == MODE_BILEVEL_FIXED) {
+        session->settings[CPAP_EPAP] = min_pressure;
+        session->settings[CPAP_IPAP] = max_pressure;
+        session->settings[CPAP_PS] = ps;
+    } else if (cpapmode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
+        session->settings[CPAP_EPAPLo] = min_pressure;
+        session->settings[CPAP_EPAPHi] = max_pressure - 2.0;
+        session->settings[CPAP_IPAPLo] = min_pressure + 2.0;
+        session->settings[CPAP_IPAPHi] = max_pressure;
+        session->settings[CPAP_PSMin] = 2.0f;
+        session->settings[CPAP_PSMax] = ps;
+    }
+
+    session->settings[CPAP_Mode] = (int)cpapmode;
+
+
+    int ramp_time = data[0x06];
+    EventDataType ramp_pressure = float(data[0x07]) / 10.0;
+
+    session->settings[CPAP_RampTime] = (int)ramp_time;
+    session->settings[CPAP_RampPressure] = ramp_pressure;
+
+    // Tubing lock has no setting byte
+
+    // Menu Options
+    session->settings[PRS1_SysLock] = (bool) (data[0x0a] & 0x80); // System One Resistance Lock Setting
+    session->settings[PRS1_SysOneResistSet] = (int)data[0x0a] & 7;       // SYstem One Resistance setting value
+    session->settings[PRS1_SysOneResistStat] = (bool) (data[0x0a] & 0x40);  // System One Resistance Status bit
+    session->settings[PRS1_HoseDiam] = (data[0x0a] & 0x08) ? QObject::tr("15mm") : QObject::tr("22mm");
+    session->settings[PRS1_AutoOn] = (bool) (data[0x0b] & 0x40);
+    session->settings[PRS1_AutoOff] = (bool) (data[0x0c] & 0x10);
+    session->settings[PRS1_MaskAlert] = (bool) (data[0x0c] & 0x08);
+    session->settings[PRS1_ShowAHI] = (bool) (data[0x0c] & 0x04);
+    session->settings[PRS1_HumidStatus] = (bool)(data[0x09] & 0x80);        // Humidifier Connected
+    session->settings[PRS1_HumidLevel] = (int)(data[0x09] & 7);          // Humidifier Value
+
+   // session->
+
+    quint8 flex = data[0x08];
+
+    int flexlevel = flex & 0x03;
+    FlexMode flexmode = FLEX_Unknown;
+
+    // 88 CFlex+ / AFlex (depending on CPAP mode)
+    // 80 CFlex
+    // 00 NoFlex
+    // c0 Split CFlex then None
+    // c8 Split CFlex+ then None
+
+    flex &= 0xf8;
+    bool split = false;
+
+    if (flex & 0x40) {  // This bit defines the Flex setting for the CPAP component of the Split night
+        split = true;
+    }
+    if (flex & 0x80) { // CFlex bit
+        if (flex & 0x10) {
+            flexmode = FLEX_RiseTime;
+        } else if (flex & 8) { // Plus bit
+            if (split || (cpapmode == MODE_CPAP)) {
+                flexmode = FLEX_CFlexPlus;
+            } else if (cpapmode == MODE_APAP) {
+                flexmode = FLEX_AFlex;
+            }
+        } else {
+            // CFlex bits refer to Rise Time on BiLevel machines
+            flexmode = (cpapmode >= MODE_BILEVEL_FIXED) ? FLEX_BiFlex : FLEX_CFlex;
+        }
+    } else flexmode = FLEX_None;
+
+    session->settings[PRS1_FlexMode] = (int)flexmode;
+    session->settings[PRS1_FlexLevel] = (int)flexlevel;
+
+    summary_duration = data[0x14] | data[0x15] << 8;
+
+    return true;
+}
+
+bool PRS1Import::ParseSummaryF0V4()
+{
+    const unsigned char * data = (unsigned char *)summary->m_data.constData();
+
+    if (data[0x00] > 0) {
+        return false;
+    }
+
+    session->set_first(qint64(summary->timestamp) * 1000L);
+
+    CPAPMode cpapmode = MODE_UNKNOWN;
+
+    switch (data[0x02]) {  // PRS1 mode   // 0 = CPAP, 2 = APAP
+    case 0x00:
+        cpapmode = MODE_CPAP;
+        break;
+    case 0x20:
+        cpapmode = MODE_BILEVEL_FIXED;
+        break;
+    case 0x40:
+        cpapmode = MODE_APAP;
+        break;
+    case 0x60:
+        cpapmode = MODE_BILEVEL_AUTO_VARIABLE_PS;
+    }
+
+
+    EventDataType min_pressure = float(data[0x03]) / 10.0;
+    EventDataType max_pressure = float(data[0x04]) / 10.0;
+    EventDataType min_ps  = float(data[0x05]) / 10.0; // pressure support
+    EventDataType max_ps  = float(data[0x06]) / 10.0; // pressure support
+
+    if (cpapmode == MODE_CPAP) {
+        session->settings[CPAP_Pressure] = min_pressure;
+    } else if (cpapmode == MODE_APAP) {
+        session->settings[CPAP_PressureMin] = min_pressure;
+        session->settings[CPAP_PressureMax] = max_pressure;
+    } else if (cpapmode == MODE_BILEVEL_FIXED) {
+        session->settings[CPAP_EPAP] = min_pressure;
+        session->settings[CPAP_IPAP] = max_pressure;
+        session->settings[CPAP_PS] = max_pressure - min_pressure;
+    } else if (cpapmode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
+        session->settings[CPAP_EPAPLo] = min_pressure;
+        session->settings[CPAP_EPAPHi] = max_pressure;
+        session->settings[CPAP_IPAPLo] = min_pressure + min_ps;
+        session->settings[CPAP_IPAPHi] = max_pressure;
+        session->settings[CPAP_PSMin] = min_ps;
+        session->settings[CPAP_PSMax] = max_ps;
+    }
+    session->settings[CPAP_Mode] = (int)cpapmode;
+
+    quint8 flex = data[0x0a];
+
+    int flexlevel = flex & 0x03;
+    FlexMode flexmode = FLEX_Unknown;
+
+    flex &= 0xf8;
+    bool split = false;
+
+    if (flex & 0x40) {  // This bit defines the Flex setting for the CPAP component of the Split night
+        split = true;
+    }
+    if (flex & 0x80) { // CFlex bit
+        if (flex & 0x10) {
+            flexmode = FLEX_RiseTime;
+        } else if (flex & 8) { // Plus bit
+            if (split || (cpapmode == MODE_CPAP)) {
+                flexmode = FLEX_CFlexPlus;
+            } else if (cpapmode == MODE_APAP) {
+                flexmode = FLEX_AFlex;
+            }
+        } else {
+            // CFlex bits refer to Rise Time on BiLevel machines
+            flexmode = (cpapmode >= MODE_BILEVEL_FIXED) ? FLEX_BiFlex : FLEX_CFlex;
+        }
+    } else flexmode = FLEX_None;
+
+    int ramp_time = data[0x08];
+    EventDataType ramp_pressure = float(data[0x09]) / 10.0;
+
+    session->settings[CPAP_RampTime] = (int)ramp_time;
+    session->settings[CPAP_RampPressure] = ramp_pressure;
+
+    session->settings[PRS1_FlexMode] = (int)flexmode;
+    session->settings[PRS1_FlexLevel] = (int)flexlevel;
+
+    session->settings[PRS1_HumidStatus] = (bool)(data[0x0b] & 0x80);        // Humidifier Connected
+    session->settings[PRS1_HeatedTubing] = (bool)(data[0x0b] & 0x10);        // Heated Hose??
+    session->settings[PRS1_HumidLevel] = (int)(data[0x0b] & 7);          // Humidifier Value
+
+
+    summary_duration = data[0x14] | data[0x15] << 8;
+
+    return true;
+}
+
+
+bool PRS1Import::ParseSummaryF3()
+{
+    const unsigned char * data = (unsigned char *)summary->m_data.constData();
+
+    if (data[0x00] > 0) {
+        return false;
+    }
+
+    session->set_first(qint64(summary->timestamp) * 1000L);
+
+    EventDataType epap = data[0x04] | (data[0x05] << 8);
+    EventDataType ipap = data[0x06] | (data[0x07] << 8);
+
+    EventDataType f1 = data[0x08] | (data[0x09] << 8);
+
+    return true;
+}
+
+bool PRS1Import::ParseSummaryF5V0()
+{
+    const unsigned char * data = (unsigned char *)summary->m_data.constData();
+
+    if (data[0x00] > 0) {
+        return false;
+    }
+
+    session->set_first(qint64(summary->timestamp) * 1000L);
+
+    CPAPMode cpapmode = MODE_UNKNOWN;
+
+    int imin_epap = data[0x3];
+    int imax_epap = data[0x4];
+    int imin_ps = data[0x5];
+    int imax_ps = data[0x6];
+    int imax_pressure = data[0x2];
+
+    cpapmode = MODE_ASV_VARIABLE_EPAP;
+
+    session->settings[CPAP_Mode] = (int)cpapmode;
+
+    if (cpapmode == MODE_CPAP) {
+        session->settings[CPAP_Pressure] = imin_epap/10.0f;
+
+    } else if (cpapmode == MODE_BILEVEL_FIXED) {
+        session->settings[CPAP_EPAP] = imin_epap/10.0f;
+        session->settings[CPAP_IPAP] = imax_epap/10.0f;
+
+    } else if (cpapmode == MODE_ASV_VARIABLE_EPAP) {
+        int imax_ipap = imax_epap + imax_ps;
+        int imin_ipap = imin_epap + imin_ps;
+
+        session->settings[CPAP_EPAPLo] = imin_epap / 10.0f;
+        session->settings[CPAP_EPAPHi] = imax_epap / 10.0f;
+        session->settings[CPAP_IPAPLo] = imin_ipap / 10.0f;
+        session->settings[CPAP_IPAPHi] = imax_pressure / 10.0f;
+        session->settings[CPAP_PSMin] = imin_ps / 10.0f;
+        session->settings[CPAP_PSMax] = imax_ps / 10.0f;
+    }
+
+    quint8 flex = data[0x0c];
+
+    int flexlevel = flex & 0x03;
+    FlexMode flexmode = FLEX_Unknown;
+
+    flex &= 0xf8;
+    bool split = false;
+
+    if (flex & 0x40) {  // This bit defines the Flex setting for the CPAP component of the Split night
+        split = true;
+    }
+    if (flex & 0x80) { // CFlex bit
+        if (flex & 0x10) {
+            flexmode = FLEX_RiseTime;
+        } else if (flex & 8) { // Plus bit
+            if (split || (cpapmode == MODE_CPAP)) {
+                flexmode = FLEX_CFlexPlus;
+            } else if (cpapmode == MODE_APAP) {
+                flexmode = FLEX_AFlex;
+            }
+        } else {
+            // CFlex bits refer to Rise Time on BiLevel machines
+            flexmode = (cpapmode >= MODE_BILEVEL_FIXED) ? FLEX_BiFlex : FLEX_CFlex;
+        }
+    } else flexmode = FLEX_None;
+
+    session->settings[PRS1_FlexMode] = (int)flexmode;
+    session->settings[PRS1_FlexLevel] = (int)flexlevel;
+
+
+    int ramp_time = data[0x0a];
+    EventDataType ramp_pressure = float(data[0x0b]) / 10.0;
+
+    session->settings[CPAP_RampTime] = (int)ramp_time;
+    session->settings[CPAP_RampPressure] = ramp_pressure;
+
+    session->settings[PRS1_HumidStatus] = (bool)(data[0x0d] & 0x80);        // Humidifier Connected
+    session->settings[PRS1_HeatedTubing] = (bool)(data[0x0d] & 0x10);        // Heated Hose??
+    session->settings[PRS1_HumidLevel] = (int)(data[0x0d] & 7);          // Humidifier Value
+
+    summary_duration = data[0x18] | data[0x19] << 8;
+
+    return true;
+}
+
+bool PRS1Import::ParseSummaryF5V1()
+{
+    const unsigned char * data = (unsigned char *)summary->m_data.constData();
+
+    if (data[0x00] > 0) {
+        return false;
+    }
+
+    session->set_first(qint64(summary->timestamp) * 1000L);
+
+    CPAPMode cpapmode = MODE_UNKNOWN;
+
+    int imin_epap = data[0x3];
+    int imax_epap = data[0x4];
+    int imin_ps = data[0x5];
+    int imax_ps = data[0x6];
+    int imax_pressure = data[0x2];
+
+    cpapmode = MODE_ASV_VARIABLE_EPAP;
+
+    session->settings[CPAP_Mode] = (int)cpapmode;
+
+    if (cpapmode == MODE_CPAP) {
+        session->settings[CPAP_Pressure] = imin_epap/10.0f;
+
+    } else if (cpapmode == MODE_BILEVEL_FIXED) {
+        session->settings[CPAP_EPAP] = imin_epap/10.0f;
+        session->settings[CPAP_IPAP] = imax_epap/10.0f;
+
+    } else if (cpapmode == MODE_ASV_VARIABLE_EPAP) {
+        int imax_ipap = imax_epap + imax_ps;
+        int imin_ipap = imin_epap + imin_ps;
+
+        session->settings[CPAP_EPAPLo] = imin_epap / 10.0f;
+        session->settings[CPAP_EPAPHi] = imax_epap / 10.0f;
+        session->settings[CPAP_IPAPLo] = imin_ipap / 10.0f;
+        session->settings[CPAP_IPAPHi] = imax_pressure / 10.0f;
+        session->settings[CPAP_PSMin] = imin_ps / 10.0f;
+        session->settings[CPAP_PSMax] = imax_ps / 10.0f;
+    }
+
+    quint8 flex = data[0x0c];
+
+    int flexlevel = flex & 0x03;
+    FlexMode flexmode = FLEX_Unknown;
+
+    flex &= 0xf8;
+    bool split = false;
+
+    if (flex & 0x40) {  // This bit defines the Flex setting for the CPAP component of the Split night
+        split = true;
+    }
+    if (flex & 0x80) { // CFlex bit
+        if (flex & 0x10) {
+            flexmode = FLEX_RiseTime;
+        } else if (flex & 8) { // Plus bit
+            if (split || (cpapmode == MODE_CPAP)) {
+                flexmode = FLEX_CFlexPlus;
+            } else if (cpapmode == MODE_APAP) {
+                flexmode = FLEX_AFlex;
+            }
+        } else {
+            // CFlex bits refer to Rise Time on BiLevel machines
+            flexmode = (cpapmode >= MODE_BILEVEL_FIXED) ? FLEX_BiFlex : FLEX_CFlex;
+        }
+    } else flexmode = FLEX_None;
+
+    session->settings[PRS1_FlexMode] = (int)flexmode;
+    session->settings[PRS1_FlexLevel] = (int)flexlevel;
+
+
+    int ramp_time = data[0x0a];
+    EventDataType ramp_pressure = float(data[0x0b]) / 10.0;
+
+    session->settings[CPAP_RampTime] = (int)ramp_time;
+    session->settings[CPAP_RampPressure] = ramp_pressure;
+
+    session->settings[PRS1_HumidStatus] = (bool)(data[0x0d] & 0x80);        // Humidifier Connected
+    session->settings[PRS1_HeatedTubing] = (bool)(data[0x0d] & 0x10);        // Heated Hose??
+    session->settings[PRS1_HumidLevel] = (int)(data[0x0d] & 7);          // Humidifier Value
+
+    summary_duration = data[0x18] | data[0x19] << 8;
+
+    return true;
+}
+
+
+bool PRS1Import::ParseSummary()
+{
+
+    // Family 0 = XPAP
+    // Family 3 = BIPAP AVAPS
+    // Family 5 = BIPAP AutoSV
+
+
+    if (!summary) return false;
+
+    session->setPhysMax(CPAP_LeakTotal, 120);
+    session->setPhysMin(CPAP_LeakTotal, 0);
+    session->setPhysMax(CPAP_Pressure, 25);
+    session->setPhysMin(CPAP_Pressure, 4);
+    session->setPhysMax(CPAP_IPAP, 25);
+    session->setPhysMin(CPAP_IPAP, 4);
+    session->setPhysMax(CPAP_EPAP, 25);
+    session->setPhysMin(CPAP_EPAP, 4);
+    session->setPhysMax(CPAP_PS, 25);
+    session->setPhysMin(CPAP_PS, 0);
+
+    switch (summary->family) {
+    case 0:
+        if (summary->familyVersion == 4) {
+            return ParseSummaryF0V4();
+        } else {
+            return ParseSummaryF0();
+        }
+    case 3:
+  //      return ParseSummaryF3();
+        break;
+    case 5:
+        if (summary->familyVersion == 0) {
+            return ParseSummaryF5V0();
+        } else {
+            return ParseSummaryF5V1();
+        }
+    }
+
+    this->loader->saveMutex.lock();
+    if (!mach->unsupported()) {
+        this->loader->unsupported(mach);
+    }
+    this->loader->saveMutex.unlock();
+    return false;
+
+    const unsigned char * data = (unsigned char *)summary->m_data.constData();
+
+    //////////////////////////////////////////////////////////////////////////////////////////
+    // ASV Codes (Family 5) Recheck 17/10/2013
+    // These are all confirmed off Encore reports
+
+    //cpapmax=EventDataType(data[0x02])/10.0;   // Max Pressure in ASV machines
+    //minepap=EventDataType(data[0x03])/10.0;   // Min EPAP
+    //maxepap=EventDataType(data[0x04])/10.0;   // Max EPAP
+    //minps=EventDataType(data[0x05])/10.0      // Min Pressure Support
+    //maxps=EventDataType(data[0x06])/10.0      // Max Pressure Support
+
+    //duration=data[0x1B] | data[0x1C] << 8)  // Session length in seconds
+
+    //epap90=EventDataType(data[0x21])/10.0;    // EPAP 90%
+    //epapavg=EventDataType(data[0x22])/10.0;   // EPAP Average
+    //ps90=EventDataType(data[0x23])/10.0;      // Pressure Support 90%
+    //psavg=EventDataType(data[0x24])/10.0;     // Pressure Support Average
+
+    //TODO: minpb=data[0x] | data[0x] << 8;           // Minutes in PB
+    //TODO: minleak=data[0x] | data[0x] << 8;         // Minutes in Large Leak
+    //TODO: oa_cnt=data[0x] | data[0x] << 8;          // Obstructive events count
+
+    //ca_cnt=data[0x2d] | data[0x2e] << 8;      // Clear Airway Events count
+    //h_cnt=data[0x2f] | data[0x30] << 8;       // Hypopnea events count
+    //fl_cnt=data[0x33] | data[0x34] << 8;      // Flow Limitation events count
+
+    //avg_leak=EventDataType(data[0x35]);       // Average Leak
+    //avgptb=EventDataType(data[0x36]);         // Average Patient Triggered Breaths %
+    //avgbreathrate=EventDataType(data[0x37]);  // Average Breaths Per Minute
+    //avgminvent=EventDataType(data[0x38]);     // Average Minute Ventilation
+    //avg_tidalvol=EventDataType(data[0x39])*10.0;  // Average Tidal Volume
+    //////////////////////////////////////////////////////////////////////////////////////////
+
+
+    //quint8 rectype = data[0x00];
+
+
+
+    EventDataType max, min;
+
+    min = float(data[0x03]) / 10.0; // Min EPAP
+    max = float(data[0x04]) / 10.0; // Max EPAP
+    int offset = 0;
+    int duration = 0;
+
+    // This is a time value for ASV stuff
+    if (summary->family == 5) {
+        offset = 4; // non zero adds 4 extra fields..
+
+        if (summary->familyVersion == 0) {
+            duration = data[0x1B] | data[0x1C] << 8;
+        }
+    } else if (summary->family == 0) {
+
+        if (summary->familyVersion == 2) {
+            duration = data[0x14] | data[0x15] << 8;
+        }
+        if (summary->familyVersion >= 4) {
+            offset = 2;
+        }
+
+    }
+
+    if (duration > 0) {
+        session->set_last(qint64(summary->timestamp + duration) * 1000L);
+    }
+    if (!event) {
+        session->setSummaryOnly(true);
+    }
+
+    // Minutes. Convert to seconds/hours here?
+    session->settings[CPAP_RampTime] = (int)data[offset + 0x06];
+    session->settings[CPAP_RampPressure] = (EventDataType)data[offset + 0x07] / 10.0;
+
+    if (max > 0) { // Ignoring bipap until we see some more data during import
+        session->settings[CPAP_Mode] = (summary->family == 5) ? (int)MODE_ASV : (int)MODE_APAP;
+
+        session->settings[CPAP_PressureMin] = (EventDataType)min;
+        session->settings[CPAP_PressureMax] = (EventDataType)max;
+    } else {
+        session->settings[CPAP_Mode] = (int)MODE_CPAP;
+        session->settings[CPAP_Pressure] = (EventDataType)min;
+    }
+
+
+    if (data[offset + 0x08] & 0x80) { // Flex Setting
+        if (data[offset + 0x08] & 0x08) {
+            if (max > 0) {
+                if (summary->family == 5) {
+                    session->settings[PRS1_FlexMode] = (int)PR_BIFLEX;
+                } else {
+                    session->settings[PRS1_FlexMode] = (int)PR_AFLEX;
+                }
+            } else { session->settings[PRS1_FlexMode] = (int)PR_CFLEXPLUS; }
+        } else { session->settings[PRS1_FlexMode] = (int)PR_CFLEX; }
+    } else { session->settings[PRS1_FlexMode] = (int)PR_NONE; }
+
+    // Map the channels
+
+    session->settings[PRS1_FlexLevel] = (int)(data[offset + 0x08] & 7);
+
+    session->settings[PRS1_SysLock] = (data[offset + 0x0a] & 0x80) == 0x80;
+    session->settings[PRS1_HoseDiam] = ((data[offset + 0x0a] & 0x08) ? "15mm" : "22mm");
+    session->settings[PRS1_AutoOff] = (data[offset + 0x0c] & 0x10) == 0x10;
+    session->settings[PRS1_MaskAlert] = (data[offset + 0x0c] & 0x08) == 0x08;
+    session->settings[PRS1_ShowAHI] = (data[offset + 0x0c] & 0x04) == 0x04;
+
+    if (summary->family == 0 && summary->familyVersion >= 4) {
+        if ((data[offset + 0x0a] & 0x04) == 0x04) { // heated tubing off
+            session->settings[CPAP_HumidSetting] = (int)data[offset + 0x09] & 0x0f;
+        } else {
+            session->settings[CPAP_HumidSetting] = (int)(data[offset + 0x09] & 0x30) >> 4;
+        }
+
+        session->settings[PRS1_SysOneResistSet] = (int)(data[offset + 0x0b] & 0x38) >> 3;
+        /* These should be added to channels, if they are correct(?) */
+        /* for now, leave commented out                              */
+        /*
+        session->settings[PRS1_HeatedTubing]=(data[offset+0x0a]&0x04)!=0x04;
+        session->settings[PRS1_HeatedTubingConnected]=(data[offset+0x0b]&0x01)==0x01;
+        session->settings[PRS1_HeatedTubingTemp]=(int)(data[offset+0x09]&0x80)>>5
+            + (data[offset+0x0a]&0x03);
+        */
+    } else {
+        session->settings[CPAP_HumidSetting] = (int)data[offset + 0x09] & 0x0f;
+        session->settings[PRS1_HumidStatus] = (data[offset + 0x09] & 0x80) == 0x80;
+        session->settings[PRS1_SysOneResistStat] = (data[offset + 0x0a] & 0x40) == 0x40;
+        session->settings[PRS1_SysOneResistSet] = (int)data[offset + 0x0a] & 7;
+    }
+
+
+
+    // Set recommended Graph values..
+
+
+
+    if (summary->family == 0 && summary->familyVersion == 0) {
+    }
+
+    return true;
+}
+
+bool PRS1Import::ParseEvents()
+{
+    bool res = false;
+    if (!event) return false;
+    switch (event->family) {
+    case 0:
+        res = ParseF0Events();
+        break;
+    case 5:
+        res= ParseF5Events();
+        break;
+    default:
+        qDebug() << "Unknown PRS1 familyVersion" << event->familyVersion;
+        return false;
+    }
+
+    if (res) {
+        if (session->count(CPAP_IPAP) > 0) {
+//            if (session->settings[CPAP_Mode].toInt() != (int)MODE_ASV) {
+//                session->settings[CPAP_Mode] = MODE_BILEVEL_FIXED;
+//            }
+
+//            if (session->settings[CPAP_PresReliefType].toInt() != PR_NONE) {
+//                session->settings[CPAP_PresReliefType] = PR_BIFLEX;
+//            }
+
+//            EventDataType min = session->settings[CPAP_PressureMin].toDouble();
+//            EventDataType max = session->settings[CPAP_PressureMax].toDouble();
+//            session->settings[CPAP_EPAP] = min;
+//            session->settings[CPAP_IPAP] = max;
+
+//            session->settings[CPAP_PS] = max - min;
+//            session->settings.erase(session->settings.find(CPAP_PressureMin));
+//            session->settings.erase(session->settings.find(CPAP_PressureMax));
+
+//            session->m_valuesummary.erase(session->m_valuesummary.find(CPAP_Pressure));
+//            session->m_wavg.erase(session->m_wavg.find(CPAP_Pressure));
+//            session->m_min.erase(session->m_min.find(CPAP_Pressure));
+//            session->m_max.erase(session->m_max.find(CPAP_Pressure));
+//            session->m_gain.erase(session->m_gain.find(CPAP_Pressure));
+
+        } else {
+            if (!session->settings.contains(CPAP_Pressure) && !session->settings.contains(CPAP_PressureMin)) {
+                session->settings[CPAP_BrokenSummary] = true;
+
+                //session->set_last(session->first());
+                if (session->Min(CPAP_Pressure) == session->Max(CPAP_Pressure)) {
+                    session->settings[CPAP_Mode] = MODE_CPAP; // no ramp
+                    session->settings[CPAP_Pressure] = session->Min(CPAP_Pressure);
+                } else {
+                    session->settings[CPAP_Mode] = MODE_APAP;
+                    session->settings[CPAP_PressureMin] = session->Min(CPAP_Pressure);
+                    session->settings[CPAP_PressureMax] = 0; //session->Max(CPAP_Pressure);
+                }
+
+                //session->Set("FlexMode",PR_UNKNOWN);
+
+            }
+        }
+
+    }
+    return res;
+}
+
+bool PRS1Import::ParseOximetery()
+{
+    int size = oximetery.size();
+
+    for (int i=0; i < size; ++i) {
+        PRS1DataChunk * oxi = oximetery.at(i);
+        int num = oxi->waveformInfo.size();
+
+        int size = oxi->m_data.size();
+        if (size == 0) {
+            continue;
+        }
+        quint64 ti = quint64(oxi->timestamp) * 1000L;
+        qint64 dur = qint64(oxi->duration) * 1000L;
+
+        if (num > 1) {
+            // Process interleaved samples
+            QVector<QByteArray> data;
+            data.resize(num);
+
+            int pos = 0;
+            do {
+                for (int n=0; n < num; n++) {
+                    int interleave = oxi->waveformInfo.at(n).interleave;
+                    data[n].append(oxi->m_data.mid(pos, interleave));
+                    pos += interleave;
+                }
+            } while (pos < size);
+
+            if (data[0].size() > 0) {
+                EventList * pulse = session->AddEventList(OXI_Pulse, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, dur / data[0].size());
+                pulse->AddWaveform(ti, (unsigned char *)data[0].data(), data[0].size(), dur);
+            }
+
+            if (data[1].size() > 0) {
+                EventList * spo2 = session->AddEventList(OXI_SPO2, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, dur / data[1].size());
+                spo2->AddWaveform(ti, (unsigned char *)data[1].data(), data[1].size(), dur);
+            }
+
+        }
+    }
+    return true;
+}
+
+bool PRS1Import::ParseWaveforms()
+{
+    int size = waveforms.size();
+
+    for (int i=0; i < size; ++i) {
+        PRS1DataChunk * waveform = waveforms.at(i);
+        int num = waveform->waveformInfo.size();
+
+        int size = waveform->m_data.size();
+        if (size == 0) {
+            continue;
+        }
+        quint64 ti = quint64(waveform->timestamp) * 1000L;
+        qint64 dur = qint64(waveform->duration) * 1000L;
+
+        if (num > 1) {
+            // Process interleaved samples
+            QVector<QByteArray> data;
+            data.resize(num);
+
+            int pos = 0;
+            do {
+                for (int n=0; n < num; n++) {
+                    int interleave = waveform->waveformInfo.at(n).interleave;
+                    data[n].append(waveform->m_data.mid(pos, interleave));
+                    pos += interleave;
+                }
+            } while (pos < size);
+
+            if (data[0].size() > 0) {
+                EventList * flow = session->AddEventList(CPAP_FlowRate, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, dur / data[0].size());
+                flow->AddWaveform(ti, (char *)data[0].data(), data[0].size(), dur);
+            }
+
+            if (data[1].size() > 0) {
+                EventList * pres = session->AddEventList(CPAP_MaskPressureHi, EVL_Waveform, 0.1, 0.0, 0.0, 0.0, dur / data[1].size());
+                pres->AddWaveform(ti, (unsigned char *)data[1].data(), data[1].size(), dur);
+            }
+
+        } else {
+            // Non interleaved, so can process it much faster
+            EventList * flow = session->AddEventList(CPAP_FlowRate, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, dur / waveform->m_data.size());
+            flow->AddWaveform(ti, (char *)waveform->m_data.data(), waveform->m_data.size(), dur);
+        }
+    }
+    return true;
+}
+
+void PRS1Import::run()
+{
+    if (mach->unsupported())
+        return;
+    session = new Session(mach, sessionid);
+
+    if ((compliance && ParseCompliance()) || (summary && ParseSummary())) {
+        if (event && !ParseEvents()) {
+        }
+        waveforms = loader->ParseFile(wavefile);
+        ParseWaveforms();
+
+        oximetery = loader->ParseFile(oxifile);
+        ParseOximetery();
+
+        if (session->first() > 0) {
+            if (session->last() < session->first()) {
+                // if last isn't set, duration couldn't be gained from summary, parsing events or waveforms..
+                // This session is dodgy, so kill it
+                session->setSummaryOnly(true);
+                session->really_set_last(session->first()+(qint64(summary_duration) * 1000L));
+            }
+            session->SetChanged(true);
+
+            loader->addSession(session);
+
+            // Update indexes, process waveform and perform flagging
+            session->UpdateSummaries();
+
+            // Save is not threadsafe
+            loader->saveMutex.lock();
+            session->Store(mach->getDataPath());
+            loader->saveMutex.unlock();
+
+            session->TrashEvents();
+        }
+
+    }
+}
+
+QList<PRS1DataChunk *> PRS1Loader::ParseFile(QString path)
+{
+    QList<PRS1DataChunk *> CHUNKS;
+
+    if (path.isEmpty())
+        return CHUNKS;
+
+    QFile f(path);
+
+    if (!f.exists()) {
+        return CHUNKS;
+    }
+
+    if (!f.open(QIODevice::ReadOnly)) {
+        return CHUNKS;
+    }
+
+    PRS1DataChunk *chunk = nullptr, *lastchunk = nullptr;
+
+    quint16 blocksize;
+    quint16 wvfm_signals;
+
+    unsigned char * header;
+    int cnt = 0;
+
+    int lastheadersize = 0;
+    int lastblocksize = 0;
+
+    int cruft = 0;
+    int firstsession = 0;
+
+
+    do {
+        QByteArray headerBA = f.read(16);
+        if (headerBA.size() != 16) {
+            break;
+        }
+        header = (unsigned char *)headerBA.data();
+
+        blocksize = (header[2] << 8) | header[1];
+        if (blocksize == 0) break;
+
+        chunk = new PRS1DataChunk();
+
+        chunk->sessionid = (header[10] << 24) | (header[9] << 16) | (header[8] << 8) | header[7];
+
+        if (!firstsession) {
+            firstsession = chunk->sessionid;
+        }
+        chunk->fileVersion = header[0];
+        chunk->htype = header[3];  // 00 = normal ?? // 01=waveform ?? // could be a bool signifying extra header bytes?
+        chunk->family = header[4];
+        chunk->familyVersion = header[5];
+        chunk->ext = header[6];
+        chunk->timestamp = (header[14] << 24) | (header[13] << 16) | (header[12] << 8) | header[11];
+
+        if (lastchunk != nullptr) {
+            if ((lastchunk->fileVersion != chunk->fileVersion)
+                && (lastchunk->ext != chunk->ext)
+                && (lastchunk->family != chunk->family)
+                && (lastchunk->familyVersion != chunk->familyVersion)
+                && (lastchunk->htype != chunk->htype)) {
+                QByteArray junk = f.read(lastblocksize - 16);
+
+                Q_UNUSED(junk)
+                if (lastchunk->ext == 5) {
+                    // The data is random crap
+//                    lastchunk->m_data.append(junk.mid(lastheadersize-16));
+                }
+                delete chunk;
+                ++cruft;
+                if (cruft > 3)
+                    break;
+
+                continue;
+                // Corrupt header.. skip it.
+            }
+        }
+
+        int diff = 0;
+
+        //////////////////////////////////////////////////////////
+        // Waveform Header
+        //////////////////////////////////////////////////////////
+        if ((chunk->ext == 5) || (chunk->ext == 6)) {
+            // Get extra 8 bytes in waveform header.
+            QByteArray extra = f.read(4);
+            if (extra.size() != 4) {
+                delete chunk;
+                break;
+            }
+            headerBA.append(extra);
+            // Get the header address again to be safe
+            header = (unsigned char *)headerBA.data();
+
+            chunk->duration = header[0x0f] | header[0x10] << 8;
+
+            wvfm_signals = header[0x12] | header[0x13] << 8;
+
+            int sbsize = wvfm_signals * 3 + 1;
+            QByteArray sbextra = f.read(sbsize);
+            if (sbextra.size() != sbsize) {
+                delete chunk;
+                break;
+            }
+            headerBA.append(sbextra);
+            header = (unsigned char *)headerBA.data();
+
+            // Read the waveform information in reverse.
+            int pos = 0x14 + (wvfm_signals - 1) * 3;
+            for (int i = 0; i < wvfm_signals; ++i) {
+                quint16 interleave = header[pos] | header[pos + 1] << 8;
+                quint8 sample_format = header[pos + 2];
+                chunk->waveformInfo.push_back(PRS1Waveform(interleave, sample_format));
+                pos -= 3;
+            }
+            if (lastchunk != nullptr) {
+                diff = (chunk->timestamp - lastchunk->timestamp) - lastchunk->duration;
+
+            }
+        }
+
+        int headersize = headerBA.size();
+
+        lastblocksize = blocksize;
+        lastheadersize = headersize;
+        blocksize -= headersize;
+
+        // Check header checksum
+        quint8 csum = 0;
+        for (int i=0; i < headersize-1; ++i) csum += header[i];
+        if (csum != header[headersize-1]) {
+            // header checksum error.
+            delete chunk;
+            return CHUNKS;
+        }
+
+        // Read data block
+        chunk->m_data = f.read(blocksize);
+
+        if (chunk->m_data.size() < blocksize) {
+            delete chunk;
+            break;
+        }
+
+        // last two bytes contain crc16 checksum.
+        int ds = chunk->m_data.size();
+        quint16 crc16 = chunk->m_data.at(ds-2) | chunk->m_data.at(ds-1) << 8;
+        chunk->m_data.chop(2);
+
+#ifdef PRS1_CRC_CHECK
+        // This fails.. it needs to include the header!
+        quint16 calc16 = CRC16((unsigned char *)chunk->m_data.data(), chunk->m_data.size());
+        if (calc16 != crc16) {
+            // corrupt data block.. bleh..
+         //   qDebug() << "CRC16 doesn't match for chunk" << chunk->sessionid << "for" << path;
+        }
+#endif
+
+        if ((chunk->ext == 5) || (chunk->ext == 6)){
+            if (lastchunk != nullptr) {
+
+                Q_ASSERT(lastchunk->sessionid == chunk->sessionid);
+
+                if (diff == 0) {
+                    // In sync, so append waveform data to previous chunk
+                    lastchunk->m_data.append(chunk->m_data);
+                    lastchunk->duration += chunk->duration;
+                    delete chunk;
+                    cnt++;
+                    chunk = lastchunk;
+                    continue;
+                }
+                // else start a new chunk to resync
+            }
+        }
+
+        CHUNKS.append(chunk);
+
+        lastchunk = chunk;
+        cnt++;
+    } while (!f.atEnd());
+    return CHUNKS;
+}
+
+void InitModelMap()
+{
+    ModelMap[0x34] = "RemStar Pro with C-Flex+"; // 450/460P
+    ModelMap[0x35] = "RemStar Auto with A-Flex"; // 550/560P
+    ModelMap[0x36] = "RemStar BiPAP Pro with Bi-Flex";
+    ModelMap[0x37] = "RemStar BiPAP Auto with Bi-Flex";
+    ModelMap[0x38] = "RemStar Plus :(";          // 150/250P/260P
+    ModelMap[0x41] = "BiPAP autoSV Advanced";
+    ModelMap[0x4a] = "BiPAP autoSV Advanced 60 Series";
+    ModelMap[0x4E] = "BiPAP AVAPS";
+}
+
+bool initialized = false;
+
+using namespace schema;
+
+Channel PRS1Channels;
+
+void PRS1Loader::initChannels()
+{
+    Channel * chan = nullptr;
+
+    channel.add(GRP_CPAP, new Channel(CPAP_PressurePulse = 0x1009, MINOR_FLAG,  MT_CPAP,   SESSION,
+        "PressurePulse",
+        QObject::tr("Pressure Pulse"),
+        QObject::tr("A pulse of pressure 'pinged' to detect a closed airway."),
+        QObject::tr("PP"),
+        STR_UNIT_EventsPerHour,    DEFAULT,    QColor("dark red")));
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_FlexMode = 0xe105, SETTING,  MT_CPAP,  SESSION,
+        "PRS1FlexMode", QObject::tr("Flex Mode"),
+        QObject::tr("PRS1 pressure relief mode."),
+        QObject::tr("Flex Mode"),
+        "", LOOKUP, Qt::green));
+
+
+    chan->addOption(FLEX_None, STR_TR_None);
+    chan->addOption(FLEX_CFlex, QObject::tr("C-Flex"));
+    chan->addOption(FLEX_CFlexPlus, QObject::tr("C-Flex+"));
+    chan->addOption(FLEX_AFlex, QObject::tr("A-Flex"));
+    chan->addOption(FLEX_RiseTime, QObject::tr("Rise Time"));
+    chan->addOption(FLEX_BiFlex, QObject::tr("Bi-Flex"));
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_FlexLevel = 0xe106, SETTING, MT_CPAP,   SESSION,
+        "PRS1FlexSet",
+        QObject::tr("Flex Level"),
+        QObject::tr("PRS1 pressure relief setting."),
+        QObject::tr("Flex Level"),
+        "", LOOKUP, Qt::blue));
+
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, QObject::tr("x1"));
+    chan->addOption(2, QObject::tr("x2"));
+    chan->addOption(3, QObject::tr("x3"));
+    chan->addOption(4, QObject::tr("x4"));
+    chan->addOption(5, QObject::tr("x5"));
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_HumidStatus = 0xe101, SETTING, MT_CPAP, SESSION,
+        "PRS1HumidStat",
+        QObject::tr("Humidifier Status"),
+        QObject::tr("PRS1 humidifier connected?"),
+        QObject::tr("Humidifier Status"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, QObject::tr("Disconnected"));
+    chan->addOption(1, QObject::tr("Connected"));
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_HeatedTubing = 0xe10d, SETTING, MT_CPAP,  SESSION,
+        "PRS1HeatedTubing",
+        QObject::tr("Heated Tubing"),
+        QObject::tr("Heated Tubing Connected"),
+        QObject::tr("Headed Tubing"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, QObject::tr("Yes"));
+    chan->addOption(1, QObject::tr("No"));
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_HumidLevel = 0xe102, SETTING,  MT_CPAP,  SESSION,
+        "PRS1HumidLevel",
+        QObject::tr("Humidification Level"),
+        QObject::tr("PRS1 Humidification level"),
+        QObject::tr("Humid. Lvl."),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, QObject::tr("x1"));
+    chan->addOption(2, QObject::tr("x2"));
+    chan->addOption(3, QObject::tr("x3"));
+    chan->addOption(4, QObject::tr("x4"));
+    chan->addOption(5, QObject::tr("x5"));
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_SysOneResistStat = 0xe103, SETTING, MT_CPAP,   SESSION,
+        "SysOneResistStat",
+        QObject::tr("System One Resistance Status"),
+        QObject::tr("System One Resistance Status"),
+        QObject::tr("Sys1 Resist. Status"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, STR_TR_On);
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_SysOneResistSet = 0xe104, SETTING, MT_CPAP,   SESSION,
+        "SysOneResistSet",
+        QObject::tr("System One Resistance Setting"),
+        QObject::tr("System One Mask Resistance Setting"),
+        QObject::tr("Sys1 Resist. Set"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, QObject::tr("x1"));
+    chan->addOption(2, QObject::tr("x2"));
+    chan->addOption(3, QObject::tr("x3"));
+    chan->addOption(4, QObject::tr("x4"));
+    chan->addOption(5, QObject::tr("x5"));
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_HoseDiam = 0xe107, SETTING,  MT_CPAP,  SESSION,
+        "PRS1HoseDiam",
+        QObject::tr("Hose Diameter"),
+        QObject::tr("Diameter of primary CPAP hose"),
+        QObject::tr("Hose Diameter"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, QObject::tr("22mm"));
+    chan->addOption(1, QObject::tr("15mm"));
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_SysOneResistStat = 0xe108, SETTING,  MT_CPAP,  SESSION,
+        "SysOneLock",
+        QObject::tr("System One Resistance Lock"),
+        QObject::tr("Whether System One resistance settings are available to you."),
+        QObject::tr("Sys1 Resist. Lock"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, STR_TR_On);
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_AutoOn = 0xe109, SETTING, MT_CPAP,   SESSION,
+        "PRS1AutoOn",
+        QObject::tr("Auto On"),
+        QObject::tr("A few breaths automatically starts machine"),
+        QObject::tr("Auto On"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, STR_TR_On);
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_AutoOff = 0xe10a, SETTING, MT_CPAP,   SESSION,
+        "PRS1AutoOff",
+        QObject::tr("Auto Off"),
+        QObject::tr("Machine automatically switches off"),
+        QObject::tr("Auto Off"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, STR_TR_On);
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_MaskAlert = 0xe10b, SETTING,  MT_CPAP,  SESSION,
+        "PRS1MaskAlert",
+        QObject::tr("Mask Alert"),
+        QObject::tr("Whether or not machine allows Mask checking."),
+        QObject::tr("Mask Alert"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, STR_TR_On);
+
+    channel.add(GRP_CPAP, chan = new Channel(PRS1_MaskAlert = 0xe10c, SETTING, MT_CPAP,   SESSION,
+        "PRS1ShowAHI",
+        QObject::tr("Show AHI"),
+        QObject::tr("Whether or not machine shows AHI via LCD panel."),
+        QObject::tr("Show AHI"),
+        "", LOOKUP, Qt::green));
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, STR_TR_On);
+
+//    <channel id="0xe10e" class="setting" scope="!session" name="PRS1Mode" details="PAP Mode" label="PAP Mode" type="integer" link="0x1200">
+//     <Option id="0" value="CPAP"/>
+//     <Option id="1" value="Auto"/>
+//     <Option id="2" value="BIPAP"/>
+//     <Option id="3" value="AutoSV"/>
+//    </channel>
+
+    QString unknowndesc=QObject::tr("Unknown PRS1 Code %1");
+    QString unknownname=QObject::tr("PRS1_%1");
+    QString unknownshort=QObject::tr("PRS1_%1");
+
+    channel.add(GRP_CPAP, new Channel(PRS1_00 = 0x1150, UNKNOWN, MT_CPAP,    SESSION,
+        "PRS1_00",
+        QString(unknownname).arg(0,2,16,QChar('0')),
+        QString(unknowndesc).arg(0,2,16,QChar('0')),
+        QString(unknownshort).arg(0,2,16,QChar('0')),
+        STR_UNIT_Unknown,
+        DEFAULT,    QColor("black")));
+
+    channel.add(GRP_CPAP, new Channel(PRS1_01 = 0x1151, UNKNOWN,  MT_CPAP,   SESSION,
+        "PRS1_01",
+        QString(unknownname).arg(1,2,16,QChar('0')),
+        QString(unknowndesc).arg(1,2,16,QChar('0')),
+        QString(unknownshort).arg(1,2,16,QChar('0')),
+        STR_UNIT_Unknown,
+        DEFAULT,    QColor("black")));
+
+    channel.add(GRP_CPAP, new Channel(PRS1_08 = 0x1152, UNKNOWN, MT_CPAP,    SESSION,
+        "PRS1_08",
+        QString(unknownname).arg(8,2,16,QChar('0')),
+        QString(unknowndesc).arg(8,2,16,QChar('0')),
+        QString(unknownshort).arg(8,2,16,QChar('0')),
+        STR_UNIT_Unknown,
+        DEFAULT,    QColor("black")));
+
+    channel.add(GRP_CPAP, new Channel(PRS1_0A = 0x1154, UNKNOWN, MT_CPAP,    SESSION,
+        "PRS1_0A",
+        QString(unknownname).arg(0xa,2,16,QChar('0')),
+        QString(unknowndesc).arg(0xa,2,16,QChar('0')),
+        QString(unknownshort).arg(0xa,2,16,QChar('0')),
+        STR_UNIT_Unknown,
+        DEFAULT,    QColor("black")));
+    channel.add(GRP_CPAP, new Channel(PRS1_0B = 0x1155, UNKNOWN,  MT_CPAP,   SESSION,
+        "PRS1_0B",
+        QString(unknownname).arg(0xb,2,16,QChar('0')),
+        QString(unknowndesc).arg(0xb,2,16,QChar('0')),
+        QString(unknownshort).arg(0xb,2,16,QChar('0')),
+        STR_UNIT_Unknown,
+        DEFAULT,    QColor("black")));
+    channel.add(GRP_CPAP, new Channel(PRS1_0C = 0x1156, UNKNOWN,  MT_CPAP,   SESSION,
+        "PRS1_0C",
+        QString(unknownname).arg(0xc,2,16,QChar('0')),
+        QString(unknowndesc).arg(0xc,2,16,QChar('0')),
+        QString(unknownshort).arg(0xc,2,16,QChar('0')),
+        STR_UNIT_Unknown,
+        DEFAULT,    QColor("black")));
+    channel.add(GRP_CPAP, new Channel(PRS1_0E = 0x1157, UNKNOWN, MT_CPAP,    SESSION,
+        "PRS1_0E",
+        QString(unknownname).arg(0xe,2,16,QChar('0')),
+        QString(unknowndesc).arg(0xe,2,16,QChar('0')),
+        QString(unknownshort).arg(0xe,2,16,QChar('0')),
+        STR_UNIT_Unknown,
+        DEFAULT,    QColor("black")));
+//    channel.add(GRP_CPAP, new Channel(PRS1_12 = 0x1159, UNKNOWN,  MT_CPAP,   SESSION,
+//        "PRS1_12",
+//        QString(unknownname).arg(0x12,2,16,QChar('0')),
+//        QString(unknowndesc).arg(0x12,2,16,QChar('0')),
+//        QString(unknownshort).arg(0x12,2,16,QChar('0')),
+//        STR_UNIT_Unknown,
+//        DEFAULT,    QColor("black")));
+
+
+    channel.add(GRP_CPAP, new Channel(PRS1_TimedBreath = 0x1180, MINOR_FLAG, MT_CPAP,    SESSION,
+        "PRS1TimedBreath",
+        QObject::tr("Timed Breath"),
+        QObject::tr("Machine Initiated Breath"),
+        QObject::tr("TB"),
+        STR_UNIT_Unknown,
+        DEFAULT,    QColor("black")));
+}
+
+void PRS1Loader::Register()
+{
+    if (initialized) { return; }
+
+    qDebug() << "Registering PRS1Loader";
+    RegisterLoader(new PRS1Loader());
+    InitModelMap();
+    initialized = true;
+}
+
+/* Thanks SleepyCPAP :)
+CODE ERROR DESCRIPTION ERROR TYPE ERROR CATEGORY
+1 SOFTWARE STOP STOP General Errors
+2 Not Used General Errors
+3 INT RAM REBOOT General Errors
+4 NULL PTR REBOOT General Errors
+5 DATA REBOOT General Errors
+6 STATE MACHINE REBOOT General Errors
+7 SOFTWARE REBOOT General Errors
+8-9 Not Used General Errors
+10 WDOG TEST RAM REBOOT Watchdog & Timer Errors
+11 WDOG TEST REBOOT Watchdog & Timer Errors
+12 BACKGROUND WDOG NO CARD REBOOT Watchdog & Timer Errors
+13 BACKGROUND WDOG SD CARD REBOOT Watchdog & Timer Errors
+14 WDOG LOWRES TIMER REBOOT Watchdog & Timer Errors
+15 CYCLE HANDLER OVERRUN REBOOT Watchdog & Timer Errors
+16 RASP RESTORE TIMEOUT CONTINUE Watchdog & Timer Errors
+17 ONEMS HANDLER OVERRUN REBOOT Watchdog & Timer Errors
+18 Not Used Watchdog & Timer Errors
+19 WDOG TIMEOUT REBOOT Watchdog & Timer Errors
+20 MOTOR SPINUP FLUX LOW REBOOT Motor/Blower Errors
+21 MOTOR VBUS HIGH STOP Motor/Blower Errors
+22 MOTOR FLUX MAGNITUDE REBOOT Motor/Blower Errors
+23 MOTOR OVERSPEED REBOOT Motor/Blower Errors
+24 MOTOR SPEED REVERSE REBOOT Motor/Blower Errors
+25 MOTOR THERMISTOR OPEN CONTINUE Motor/Blower Errors
+26 MOTOR THERMISTOR SHORTED CONTINUE Motor/Blower Errors
+27 MOTOR RL NOCONVERGE STOP Motor/Blower Errors
+28 NEGATIVE QUADRATURE VOLTAGE VECTOR REBOOT Motor/Blower Errors
+29 VBUS GAIN ZERO: REBOOT Motor/Blower Errors
+30 MOTOR SPINUP FLUX HIGH REBOOT Motor/Blower Errors
+31 (incorrect power supply - 60series) Motor/Blower Errors
+32-39 Not Used Motor/Blower Errors
+40 NVRAM REBOOT NVRAM Low Level Errors
+41 STORAGE UNIT RAM REBOOT NVRAM Low Level Errors
+42 UNABLE TO OBTAIN BUS REBOOT NVRAM Low Level Errors
+43 NVRAM NO CALLBACK OCCURRED REBOOT NVRAM Low Level Errors
+44 NV BUFFER NULL REBOOT NVRAM Low Level Errors
+45 NV CALLBACK NULL REBOOT NVRAM Low Level Errors
+46 NV ZERO LENGTH REBOOT NVRAM Low Level Errors
+47 NVRAM INVALID BYTES XFRRED REBOOT NVRAM Low Level Errors
+48-49 Not Used NVRAM Low Level Errors
+50 DAILY VALUES CORRUPT LOG ONLY NVRAM Unit Related Errors
+51 CORRUPT COMPLIANCE LOG CONTINUE NVRAM Unit Related Errors
+52 CORRUPT COMPLIANCE CB CONTINUE NVRAM Unit Related Errors
+53 COMP LOG SEM TIMEOUT CONTINUE NVRAM Unit Related Errors
+54 COMPLOG REQS OVERFLOW REBOOT NVRAM Unit Related Errors
+55 THERAPY QUEUE FULL CONTINUE NVRAM Unit Related Errors
+56 COMPLOG PACKET STATUS REBOOT NVRAM Unit Related Errors
+57 SESS OBS QUEUE OVF REBOOT NVRAM Unit Related Errors
+58 SESS OBS NO CALLBACK REBOOT NVRAM Unit Related Errors
+59 Not Used NVRAM Unit Related Errors
+60 UNSUPPORTED HARDWARE REBOOT General Hardware Errors
+61 PLL UNLOCKED REBOOT General Hardware Errors
+62 STUCK RAMP KEY CONTINUE General Hardware Errors
+63 STUCK KNOB KEY CONTINUE General Hardware Errors
+64 DSP OVERTIME PWM REBOOT General Hardware Errors
+65 STUCK ENCODER A CONTINUE General Hardware Errors
+66 STUCK ENCODER B CONTINUE General Hardware Errors
+67-69 Not Used General Hardware Errors
+70 PRESSURE SENSOR ABSENT STOP Pressure Sensor Errors
+71 Not Used Pressure Sensor Errors
+72 PSENS UNABLE TO OBTAIN BUS REBOOT Pressure Sensor Errors
+73 SENSOR PRESS OFFSET STOP STOP Pressure Sensor Errors
+74-79 Not Used Pressure Sensor Errors
+80 UNABLE TO INIT FLOW SENSOR REBOOT Flow Sensor Errors
+81 FLOW SENSOR TABLE CONTINUE Flow Sensor Errors
+82 FLOW SENSOR OFFSET CONTINUE Flow Sensor Errors
+83 FSENS UNABLE TO OBTAIN BUS REBOOT / 2nd failure=STOP Flow Sensor Errors
+84 FLOW SENSOR STOP STOP Flow Sensor Errors
+85 FLOW SENSOR OCCLUDED CONTINUE Flow Sensor Errors
+86 FLOW SENSOR ABSENT CONTINUE Flow Sensor Errors
+87 FLOW SENSOR BUS CONTINUE Flow Sensor Errors
+88-89 Not Used Flow Sensor Errors
+90 OTP NOT CONFIGURED STOP OTP & RTC Errors
+91 OTP INCORRECTLY CONFIGURED STOP OTP & RTC Errors
+92 Not Used OTP & RTC Errors
+93 RTC VALUE CONTINUE OTP & RTC Errors
+94 RTC STOPPED CONTINUE OTP & RTC Errors
+95-99 Not Used OTP & RTC Errors
+100 HUMID NO HEAT CONTINUE Humidifier Errors
+101 HUMID TEMP MAX STOP Humidifier Errors
+102 THERMISTOR HIGH CONTINUE Humidifier Errors
+103 THERMISTOR LOW CONTINUE Humidifier Errors
+104 HUMID AMBIENT OFF CONTINUE Humidifier Errors
+105 HUMID AMBIENT COMM CONTINUE Humidifier Errors
+106-109 Not Used Humidifier Errors
+110 STACK REBOOT Stack & Exception Handler Errors
+111 EXCEPTION STACK OVERFLOW REBOOT Stack & Exception Handler Errors
+112 EXCEPTION STACK RESERVE LOG ONLY Stack & Exception Handler Errors
+113 EXCEPTION STACK UNDERFLOW REBOOT Stack & Exception Handler Errors
+114 FIQ STACK OVERFLOW REBOOT Stack & Exception Handler Errors
+115 FIQ STACK RESERVE LOG ONLY Stack & Exception Handler Errors
+116 FIQ STACK UNDERFLOW REBOOT Stack & Exception Handler Errors
+117 IRQ STACK OVERFLOW REBOOT Stack & Exception Handler Errors
+118 IRQ STACK RESERVE LOG ONLY Stack & Exception Handler Errors
+119 IRQ STACK UNDERFLOW REBOOT Stack & Exception Handler Errors
+120 SVC STACK OVERFLOW REBOOT Stack & Exception Handler Errors
+121 SVC STACK RESERVE LOG ONLY Stack & Exception Handler Errors
+122 SVC STACK UNDERFLOW REBOOT Stack & Exception Handler Errors
+123 DATA ABORT EXCEPTION REBOOT Stack & Exception Handler Errors
+124 PREFETCH EXCEPTION REBOOT Stack & Exception Handler Errors
+125 ILLEGAL INSTRUCTION EXCEPTION REBOOT Stack & Exception Handler Errors
+126 SWI ABORT EXCEPTION REBOOT Stack & Exception Handler Errors
+*/
+
diff --git a/sleepyhead/SleepLib/loader_plugins/prs1_loader.h b/sleepyhead/SleepLib/loader_plugins/prs1_loader.h
new file mode 100644
index 0000000..4667c03
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/prs1_loader.h
@@ -0,0 +1,225 @@
+/* SleepLib PRS1 Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef PRS1LOADER_H
+#define PRS1LOADER_H
+//#include <map>
+//using namespace std;
+#include "SleepLib/machine.h" // Base class: MachineLoader
+#include "SleepLib/machine_loader.h"
+#include "SleepLib/profiles.h"
+
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the following value when making changes to this loaders implementation.
+//
+const int prs1_data_version = 13;
+//
+//********************************************************************************************
+
+/*! \class PRS1
+    \brief PRS1 customized machine object (via CPAP)
+    */
+class PRS1: public CPAP
+{
+  public:
+    PRS1(MachineID id = 0);
+    virtual ~PRS1();
+};
+
+
+const int max_load_buffer_size = 1024 * 1024;
+const QString prs1_class_name = STR_MACH_PRS1;
+
+/*! \struct PRS1Waveform
+    \brief Used in PRS1 Waveform Parsing */
+struct PRS1Waveform {
+    PRS1Waveform(quint16 i, quint8 f) {
+        interleave = i;
+        sample_format = f;
+    }
+    quint16 interleave;
+    quint8 sample_format;
+};
+
+
+class PRS1DataChunk
+{
+    friend class PRS1DataGroup;
+public:
+    PRS1DataChunk() {
+        timestamp = 0;
+        ext = 255;
+        sessionid = 0;
+        htype = 0;
+        family = 0;
+        familyVersion = 0;
+        duration = 0;
+
+    }
+    ~PRS1DataChunk() {
+    }
+    inline int size() const { return m_data.size(); }
+
+    QByteArray m_data;
+
+    SessionID sessionid;
+
+    quint8 fileVersion;
+    quint8 ext;
+    quint8 htype;
+    quint8 family;
+    quint8 familyVersion;
+    quint32 timestamp;
+
+    quint16 duration;
+
+    QList<PRS1Waveform> waveformInfo;
+};
+
+class PRS1Loader;
+
+
+class PRS1Import:public ImportTask
+{
+public:
+    PRS1Import(PRS1Loader * l, SessionID s, Machine * m): loader(l), sessionid(s), mach(m) {
+        summary = nullptr;
+        compliance = nullptr;
+        event = nullptr;
+        session = nullptr;
+    }
+    virtual ~PRS1Import() {
+        delete compliance;
+        delete summary;
+        delete event;
+        for (int i=0;i < waveforms.size(); ++i) {delete waveforms.at(i); }
+    }
+
+    virtual void run();
+
+    PRS1DataChunk * compliance;
+    PRS1DataChunk * summary;
+    PRS1DataChunk * event;
+    QList<PRS1DataChunk *> waveforms;
+    QList<PRS1DataChunk *> oximetery;
+
+    QString wavefile;
+    QString oxifile;
+
+    bool ParseCompliance();
+    bool ParseSummary();
+    bool ParseEvents();
+    bool ParseWaveforms();
+    bool ParseOximetery();
+
+
+    bool ParseSummaryF0();
+    bool ParseSummaryF0V4();
+    bool ParseSummaryF3();
+    bool ParseSummaryF5V0();
+    bool ParseSummaryF5V1();
+
+
+    //! \brief Parse a single data chunk from a .002 file containing event data for a standard system one machine
+    bool ParseF0Events();
+
+    //! \brief Parse a single data chunk from a .002 file containing event data for a family 5 ASV machine (which has a different format)
+    bool ParseF5Events();
+
+protected:
+    Session * session;
+    PRS1Loader * loader;
+    SessionID sessionid;
+    Machine * mach;
+
+    int summary_duration;
+};
+
+/*! \class PRS1Loader
+    \brief Philips Respironics System One Loader Module
+    */
+class PRS1Loader : public CPAPLoader
+{
+  public:
+    PRS1Loader();
+    virtual ~PRS1Loader();
+
+    QString checkDir(const QString & path);
+    bool PeekProperties(MachineInfo & info, QString path, Machine * mach = nullptr);
+
+
+    //! \brief Detect if the given path contains a valid Folder structure
+    virtual bool Detect(const QString & path);
+
+    virtual MachineInfo PeekInfo(const QString & path);
+
+    //! \brief Scans directory path for valid PRS1 signature
+    virtual int Open(QString path);
+
+    //! \brief Returns the database version of this loader
+    virtual int Version() { return prs1_data_version; }
+
+    //! \brief Return the loaderName, in this case "PRS1"
+    virtual const QString &loaderName() { return prs1_class_name; }
+
+    QList<PRS1DataChunk *> ParseFile(QString path);
+
+    //! \brief Register this Module to the list of Loaders, so it knows to search for PRS1 data.
+    static void Register();
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_CPAP, 0, prs1_class_name, QObject::tr("Philips Respironics"), QString(), QString(), QString(), QObject::tr("System One"), QDateTime::currentDateTime(), prs1_data_version);
+    }
+
+
+    virtual QString PresReliefLabel() { return QObject::tr(""); }
+    virtual ChannelID PresReliefMode() { return PRS1_FlexMode; }
+    virtual ChannelID PresReliefLevel() { return PRS1_FlexLevel; }
+
+    virtual ChannelID HumidifierConnected() { return PRS1_HumidStatus; }
+    virtual ChannelID HumidifierLevel() { return PRS1_HumidLevel; }
+
+    void initChannels();
+
+
+    QHash<SessionID, PRS1Import*> sesstasks;
+
+  protected:
+    QString last;
+    QHash<QString, Machine *> PRS1List;
+
+    //! \brief Opens the SD folder structure for this machine, scans for data files and imports any new sessions
+    int OpenMachine(QString path);
+
+//    //! \brief Parses "properties.txt" file containing machine information
+//    bool ParseProperties(Machine *m, QString filename);
+
+    //! \brief Parse a .005 waveform file, extracting Flow Rate waveform (and Mask Pressure data if available)
+    bool OpenWaveforms(SessionID sid, QString filename);
+
+    //! \brief Parse a data chunk from the .000 (brick) and .001 (summary) files.
+    bool ParseSummary(Machine *mach, qint32 sequence, quint32 timestamp, unsigned char *data,
+                      quint16 size, int family, int familyVersion);
+
+
+
+    //! \brief Open a PRS1 data file, and break into data chunks, delivering them to the correct parser.
+    bool OpenFile(Machine *mach, QString filename);
+
+    QHash<SessionID, Session *> extra_session;
+
+    //! \brief PRS1 Data files can store multiple sessions, so store them in this list for later processing.
+    QHash<SessionID, Session *> new_sessions;
+
+    qint32 summary_duration;
+};
+
+#endif // PRS1LOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp b/sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp
new file mode 100644
index 0000000..779211c
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp
@@ -0,0 +1,3229 @@
+/* SleepLib ResMed Loader Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QApplication>
+#include <QString>
+#include <QDateTime>
+#include <QDir>
+#include <QFile>
+#include <QMessageBox>
+#include <QProgressBar>
+#include <QTextStream>
+#include <QDebug>
+#include <cmath>
+
+#include "resmed_loader.h"
+#include "SleepLib/session.h"
+#include "SleepLib/calcs.h"
+
+#ifdef DEBUG_EFFICIENCY
+#include <QElapsedTimer>  // only available in 4.8
+#endif
+
+extern QProgressBar *qprogress;
+
+QHash<QString, QList<quint16> > Resmed_Model_Map;
+
+const QString STR_UnknownModel = "Resmed S9 ???";
+
+ChannelID RMS9_EPR, RMS9_EPRLevel, RMS9_Mode;
+
+const QString STR_ResMed_AirSense10 = "AirSense 10";
+const QString STR_ResMed_S9 = "S9";
+
+
+
+// Return the model name matching the supplied model number.
+const QString & lookupModel(quint16 model)
+{
+
+    QHash<QString, QList<quint16> >::iterator end = Resmed_Model_Map.end();
+    for (QHash<QString, QList<quint16> >::iterator it = Resmed_Model_Map.begin(); it != end; ++it) {
+        QList<quint16> & list = it.value();
+        for (int i=0; i < list.size(); ++i) {
+            if (list.at(i) == model) {
+                return it.key();
+            }
+        }
+    }
+    return STR_UnknownModel;
+}
+
+QHash<ChannelID, QStringList> resmed_codes;
+
+const QString STR_ext_TGT = "tgt";
+const QString STR_ext_CRC = "crc";
+const QString STR_ext_EDF = "edf";
+const QString STR_ext_gz = ".gz";
+
+
+// Looks up foreign language Signal names that match this channelID
+EDFSignal *EDFParser::lookupSignal(ChannelID ch)
+{
+    // Get list of all known foreign language names for this channel
+    QHash<ChannelID, QStringList>::iterator channames = resmed_codes.find(ch);
+
+    if (channames == resmed_codes.end()) {
+        // no alternatives strings found for this channel
+        return nullptr;
+    }
+
+    // This is bad, because ResMed thinks it was a cool idea to use two channels with the same name.
+
+    // Scan through EDF's list of signals to see if any match
+    for (int i = 0; i < channames.value().size(); i++) {
+        EDFSignal *sig = lookupLabel(channames.value()[i]);
+        if (sig) return sig;
+    }
+
+    // Failed
+    return nullptr;
+}
+
+// Check if given string matches any alternative signal names for this channel
+bool matchSignal(ChannelID ch, const QString & name)
+{
+    QHash<ChannelID, QStringList>::iterator channames = resmed_codes.find(ch);
+
+    if (channames == resmed_codes.end()) {
+        return false;
+    }
+
+    QStringList & strings = channames.value();
+    int size = strings.size();
+
+    for (int i=0; i < size; ++i) {
+        // Using starts with, because ResMed is very lazy about consistency
+        if (name.startsWith(strings.at(i), Qt::CaseInsensitive)) {
+                return true;
+        }
+    }
+    return false;
+}
+
+EDFSignal *EDFParser::lookupLabel(QString name, int index)
+{
+    QHash<QString, QList<EDFSignal *> >::iterator it = signalList.find(name);
+
+    if (it == signalList.end()) return nullptr;
+
+    if (index >= it.value().size()) return nullptr;
+
+    return it.value()[index];
+}
+
+EDFParser::EDFParser(QString name)
+{
+    buffer = nullptr;
+    Open(name);
+}
+EDFParser::~EDFParser()
+{
+    for (QVector<EDFSignal>::iterator s = edfsignals.begin(); s != edfsignals.end(); s++) {
+        if ((*s).data) { delete [](*s).data; }
+    }
+
+    if (buffer) { delete [] buffer; }
+}
+
+void ResmedLoader::ParseSTR(Machine *mach, QStringList strfiles)
+{
+    QStringList::iterator strend = strfiles.end();
+    for (QStringList::iterator it = strfiles.begin(); it != strend; ++it) {
+        EDFParser str(*it);
+        if (!str.Parse()) continue;
+        if (mach->serial() != str.serialnumber) {
+            qDebug() << "Trying to import a STR.edf from another machine, skipping" << mach->serial() << str.serialnumber;
+            qDebug() << (*it);
+            continue;
+        }
+
+        QDateTime start = QDateTime::fromMSecsSinceEpoch(str.startdate);
+        QDate date = start.date();
+
+        qDebug() << "Parsing" << *it << date << str.GetNumDataRecords() << str.GetNumSignals();
+
+        EDFSignal *maskon = str.lookupLabel("Mask On");
+        if (!maskon) {
+            maskon = str.lookupLabel("MaskOn");
+        }
+        EDFSignal *maskoff = str.lookupLabel("Mask Off");
+        if (!maskoff) {
+             maskoff = str.lookupLabel("MaskOff");
+        }
+        EDFSignal *sig = nullptr;
+        quint32 laston = 0;
+
+        bool skipday;
+
+        int size = str.GetNumDataRecords();
+        int cnt=0;
+        QDateTime dt = start;
+
+        // For each data record, representing 1 day each
+        for (int rec = 0; rec < str.GetNumDataRecords(); ++rec) {
+            uint timestamp = dt.toTime_t();
+            int recstart = rec * maskon->nr;
+
+            skipday = false;
+            if ((++cnt % 10) == 0) {
+                // TODO: Change me to emit once MachineLoader is QObjectified...
+                if (qprogress) { qprogress->setValue(10.0 + (float(cnt) / float(size) * 90.0)); }
+
+                QApplication::processEvents();
+            }
+
+            // Scan the mask on/off events
+            for (int s = 0; s < maskon->nr; ++s) {
+                qint32 on = maskon->data[recstart+s];
+                qint32 off = maskoff->data[recstart+s];
+                quint32 ontime = timestamp + on * 60;
+                quint32 offtime = timestamp + off * 60;
+
+                // -1 marks empty record, but can start with mask off, if sleep crosses noon
+                if (on < 0) {
+                    if (off < 0) continue;  // Both are -1, skip the rest of this day
+                    // laston stops on this record
+
+                    QMap<quint32, STRRecord>::iterator si = strsess.find(laston);
+                    if (si != strsess.end()) {
+                        if (si.value().maskoff == 0) {
+                            if (offtime > laston) {
+                                si.value().maskoff = offtime;
+                            }
+                        } else {
+                            if (si.value().maskoff != offtime) {
+                                // not sure why this happens.
+                                qDebug() << "WTF?? mask off's don't match"
+                                        << QDateTime::fromTime_t(laston).toString()
+                                        << QDateTime::fromTime_t(si.value().maskoff).toString()
+                                        << "!=" << QDateTime::fromTime_t(offtime).toString();
+                            }
+                            //Q_ASSERT(si.value().maskoff == offtime);
+                        }
+                    }
+                    continue;
+                }
+
+                QMap<quint32, STRRecord>::iterator sid = strsess.find(ontime);
+                // Record already exists?
+                if (sid != strsess.end()) {
+                    // then skip
+                    laston = ontime;
+                    continue;
+                }
+
+                // For every mask on, there will be a session within 1 minute either way
+                // We can use that for data matching
+                STRRecord R;
+
+                R.maskon = ontime;
+                if (offtime > 0) {
+                    R.maskoff = offtime;
+                }
+                CPAPMode mode = MODE_UNKNOWN;
+
+                if ((sig = str.lookupSignal(CPAP_Mode))) {
+                    int mod = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                    R.rms9_mode = mod;
+
+                    if (mod == 11) {
+                        mode = MODE_APAP;
+                    } else if (mod >= 8) {       // mod 8 == vpap adapt variable epap
+                        mode = MODE_ASV_VARIABLE_EPAP;
+                    } else if (mod >= 7) {       // mod 7 == vpap adapt
+                        mode = MODE_ASV;
+                    } else if (mod >= 6) { // mod 6 == vpap auto (Min EPAP, Max IPAP, PS)
+                        mode = MODE_BILEVEL_AUTO_FIXED_PS;
+                    } else if (mod >= 3) {// mod 3 == vpap s fixed pressure (EPAP, IPAP, No PS)
+                        mode = MODE_BILEVEL_FIXED;
+                        // 4,5 are S/T types...
+
+                    } else if (mod >= 1) {
+                        mode = MODE_APAP; // mod 1 == apap
+                        // not sure what mode 2 is ?? split ?
+                    } else {
+                        mode = MODE_CPAP; // mod 0 == cpap
+                    }
+                    R.mode = mode;
+
+                    if ((mod == 0) && (sig = str.lookupLabel("S.C.StartPress"))) {
+                        R.ramp_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                    }
+                    if (((mod == 1) || (mod == 11)) && (sig = str.lookupLabel("S.AS.StartPress"))) {
+                        R.ramp_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                    }
+                }
+
+
+                if ((sig = str.lookupLabel("Mask Dur"))) {
+                    R.maskdur = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+
+
+                if ((sig = str.lookupLabel("Leak Med"))) {
+                    float gain = sig->gain * 60.0;
+                    R.leakgain = gain;
+                    R.leakmed = EventDataType(sig->data[rec]) * gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("Leak Max"))) {
+                    float gain = sig->gain * 60.0;
+                    R.leakgain = gain;
+                    R.leakmax = EventDataType(sig->data[rec]) * gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("Leak 95"))) {
+                    float gain = sig->gain * 60.0;
+                    R.leakgain = gain;
+                    R.leak95 = EventDataType(sig->data[rec]) * gain + sig->offset;
+                }
+
+
+                if ((sig = str.lookupSignal(CPAP_PressureMax))) {
+                    R.max_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupSignal(CPAP_PressureMin))) {
+                    R.min_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupSignal(RMS9_SetPressure))) {
+                    R.set_pressure = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupSignal(CPAP_EPAP))) {
+                    R.epap = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupSignal(CPAP_EPAPHi))) {
+                    R.max_epap = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupSignal(CPAP_EPAPLo))) {
+                    R.min_epap = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                bool haveipap = false;
+                if ((sig = str.lookupSignal(CPAP_IPAP))) {
+                    R.ipap = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                    haveipap = true;
+                }
+                if ((sig = str.lookupSignal(CPAP_IPAPHi))) {
+                    R.max_ipap = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                    haveipap = true;
+                }
+                if ((sig = str.lookupSignal(CPAP_IPAPLo))) {
+                    R.min_ipap = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                    haveipap = true;
+                }
+                if ((sig = str.lookupSignal(CPAP_PS))) {
+                    R.ps = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+
+
+                // Okay, problem here: THere are TWO PSMin & MAX values on the 36037 with the same string
+                // One is for ASV mode, and one is for ASVAuto
+                int psvar = (mode == MODE_ASV_VARIABLE_EPAP) ? 1 : 0;
+                if ((sig = str.lookupLabel("Max PS", psvar))) {
+                    R.max_ps = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("Min PS", psvar))) {
+                    R.min_ps = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+
+
+                if (!haveipap) {
+                }
+
+                if (mode == MODE_ASV_VARIABLE_EPAP) {
+                    R.min_ipap = R.min_epap + R.min_ps;
+                    R.max_ipap = R.max_epap + R.max_ps;
+                } else if (mode == MODE_ASV) {
+                    R.min_ipap = R.epap + R.min_ps;
+                    R.max_ipap = R.epap + R.max_ps;
+                }
+
+                EventDataType epr = -1, epr_level = -1;
+                if ((sig = str.lookupSignal(RMS9_EPR))) {
+                    epr= EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupSignal(RMS9_EPRLevel))) {
+                    epr_level= EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+
+                if ((sig = str.lookupLabel("S.EPR.EPRType"))) {
+                    epr = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                    epr += 1;
+                }
+
+
+
+                if ((epr >= 0) && (epr_level >= 0)) {
+                    R.epr_level = epr_level;
+                    R.epr = epr;
+                } else {
+                    if (epr >= 0) {
+                        static bool warn=false;
+                        if (!warn) { // just nag once
+                            qDebug() << "If you can read this, please tell Jedimark you found a ResMed with EPR but no EPR_LEVEL so he can remove this warning";
+                            warn = true;
+                        }
+
+                        R.epr = (epr > 0) ? 1 : 0;
+                        R.epr_level = epr;
+                    } else if (epr_level >= 0) {
+                        R.epr_level = epr_level;
+                        R.epr = (epr_level > 0) ? 1 : 0;
+                    }
+                }
+
+
+
+                if ((sig = str.lookupLabel("AHI"))) {
+                    R.ahi = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("AI"))) {
+                    R.ai = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("HI"))) {
+                    R.hi = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("UAI"))) {
+                    R.uai = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("CAI"))) {
+                    R.cai = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+
+
+                if ((sig = str.lookupLabel("S.RampTime"))) {
+                    R.s_RampTime = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.RampEnable"))) {
+                    R.s_RampEnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.EPR.ClinEnable"))) {
+                    R.s_EPR_ClinEnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.EPR.EPREnable"))) {
+                    R.s_EPREnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+
+                if ((sig = str.lookupLabel("S.ABFilter"))) {
+                    R.s_ABFilter = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+
+                if ((sig = str.lookupLabel("S.ClimateControl"))) {
+                    R.s_ClimateControl = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+
+                if ((sig = str.lookupLabel("S.Mask"))) {
+                    R.s_Mask = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.PtAccess"))) {
+                    R.s_PtAccess = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.SmartStart"))) {
+                    R.s_SmartStart = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.HumEnable"))) {
+                    R.s_HumEnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.HumLevel"))) {
+                    R.s_HumLevel = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.TempEnable"))) {
+                    R.s_TempEnable = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.Temp"))) {
+                    R.s_Temp = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+                if ((sig = str.lookupLabel("S.Tube"))) {
+                    R.s_Tube = EventDataType(sig->data[rec]) * sig->gain + sig->offset;
+                }
+
+                laston = ontime;
+
+                QDateTime dontime = QDateTime::fromTime_t(ontime);
+                date = dontime.date();
+                R.date = date;
+
+                //CHECKME: Should I be taking noon day split time into account here?
+                strdate[date].push_back(&strsess.insert(ontime, R).value());
+
+                //QDateTime dofftime = QDateTime::fromTime_t(offtime);
+                //qDebug() << "Mask on" << dontime << "Mask off" << dofftime;
+            }
+
+            // Wait... ResMed has a DST bug here...should I be replicating it by using multiples of 86400 seconds?
+            dt = dt.addDays(1);
+        }
+    }
+}
+
+// Read a 16 bits integer
+qint16 EDFParser::Read16()
+{
+    if ((pos + 2) > filesize) {
+        return 0;
+    }
+
+#ifdef Q_LITTLE_ENDIAN
+    // Intel, etc...
+    qint16 res = *(qint16 *)&buffer[pos];
+#else
+    // ARM, PPC, etc..
+    qint16 res = quint8(buffer[pos]) | (qint8(buffer[pos+1]) << 8);
+#endif
+
+    pos += 2;
+    return res;
+}
+
+QString EDFParser::Read(unsigned n)
+{
+    if ((pos + long(n)) > filesize) {
+        return "";
+    }
+
+    QByteArray buf(&buffer[pos], n);
+    pos+=n;
+
+    return buf.trimmed();
+}
+bool EDFParser::Parse()
+{
+    bool ok;
+    QString temp, temp2;
+
+    version = QString::fromLatin1(header.version, 8).toLong(&ok);
+
+    if (!ok) {
+        return false;
+    }
+
+    //patientident=QString::fromLatin1(header.patientident,80);
+    recordingident = QString::fromLatin1(header.recordingident, 80); // Serial number is in here..
+    int snp = recordingident.indexOf("SRN=");
+    serialnumber.clear();
+    /*char * idx=index(header.recordingident,'=');
+    idx++;
+    for (int i=0;i<16;++i) {
+        if (*idx==0x20) break;
+        serialnumber+=*idx;
+        ++idx;
+    } */
+
+    for (int i = snp + 4; i < recordingident.length(); i++) {
+        if (recordingident[i] == ' ') {
+            break;
+        }
+
+        serialnumber += recordingident[i];
+    }
+
+    QDateTime startDate = QDateTime::fromString(QString::fromLatin1(header.datetime, 16), "dd.MM.yyHH.mm.ss");
+    //startDate.toTimeSpec(Qt::UTC);
+
+    QDate d2 = startDate.date();
+
+    if (d2.year() < 2000) {
+        d2.setDate(d2.year() + 100, d2.month(), d2.day());
+        startDate.setDate(d2);
+    }
+
+    if (!startDate.isValid()) {
+        qDebug() << "Invalid date time retreieved parsing EDF File " << filename;
+        return false;
+    }
+
+    startdate = qint64(startDate.toTime_t()) * 1000L;
+    //startdate-=timezoneOffset();
+
+    //qDebug() << startDate.toString("yyyy-MM-dd HH:mm:ss");
+
+    num_header_bytes = QString::fromLatin1(header.num_header_bytes, 8).toLong(&ok);
+
+    if (!ok) {
+        return false;
+    }
+
+    //reserved44=QString::fromLatin1(header.reserved,44);
+    num_data_records = QString::fromLatin1(header.num_data_records, 8).toLong(&ok);
+
+    if (!ok) {
+        return false;
+    }
+
+    dur_data_record = (QString::fromLatin1(header.dur_data_records, 8).toDouble(&ok) * 1000.0L);
+
+    if (!ok) {
+        return false;
+    }
+
+    num_signals = QString::fromLatin1(header.num_signals, 4).toLong(&ok);
+
+    if (!ok) {
+        return false;
+    }
+
+    enddate = startdate + dur_data_record * qint64(num_data_records);
+    // if (dur_data_record==0)
+    //   return false;
+
+    // this could be loaded quicker by transducer_type[signal] etc..
+
+    // Initialize fixed-size signal list.
+    edfsignals.resize(num_signals);
+
+    for (int i = 0; i < num_signals; i++) {
+        EDFSignal &sig = edfsignals[i];
+        sig.data = nullptr;
+        sig.label = Read(16);
+
+        signal_labels.push_back(sig.label);
+        signalList[sig.label].push_back(&sig);
+        signal.push_back(&sig);
+    }
+
+    for (int i = 0; i < num_signals; i++) { edfsignals[i].transducer_type = Read(80); }
+
+    for (int i = 0; i < num_signals; i++) { edfsignals[i].physical_dimension = Read(8); }
+
+    for (int i = 0; i < num_signals; i++) { edfsignals[i].physical_minimum = Read(8).toDouble(&ok); }
+
+    for (int i = 0; i < num_signals; i++) { edfsignals[i].physical_maximum = Read(8).toDouble(&ok); }
+
+    for (int i = 0; i < num_signals; i++) { edfsignals[i].digital_minimum = Read(8).toDouble(&ok); }
+
+    for (int i = 0; i < num_signals; i++) {
+        EDFSignal &e = edfsignals[i];
+        e.digital_maximum = Read(8).toDouble(&ok);
+        e.gain = (e.physical_maximum - e.physical_minimum) / (e.digital_maximum - e.digital_minimum);
+        e.offset = 0;
+    }
+
+    for (int i = 0; i < num_signals; i++) { edfsignals[i].prefiltering = Read(80); }
+
+    for (int i = 0; i < num_signals; i++) { edfsignals[i].nr = Read(8).toLong(&ok); }
+
+    for (int i = 0; i < num_signals; i++) { edfsignals[i].reserved = Read(32); }
+
+    // allocate the buffers
+    for (int i = 0; i < num_signals; i++) {
+        //qDebug//cout << "Reading signal " << signals[i]->label << endl;
+        EDFSignal &sig = edfsignals[i];
+
+        long recs = sig.nr * num_data_records;
+
+        if (num_data_records < 0) {
+            sig.data = nullptr;
+            continue;
+        }
+
+        sig.data = new qint16 [recs];
+        sig.pos = 0;
+    }
+
+    for (int x = 0; x < num_data_records; x++) {
+        for (int i = 0; i < num_signals; i++) {
+            EDFSignal &sig = edfsignals[i];
+#ifdef Q_LITTLE_ENDIAN
+            // Intel x86, etc..
+            memcpy((char *)&sig.data[sig.pos], (char *)&buffer[pos], sig.nr * 2);
+            sig.pos += sig.nr;
+            pos += sig.nr * 2;
+#else
+            // Big endian safe
+            for (int j=0;j<sig.nr;j++) {
+                qint16 t=Read16();
+                sig.data[sig.pos++]=t;
+            }
+#endif
+        }
+    }
+
+    return true;
+}
+bool EDFParser::Open(QString name)
+{
+    Q_ASSERT(buffer == nullptr);
+
+    if (name.endsWith(STR_ext_gz)) {
+        // Open and decempress file to buffer
+
+        filename = name.mid(0, -3);
+
+        // Get file length from inside gzip file
+        QFile fi(name);
+
+        if (!fi.open(QFile::ReadOnly) || !fi.seek(fi.size() - 4)) {
+            goto badfile;
+        }
+
+        unsigned char ch[4];
+        fi.read((char *)ch, 4);
+        filesize = ch[0] | (ch [1] << 8) | (ch[2] << 16) | (ch[3] << 24);
+
+        datasize = filesize - EDFHeaderSize;
+        if (datasize < 0) {
+            goto badfile;
+        }
+
+        // Open gzip file for reading
+        gzFile f = gzopen(name.toLatin1(), "rb");
+        if (!f) {
+            goto badfile;
+        }
+
+        // Decompressed header and data block
+        gzread(f, (char *)&header, EDFHeaderSize);
+        buffer = new char [datasize];
+        gzread(f, buffer, datasize);
+        gzclose(f);
+    } else {
+
+        // Open and read uncompressed file
+        QFile f(name);
+
+        if (!f.open(QIODevice::ReadOnly)) {
+            goto badfile;
+        }
+
+        filename = name;
+        filesize = f.size();
+        datasize = filesize - EDFHeaderSize;
+
+        if (datasize < 0) {
+            goto badfile;
+        }
+
+        f.read((char *)&header, EDFHeaderSize);
+
+        buffer = new char [datasize];
+        f.read(buffer, datasize);
+        f.close();
+    }
+
+    pos = 0;
+    return true;
+
+badfile:
+    qDebug() << "EDFParser::Open() Couldn't open file" << name;
+    return false;
+}
+
+
+void ResmedImport::run()
+{
+    loader->saveMutex.lock();
+
+    Session * sess = mach->SessionExists(sessionid);
+    if (sess) {
+        if (sess->summaryOnly()) {
+            // Reuse this session
+            sess->wipeSummary();
+        } else {
+            // Already imported
+            loader->saveMutex.unlock();
+            return;
+        }
+    } else {
+        // Could be importing from an older backup.. if so, destroy the summary only records
+        quint32 key = int(sessionid / 60) * 60;
+
+        sess = mach->SessionExists(key);
+        if (sess) {
+            if (sess->summaryOnly()) {
+
+                sess->Destroy();
+                delete sess;
+            }
+        }
+
+        // Create the session
+        sess = new Session(mach, sessionid);
+    }
+    loader->saveMutex.unlock();
+
+    Q_FOREACH(QString file, files[EDF_PLD]) {
+        loader->LoadPLD(sess, file);
+#ifdef SESSION_DEBUG
+        sess->session_files.append(file);
+#endif
+    }
+    Q_FOREACH(QString file, files[EDF_BRP]) {
+        loader->LoadBRP(sess, file);
+#ifdef SESSION_DEBUG
+        sess->session_files.append(file);
+#endif
+    }
+    Q_FOREACH(QString file, files[EDF_SAD]) {
+        loader->LoadSAD(sess, file);
+#ifdef SESSION_DEBUG
+        sess->session_files.append(file);
+#endif
+    }
+
+    Q_FOREACH(QString file, files[EDF_CSL]) {
+        loader->LoadCSL(sess, file);
+#ifdef SESSION_DEBUG
+        sess->session_files.append(file);
+#endif
+    }
+
+    bool haveeve = false;
+    Q_FOREACH(QString file, files[EDF_EVE]) {
+        loader->LoadEVE(sess, file);
+#ifdef SESSION_DEBUG
+        sess->session_files.append(file);
+#endif
+        haveeve = true;
+    }
+
+    if (!haveeve) {
+        sess->AddEventList(CPAP_Obstructive, EVL_Event);
+        sess->AddEventList(CPAP_ClearAirway, EVL_Event);
+        sess->AddEventList(CPAP_Apnea, EVL_Event);
+        sess->AddEventList(CPAP_Hypopnea, EVL_Event);
+    }
+
+
+    if (sess->first() == 0) {
+       // loader->saveMutex.lock();
+
+        //if (mach->sessionlist.contains(sess->session())) {
+       // sess->Destroy();
+            //mach->sessionlist.remove(sess->session());
+        //}
+        delete sess;
+        //loader->saveMutex.unlock();
+        return;
+    }
+
+    sess->setSummaryOnly(false);
+    sess->SetChanged(true);
+
+    /////////////////////////////////////////////////////////////////////////////////
+    // Process STR.edf now all valid Session data is imported
+    /////////////////////////////////////////////////////////////////////////////////
+
+    quint32 key = quint32(sessionid / 60) * 60; // round to 1 minute
+
+    QMap<quint32, STRRecord>::iterator strsess_end = loader->strsess.end();
+    QMap<quint32, STRRecord>::iterator it = loader->strsess.find(key);
+
+    if (it == strsess_end) {
+        // ResMed merges mask on/off groups that are less than a minute apart
+        // this means have to jump back to the last session closest.
+
+        it = loader->strsess.lowerBound(key);
+        if (it != loader->strsess.begin()) it--;
+    }
+
+    if (it != strsess_end) {
+        STRRecord & R = it.value();
+
+        // calculate the time between session record and mask-on record.
+        int gap = sessionid - R.maskon;
+
+        if (gap > 3600*6) {
+            QDateTime dt = QDateTime::fromTime_t(sessionid);
+            QDateTime rt = QDateTime::fromTime_t(R.maskon);
+
+            QString msg = QString("Warning: Closest matching STR record for %1 is %2 by %3 seconds").
+                    arg(dt.toString(Qt::ISODate)).
+                    arg(sess->length() / 1000.0L,0,'f',1).
+                    arg(gap);
+            qDebug() << msg;
+        }
+
+
+        // Claim this session
+        R.sessionid = sessionid;
+
+
+        // Save maskon time in session setting so we can use it later to avoid doubleups.
+        sess->settings[RMS9_MaskOnTime] = R.maskon;
+
+#ifdef SESSION_DEBUG
+        sess->session_files.append("STR.edf");
+#endif
+
+        if (R.mode >= 0) {
+            sess->settings[CPAP_Mode] = R.mode;
+            sess->settings[RMS9_Mode] = R.rms9_mode;
+            if (R.mode == MODE_CPAP) {
+                if (R.set_pressure >= 0) {
+                    sess->settings[CPAP_Pressure] = R.set_pressure;
+                }
+            } else if (R.mode == MODE_APAP) {
+                if (R.min_pressure >= 0) sess->settings[CPAP_PressureMin] = R.min_pressure;
+                if (R.max_pressure >= 0) sess->settings[CPAP_PressureMax] = R.max_pressure;
+            } else if (R.mode == MODE_BILEVEL_FIXED) {
+                if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap;
+                if (R.ipap >= 0) sess->settings[CPAP_IPAP] = R.ipap;
+                if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps;
+            } else if (R.mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+                if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap;
+                if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap;
+                if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps;
+            } else if (R.mode == MODE_ASV) {
+                if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap;
+                if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps;
+                if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps;
+                if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap;
+            } else if (R.mode == MODE_ASV_VARIABLE_EPAP) {
+                if (R.max_epap >= 0) sess->settings[CPAP_EPAPHi] = R.max_epap;
+                if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap;
+                if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap;
+                if (R.min_ipap >= 0) sess->settings[CPAP_IPAPLo] = R.min_ipap;
+                if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps;
+                if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps;
+            }
+        } else {
+            if (R.set_pressure >= 0) sess->settings[CPAP_Pressure] = R.set_pressure;
+            if (R.min_pressure >= 0) sess->settings[CPAP_PressureMin] = R.min_pressure;
+            if (R.max_pressure >= 0) sess->settings[CPAP_PressureMax] = R.max_pressure;
+            if (R.max_epap >= 0) sess->settings[CPAP_EPAPHi] = R.max_epap;
+            if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap;
+            if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap;
+            if (R.min_ipap >= 0) sess->settings[CPAP_IPAPLo] = R.min_ipap;
+            if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps;
+            if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps;
+            if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps;
+            if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap;
+            if (R.ipap >= 0) sess->settings[CPAP_IPAP] = R.ipap;
+        }
+
+        if (R.epr >= 0) {
+            sess->settings[RMS9_EPR] = (int)R.epr;
+            if (R.epr > 0) {
+                if (R.epr_level >= 0) {
+                    sess->settings[RMS9_EPRLevel] = (int)R.epr_level;
+                }
+            }
+
+        }
+
+        // Ignore all the rest of the sumary data, because there is enough available to calculate it with higher accuracy.
+
+        if (sess->length() > 0) {
+            loader->addSession(sess);
+        } else {
+            delete sess;
+            return;
+        }
+    }
+
+    // Update indexes, process waveform and perform flagging
+    sess->UpdateSummaries();
+
+    // Save is not threadsafe
+    loader->saveMutex.lock();
+    sess->Store(mach->getDataPath());
+    loader->saveMutex.unlock();
+
+    // Free the memory used by this session
+    sess->TrashEvents();
+}
+
+ResmedLoader::ResmedLoader()
+{
+    const QString RMS9_ICON = ":/icons/rms9.png";
+    const QString RM10_ICON = ":/icons/rms9.png";
+
+    m_pixmaps[STR_ResMed_S9] = QPixmap(RMS9_ICON);
+    m_pixmaps[STR_ResMed_AirSense10] = QPixmap(RM10_ICON);
+    m_pixmap_paths[STR_ResMed_S9] = RMS9_ICON;
+    m_pixmap_paths[STR_ResMed_AirSense10] = RM10_ICON;
+
+    m_type = MT_CPAP;
+}
+ResmedLoader::~ResmedLoader()
+{
+}
+
+void ResmedImportStage2::run()
+{
+    if (R.maskon == R.maskoff) return;
+    Session * sess = new Session(mach, R.maskon);
+
+
+    sess->really_set_first(qint64(R.maskon) * 1000L);
+    sess->really_set_last(qint64(R.maskoff) * 1000L);
+
+    // Claim this record for future imports
+    sess->settings[RMS9_MaskOnTime] = R.maskon;
+    sess->setSummaryOnly(true);
+
+#ifdef SESSION_DEBUG
+    sess->session_files.append("STR.edf");
+#endif
+    sess->SetChanged(true);
+
+    // First take the settings
+
+    if (R.mode >= 0) {
+        sess->settings[CPAP_Mode] = R.mode;
+        sess->settings[RMS9_Mode] = R.rms9_mode;
+
+        if (R.mode == MODE_CPAP) {
+            if (R.set_pressure >= 0) {
+                sess->settings[CPAP_Pressure] = R.set_pressure;
+            }
+        } else if (R.mode == MODE_APAP) {
+            if (R.min_pressure >= 0) sess->settings[CPAP_PressureMin] = R.min_pressure;
+            if (R.max_pressure >= 0) sess->settings[CPAP_PressureMax] = R.max_pressure;
+        } else if (R.mode == MODE_BILEVEL_FIXED) {
+            if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap;
+            if (R.ipap >= 0) sess->settings[CPAP_IPAP] = R.ipap;
+            if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps;
+        } else if (R.mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+            if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap;
+            if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap;
+            if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps;
+        } else if (R.mode == MODE_ASV) {
+            if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap;
+            if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps;
+            if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps;
+            if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap;
+        } else if (R.mode == MODE_ASV_VARIABLE_EPAP) {
+            if (R.max_epap >= 0) sess->settings[CPAP_EPAPHi] = R.max_epap;
+            if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap;
+            if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap;
+            if (R.min_ipap >= 0) sess->settings[CPAP_IPAPLo] = R.min_ipap;
+            if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps;
+            if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps;
+        }
+    } else {
+        if (R.set_pressure >= 0) sess->settings[CPAP_Pressure] = R.set_pressure;
+        if (R.min_pressure >= 0) sess->settings[CPAP_PressureMin] = R.min_pressure;
+        if (R.max_pressure >= 0) sess->settings[CPAP_PressureMax] = R.max_pressure;
+        if (R.max_epap >= 0) sess->settings[CPAP_EPAPHi] = R.max_epap;
+        if (R.min_epap >= 0) sess->settings[CPAP_EPAPLo] = R.min_epap;
+        if (R.max_ipap >= 0) sess->settings[CPAP_IPAPHi] = R.max_ipap;
+        if (R.min_ipap >= 0) sess->settings[CPAP_IPAPLo] = R.min_ipap;
+        if (R.min_ps >= 0) sess->settings[CPAP_PSMin] = R.min_ps;
+        if (R.max_ps >= 0) sess->settings[CPAP_PSMax] = R.max_ps;
+        if (R.ps >= 0) sess->settings[CPAP_PS] = R.ps;
+        if (R.epap >= 0) sess->settings[CPAP_EPAP] = R.epap;
+        if (R.ipap >= 0) sess->settings[CPAP_IPAP] = R.ipap;
+    }
+
+
+    if (R.epr >= 0) {
+        sess->settings[RMS9_EPR] = (int)R.epr;
+        if (R.epr > 0) {
+            if (R.epr_level >= 0) {
+                sess->settings[RMS9_EPRLevel] = (int)R.epr_level;
+            }
+        }
+    }
+    if (R.leakmax >= 0) sess->setMax(CPAP_Leak, R.leakmax);
+    if (R.leakmax >= 0) sess->setMin(CPAP_Leak, 0);
+    if ((R.leakmed >= 0) && (R.leak95 >= 0) && (R.leakmax >= 0)) {
+        sess->m_timesummary[CPAP_Leak][short(R.leakmax / R.leakgain)]=1;
+        sess->m_timesummary[CPAP_Leak][short(R.leak95 / R.leakgain)]=9;
+        sess->m_timesummary[CPAP_Leak][short(R.leakmed / R.leakgain)]=65;
+        sess->m_timesummary[CPAP_Leak][0]=25;
+    }
+
+
+    // Find the matching date group for this record
+    QMap<QDate, QList<STRRecord *> >::iterator dtit = loader->strdate.find(R.date);
+
+    // should not be possible, but my brain hurts...
+    Q_ASSERT(dtit != loader->strdate.end());
+
+    if (dtit != loader->strdate.end()) {
+        QList<STRRecord *> & dayrecs = dtit.value();
+        bool hasdatasess=false;
+        EventDataType time=0, totaltime=0;
+
+        for (int c=0; c < dayrecs.size(); ++c) {
+            STRRecord *r = dayrecs[c];
+            if (r->sessionid > 0) {
+                // get complicated.. calculate all the counts for valid sessions, and use the summary to make up the rest
+                hasdatasess = true;
+            }
+            totaltime += r->maskoff - r->maskon;
+        }
+
+
+        if (!hasdatasess) {
+            for (int c=0; c < dayrecs.size(); ++c) {
+                STRRecord *r = dayrecs[c];
+                time = r->maskoff - r->maskon;
+                float ratio = time / totaltime;
+
+                // Add the time weighted proportion of the events counts
+                if (r->ai >= 0) {
+                    sess->setCount(CPAP_Obstructive, r->ai * ratio);
+                    sess->setCph(CPAP_Obstructive, (r->ai * ratio) / (time / 3600.0));
+                }
+                if (r->uai >= 0) {
+                    sess->setCount(CPAP_Apnea, r->uai * ratio);
+                    sess->setCph(CPAP_Apnea, (r->uai * ratio) / (time / 3600.0));
+                }
+                if (r->hi >= 0) {
+                    sess->setCount(CPAP_Hypopnea, r->hi * ratio);
+                    sess->setCph(CPAP_Hypopnea, (r->hi * ratio) / (time / 3600.0));
+                }
+                if (r->cai >= 0) {
+                    sess->setCount(CPAP_ClearAirway, r->cai * ratio);
+                    sess->setCph(CPAP_ClearAirway, (r->ai * ratio) / (time / 3600.0));
+                }
+
+            }
+
+        }
+    }
+
+    loader->addSession(sess);
+    loader->saveMutex.lock();
+    sess->Store(mach->getDataPath());
+    loader->saveMutex.unlock();
+}
+
+
+long event_cnt = 0;
+
+const QString RMS9_STR_datalog = "DATALOG";
+const QString RMS9_STR_idfile = "Identification.";
+const QString RMS9_STR_strfile = "STR.";
+
+bool ResmedLoader::Detect(const QString & givenpath)
+{
+    QDir dir(givenpath);
+
+    if (!dir.exists()) {
+        return false;
+    }
+
+    // ResMed drives contain a folder named "DATALOG".
+    if (!dir.exists(RMS9_STR_datalog)) {
+        return false;
+    }
+
+    // They also contain a file named "STR.edf".
+    if (!dir.exists("STR.edf")) {
+        return false;
+    }
+
+    return true;
+}
+
+
+MachineInfo ResmedLoader::PeekInfo(const QString & path)
+{
+    if (!Detect(path)) return MachineInfo();
+
+    QFile f(path+"/"+RMS9_STR_idfile+"tgt");
+
+    // Abort if this file is dodgy..
+    if (!f.exists() || !f.open(QIODevice::ReadOnly)) {
+        return MachineInfo();
+    }
+    MachineInfo info = newInfo();
+
+    // Parse # entries into idmap.
+    while (!f.atEnd()) {
+        QString line = f.readLine().trimmed();
+
+        if (!line.isEmpty()) {
+            QString key = line.section(" ", 0, 0).section("#", 1);
+            QString value = line.section(" ", 1);
+
+            if (key == "SRN") { // Serial Number
+                info.serial = value;
+
+            } else if (key == "PNA") {  // Product Name
+                value.replace("_"," ");
+
+                if (value.contains(STR_ResMed_S9)) {
+                    value.replace(STR_ResMed_S9, "");
+                    info.series = STR_ResMed_S9;
+                } else if (value.contains(STR_ResMed_AirSense10)) {
+                    value.replace(STR_ResMed_AirSense10, "");
+                    info.series = STR_ResMed_AirSense10;
+                }
+                value.replace("(","");
+                value.replace(")","");
+                if (value.contains("Adapt", Qt::CaseInsensitive)) {
+                    if (!value.contains("VPAP")) {
+                        value.replace("Adapt", QObject::tr("VPAP Adapt"));
+                    }
+                }
+                info.model = value.trimmed();
+            } else if (key == "PCD") { // Product Code
+                info.modelnumber = value;
+            }
+        }
+    }
+
+    return info;
+}
+
+
+
+struct EDFduration {
+    EDFduration() { start = end = 0; type = EDF_UNKNOWN; }
+    EDFduration(const EDFduration & copy) {
+        path = copy.path;
+        start = copy.start;
+        end = copy.end;
+        type = copy.type;
+        filename = copy.filename;
+    }
+    EDFduration(quint32 start, quint32 end, QString path) :
+        start(start), end(end), path(path) {}
+    quint32 start;
+    quint32 end;
+    QString path;
+    QString filename;
+    EDFType type;
+};
+
+EDFType lookupEDFType(QString text)
+{
+    if (text == "EVE") {
+        return EDF_EVE;
+    } else if (text =="BRP") {
+        return EDF_BRP;
+    } else if (text == "PLD") {
+        return EDF_PLD;
+    } else if (text == "SAD") {
+        return EDF_SAD;
+    } else if (text == "CSL") {
+        return EDF_CSL;
+    } else return EDF_UNKNOWN;
+}
+
+// Pretend to parse the EVE file to get the duration out of it.
+int PeekAnnotations(const QString & path, quint32 &start, quint32 &end)
+{
+    EDFParser edf(path);
+    if (!edf.Parse())
+        return -1;
+
+    QString t;
+
+    double duration;
+    char *data;
+    char c;
+    long pos;
+    bool sign, ok;
+    double d;
+    double tt;
+
+    int recs = 0;
+    int goodrecs = 0;
+
+    // Notes: Event records have useless duration record.
+
+    start = edf.startdate / 1000L;
+    // Process event annotation records
+    for (int s = 0; s < edf.GetNumSignals(); s++) {
+        recs = edf.edfsignals[s].nr * edf.GetNumDataRecords() * 2;
+
+        data = (char *)edf.edfsignals[s].data;
+        pos = 0;
+        tt = edf.startdate;
+        duration = 0;
+
+        while (pos < recs) {
+            c = data[pos];
+
+            if ((c != '+') && (c != '-')) {
+                break;
+            }
+
+            if (data[pos++] == '+') { sign = true; }
+            else { sign = false; }
+
+            t = "";
+            c = data[pos];
+
+            do {
+                t += c;
+                pos++;
+                c = data[pos];
+            } while ((c != 20) && (c != 21)); // start code
+
+            d = t.toDouble(&ok);
+
+            if (!ok) {
+                qDebug() << "Faulty EDF Annotations file " << edf.filename;
+                break;
+            }
+
+            if (!sign) { d = -d; }
+
+            tt = edf.startdate + qint64(d * 1000.0);
+
+            duration = 0;
+            // First entry
+
+            if (data[pos] == 21) {
+                pos++;
+                // get duration.
+                t = "";
+
+                do {
+                    t += data[pos];
+                    pos++;
+                } while ((data[pos] != 20) && (pos < recs)); // start code
+
+                duration = t.toDouble(&ok);
+
+                if (!ok) {
+                    qDebug() << "Faulty EDF Annotations file (at %" << pos << ") " << edf.filename;
+                    break;
+                }
+            }
+            end = (tt / 1000.0);
+
+            while ((data[pos] == 20) && (pos < recs)) {
+                t = "";
+                pos++;
+
+                if (data[pos] == 0) {
+                    break;
+                }
+
+                if (data[pos] == 20) {
+                    pos++;
+                    break;
+                }
+
+                do {
+                    t += tolower(data[pos++]);
+                } while ((data[pos] != 20) && (pos < recs)); // start code
+
+                if (!t.isEmpty() && (t!="recording starts")) {
+                    goodrecs++;
+                }
+
+                if (pos >= recs) {
+                    qDebug() << "Short EDF Annotations file" << edf.filename;
+                    break;
+                }
+
+            }
+
+            while ((data[pos] == 0) && (pos < recs)) { pos++; }
+
+            if (pos >= recs) { break; }
+        }
+
+    }
+    return goodrecs;
+}
+
+
+// Looks inside an EDF or EDF.gz and grabs the start and duration
+EDFduration getEDFDuration(QString filename)
+{
+    QString ext = filename.section("_", -1).section(".",0,0).toUpper();
+
+    bool ok1, ok2;
+
+    int num_records;
+    double rec_duration;
+
+    QDateTime startDate;
+
+    if (!filename.endsWith(".gz", Qt::CaseInsensitive)) {
+        QFile file(filename);
+        if (!file.open(QFile::ReadOnly)) {
+            return EDFduration(0, 0, filename);
+        }
+
+        if (!file.seek(0xa8)) {
+            file.close();
+            return EDFduration(0, 0, filename);
+        }
+
+        QByteArray bytes = file.read(16).trimmed();
+
+        startDate = QDateTime::fromString(QString::fromLatin1(bytes, 16), "dd.MM.yyHH.mm.ss");
+
+        if (!file.seek(0xec)) {
+            file.close();
+            return EDFduration(0, 0, filename);
+        }
+
+        bytes = file.read(8).trimmed();
+        num_records = bytes.toInt(&ok1);
+        bytes = file.read(8).trimmed();
+        rec_duration = bytes.toDouble(&ok2);
+
+        file.close();
+    } else {
+        gzFile f = gzopen(filename.toLatin1(), "rb");
+        if (!f) {
+            return EDFduration(0, 0, filename);
+        }
+
+        if (!gzseek(f, 0xa8, SEEK_SET)) {
+            gzclose(f);
+            return EDFduration(0, 0, filename);
+        }
+        char datebytes[17] = {0};
+        gzread(f, (char *)&datebytes, 16);
+        QString str = QString(QString::fromLatin1(datebytes,16)).trimmed();
+
+        startDate = QDateTime::fromString(str, "dd.MM.yyHH.mm.ss");
+
+        if (!gzseek(f, 0xec-0xa8-16, SEEK_CUR)) { // 0xec
+            gzclose(f);
+            return EDFduration(0, 0, filename);
+        }
+
+        // Decompressed header and data block
+        char cbytes[9] = {0};
+        gzread(f, (char *)&cbytes, 8);
+        str = QString(cbytes).trimmed();
+        num_records = str.toInt(&ok1);
+
+        gzread(f, (char *)&cbytes, 8);
+        str = QString(cbytes).trimmed();
+        rec_duration = str.toDouble(&ok2);
+
+        gzclose(f);
+
+    }
+
+    QDate d2 = startDate.date();
+
+    if (d2.year() < 2000) {
+        d2.setDate(d2.year() + 100, d2.month(), d2.day());
+        startDate.setDate(d2);
+    }
+    if (!startDate.isValid()) {
+        qDebug() << "Invalid date time retreieved parsing EDF duration for" << filename;
+        return EDFduration(0, 0, filename);
+    }
+
+    if (!(ok1 && ok2)) {
+        return EDFduration(0, 0, filename);
+    }
+
+    quint32 start = startDate.toTime_t();
+    quint32 end = start + rec_duration * num_records;
+
+    QString filedate = filename.section("/",-1).section("_",0,1);
+
+    QDateTime dt2 = QDateTime::fromString(filedate, "yyyyMMdd_hhmmss");
+    quint32 st2 = dt2.toTime_t();
+
+    start = qMin(st2, start);
+
+    if (end < start) end = qMax(st2, start);
+
+    if ((ext == "EVE") || (ext == "CSL")) {
+        // S10 Forces us to parse EVE files to find their real durations
+        quint32 en2;
+
+        // Have to get the actual duration of the EVE file by parsing the annotations. :(
+        int recs = PeekAnnotations(filename, st2, en2);
+        if (recs > 0) {
+            start = qMin(st2, start);
+            end = qMax(en2, end);
+            EDFduration dur(start, end, filename);
+
+            dur.type = lookupEDFType(ext.toUpper());
+
+            return dur;
+        } else {
+            // empty annotations file, don't give a crap about it...
+            return EDFduration(0, 0, filename);
+        }
+        // A Firmware bug causes (perhaps with failing SD card) sessions to sometimes take a long time to write
+    }
+
+    EDFduration dur(start, end, filename);
+
+    dur.type = lookupEDFType(ext.toUpper());
+
+    return dur;
+}
+
+int ResmedLoader::scanFiles(Machine * mach, QString datalog_path)
+{
+    QHash<QString, SessionID> skipfiles;
+
+    bool create_backups = true; //p_profile->session->backupCardData();
+
+    QString backup_path = mach->getBackupPath();
+
+    QString dlog = datalog_path;
+
+    if (datalog_path == backup_path + RMS9_STR_datalog + "/") {
+        // Don't create backups if importing from backup folder
+        create_backups = false;
+    }
+
+    // Read the "already imported" file list
+    QFile impfile(mach->getDataPath()+"/imported_files.csv");
+    if (impfile.open(QFile::ReadOnly)) {
+        QTextStream impstream(&impfile);
+        QString serial;
+        impstream >> serial;
+        if (mach->serial() == serial) {
+            QString line, file, str;
+            SessionID sid;
+            bool ok;
+            do {
+                line = impstream.readLine();
+                file = line.section(',',0,0);
+                str = line.section(',',1);
+                sid = str.toInt(&ok);
+
+                skipfiles[file] = sid;
+            } while (!impstream.atEnd());
+        }
+    }
+    impfile.close();
+
+    QStringList dirs;
+    dirs.push_back(datalog_path);
+
+    QDir dir(datalog_path);
+
+    dir.setFilter(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot);
+    QFileInfoList flist = dir.entryInfoList();
+    QString filename;
+    bool ok, gz;
+
+
+    // Scan for any sub folders
+    for (int i = 0; i < flist.size(); i++) {
+        QFileInfo fi = flist.at(i);
+        filename = fi.fileName();
+
+        if (filename.length() == 4) {
+            // year folder (used in backups)
+            filename.toInt(&ok);
+
+            if (ok) {
+                dirs.push_back(fi.canonicalFilePath());
+            }
+        } else if (filename.length() == 8) {
+            // S10 stores sessions per day folders
+            filename.toInt(&ok);
+
+            if (ok) {
+                dirs.push_back(fi.canonicalFilePath());
+            }
+        }
+    }
+
+    QStringList newSkipFiles;
+
+    QMap<QString, EDFduration> newfiles; // used for duplicate checking, and session overlap testing to group sessions
+    QHash<EDFType, QList<EDFduration *> > filesbytype;
+
+    // Scan through all folders looking for EDF files, skip any already imported and peek inside to get durations
+    for (int d=0; d < dirs.size(); ++d) {
+        dir.setPath(dirs.at(d));
+        dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+        dir.setSorting(QDir::Name);
+
+        flist = dir.entryInfoList();
+
+        // get number of files in current directory being processed
+        int size = flist.size();
+
+        // For each file in flist...
+        for (int i = 0; i < size; i++) {
+            QFileInfo fi = flist.at(i);
+            filename = fi.fileName();
+
+            // Forget about it if it can't be read.
+            if (!fi.isReadable()) {
+                continue;
+            }
+
+            // Chop off the .gz component if it exists
+            if (filename.endsWith(STR_ext_gz)) {
+                filename.chop(3);
+                gz = true;
+            } else { gz = false; }
+
+            // Skip if this file is in the already imported list
+            if (skipfiles.contains(filename)) continue;
+
+            if (newfiles.contains(filename)) {
+                // Not sure what to do with it.. delete it? check compress status and delete the other one?
+                qDebug() << "Duplicate EDF file detected" << filename;
+                continue;
+            }
+
+            // Peek inside file and get duration in seconds..
+
+            // Accept only .edf and .edf.gz files
+            if (filename.right(4).toLower() != "." + STR_ext_EDF) {
+                continue;
+            }
+
+
+            QString fullname = fi.canonicalFilePath();
+
+            // Peek inside the EDF file and get the EDFDuration record for the session matching that follows
+            EDFduration dur = getEDFDuration(fullname);
+            dur.filename = filename;
+
+            if (dur.start != dur.end) { // make sure empty EVE's are skipped
+                QMap<QString, EDFduration>::iterator it = newfiles.insert(filename, getEDFDuration(fullname));
+                filesbytype[dur.type].append(&it.value());
+            }
+        }
+    }
+
+    QList<EDFType> EDForder;
+    EDForder.push_back(EDF_PLD);
+    EDForder.push_back(EDF_BRP);
+    EDForder.push_back(EDF_SAD);
+
+    for (int i=0; i<3; i++) {
+        EDFType basetype = EDForder.takeFirst();
+
+        // Process PLD files
+        QList<EDFduration *> & LIST = filesbytype[basetype];
+        int base_size = LIST.size();
+        for (int f=0; f < base_size; ++f) {
+            const EDFduration * dur = LIST.at(f);
+
+            quint32 start = dur->start;
+            if (start == 0) continue;
+
+            quint32 end = dur->end;
+            QHash<EDFType, QStringList> grp;
+            grp[basetype].append(create_backups ? backup(dur->path, backup_path) : dur->path);
+
+
+            QStringList files;
+            files.append(dur->filename);
+
+            for (int o=0; o<EDForder.size(); ++o) {
+                EDFType type = EDForder.at(o);
+
+                QList<EDFduration *> & EDF_list = filesbytype[type];
+                QList<EDFduration *>::iterator item;
+                QList<EDFduration *>::iterator list_end = EDF_list.end();
+                for (item = EDF_list.begin(); item != list_end; ++item) {
+                    const EDFduration * dur2 = *item;
+                    if (dur2->start == 0) continue;
+
+                    // Do the sessions Overlap?
+                    if ((start < dur2->end) && ( dur2->start < end)) {
+                        start = qMin(start, dur2->start);
+                        end = qMax(end, dur2->end);
+
+                        files.append(dur2->filename);
+
+                        grp[type].append(create_backups ? backup(dur2->path, backup_path) : dur2->path);
+
+                        filesbytype[type].erase(item);
+                    }
+                }
+
+            }
+
+            // EVE annotation files can cover multiple sessions
+            QList<EDFduration *> & EDF_list = filesbytype[EDF_EVE];
+            QList<EDFduration *>::iterator item;
+            QList<EDFduration *>::iterator list_end = EDF_list.end();
+            for (item = EDF_list.begin(); item != list_end; ++item) {
+                const EDFduration * dur2 = *item;
+                if (dur2->start == 0) continue;
+
+                // Do the sessions Overlap?
+                if ((start < dur2->end) && ( dur2->start < end)) {
+//                    start = qMin(start, dur2->start);
+//                    end = qMax(end, dur2->end);
+
+                    files.append(dur2->filename);
+
+                    grp[EDF_EVE].append(create_backups ? backup(dur2->path, backup_path) : dur2->path);
+                }
+            }
+
+            // CSL files contain CSR flags
+            QList<EDFduration *> & CSL_list = filesbytype[EDF_CSL];
+            list_end = CSL_list.end();
+            for (item = CSL_list.begin(); item != list_end; ++item) {
+                const EDFduration * dur2 = *item;
+                if (dur2->start == 0) continue;
+
+                // Do the sessions Overlap?
+                if ((start < dur2->end) && ( dur2->start < end)) {
+//                    start = qMin(start, dur2->start);
+//                    end = qMax(end, dur2->end);
+
+                    files.append(dur2->filename);
+
+                    grp[EDF_CSL].append(create_backups ? backup(dur2->path, backup_path) : dur2->path);
+                }
+            }
+
+
+
+            if (mach->SessionExists(start) == nullptr) {
+                //EDFGroup group(grp[EDF_BRP], grp[EDF_EVE], grp[EDF_PLD], grp[EDF_SAD], grp[EDF_CSL]);
+                if (grp.size() > 0) {
+                    queTask(new ResmedImport(this, start, grp, mach));
+                    for (int i=0; i<files.size(); i++) skipfiles[files.at(i)] = start;
+                }
+            }
+        }
+    }
+
+
+    // No PLD files
+
+/*    QMap<QString, EDFduration>::iterator it;
+    QMap<QString, EDFduration>::iterator itn;
+    QMap<QString, EDFduration>::iterator it_end = newfiles.end();
+
+    // Now scan through all new files, and group together into sessions
+    for (it = newfiles.begin(); it != it_end; ++it) {
+        quint32 start = it.value().start;
+
+        if (start == 0)
+            continue;
+
+        const QString & file = it.key();
+
+        quint32 end = it.value().end;
+
+
+        QString type = file.section("_", -1).section(".", 0, 0).toUpper();
+
+        QString newpath = create_backups ? backup(it.value().path, backup_path) : it.value().path;
+
+        EDFGroup group;
+
+        if (type == "BRP") group.BRP = newpath;
+        else if (type == "EVE") {
+            if (group.BRP.isEmpty()) {
+                qDebug() << "Jedimark's Order theory was wrong.. EVE's need to be parsed seperately!";
+            }
+            group.EVE = newpath;
+        }
+
+        else if (type == "PLD") group.PLD = newpath;
+        else if (type == "SAD") group.SAD = newpath;
+        else continue;
+
+        QStringList sessfiles;
+        sessfiles.push_back(file);
+
+        for (itn = it+1; itn != it_end; ++itn) {
+            if (itn.value().start == 0) continue;  // already processed
+            const EDFduration & dur2 = itn.value();
+
+            // Do the sessions Overlap?
+            if ((start < dur2.end) && ( dur2.start < end)) {
+
+                start = qMin(start, dur2.start);
+                end = qMax(end, dur2.end);
+
+                type = itn.key().section("_",-1).section(".",0,0).toUpper();
+
+                newpath = create_backups ? backup(dur2.path, backup_path) : dur2.path;
+
+                if (type == "BRP") {
+                    if (!group.BRP.isEmpty()) {
+                        itn.value().start = 0;
+                        continue;
+                    }
+                    group.BRP = newpath;
+                } else if (type == "EVE") {
+                    if (!group.EVE.isEmpty()) {
+                        itn.value().start = 0;
+                        continue;
+                    }
+                    group.EVE = newpath;
+                } else if (type == "PLD") {
+                    if (!group.PLD.isEmpty()) {
+                        itn.value().start = 0;
+                        continue;
+                    }
+                    group.PLD = newpath;
+                } else if (type == "SAD") {
+                    if (!group.SAD.isEmpty()) {
+                        itn.value().start = 0;
+                        continue;
+                    }
+                    group.SAD = newpath;
+                } else {
+                    itn.value().start = 0;
+                    continue;
+                }
+                sessfiles.push_back(itn.key());
+
+                itn.value().start = 0;
+            }
+        }
+
+        if (mach->SessionExists(start) == nullptr) {
+            queTask(new ResmedImport(this, start, group, mach));
+            for (int i=0; i < sessfiles.size(); ++i) {
+                skipfiles[sessfiles.at(i)] = start;
+            }
+        }
+    } */
+
+    // Run the tasks...
+    int c = countTasks();
+    runTasks(p_profile->session->multithreading());
+
+    newSkipFiles.append(skipfiles.keys());
+    impfile.remove();
+
+    if (impfile.open(QFile::WriteOnly)) {
+        QTextStream out(&impfile);
+        out << mach->serial();
+        QHash<QString, SessionID>::iterator skit;
+        QHash<QString, SessionID>::iterator skit_end = skipfiles.end();
+        for (skit = skipfiles.begin(); skit != skit_end; ++skit) {
+            QString a = QString("%1,%2\n").arg(skit.key()).arg(skit.value());;
+            out << a;
+        }
+        out.flush();
+    }
+    impfile.close();
+
+    return c;
+}
+
+int ResmedLoader::Open(QString path)
+{
+
+    QString key, value;
+    QString line;
+    QString newpath;
+    QString filename;
+
+    QHash<QString, QString> idmap;  // Temporary properties hash
+
+    path = path.replace("\\", "/");
+
+    // Strip off end "/" if any
+    if (path.endsWith("/")) {
+        path = path.section("/", 0, -2);
+    }
+
+    // Strip off DATALOG from path, and set newpath to the path contianing DATALOG
+    if (path.endsWith(RMS9_STR_datalog)) {
+        newpath = path + "/";
+        path = path.section("/", 0, -2);
+    } else {
+        newpath = path + "/" + RMS9_STR_datalog + "/";
+    }
+
+    // Add separator back
+    path += "/";
+
+    // Check DATALOG folder exists and is readable
+    if (!QDir().exists(newpath)) {
+        return -1;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    // Parse Identification.tgt file (containing serial number and machine information)
+    ///////////////////////////////////////////////////////////////////////////////////
+    filename = path + RMS9_STR_idfile + STR_ext_TGT;
+    QFile f(filename);
+
+    // Abort if this file is dodgy..
+    if (!f.exists() || !f.open(QIODevice::ReadOnly)) {
+        return -1;
+    }
+    MachineInfo info = newInfo();
+
+    // Parse # entries into idmap.
+    while (!f.atEnd()) {
+        line = f.readLine().trimmed();
+
+        if (!line.isEmpty()) {
+            key = line.section(" ", 0, 0).section("#", 1);
+            value = line.section(" ", 1);
+
+            if (key == "SRN") { // Serial Number
+                info.serial = value;
+                continue;
+
+            } else if (key == "PNA") {  // Product Name
+                value.replace("_"," ");
+                if (value.contains("S9")) {
+                    value.replace("S9", "");
+                    info.series = "S9";
+                } else if (value.contains("AirSense 10")) {
+                    value.replace("AirSense 10", "");
+                    info.series = "AirSense 10";
+                }
+                value.replace("(","");
+                value.replace(")","");
+
+                if (value.contains("Adapt", Qt::CaseInsensitive)) {
+                    if (!value.contains("VPAP")) {
+                        value.replace("Adapt", QObject::tr("VPAP Adapt"));
+                    }
+                }
+                info.model = value.trimmed();
+                continue;
+
+            } else if (key == "PCD") { // Product Code
+                info.modelnumber = value;
+                continue;
+            }
+
+            idmap[key] = value;
+        }
+    }
+
+    f.close();
+
+    // Abort if no serial number
+    if (info.serial.isEmpty()) {
+        qDebug() << "S9 Data card has no valid serial number in Indentification.tgt";
+        return -1;
+    }
+
+    // Early check for STR.edf file, so we can early exit before creating faulty machine record.
+    QString strpath = path + RMS9_STR_strfile + STR_ext_EDF; // STR.edf file
+    f.setFileName(strpath);
+
+    if (!f.exists()) { // No STR.edf.. Do we have a STR.edf.gz?
+        strpath += STR_ext_gz;
+        f.setFileName(strpath);
+
+        if (!f.exists()) {
+            qDebug() << "Missing STR.edf file";
+            return -1;
+        }
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    // Create machine object (unless it's already registered)
+    ///////////////////////////////////////////////////////////////////////////////////
+    Machine *m = CreateMachine(info);
+
+    bool create_backups = p_profile->session->backupCardData();
+    bool compress_backups = p_profile->session->compressBackupData();
+
+    QString backup_path = m->getBackupPath();
+
+    if (path == backup_path) {
+        // Don't create backups if importing from backup folder
+        create_backups = false;
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    // Parse the idmap into machine objects properties, (overwriting any old values)
+    ///////////////////////////////////////////////////////////////////////////////////
+    for (QHash<QString, QString>::iterator i = idmap.begin(); i != idmap.end(); i++) {
+        m->properties[i.key()] = i.value();
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    // Open and Parse STR.edf file
+    ///////////////////////////////////////////////////////////////////////////////////
+    QStringList strfiles;
+    strfiles.push_back(strpath);
+    QDir dir(path + "STR_Backup");
+    dir.setFilter(QDir::Files | QDir::Hidden | QDir::Readable);
+    QFileInfoList flist = dir.entryInfoList();
+
+    {
+    int size = flist.size();
+    for (int i = 0; i < size; i++) {
+        QFileInfo fi = flist.at(i);
+        filename = fi.fileName();
+        if (filename.startsWith("STR", Qt::CaseInsensitive)) {
+            strfiles.push_back(fi.filePath());
+        }
+    }
+    }
+
+    strsess.clear();
+    ParseSTR(m, strfiles);
+
+    EDFParser stredf(strpath);
+    if (!stredf.Parse()) {
+        qDebug() << "Faulty file" << RMS9_STR_strfile;
+        return 0;
+    }
+
+    if (stredf.serialnumber != info.serial) {
+        qDebug() << "Identification.tgt Serial number doesn't match STR.edf!";
+    }
+
+
+    // Creating early as we need the object
+    dir.setPath(newpath);
+
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    // Create the backup folder for storing a copy of everything in..
+    // (Unless we are importing from this backup folder)
+    ///////////////////////////////////////////////////////////////////////////////////
+    if (create_backups) {
+        if (!dir.exists(backup_path)) {
+            if (!dir.mkpath(backup_path + RMS9_STR_datalog)) {
+                qDebug() << "Could not create S9 backup directory :-/";
+            }
+        }
+
+        // Copy Identification files to backup folder
+        QFile::copy(path + RMS9_STR_idfile + STR_ext_TGT, backup_path + RMS9_STR_idfile + STR_ext_TGT);
+        QFile::copy(path + RMS9_STR_idfile + STR_ext_CRC, backup_path + RMS9_STR_idfile + STR_ext_CRC);
+
+        QDateTime dts = QDateTime::fromMSecsSinceEpoch(stredf.startdate);
+        dir.mkpath(backup_path + "STR_Backup");
+        QString strmonthly = backup_path + "STR_Backup/STR-" + dts.toString("yyyyMM") + "." + STR_ext_EDF;
+
+        //copy STR files to backup folder
+        if (strpath.endsWith(STR_ext_gz)) { // Already compressed. Don't bother decompressing..
+            QFile::copy(strpath, backup_path + RMS9_STR_strfile + STR_ext_EDF + STR_ext_gz);
+        } else { // Compress STR file to backup folder
+            QString strf = backup_path + RMS9_STR_strfile + STR_ext_EDF;
+
+            // Copy most recent to STR.edf
+            if (QFile::exists(strf)) {
+                QFile::remove(strf);
+            }
+
+            if (QFile::exists(strf + STR_ext_gz)) {
+                QFile::remove(strf + STR_ext_gz);
+            }
+
+            compress_backups ?
+            compressFile(strpath, strf)
+            :
+            QFile::copy(strpath, strf);
+
+        }
+
+        // Keep one STR.edf backup every month
+        if (!QFile::exists(strmonthly) && !QFile::exists(strmonthly + ".gz")) {
+            compress_backups ?
+            compressFile(strpath, strmonthly)
+            :
+            QFile::copy(strpath, strmonthly);
+        }
+
+        // Meh.. these can be calculated if ever needed for ResScan SDcard export
+        QFile::copy(path + "STR.crc", backup_path + "STR.crc");
+    }
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    // Process the actual STR.edf data
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    qint64 numrecs = stredf.GetNumDataRecords();
+    qint64 duration = numrecs * stredf.GetDuration();
+
+    int days = duration / 86400000L; // GetNumDataRecords = this.. Duh!
+
+    // Process STR.edf and find first and last time for each day
+
+    QVector<qint8> dayused;
+    dayused.resize(days);
+
+    time_t time = stredf.startdate / 1000L; // == 12pm on first day
+
+    // reset time to first day
+    time = stredf.startdate / 1000;
+
+    ///////////////////////////////////////////////////////////////////////////////////
+    // Scan DATALOG files, sort, and import any new sessions
+    ///////////////////////////////////////////////////////////////////////////////////
+
+    int num_new_sessions = scanFiles(m, newpath);
+
+    ////////////////////////////////////////////////////////////////////////////////////
+    // Now look for any new summary data that can be extracted from STR.edf records
+    ////////////////////////////////////////////////////////////////////////////////////
+
+
+    int size = m->sessionlist.size();
+    int cnt=0;
+    Session * sess;
+
+
+    // Scan through all sessions, and remove any strsess records that have a matching session already
+//    for (sessit = m->sessionlist.begin(); sessit != sessend; ++sessit) {
+//        sess = *sessit;
+//        quint32 key = sess->settings[RMS9_MaskOnTime].toUInt();
+
+//        // Ugly.. need to check sessions overlaps..
+
+//        QMap<quint32, STRRecord>::iterator e = strsess.find(key);
+//        if (e != end) {
+//            strsess.erase(e);
+//        }
+//    }
+///
+
+    QHash<SessionID, Session *>::iterator sessit;
+    QHash<SessionID, Session *>::iterator sessend = m->sessionlist.end();;
+
+    QMap<SessionID, Session *>::iterator sit;
+    QMap<SessionID, Session *>::iterator ns_end = new_sessions.end();
+
+
+    QMap<quint32, STRRecord>::iterator it;
+    QMap<quint32, STRRecord>::iterator end = strsess.end();
+
+    QList<quint32> strlist;
+    for (it = strsess.begin(); it != end; ++it) {
+        STRRecord & R = it.value();
+        quint32 s1 = R.maskon;
+        quint32 e1 = R.maskoff;
+        bool fnd = false;
+        for (sessit = m->sessionlist.begin(); sessit != sessend; ++sessit) {
+            sess = sessit.value();
+            quint32 s2 = sess->session();
+            quint32 e2 = s2 + (sess->length() / 1000L);
+
+            if ((s1 < e2) && (s2 < e1)) {
+                strlist.push_back(it.key());
+                fnd = true;
+                break;
+            }
+        }
+        if (!fnd) for (sit = new_sessions.begin(); sit != ns_end; ++sit) {
+            sess = sit.value();
+            quint32 s2 = sess->session();
+            quint32 e2 = s2 + (sess->length() / 1000L);
+
+            if ((s1 < e2) && (s2 < e1)) {
+                strlist.push_back(it.key());
+                fnd = true;
+                break;
+            }
+
+        }
+    }
+
+    for (int i=0; i<strlist.size(); i++) {
+        int k = strlist.at(i);
+        strsess.remove(k);
+    }
+
+    ///
+
+    size = strsess.size();
+    cnt=0;
+    quint32 ignoreolder = p_profile->session->ignoreOlderSessionsDate().toTime_t();
+
+    bool ignoreold = p_profile->session->ignoreOlderSessions();
+    // strsess end can change above.
+    end = strsess.end();
+
+    /////////////////////////////////////////////////////////////////////////////////////////////
+    // Scan through unmatched strsess records, and attempt to get at summary data
+    /////////////////////////////////////////////////////////////////////////////////////////////
+    for (it = strsess.begin(); it != end; ++it) {
+        STRRecord & R = it.value();
+
+        if (ignoreold && (R.maskon < ignoreolder)) {
+            m->skipSaveTask();
+            continue;
+        }
+
+        //Q_ASSERT(R.sessionid == 0);
+
+        // the following should not happen
+        if (R.sessionid > 0) {
+            m->skipSaveTask();
+            continue;
+        }
+
+
+        queTask(new ResmedImportStage2(this, R, m));
+    }
+
+    num_new_sessions += countTasks();
+    runTasks();
+
+    finishAddingSessions();
+
+#ifdef DEBUG_EFFICIENCY
+    {
+        qint64 totalbytes = 0;
+        qint64 totalns = 0;
+        qDebug() << "Time Delta Efficiency Information";
+
+        for (QHash<ChannelID, qint64>::iterator it = channel_efficiency.begin();
+                it != channel_efficiency.end(); it++) {
+            ChannelID code = it.key();
+            qint64 value = it.value();
+            qint64 ns = channel_time[code];
+            totalbytes += value;
+            totalns += ns;
+            double secs = double(ns) / 1000000000.0L;
+            QString s = value < 0 ? "saved" : "cost";
+            qDebug() << "Time-Delta conversion for " + schema::channel[code].label() + " " + s + " " +
+                     QString::number(qAbs(value)) + " bytes and took " + QString::number(secs, 'f', 4) + "s";
+        }
+
+        qDebug() << "Total toTimeDelta function usage:" << totalbytes << "in" << double(
+                     totalns) / 1000000000.0 << "seconds";
+    }
+#endif
+
+    if (qprogress) { qprogress->setValue(100); }
+
+    sessfiles.clear();
+    strsess.clear();
+
+    strdate.clear();
+    channel_efficiency.clear();
+    channel_time.clear();
+
+    qDebug() << "Total Events " << event_cnt;
+    return num_new_sessions;
+}
+
+
+QString ResmedLoader::backup(QString fullname, QString backup_path)
+{
+    bool compress = p_profile->session->compressBackupData();
+
+    QString filename, yearstr, newname, oldname;
+    bool ok, gz = (fullname.right(3).toLower() == STR_ext_gz);
+
+    filename = fullname.section("/", -1);
+
+    if (gz) {
+        filename.chop(3);
+    }
+
+    yearstr = filename.left(4);
+    yearstr.toInt(&ok, 10);
+
+
+    if (!ok) {
+        qDebug() << "Invalid EDF filename given to ResMedLoader::backup()";
+        return "";
+    }
+
+    newname = backup_path + RMS9_STR_datalog + "/" + yearstr;
+    QDir dir;
+    dir.mkpath(newname);
+    newname += "/" + filename;
+
+    QString tmpname = newname;
+
+    if (compress) {
+        newname += STR_ext_gz;
+    }
+
+    // First make sure the correct backup exists.
+    if (!QFile::exists(newname)) {
+        if (compress) {
+            gz ?
+            QFile::copy(fullname, newname)      // Already compressed.. copy it to the right location
+            :
+            compressFile(fullname, newname);
+        } else {
+            // dont really care if it's compressed and not meant to be, leave it that way
+            QFile::copy(fullname, newname);
+        }
+    } // else backup already exists...
+
+    // Now the correct backup is in place, we can trash any
+    if (compress) {
+        // Remove any uncompressed duplicate
+        if (QFile::exists(tmpname)) {
+            QFile::remove(tmpname);
+        }
+    } else {
+        // Delete the non compressed copy and choose it instead.
+        if (QFile::exists(tmpname + STR_ext_gz)) {
+            QFile::remove(tmpname);
+            newname = tmpname + STR_ext_gz;
+        }
+
+    }
+
+    // Remove any traces from old backup directory structure
+    oldname = backup_path + RMS9_STR_datalog + "/" + filename;
+
+    if (QFile::exists(oldname)) {
+        QFile::remove(oldname);
+    }
+
+    if (QFile::exists(oldname + STR_ext_gz)) {
+        QFile::remove(oldname + STR_ext_gz);
+    }
+
+    return newname;
+}
+
+bool ResmedLoader::LoadCSL(Session *sess, const QString & path)
+{
+    EDFParser edf(path);
+    if (!edf.Parse())
+        return false;
+
+    QString t;
+
+    long recs;
+    double duration;
+    char *data;
+    char c;
+    long pos;
+    bool sign, ok;
+    double d;
+    double tt;
+
+    // Notes: Event records have useless duration record.
+   // sess->updateFirst(edf.startdate);
+
+    EventList *CSR = nullptr;
+
+    // Allow for empty sessions..
+    qint64 csr_starts = 0;
+
+
+    // Process event annotation records
+    for (int s = 0; s < edf.GetNumSignals(); s++) {
+        recs = edf.edfsignals[s].nr * edf.GetNumDataRecords() * 2;
+
+        data = (char *)edf.edfsignals[s].data;
+        pos = 0;
+        tt = edf.startdate;
+    //    sess->updateFirst(tt);
+        duration = 0;
+
+        while (pos < recs) {
+            c = data[pos];
+
+            if ((c != '+') && (c != '-')) {
+                break;
+            }
+
+            if (data[pos++] == '+') { sign = true; }
+            else { sign = false; }
+
+            t = "";
+            c = data[pos];
+
+            do {
+                t += c;
+                pos++;
+                c = data[pos];
+            } while ((c != 20) && (c != 21)); // start code
+
+            d = t.toDouble(&ok);
+
+            if (!ok) {
+                qDebug() << "Faulty EDF CSL file " << edf.filename;
+                break;
+            }
+
+            if (!sign) { d = -d; }
+
+            tt = edf.startdate + qint64(d * 1000.0);
+            duration = 0;
+            // First entry
+
+            if (data[pos] == 21) {
+                pos++;
+                // get duration.
+                t = "";
+
+                do {
+                    t += data[pos];
+                    pos++;
+                } while ((data[pos] != 20) && (pos < recs)); // start code
+
+                duration = t.toDouble(&ok);
+
+                if (!ok) {
+                    qDebug() << "Faulty EDF CSL file (at %" << pos << ") " << edf.filename;
+                    break;
+                }
+            }
+
+            while ((data[pos] == 20) && (pos < recs)) {
+                t = "";
+                pos++;
+
+                if (data[pos] == 0) {
+                    break;
+                }
+
+                if (data[pos] == 20) {
+                    pos++;
+                    break;
+                }
+
+                do {
+                    t += tolower(data[pos++]);
+                } while ((data[pos] != 20) && (pos < recs)); // start code
+
+                if (!t.isEmpty()) {
+                    if (t == "csr start") {
+                        csr_starts = tt;
+                    } else if (t == "csr end") {
+                        if (!CSR) {
+                            CSR = sess->AddEventList(CPAP_CSR, EVL_Event);
+                        }
+
+                        if (csr_starts > 0) {
+                            if (sess->checkInside(csr_starts))
+                                CSR->AddEvent(tt, double(tt - csr_starts) / 1000.0);
+                            csr_starts = 0;
+                        } else {
+                            qDebug() << "If you can read this, ResMed sucks and split CSR flagging!";
+                        }
+                    } else if (t != "recording starts") {
+                        qDebug() << "Unobserved ResMed CSL annotation field: " << t;
+                    }
+                }
+
+                if (pos >= recs) {
+                    qDebug() << "Short EDF CSL file" << edf.filename;
+                    break;
+                }
+
+                // pos++;
+            }
+
+            while ((data[pos] == 0) && (pos < recs)) { pos++; }
+
+            if (pos >= recs) { break; }
+        }
+
+    //    sess->updateLast(tt);
+    }
+
+    return true;
+}
+
+bool ResmedLoader::LoadEVE(Session *sess, const QString & path)
+{
+    EDFParser edf(path);
+    if (!edf.Parse())
+        return false;
+
+    QString t;
+
+    long recs;
+    double duration;
+    char *data;
+    char c;
+    long pos;
+    bool sign, ok;
+    double d;
+    double tt;
+
+    // Notes: Event records have useless duration record.
+   // sess->updateFirst(edf.startdate);
+
+    EventList *OA = nullptr, *HY = nullptr, *CA = nullptr, *UA = nullptr, *RE = nullptr;
+
+    // Allow for empty sessions..
+
+    // Create EventLists
+    OA = sess->AddEventList(CPAP_Obstructive, EVL_Event);
+    HY = sess->AddEventList(CPAP_Hypopnea, EVL_Event);
+    UA = sess->AddEventList(CPAP_Apnea, EVL_Event);
+
+    // Process event annotation records
+    for (int s = 0; s < edf.GetNumSignals(); s++) {
+        recs = edf.edfsignals[s].nr * edf.GetNumDataRecords() * 2;
+
+        data = (char *)edf.edfsignals[s].data;
+        pos = 0;
+        tt = edf.startdate;
+    //    sess->updateFirst(tt);
+        duration = 0;
+
+        while (pos < recs) {
+            c = data[pos];
+
+            if ((c != '+') && (c != '-')) {
+                break;
+            }
+
+            if (data[pos++] == '+') { sign = true; }
+            else { sign = false; }
+
+            t = "";
+            c = data[pos];
+
+            do {
+                t += c;
+                pos++;
+                c = data[pos];
+            } while ((c != 20) && (c != 21)); // start code
+
+            d = t.toDouble(&ok);
+
+            if (!ok) {
+                qDebug() << "Faulty EDF EVE file " << edf.filename;
+                break;
+            }
+
+            if (!sign) { d = -d; }
+
+            tt = edf.startdate + qint64(d * 1000.0);
+            duration = 0;
+            // First entry
+
+            if (data[pos] == 21) {
+                pos++;
+                // get duration.
+                t = "";
+
+                do {
+                    t += data[pos];
+                    pos++;
+                } while ((data[pos] != 20) && (pos < recs)); // start code
+
+                duration = t.toDouble(&ok);
+
+                if (!ok) {
+                    qDebug() << "Faulty EDF EVE file (at %" << pos << ") " << edf.filename;
+                    break;
+                }
+            }
+
+            while ((data[pos] == 20) && (pos < recs)) {
+                t = "";
+                pos++;
+
+                if (data[pos] == 0) {
+                    break;
+                }
+
+                if (data[pos] == 20) {
+                    pos++;
+                    break;
+                }
+
+                do {
+                    t += tolower(data[pos++]);
+                } while ((data[pos] != 20) && (pos < recs)); // start code
+
+                if (!t.isEmpty()) {
+                    if (matchSignal(CPAP_Obstructive, t)) {
+
+                        if (sess->checkInside(tt)) OA->AddEvent(tt, duration);
+                    } else if (matchSignal(CPAP_Hypopnea, t)) {
+                        if (sess->checkInside(tt)) HY->AddEvent(tt, duration + 10); // Only Hyponea's Need the extra duration???
+                    } else if (matchSignal(CPAP_Apnea, t)) {
+                        if (sess->checkInside(tt)) UA->AddEvent(tt, duration);
+                    } else if (matchSignal(CPAP_RERA, t)) {
+                        // Not all machines have it, so only create it when necessary..
+                        if (!RE) {
+                            if (!(RE = sess->AddEventList(CPAP_RERA, EVL_Event))) { return false; }
+                        }
+                        if (sess->checkInside(tt)) RE->AddEvent(tt, duration);
+                    } else if (matchSignal(CPAP_ClearAirway, t)) {
+                        // Not all machines have it, so only create it when necessary..
+                        if (!CA) {
+                            if (!(CA = sess->AddEventList(CPAP_ClearAirway, EVL_Event))) { return false; }
+                        }
+
+                        if (sess->checkInside(tt)) CA->AddEvent(tt, duration);
+                    } else {
+                        if (t != "recording starts") {
+                            qDebug() << "Unobserved ResMed annotation field: " << t;
+                        }
+                    }
+                }
+
+                if (pos >= recs) {
+                    qDebug() << "Short EDF EVE file" << edf.filename;
+                    break;
+                }
+
+                // pos++;
+            }
+
+            while ((data[pos] == 0) && (pos < recs)) { pos++; }
+
+            if (pos >= recs) { break; }
+        }
+
+    //    sess->updateLast(tt);
+    }
+
+    return true;
+}
+
+bool ResmedLoader::LoadBRP(Session *sess, const QString & path)
+{
+    EDFParser edf(path);
+    if (!edf.Parse())
+        return false;
+
+    sess->updateFirst(edf.startdate);
+
+    qint64 duration = edf.GetNumDataRecords() * edf.GetDuration();
+    sess->updateLast(edf.startdate + duration);
+
+    for (int s = 0; s < edf.GetNumSignals(); s++) {
+        EDFSignal &es = edf.edfsignals[s];
+
+        long recs = es.nr * edf.GetNumDataRecords();
+        if (recs < 0)
+            continue;
+        ChannelID code;
+
+        if (matchSignal(CPAP_FlowRate, es.label)) {
+            code = CPAP_FlowRate;
+            es.gain *= 60.0;
+            es.physical_minimum *= 60.0;
+            es.physical_maximum *= 60.0;
+            es.physical_dimension = "L/M";
+
+        } else if (matchSignal(CPAP_MaskPressureHi, es.label)) {
+            code = CPAP_MaskPressureHi;
+
+        } else if (matchSignal(CPAP_RespEvent, es.label)) {
+            code = CPAP_RespEvent;
+
+        } else if (es.label != "Crc16") {
+            qDebug() << "Unobserved ResMed BRP Signal " << es.label;
+            continue;
+        } else continue;
+
+        if (code) {
+            double rate = double(duration) / double(recs);
+            EventList *a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate);
+            a->setDimension(es.physical_dimension);
+            a->AddWaveform(edf.startdate, es.data, recs, duration);
+            sess->setMin(code, a->Min());
+            sess->setMax(code, a->Max());
+            sess->setPhysMin(code, es.physical_minimum);
+            sess->setPhysMax(code, es.physical_maximum);
+        }
+    }
+
+    return true;
+}
+
+// Convert EDFSignal data to sleepyheads Time-Delta Event format
+void ResmedLoader::ToTimeDelta(Session *sess, EDFParser &edf, EDFSignal &es, ChannelID code,
+                               long recs, qint64 duration, EventDataType t_min, EventDataType t_max, bool square)
+{
+    if (t_min == t_max) {
+        t_min = es.physical_minimum;
+        t_max = es.physical_maximum;
+    }
+
+#ifdef DEBUG_EFFICIENCY
+    QElapsedTimer time;
+    time.start();
+#endif
+
+    double rate = (duration / recs); // milliseconds per record
+    double tt = edf.startdate;
+
+    EventStoreType c, last;
+
+    int startpos = 0;
+
+    if ((code == CPAP_Pressure) || (code == CPAP_IPAP) || (code == CPAP_EPAP)) {
+        startpos = 20; // Shave the first 20 seconds of pressure data
+        tt += rate * startpos;
+    }
+
+    qint16 *sptr = es.data;
+    qint16 *eptr = sptr + recs;
+    sptr += startpos;
+
+    EventDataType min = t_max, max = t_min, tmp;
+
+    EventList *el = nullptr;
+
+    if (recs > startpos + 1) {
+
+        // Prime last with a good starting value
+        do {
+            last = *sptr++;
+            tmp = EventDataType(last) * es.gain;
+
+            if ((tmp >= t_min) && (tmp <= t_max)) {
+                min = tmp;
+                max = tmp;
+                el = sess->AddEventList(code, EVL_Event, es.gain, es.offset, 0, 0);
+
+                el->AddEvent(tt, last);
+                tt += rate;
+
+                break;
+            }
+
+            tt += rate;
+
+        } while (sptr < eptr);
+
+        if (!el) {
+            return;
+        }
+
+        for (; sptr < eptr; sptr++) {
+            c = *sptr;
+
+            if (last != c) {
+                if (square) {
+                    tmp = EventDataType(last) * es.gain;
+
+                    if ((tmp >= t_min) && (tmp <= t_max)) {
+                        if (tmp < min) {
+                            min = tmp;
+                        }
+
+                        if (tmp > max) {
+                            max = tmp;
+                        }
+
+                        el->AddEvent(tt, last);
+                    } else {
+                        // Out of bounds value, start a new eventlist
+                        if (el->count() > 1) {
+                            // that should be in session, not the eventlist.. handy for debugging though
+                            el->setDimension(es.physical_dimension);
+
+                            el = sess->AddEventList(code, EVL_Event, es.gain, es.offset, 0, 0);
+                        } else {
+                            el->clear(); // reuse the object
+                        }
+                    }
+                }
+
+                tmp = EventDataType(c) * es.gain;
+
+                if ((tmp >= t_min) && (tmp <= t_max)) {
+                    if (tmp < min) {
+                        min = tmp;
+                    }
+
+                    if (tmp > max) {
+                        max = tmp;
+                    }
+
+                    el->AddEvent(tt, c);
+                } else {
+                    if (el->count() > 1) {
+                        el->setDimension(es.physical_dimension);
+
+                        // Create and attach new EventList
+                        el = sess->AddEventList(code, EVL_Event, es.gain, es.offset, 0, 0);
+                    } else { el->clear(); }
+                }
+            }
+
+            tt += rate;
+
+            last = c;
+        }
+
+        tmp = EventDataType(c) * es.gain;
+
+        if ((tmp >= t_min) && (tmp <= t_max)) {
+            el->AddEvent(tt, c);
+        }
+
+        sess->setMin(code, min);
+        sess->setMax(code, max);
+        sess->setPhysMin(code, es.physical_minimum);
+        sess->setPhysMax(code, es.physical_maximum);
+        sess->updateLast(tt);
+    }
+
+#ifdef DEBUG_EFFICIENCY
+    qint64 t = time.nsecsElapsed();
+    int cnt = el->count();
+    int bytes = cnt * (sizeof(EventStoreType) + sizeof(quint32));
+    int wvbytes = recs * (sizeof(EventStoreType));
+    QHash<ChannelID, qint64>::iterator it = channel_efficiency.find(code);
+
+    if (it == channel_efficiency.end()) {
+        channel_efficiency[code] = wvbytes - bytes;
+        channel_time[code] = t;
+    } else {
+        it.value() += wvbytes - bytes;
+        channel_time[code] += t;
+    }
+
+#endif
+}
+
+// Load SAD Oximetry Signals
+bool ResmedLoader::LoadSAD(Session *sess, const QString & path)
+{
+    EDFParser edf(path);
+    if (!edf.Parse())
+        return false;
+
+    sess->updateFirst(edf.startdate);
+    qint64 duration = edf.GetNumDataRecords() * edf.GetDuration();
+    sess->updateLast(edf.startdate + duration);
+
+    for (int s = 0; s < edf.GetNumSignals(); s++) {
+        EDFSignal &es = edf.edfsignals[s];
+        //qDebug() << "SAD:" << es.label << es.digital_maximum << es.digital_minimum << es.physical_maximum << es.physical_minimum;
+        long recs = es.nr * edf.GetNumDataRecords();
+        ChannelID code;
+
+        bool hasdata = false;
+
+        for (int i = 0; i < recs; ++i) {
+            if (es.data[i] != -1) {
+                hasdata = true;
+                break;
+            }
+        }
+        if (!hasdata) {
+            continue;
+        }
+
+        if (matchSignal(OXI_Pulse, es.label)) {
+            code = OXI_Pulse;
+            ToTimeDelta(sess, edf, es, code, recs, duration);
+            sess->setPhysMax(code, 180);
+            sess->setPhysMin(code, 18);
+        } else if (matchSignal(OXI_SPO2, es.label)) {
+            code = OXI_SPO2;
+            es.physical_minimum = 60;
+            ToTimeDelta(sess, edf, es, code, recs, duration);
+            sess->setPhysMax(code, 100);
+            sess->setPhysMin(code, 60);
+        } else if (es.label != "Crc16") {
+            qDebug() << "Unobserved ResMed SAD Signal " << es.label;
+        }
+    }
+
+    return true;
+}
+
+
+bool ResmedLoader::LoadPLD(Session *sess, const QString & path)
+{
+    EDFParser edf(path);
+    if (!edf.Parse())
+        return false;
+
+    // Is it save to assume the order does not change here?
+    enum PLDType { MaskPres = 0, TherapyPres, ExpPress, Leak, RR, Vt, Mv, SnoreIndex, FFLIndex, U1, U2 };
+
+    qint64 duration = edf.GetNumDataRecords() * edf.GetDuration();
+    sess->updateFirst(edf.startdate);
+    sess->updateLast(edf.startdate + duration);
+    QString t;
+    int emptycnt = 0;
+    EventList *a = nullptr;
+    double rate;
+    long recs;
+    ChannelID code;
+
+    for (int s = 0; s < edf.GetNumSignals(); s++) {
+        a = nullptr;
+        EDFSignal &es = edf.edfsignals[s];
+        recs = es.nr * edf.GetNumDataRecords();
+
+        if (recs <= 0) { continue; }
+
+        rate = double(duration) / double(recs);
+
+        //qDebug() << "EVE:" << es.digital_maximum << es.digital_minimum << es.physical_maximum << es.physical_minimum << es.gain;
+        if (matchSignal(CPAP_Snore, es.label)) {
+            code = CPAP_Snore;
+            ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0);
+        } else if (matchSignal(CPAP_Pressure, es.label)) {
+            code = CPAP_Pressure;
+            es.physical_maximum = 25;
+            es.physical_minimum = 4;
+            ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0);
+        } else if (matchSignal(CPAP_IPAP, es.label)) {
+            code = CPAP_IPAP;
+            es.physical_maximum = 25;
+            es.physical_minimum = 4;
+            ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0);
+        } else if (matchSignal(CPAP_EPAP, es.label)) { // Expiratory Pressure
+            code = CPAP_EPAP;
+            es.physical_maximum = 25;
+            es.physical_minimum = 4;
+
+            ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0);
+        }  else if (matchSignal(CPAP_MinuteVent,es.label)) {
+            code = CPAP_MinuteVent;
+            ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0);
+        } else if (matchSignal(CPAP_RespRate, es.label)) {
+            code = CPAP_RespRate;
+            a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate);
+            a->AddWaveform(edf.startdate, es.data, recs, duration);
+        } else if (matchSignal(CPAP_TidalVolume, es.label)) {
+            code = CPAP_TidalVolume;
+            es.gain *= 1000.0;
+            es.physical_maximum *= 1000.0;
+            es.physical_minimum *= 1000.0;
+            //            es.digital_maximum*=1000.0;
+            //            es.digital_minimum*=1000.0;
+            ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0);
+        } else if (matchSignal(CPAP_Leak, es.label)) {
+            code = CPAP_Leak;
+            es.gain *= 60.0;
+            es.physical_maximum *= 60.0;
+            es.physical_minimum *= 60.0;
+            //            es.digital_maximum*=60.0;
+            //            es.digital_minimum*=60.0;
+            es.physical_dimension = "L/M";
+            ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0, true);
+            sess->setPhysMax(code, 120.0);
+            sess->setPhysMin(code, 0);
+        } else if (matchSignal(CPAP_FLG, es.label)) {
+            code = CPAP_FLG;
+            ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0);
+        } else if (matchSignal(CPAP_MaskPressure, es.label)) {
+            code = CPAP_MaskPressure;
+            es.physical_maximum = 25;
+            es.physical_minimum = 4;
+
+            ToTimeDelta(sess, edf, es, code, recs, duration, 0, 0);
+        } else if (matchSignal(CPAP_IE, es.label)) { //I:E ratio
+            code = CPAP_IE;
+            a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate);
+            a->AddWaveform(edf.startdate, es.data, recs, duration);
+            //a=ToTimeDelta(sess,edf,es, code,recs,duration,0,0);
+        } else if (matchSignal(CPAP_Ti, es.label)) {
+            code = CPAP_Ti;
+            // There are TWO of these with the same label on my VPAP Adapt 36037
+
+            if (sess->eventlist.contains(code)) {
+                continue;
+            }
+            a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate);
+            a->AddWaveform(edf.startdate, es.data, recs, duration);
+            //a=ToTimeDelta(sess,edf,es, code,recs,duration,0,0);
+        } else if (matchSignal(CPAP_Te, es.label)) {
+            code = CPAP_Te;
+            // There are TWO of these with the same label on my VPAP Adapt 36037
+            if (sess->eventlist.contains(code)) {
+                continue;
+            }
+            a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate);
+            a->AddWaveform(edf.startdate, es.data, recs, duration);
+            //a=ToTimeDelta(sess,edf,es, code,recs,duration,0,0);
+        } else if (matchSignal(CPAP_TgMV, es.label)) {
+            code = CPAP_TgMV;
+            a = sess->AddEventList(code, EVL_Waveform, es.gain, es.offset, 0, 0, rate);
+            a->AddWaveform(edf.startdate, es.data, recs, duration);
+            //a=ToTimeDelta(sess,edf,es, code,recs,duration,0,0);
+        } else if (es.label == "") { // What the hell resmed??
+            if (emptycnt == 0) {
+                code = RMS9_E01;
+//                ToTimeDelta(sess, edf, es, code, recs, duration);
+            } else if (emptycnt == 1) {
+                code = RMS9_E02;
+//                ToTimeDelta(sess, edf, es, code, recs, duration);
+            } else {
+                qDebug() << "Unobserved Empty Signal " << es.label;
+            }
+
+            emptycnt++;
+        }  else if (es.label != "Crc16") {
+            qDebug() << "Unobserved ResMed PLD Signal " << es.label;
+            a = nullptr;
+        }
+
+        if (a) {
+            sess->setMin(code, a->Min());
+            sess->setMax(code, a->Max());
+            sess->setPhysMin(code, es.physical_minimum);
+            sess->setPhysMax(code, es.physical_maximum);
+            a->setDimension(es.physical_dimension);
+        }
+
+    }
+
+    return true;
+}
+
+void ResInitModelMap()
+{
+    // don't really need this anymore
+//    Resmed_Model_Map = {
+//        { "S9 Escape",      { 36001, 36011, 36021, 36141, 36201, 36221, 36261, 36301, 36361 } },
+//        { "S9 Escape Auto", { 36002, 36012, 36022, 36302, 36362 } },
+//        { "S9 Elite",       { 36003, 36013, 36023, 36103, 36113, 36123, 36143, 36203, 36223, 36243, 36263, 36303, 36343, 36363 } },
+//        { "S9 Autoset",     { 36005, 36015, 36025, 36105, 36115, 36125, 36145, 36205, 36225, 36245, 36265, 36305, 36325, 36345, 36365 } },
+//        { "S9 AutoSet CS",  { 36100, 36110, 36120, 36140, 36200, 36220, 36360 } },
+//        { "S9 AutoSet 25",  { 36106, 36116, 36126, 36146, 36206, 36226, 36366 } },
+//        { "S9 AutoSet for Her", { 36065 } },
+//        { "S9 VPAP S",      { 36004, 36014, 36024, 36114, 36124, 36144, 36204, 36224, 36284, 36304 } },
+//        { "S9 VPAP Auto",   { 36006, 36016, 36026 } },
+//        { "S9 VPAP Adapt",  { 36037, 36007, 36017, 36027, 36367 } },
+//        { "S9 VPAP ST",     { 36008, 36018, 36028, 36108, 36148, 36208, 36228, 36368 } },
+//        { "S9 VPAP ST 22",  { 36118, 36128 } },
+//        { "S9 VPAP ST-A",   { 36039, 36159, 36169, 36379 } },
+//      //S8 Series
+//        { "S8 Escape",      { 33007 } },
+//        { "S8 Elite II",    { 33039 } },
+//        { "S8 Escape II",   { 33051 } },
+//        { "S8 Escape II AutoSet", { 33064 } },
+//        { "S8 AutoSet II",  { 33129 } },
+//    };
+
+    ////////////////////////////////////////////////////////////////////////////
+    // Translation lookup table for non-english machines
+    ////////////////////////////////////////////////////////////////////////////
+
+    // Only put the first part, enough to be identifiable, because ResMed likes
+    // to signal names crop short
+    // Read this from a table?
+
+    resmed_codes.clear();
+
+    // BRP file
+    resmed_codes[CPAP_FlowRate].push_back("Flow");
+    resmed_codes[CPAP_FlowRate].push_back("Flow.40ms");
+    resmed_codes[CPAP_MaskPressureHi].push_back("Mask Pres");
+    resmed_codes[CPAP_MaskPressureHi].push_back("Press.40ms");
+
+
+    // PLD File
+    resmed_codes[CPAP_MaskPressure].push_back("Mask Pres");
+
+
+    resmed_codes[CPAP_RespEvent].push_back("Resp Event");
+    resmed_codes[CPAP_Pressure].push_back("Therapy Pres");
+    resmed_codes[CPAP_IPAP].push_back("Insp Pres");
+    resmed_codes[CPAP_IPAP].push_back("IPAP");
+    resmed_codes[CPAP_EPAP].push_back("Exp Pres");
+    resmed_codes[CPAP_EPAP].push_back("EPAP");
+    resmed_codes[CPAP_EPAPHi].push_back("Max EPAP");
+    resmed_codes[CPAP_EPAPLo].push_back("Min EPAP");
+    resmed_codes[CPAP_IPAPHi].push_back("Max IPAP");
+    resmed_codes[CPAP_IPAPLo].push_back("Min IPAP");
+
+    resmed_codes[CPAP_PS].push_back("PS");
+    resmed_codes[CPAP_PSMin].push_back("Min PS");
+    resmed_codes[CPAP_PSMax].push_back("Max PS");
+
+    resmed_codes[CPAP_Leak].push_back("Leak"); // Leak Leck Lekk Läck Fuites
+    resmed_codes[CPAP_Leak].push_back("Leck");
+    resmed_codes[CPAP_Leak].push_back("Fuites");
+
+    resmed_codes[CPAP_Leak].push_back("\xE6\xBC\x8F\xE6\xB0\x94");
+    resmed_codes[CPAP_Leak].push_back("Lekk");
+    resmed_codes[CPAP_Leak].push_back("Läck");
+    resmed_codes[CPAP_Leak].push_back("Läck");
+    resmed_codes[CPAP_RespRate].push_back("RR");
+    resmed_codes[CPAP_RespRate].push_back("AF");
+    resmed_codes[CPAP_RespRate].push_back("FR");
+    resmed_codes[CPAP_MinuteVent].push_back("MV");
+    resmed_codes[CPAP_MinuteVent].push_back("VM");
+    resmed_codes[CPAP_TidalVolume].push_back("Vt");
+    resmed_codes[CPAP_TidalVolume].push_back("VC");
+    resmed_codes[CPAP_IE].push_back("I:E");
+    resmed_codes[CPAP_Snore].push_back("Snore");
+    resmed_codes[CPAP_FLG].push_back("FFL Index");
+    resmed_codes[CPAP_Ti].push_back("Ti");
+    resmed_codes[CPAP_Te].push_back("Te");
+    resmed_codes[CPAP_TgMV].push_back("TgMV");
+    resmed_codes[OXI_Pulse].push_back("Pulse");
+    resmed_codes[OXI_Pulse].push_back("Puls");
+    resmed_codes[OXI_Pulse].push_back("Pouls");
+    resmed_codes[OXI_Pulse].push_back("Pols");
+    resmed_codes[OXI_SPO2].push_back("SpO2");
+    resmed_codes[CPAP_Obstructive].push_back("Obstructive apnea");
+    resmed_codes[CPAP_Hypopnea].push_back("Hypopnea");
+    resmed_codes[CPAP_Apnea].push_back("Apnea");
+    resmed_codes[CPAP_RERA].push_back("Arousal");
+    resmed_codes[CPAP_ClearAirway].push_back("Central apnea");
+    resmed_codes[CPAP_Mode].push_back("Mode");
+    resmed_codes[CPAP_Mode].push_back("Modus");
+    resmed_codes[CPAP_Mode].push_back("Funktion");
+    resmed_codes[CPAP_Mode].push_back("\xE6\xA8\xA1\xE5\xBC\x8F");  // Chinese
+
+    resmed_codes[RMS9_SetPressure].push_back("Set Pressure");
+    resmed_codes[RMS9_SetPressure].push_back("Eingest. Druck");
+    resmed_codes[RMS9_SetPressure].push_back("Ingestelde druk");
+    resmed_codes[RMS9_SetPressure].push_back("\xE8\xAE\xBE\xE5\xAE\x9A\xE5\x8E\x8B\xE5\x8A\x9B"); // Chinese
+    resmed_codes[RMS9_SetPressure].push_back("Pres. prescrite");
+    resmed_codes[RMS9_SetPressure].push_back("Inställt tryck");
+    resmed_codes[RMS9_SetPressure].push_back("Inställt tryck");
+
+    resmed_codes[RMS9_EPR].push_back("EPR");
+    //resmed_codes[RMS9_EPR].push_back("S.EPR.EPRType");
+
+    resmed_codes[RMS9_EPR].push_back("\xE5\x91\xBC\xE6\xB0\x94\xE9\x87\x8A\xE5\x8E\x8B\x28\x45\x50"); // Chinese
+    resmed_codes[RMS9_EPRLevel].push_back("EPR Level");
+    resmed_codes[RMS9_EPRLevel].push_back("EPR-Stufe");
+    resmed_codes[RMS9_EPRLevel].push_back("EPR-niveau");
+    resmed_codes[RMS9_EPRLevel].push_back("\x45\x50\x52\x20\xE6\xB0\xB4\xE5\xB9\xB3"); // Chinese
+
+    resmed_codes[RMS9_EPRLevel].push_back("Niveau EPR");
+    resmed_codes[RMS9_EPRLevel].push_back("EPR-nivå");
+    resmed_codes[RMS9_EPRLevel].push_back("EPR-nivå");
+    resmed_codes[CPAP_PressureMax].push_back("Max Pressure");
+    resmed_codes[CPAP_PressureMax].push_back("Max. Druck");
+    resmed_codes[CPAP_PressureMax].push_back("Max druk");
+
+    resmed_codes[CPAP_PressureMax].push_back("\xE6\x9C\x80\xE5\xA4\xA7\xE5\x8E\x8B\xE5\x8A\x9B"); // Chinese
+    resmed_codes[CPAP_PressureMax].push_back("Pression max.");
+    resmed_codes[CPAP_PressureMax].push_back("Max tryck");
+    resmed_codes[CPAP_PressureMin].push_back("Min Pressure");
+    resmed_codes[CPAP_PressureMin].push_back("Min. Druck");
+    resmed_codes[CPAP_PressureMin].push_back("Min druk");
+    resmed_codes[CPAP_PressureMin].push_back("\xE6\x9C\x80\xE5\xB0\x8F\xE5\x8E\x8B\xE5\x8A\x9B"); // Chinese
+    resmed_codes[CPAP_PressureMin].push_back("Pression min.");
+    resmed_codes[CPAP_PressureMin].push_back("Min tryck");
+
+
+
+    // SAD file
+    resmed_codes[OXI_Pulse].push_back("Pulse.1s");
+    resmed_codes[OXI_SPO2].push_back("SpO2.1s");
+
+    // PLD file
+    resmed_codes[CPAP_MaskPressure].push_back("MaskPress.2s");
+    resmed_codes[CPAP_Pressure].push_back("Press.2s");
+    //resmed_codes[RMS9_EPRPressure].push_back("EPRPress.2s");
+    resmed_codes[CPAP_Leak].push_back("Leak.2s");
+    resmed_codes[CPAP_RespRate].push_back("RespRate.2s");
+    resmed_codes[CPAP_TidalVolume].push_back("TidVol.2s");
+    resmed_codes[CPAP_MinuteVent].push_back("MinVent.2s");
+    resmed_codes[CPAP_Snore].push_back("Snore.2s");
+    resmed_codes[CPAP_FLG].push_back("FlowLim.2s");
+
+    //S.AS.StartPress
+    resmed_codes[CPAP_PressureMin].push_back("S.AS.MinPress");
+    resmed_codes[CPAP_PressureMax].push_back("S.AS.MaxPress");
+
+    resmed_codes[RMS9_SetPressure].push_back("S.C.Press");
+
+    resmed_codes[RMS9_EPRLevel].push_back("S.EPR.Level");
+
+
+
+
+
+
+}
+
+ChannelID ResmedLoader::CPAPModeChannel() { return RMS9_Mode; }
+ChannelID ResmedLoader::PresReliefMode() { return RMS9_EPR; }
+ChannelID ResmedLoader::PresReliefLevel() { return RMS9_EPRLevel; }
+
+void ResmedLoader::initChannels()
+{
+    using namespace schema;
+    Channel * chan = nullptr;
+    channel.add(GRP_CPAP, chan = new Channel(RMS9_Mode = 0xe203, SETTING, MT_CPAP,   SESSION,
+        "RMS9_Mode",
+        QObject::tr("Mode"),
+        QObject::tr("CPAP Mode"),
+        QObject::tr("Mode"),
+        "", LOOKUP, Qt::green));
+
+    chan->addOption(0, QObject::tr("CPAP"));
+    chan->addOption(1, QObject::tr("APAP"));
+    chan->addOption(2, QObject::tr("VPAP-T"));
+    chan->addOption(3, QObject::tr("VPAP-S"));
+    chan->addOption(4, QObject::tr("VPAP-S/T"));
+    chan->addOption(5, QObject::tr("??"));
+    chan->addOption(6, QObject::tr("VPAPauto"));
+    chan->addOption(7, QObject::tr("ASV"));
+    chan->addOption(8, QObject::tr("ASVAuto"));
+    chan->addOption(9, QObject::tr("???"));
+    chan->addOption(10, QObject::tr("???"));
+    chan->addOption(11, QObject::tr("Auto for Her"));
+
+
+
+    channel.add(GRP_CPAP, chan = new Channel(RMS9_EPR = 0xe201, SETTING, MT_CPAP,   SESSION,
+        "EPR", QObject::tr("EPR"),
+        QObject::tr("ResMed Exhale Pressure Relief"),
+        QObject::tr("EPR"),
+        "", LOOKUP, Qt::green));
+
+
+    chan->addOption(0, STR_TR_Off);
+    chan->addOption(1, QObject::tr("Ramp Only"));
+    chan->addOption(2, QObject::tr("Full Time"));
+    chan->addOption(3, QObject::tr("Patient???"));
+
+    channel.add(GRP_CPAP, chan = new Channel(RMS9_EPRLevel = 0xe202, SETTING,  MT_CPAP,  SESSION,
+        "EPRLevel", QObject::tr("EPR Level"),
+        QObject::tr("Exhale Pressure Relief Level"),
+        QObject::tr("EPR Level"),
+        "", LOOKUP, Qt::blue));
+
+    chan->addOption(0, QObject::tr("0cmH2O"));
+    chan->addOption(1, QObject::tr("1cmH2O"));
+    chan->addOption(2, QObject::tr("2cmH2O"));
+    chan->addOption(3, QObject::tr("3cmH2O"));
+
+    // Modelmap needs channels initalized above!!!
+    ResInitModelMap();
+
+}
+
+bool resmed_initialized = false;
+void ResmedLoader::Register()
+{
+    if (resmed_initialized) { return; }
+
+    qDebug() << "Registering ResmedLoader";
+    RegisterLoader(new ResmedLoader());
+
+    resmed_initialized = true;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////
+// Model number information
+//    36003, 36013, 36023, 36103, 36113, 36123, 36143, 36203,
+//    36223, 36243, 36263, 36303, 36343, 36363 S9 Elite Series
+//    36005, 36015, 36025, 36105, 36115, 36125, 36145, 36205,
+//    36225, 36245, 36265, 36305, 36325, 36345, 36365 S9 AutoSet Series
+//    36065 S9 AutoSet for Her
+//    36001, 36011, 36021, 36141, 36201, 36221, 36261, 36301,
+//    36361 S9 Escape
+//    36002, 36012, 36022, 36302, 36362 S9 Escape Auto
+//    36004, 36014, 36024, 36114, 36124, 36144, 36204, 36224,
+//    36284, 36304 S9 VPAP S (+ H5i, + Climate Control)
+//    36006, 36016, 36026 S9 VPAP AUTO (+ H5i, + Climate Control)
+
+//    36007, 36017, 36027, 36367
+//    S9 VPAP ADAPT (+ H5i, + Climate
+//    Control)
+//    36008, 36018, 36028, 36108, 36148, 36208, 36228, 36368 S9 VPAP ST (+ H5i, + Climate Control)
+//    36100, 36110, 36120, 36140, 36200, 36220, 36360 S9 AUTOSET CS
+//    36106, 36116, 36126, 36146, 36206, 36226, 36366 S9 AUTOSET 25
+//    36118, 36128 S9 VPAP ST 22
+//    36039, 36159, 36169, 36379 S9 VPAP ST-A
+//    24921, 24923, 24925, 24926, 24927 ResMed Power Station II (RPSII)
+//    33030 S8 Compact
+//    33001, 33007, 33013, 33036, 33060 S8 Escape
+//    33032 S8 Lightweight
+//    33033 S8 AutoScore
+//    33048, 33051, 33052, 33053, 33054, 33061 S8 Escape II
+//    33055 S8 Lightweight II
+//    33021 S8 Elite
+//    33039, 33045, 33062, 33072, 33073, 33074, 33075 S8 Elite II
+//    33044 S8 AutoScore II
+//    33105, 33112, 33126 S8 AutoSet (including Spirit & Vantage)
+//    33128, 33137 S8 Respond
+//    33129, 33141, 33150 S8 AutoSet II
+//    33136, 33143, 33144, 33145, 33146, 33147, 33148 S8 AutoSet Spirit II
+//    33138 S8 AutoSet C
+//    26101, 26121 VPAP Auto 25
+//    26119, 26120 VPAP S
+//    26110, 26122 VPAP ST
+//    26104, 26105, 26125, 26126 S8 Auto 25
+//    26102, 26103, 26106, 26107, 26108, 26109, 26123, 26127 VPAP IV
+//    26112, 26113, 26114, 26115, 26116, 26117, 26118, 26124 VPAP IV ST
+
diff --git a/sleepyhead/SleepLib/loader_plugins/resmed_loader.h b/sleepyhead/SleepLib/loader_plugins/resmed_loader.h
new file mode 100644
index 0000000..3ea7097
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/resmed_loader.h
@@ -0,0 +1,480 @@
+/* SleepLib RESMED Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef RESMED_LOADER_H
+#define RESMED_LOADER_H
+//#include <map>
+//using namespace std;
+#include <QVector>
+#include "SleepLib/machine.h" // Base class: MachineLoader
+#include "SleepLib/machine_loader.h"
+#include "SleepLib/profiles.h"
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the following value when making changes to this loaders implementation.
+//
+const int resmed_data_version = 9;
+//
+//********************************************************************************************
+
+enum EDFType { EDF_UNKNOWN, EDF_BRP, EDF_PLD, EDF_SAD, EDF_EVE, EDF_CSL };
+
+EDFType lookupEDFType(QString text);
+
+const QString resmed_class_name = STR_MACH_ResMed;
+
+/*! \struct EDFHeader
+    \brief  Represents the EDF+ header structure, used as a place holder while processing the text data.
+    \note More information on the EDF+ file format can be obtained from http://edfplus.info
+*/
+struct EDFHeader {
+    char version[8];
+    char patientident[80];
+    char recordingident[80];
+    char datetime[16];
+    char num_header_bytes[8];
+    char reserved[44];
+    char num_data_records[8];
+    char dur_data_records[8];
+    char num_signals[4];
+}
+#ifndef BUILD_WITH_MSVC
+__attribute__((packed))
+#endif
+;
+
+const int EDFHeaderSize = sizeof(EDFHeader);
+
+/*! \struct EDFSignal
+    \brief Contains information about a single EDF+ Signal
+    \note More information on the EDF+ file format can be obtained from http://edfplus.info
+    */
+struct EDFSignal {
+  public:
+    //! \brief Name of this Signal
+    QString label;
+
+    //! \brief Tranducer Type (source of the data, usually blank)
+    QString transducer_type;
+
+    //! \brief The units of measurements represented by this signal
+    QString physical_dimension;
+
+    //! \brief The minimum limits of the ungained data
+    EventDataType physical_minimum;
+
+    //! \brief The maximum limits of the ungained data
+    EventDataType physical_maximum;
+
+    //! \brief The minimum limits of the data with gain and offset applied
+    EventDataType digital_minimum;
+
+    //! \brief The maximum limits of the data with gain and offset applied
+    EventDataType digital_maximum;
+
+    //! \brief Raw integer data is multiplied by this value
+    EventDataType gain;
+
+    //! \brief This value is added to the raw data
+    EventDataType offset;
+
+    //! \brief Any prefiltering methods used (usually blank)
+    QString prefiltering;
+
+    //! \brief Number of records
+    long nr;
+
+    //! \brief Reserved (usually blank)
+    QString reserved;
+
+    //! \brief Pointer to the signals sample data
+    qint16 *data;
+
+    //! \brief a non-EDF extra used internally to count the signal data
+    int pos;
+};
+
+struct STRRecord
+{
+    STRRecord() {
+        maskon = 0;
+        maskoff = 0;
+        maskdur = 0;
+        maskevents = -1;
+        mode = -1;
+        rms9_mode = -1;
+        set_pressure = -1;
+        epap = -1;
+        max_pressure = -1;
+        min_pressure = -1;
+        max_epap = -1;
+        min_epap = -1;
+        max_ps = -1;
+        min_ps = -1;
+        ps = -1;
+        ipap = -1;
+        max_ipap = -1;
+        min_ipap = -1;
+        epr = -1;
+        epr_level = -1;
+        sessionid = 0;
+
+        ahi = -1;
+        ai = -1;
+        hi = -1;
+        uai = -1;
+        cai = -1;
+
+        leakmed = -1;
+        leak95 = -1;
+        leakmax = -1;
+        leakgain = 0;
+
+        s_RampTime = -1;
+        s_RampEnable = -1;
+        s_EPR_ClinEnable = -1;
+        s_EPREnable = -1;
+
+        s_PtAccess = -1;
+        s_ABFilter = -1;
+        s_Mask = -1;
+        s_Tube = -1;
+        s_ClimateControl = -1;
+        s_HumEnable = -1;
+        s_HumLevel = -1;
+        s_TempEnable = -1;
+        s_Temp = -1;
+        s_SmartStart = -1;
+
+        ramp_pressure = -1;
+
+
+
+        date=QDate();
+    }
+    STRRecord(const STRRecord & copy) {
+        maskon = copy.maskon;
+        maskoff = copy.maskoff;
+        maskdur = copy.maskdur;
+        maskevents = copy.maskevents;
+        mode = copy.mode;
+        rms9_mode = copy.rms9_mode;
+        set_pressure = copy.set_pressure;
+        epap = copy.epap;
+        max_pressure = copy.max_pressure;
+        min_pressure = copy.min_pressure;
+        max_ps = copy.max_ps;
+        min_ps = copy.min_ps;
+        ps = copy.ps;
+        max_epap = copy.max_epap;
+        min_epap = copy.min_epap;
+        ipap = copy.ipap;
+        max_ipap = copy.max_ipap;
+        min_ipap = copy.min_ipap;
+        epr = copy.epr;
+        epr_level = copy.epr_level;
+        sessionid = copy.sessionid;
+        ahi = copy.ahi;
+        ai = copy.ai;
+        hi = copy.hi;
+        uai = copy.uai;
+        cai = copy.cai;
+        date = copy.date;
+        leakmed = copy.leakmed;
+        leak95 = copy.leak95;
+        leakmax = copy.leakmax;
+        leakgain = copy.leakgain;
+
+        s_SmartStart = copy.s_SmartStart;
+        s_PtAccess = copy.s_PtAccess;
+        s_ABFilter = copy.s_ABFilter;
+        s_Mask = copy.s_Mask;
+
+        s_Tube = copy.s_Tube;
+        s_ClimateControl = copy.s_ClimateControl;
+        s_HumEnable = copy.s_HumEnable;
+        s_HumLevel = copy.s_HumLevel;
+        s_TempEnable = copy.s_TempEnable;
+        s_Temp = copy.s_Temp;
+        ramp_pressure = copy.ramp_pressure;
+    }
+    quint32 maskon;
+    quint32 maskoff;
+    EventDataType maskdur;
+    EventDataType maskevents;
+    EventDataType mode;
+    EventDataType rms9_mode;
+    EventDataType set_pressure;
+    EventDataType max_pressure;
+    EventDataType min_pressure;
+    EventDataType epap;
+    EventDataType max_ps;
+    EventDataType min_ps;
+    EventDataType ps;
+    EventDataType max_epap;
+    EventDataType min_epap;
+    EventDataType ipap;
+    EventDataType max_ipap;
+    EventDataType min_ipap;
+    EventDataType epr;
+    EventDataType epr_level;
+    quint32 sessionid;
+    EventDataType ahi;
+    EventDataType ai;
+    EventDataType hi;
+    EventDataType uai;
+    EventDataType cai;
+    EventDataType leakmed;
+    EventDataType leak95;
+    EventDataType leakmax;
+    EventDataType leakgain;
+    EventDataType ramp_pressure;
+    QDate date;
+
+    EventDataType s_RampTime;
+    int s_RampEnable;
+    int s_EPR_ClinEnable;
+    int s_EPREnable;
+
+    int s_PtAccess;
+    int s_ABFilter;
+    int s_Mask;
+    int s_Tube;
+    int s_ClimateControl;
+    int s_HumEnable;
+    EventDataType s_HumLevel;
+    int s_TempEnable;
+    EventDataType s_Temp;
+    int s_SmartStart;
+
+};
+
+
+/*! \class EDFParser
+    \author Mark Watkins <jedimark64_at_users.sourceforge.net>
+    \brief Parse an EDF+ data file into a list of EDFSignal's
+    \note More information on the EDF+ file format can be obtained from http://edfplus.info
+    */
+class EDFParser
+{
+  public:
+    //! \brief Constructs an EDFParser object, opening the filename if one supplied
+    EDFParser(QString filename = "");
+
+    ~EDFParser();
+
+    //! \brief Open the EDF+ file, and read it's header
+    bool Open(QString name);
+
+    //! \brief Read n bytes of 8 bit data from the EDF+ data stream
+    QString Read(unsigned n);
+
+    //! \brief Read 16 bit word of data from the EDF+ data stream
+    qint16 Read16();
+
+    //! \brief Vector containing the list of EDFSignals contained in this edf file
+    QVector<EDFSignal> edfsignals;
+
+    //! \brief An by-name indexed into the EDFSignal data
+    QStringList signal_labels;
+
+    //! \brief ResMed likes to use the SAME signal name
+    QHash<QString, QList<EDFSignal *> > signalList;
+
+    QList<EDFSignal *> signal;
+
+    //! \brief Look up signal names by SleepLib ChannelID.. A little "ResMed"ified.. :/
+    EDFSignal *lookupSignal(ChannelID);
+    EDFSignal *lookupLabel(QString name, int index=0);
+
+    //! \brief Returns the number of signals contained in this EDF file
+    long GetNumSignals() { return num_signals; }
+
+    //! \brief Returns the number of data records contained per signal.
+    long GetNumDataRecords() { return num_data_records; }
+
+    //! \brief Returns the duration represented by this EDF file (in milliseconds)
+    qint64 GetDuration() { return dur_data_record; }
+
+    //! \brief Returns the patientid field from the EDF header
+    QString GetPatient() { return patientident; }
+
+    //! \brief Parse the EDF+ file into the list of EDFSignals.. Must be call Open(..) first.
+    bool Parse();
+    char *buffer;
+
+    //! \brief  The EDF+ files header structure, used as a place holder while processing the text data.
+    EDFHeader header;
+
+    QString filename;
+    long filesize;
+    long datasize;
+    long pos;
+
+    long version;
+    long num_header_bytes;
+    long num_data_records;
+    qint64 dur_data_record;
+    long num_signals;
+
+    QString patientident;
+    QString recordingident;
+    QString serialnumber;
+    qint64 startdate;
+    qint64 enddate;
+    QString reserved44;
+};
+
+class ResmedLoader;
+
+struct EDFGroup {
+    EDFGroup() { }
+    EDFGroup(QString brp, QString eve, QString pld, QString sad, QString csl) {
+        BRP = brp;
+        EVE = eve;
+        CSL = csl;
+        PLD = pld;
+        SAD = sad;
+    }
+    EDFGroup(const EDFGroup & copy) {
+        BRP = copy.BRP;
+        EVE = copy.EVE;
+        CSL = copy.CSL;
+        PLD = copy.PLD;
+        SAD = copy.SAD;
+    }
+    QString BRP;
+    QString EVE;
+    QString CSL;
+    QString PLD;
+    QString SAD;
+};
+
+class ResmedImport:public ImportTask
+{
+public:
+    ResmedImport(ResmedLoader * l, SessionID s, QHash<EDFType, QStringList> f, Machine * m): loader(l), sessionid(s), files(f), mach(m) {}
+    virtual ~ResmedImport() {}
+    virtual void run();
+
+protected:
+    ResmedLoader * loader;
+    SessionID sessionid;
+    QHash<EDFType, QStringList> files;
+    Machine * mach;
+};
+
+class ResmedImportStage2:public ImportTask
+{
+public:
+    ResmedImportStage2(ResmedLoader * l, STRRecord r, Machine * m): loader(l), R(r), mach(m) {}
+    virtual ~ResmedImportStage2() {}
+    virtual void run();
+
+protected:
+    ResmedLoader * loader;
+    STRRecord R;
+    Machine * mach;
+};
+
+
+/*! \class ResmedLoader
+    \brief Importer for ResMed S9 Data
+    */
+class ResmedLoader : public CPAPLoader
+{
+    friend class ResmedImport;
+    friend class ResmedImportStage2;
+  public:
+    ResmedLoader();
+    virtual ~ResmedLoader();
+
+    //! \brief Detect if the given path contains a valid Folder structure
+    virtual bool Detect(const QString & path);
+
+
+    //! \brief Look up machine model information of ResMed file structure stored at path
+    virtual MachineInfo PeekInfo(const QString & path);
+
+
+    //! \brief Scans for S9 SD folder structure signature, and loads any new data if found
+    virtual int Open(QString path);
+
+    //! \brief Returns the version number of this ResMed loader
+    virtual int Version() { return resmed_data_version; }
+
+    //! \brief Returns the Machine class name of this loader. ("ResMed")
+    virtual const QString &loaderName() { return resmed_class_name; }
+
+    //! \brief Converts EDFSignal data to time delta packed EventList, and adds to Session
+    void ToTimeDelta(Session *sess, EDFParser &edf, EDFSignal &es, ChannelID code, long recs,
+                     qint64 duration, EventDataType min = 0, EventDataType max = 0, bool square = false);
+
+    //! \brief Register the ResmedLoader with the list of other machine loaders
+    static void Register();
+
+    //! \brief Parse the EVE Event annotation data, and save to Session * sess
+    //! This contains all Hypopnea, Obstructive Apnea, Central and Apnea codes
+    bool LoadEVE(Session *sess, const QString & path);
+
+    //! \brief Parse the CSL Event annotation data, and save to Session * sess
+    //! This contains Cheyne Stokes Respiration flagging on the AirSense 10
+    bool LoadCSL(Session *sess, const QString & path);
+
+    //! \brief Parse the BRP High Resolution data, and save to Session * sess
+    //! This contains Flow Rate, Mask Pressure, and Resp. Event  data
+    bool LoadBRP(Session *sess, const QString & path);
+
+    //! \brief Parse the SAD Pulse oximetry attachment data, and save to Session * sess
+    //! This contains Pulse Rate and SpO2 Oxygen saturation data
+    bool LoadSAD(Session *sess, const QString & path);
+
+    //! \brief Parse the PRD low resolution data, and save to Session * sess
+    //! This contains the Pressure, Leak, Respiratory Rate, Minute Ventilation, Tidal Volume, etc..
+    bool LoadPLD(Session *sess, const QString & path);
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_CPAP, 0, resmed_class_name, QObject::tr("ResMed"), QString(), QString(), QString(), QObject::tr("S9"), QDateTime::currentDateTime(), resmed_data_version);
+    }
+
+    virtual void initChannels();
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Now for some CPAPLoader overrides
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    virtual QString PresReliefLabel() { return QObject::tr("EPR: "); }
+
+    virtual ChannelID PresReliefMode();
+    virtual ChannelID PresReliefLevel();
+    virtual ChannelID CPAPModeChannel();
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+protected:
+    void ParseSTR(Machine *mach, QStringList strfiles);
+
+    //! \brief Scan for new files to import, group into sessions and add to task que
+    int scanFiles(Machine * mach, QString datalog_path);
+
+    QString backup(QString file, QString backup_path);
+
+    QMap<SessionID, QStringList> sessfiles;
+    QMap<quint32, STRRecord> strsess;
+    QMap<QDate, QList<STRRecord *> > strdate;
+
+#ifdef DEBUG_EFFICIENCY
+    QHash<ChannelID, qint64> channel_efficiency;
+    QHash<ChannelID, qint64> channel_time;
+#endif
+};
+
+#endif // RESMED_LOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/somnopose_loader.cpp b/sleepyhead/SleepLib/loader_plugins/somnopose_loader.cpp
new file mode 100644
index 0000000..55148f1
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/somnopose_loader.cpp
@@ -0,0 +1,185 @@
+/* SleepLib Somnopose Loader Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+//********************************************************************************************
+// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the somnopose_data_version in somnopose_loader.h when making changes to this loader
+// that change loader behaviour or modify channels.
+//********************************************************************************************
+
+#include <QDir>
+#include <QTextStream>
+#include "somnopose_loader.h"
+#include "SleepLib/machine.h"
+
+SomnoposeLoader::SomnoposeLoader()
+{
+    m_type = MT_POSITION;
+}
+
+SomnoposeLoader::~SomnoposeLoader()
+{
+}
+int SomnoposeLoader::Open(QString path)
+{
+    Q_UNUSED(path)
+
+    QString newpath;
+
+    QString dirtag = "somnopose";
+
+    // Could Scan the ZEO folder for a list of CSVs
+
+    path = path.replace("\\", "/");
+
+    if (path.toLower().endsWith("/" + dirtag)) {
+        return 0;
+        //newpath=path;
+    } else {
+        newpath = path + "/" + dirtag.toUpper();
+    }
+
+    //QString filename;
+
+    // Somnopose folder structure detection stuff here.
+
+    return 0; // number of machines affected
+}
+
+int SomnoposeLoader::OpenFile(QString filename)
+{
+    QFile file(filename);
+
+    if (filename.toLower().endsWith(".csv")) {
+        if (!file.open(QFile::ReadOnly)) {
+            qDebug() << "Couldn't open Somnopose data file" << filename;
+            return 0;
+        }
+    } else {
+        return 0;
+    }
+
+    qDebug() << "Opening file" << filename;
+    QTextStream ts(&file);
+
+    // Read header line and determine order of fields
+    QString hdr = ts.readLine();
+    QStringList headers = hdr.split(",");
+
+    int col_inclination = -1, col_orientation = -1, col_timestamp = -1;
+
+    int hdr_size = headers.size();
+
+    for (int i = 0; i < hdr_size; i++) {
+        if (headers.at(i).compare("timestamp", Qt::CaseInsensitive) == 0) {
+            col_timestamp = i;
+        }
+
+        if (headers.at(i).compare("inclination", Qt::CaseInsensitive) == 0) {
+            col_inclination = i;
+        }
+
+        if (headers.at(i).compare("orientation", Qt::CaseInsensitive) == 0) {
+            col_orientation = i;
+        }
+    }
+
+    // Check we have all fields available
+    if ((col_timestamp < 0) || (col_inclination < 0) || (col_orientation < 0)) {
+        return 0;
+    }
+
+    QDateTime epoch(QDate(2001, 1, 1), QTime(0, 0, 0));
+    qint64 ep = qint64(epoch.toTime_t()) * 1000, time;
+
+    double timestamp, orientation, inclination;
+    QString data;
+    QStringList fields;
+    bool ok;
+
+    bool first = true;
+    MachineInfo info = newInfo();
+    Machine *mach = CreateMachine(info);
+    Session *sess = nullptr;
+    SessionID sid;
+
+    EventList *ev_orientation = nullptr, *ev_inclination = nullptr;
+
+    while (!(data = ts.readLine()).isEmpty()) {
+        fields = data.split(",");
+
+        if (fields.size() < hdr_size) { // missing fields.. skip this record
+            continue;
+        }
+
+        timestamp = fields[col_timestamp].toDouble(&ok);
+
+        if (!ok) { continue; }
+
+        orientation = fields[col_orientation].toDouble(&ok);
+
+        if (!ok) { continue; }
+
+        inclination = fields[col_inclination].toDouble(&ok);
+
+        if (!ok) { continue; }
+
+        // convert to milliseconds since epoch
+        time = (timestamp * 1000.0) + ep;
+
+        if (first) {
+            sid = time / 1000;
+
+            if (mach->SessionExists(sid)) {
+                return 0; // Already imported
+            }
+
+            sess = new Session(mach, sid);
+            sess->really_set_first(time);
+            ev_orientation = sess->AddEventList(POS_Orientation, EVL_Event, 1, 0, 0, 0);
+            ev_inclination = sess->AddEventList(POS_Inclination, EVL_Event, 1, 0, 0, 0);
+            first = false;
+        }
+
+        sess->set_last(time);
+        ev_orientation->AddEvent(time, orientation);
+        ev_inclination->AddEvent(time, inclination);
+
+        //  QDateTime dt=QDateTime::fromMSecsSinceEpoch(time);
+        //  qDebug() << dt << orientation << inclination;
+    }
+
+    sess->setMin(POS_Orientation, ev_orientation->Min());
+    sess->setMax(POS_Orientation, ev_orientation->Max());
+    sess->setMin(POS_Inclination, ev_inclination->Min());
+    sess->setMax(POS_Inclination, ev_inclination->Max());
+
+    sess->really_set_last(time);
+    sess->SetChanged(true);
+
+    mach->AddSession(sess);
+
+    mach->Save();
+
+    return true;
+}
+
+
+static bool somnopose_initialized = false;
+
+void SomnoposeLoader::Register()
+{
+    if (somnopose_initialized) { return; }
+
+    qDebug("Registering SomnoposeLoader");
+    RegisterLoader(new SomnoposeLoader());
+    //InitModelMap();
+    somnopose_initialized = true;
+}
+
diff --git a/sleepyhead/SleepLib/loader_plugins/somnopose_loader.h b/sleepyhead/SleepLib/loader_plugins/somnopose_loader.h
new file mode 100644
index 0000000..a04e443
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/somnopose_loader.h
@@ -0,0 +1,47 @@
+/* SleepLib Somnopose Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef SOMNOPOSELOADER_H
+#define SOMNOPOSELOADER_H
+
+#include "SleepLib/machine_loader.h"
+
+const QString somnopose_class_name = "Somnopose";
+const int somnopose_data_version = 1;
+
+
+/*! \class SomnoposeLoader
+    \brief Unfinished stub for loading Somnopose Positional CSV data
+*/
+class SomnoposeLoader : public MachineLoader
+{
+  public:
+    SomnoposeLoader();
+    virtual ~SomnoposeLoader();
+
+    virtual bool Detect(const QString &path) { Q_UNUSED(path); return false; }  // bypass autoscanner
+
+    virtual int Open(QString path);
+    virtual int OpenFile(QString filename);
+    static void Register();
+
+    virtual int Version() { return somnopose_data_version; }
+    virtual const QString &loaderName() { return somnopose_class_name; }
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_POSITION, 0, somnopose_class_name, QObject::tr("Somnopose"), QString(), QString(), QString(), QObject::tr("Somnopose Software"), QDateTime::currentDateTime(), somnopose_data_version);
+    }
+
+
+  //Machine *CreateMachine();
+
+  protected:
+  private:
+};
+
+#endif // SOMNOPOSELOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/weinmann_loader.cpp b/sleepyhead/SleepLib/loader_plugins/weinmann_loader.cpp
new file mode 100644
index 0000000..fce18be
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/weinmann_loader.cpp
@@ -0,0 +1,587 @@
+/* SleepLib Weinmann SOMNOsoft/Balance Loader Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QDir>
+#include <QFile>
+#include <QProgressBar>
+#include <QDomDocument>
+#include <QDomElement>
+#include <QDomNode>
+
+
+#include "weinmann_loader.h"
+
+extern QProgressBar *qprogress;
+
+Weinmann::Weinmann(MachineID id)
+    : CPAP(id)
+{
+}
+
+Weinmann::~Weinmann()
+{
+}
+
+WeinmannLoader::WeinmannLoader()
+{
+    m_buffer = nullptr;
+    m_type = MT_CPAP;
+}
+
+WeinmannLoader::~WeinmannLoader()
+{
+}
+
+bool WeinmannLoader::Detect(const QString & givenpath)
+{
+    QDir dir(givenpath);
+
+    if (!dir.exists()) {
+        return false;
+    }
+
+    // Check for the settings file inside the .. folder
+    if (!dir.exists("WM_DATA.TDF")) {
+        return false;
+    }
+
+    return true;
+}
+
+int WeinmannLoader::ParseIndex(QFile & wmdata)
+{
+    QByteArray xml;
+    do {
+        xml += wmdata.readLine(250);
+    } while (!wmdata.atEnd());
+
+    QDomDocument index_xml("weinmann");
+
+    index_xml.setContent(xml);
+    QDomElement docElem = index_xml.documentElement();
+
+    QDomNode n = docElem.firstChild();
+
+    index.clear();
+    while (!n.isNull()) {
+        QDomElement e = n.toElement();
+        if (!e.isNull()) {
+            bool ok;
+            int val = e.attribute("val").toInt(&ok);
+            if (ok) {
+                index[e.attribute("name")] = val;
+                qDebug() << e.attribute("name") << "=" << hex << val;
+            }
+        }
+        n = n.nextSibling();
+    }
+    return index.size();
+}
+
+const QString DayComplianceCount = "DayComplianceCount";
+const QString CompOffset = "DayComplianceOffset";
+const QString FlowOffset = "TID_Flow_Offset";
+const QString StatusOffset = "TID_Status_Offset";
+const QString PresOffset = "TID_P_Offset";
+const QString AMVOffset = "TID_AMV_Offset";
+const QString EventsOffset = "TID_Events_Offset";
+
+
+void HighPass(char * data, int samples, float cutoff, float dt)
+{
+    float *Y = new float [samples];
+    for (int i=0; i < samples; ++i) Y[i] = 0.0f;
+
+    Y[0] = ((unsigned char *)data)[0] ;
+
+    float RC = 1.0 / (cutoff * 2 * 3.1415926);
+    float alpha = RC / (RC + dt);
+
+    for (int i=1; i < samples; ++i) {
+        float x = ((unsigned char *)data)[i] ;
+        float x1 = ((unsigned char *)data)[i-1] ;
+        Y[i] = alpha * (Y[i-1] + x - x1);
+    }
+
+    for (int i=0; i< samples; ++i) {
+        data[i] = Y[i];
+    }
+    delete Y;
+}
+
+int WeinmannLoader::Open(QString path)
+{
+
+    path = path.replace("\\", "/");
+
+    QFile wmdata(path + "/WM_DATA.TDF");
+    if (!wmdata.open(QFile::ReadOnly)) {
+        return -1;
+    }
+
+    int res = ParseIndex(wmdata);
+    if (res < 0) return -1;
+
+
+    MachineInfo info = newInfo();
+    info.serial = "141819";
+    Machine * mach = CreateMachine(info);
+
+
+    int WeekComplianceOffset = index["WeekComplianceOffset"];
+    int WCD_Pin_Offset = index["WCD_Pin_Offset"];
+    int WCD_Pex_Offset = index["WCD_Pex_Offset"];
+    int WCD_Snore_Offset = index["WCD_Snore_Offset"];
+    int WCD_Lf_Offset = index["WCD_Lf_Offset"];
+    int WCD_Events_Offset = index["WCD_Events_Offset"];
+    int WCD_IO_Offset = index["WCD_IO_Offset"];
+    int comp_start = index[CompOffset];
+
+    int wccount = index["WeekComplianceCount"];
+
+    int size = WCD_Pin_Offset - WeekComplianceOffset;
+
+    quint8 * weekco = new quint8 [size];
+    memset(weekco, 0, size);
+    wmdata.seek(WeekComplianceOffset);
+    wmdata.read((char *)weekco, size);
+
+    unsigned char *p = weekco;
+    for (int c=0; c < wccount; ++c) {
+        int year = QString().sprintf("%02i%02i", p[0], p[1]).toInt();
+        int month = p[2];
+        int day = p[3];
+        int hour = p[5];
+        int minute = p[6];
+        int second = p[7];
+        QDateTime date = QDateTime(QDate(year,month,day), QTime(hour,minute,second));
+        quint32 ts = date.toTime_t();
+        if (!mach->SessionExists(ts)) {
+            qDebug() << date;
+        }
+
+        // stores used length of data at 0x46, in 16bit integers, for IPAP, EPAP, snore, leak,
+        // stores total length of data block at 0x66, in 16 bit integers for IPAP, EPAP, snore, leak
+
+
+        p+=0x84;
+    }
+
+    delete [] weekco;
+
+
+    //////////////////////////////////////////////////////////////////////
+    // Read Day Compliance Information....
+    //////////////////////////////////////////////////////////////////////
+
+    int comp_end = index[FlowOffset];
+    int comp_size = comp_end - comp_start;
+
+    quint8 * comp = new quint8 [comp_size];
+    memset((char *)comp, 0, comp_size);
+
+    wmdata.seek(comp_start);
+    wmdata.read((char *)comp, comp_size);
+
+    p = comp;
+
+    QDateTime dt_epoch(QDate(2000,1,1), QTime(0,0,0));
+    int epoch = dt_epoch.toTime_t();
+    epoch = 0;
+
+
+    float flow_sample_duration = 1000.0 / 5;
+    float pressure_sample_duration = 1000.0 / 2;
+    float amv_sample_duration = 200 * 10;
+
+    int c = index[DayComplianceCount];
+    for (int i=0; i < 5; i++) {
+        int year = QString().sprintf("%02i%02i", p[0], p[1]).toInt();
+        int month = p[2];
+        int day = p[3];
+        int hour = p[5];
+        int minute = p[6];
+        int second = p[7];
+        QDateTime date = QDateTime(QDate(year,month,day), QTime(hour,minute,second));
+        quint32 ts = date.toTime_t();
+
+        if (mach->SessionExists(ts)) continue;
+
+        Session * sess = new Session(mach, ts);
+        sess->SetChanged(true);
+
+
+        // Flow Waveform
+        quint32 fs = p[8] | p[9] << 8 | p[10] << 16 | p[11] << 24;
+        quint32 fl = p[0x44] | p[0x45] << 8 | p[0x46] << 16 | p[0x47] << 24;
+
+        // Status
+        quint32 ss = p[12] | p[13] << 8 | p[14] << 16 | p[15] << 24;
+        quint32 sl = p[0x48] | p[0x49] << 8 | p[0x4a] << 16 | p[0x4b] << 24;
+
+        // Pressure
+        quint32 ps = p[16] | p[17] << 8 | p[18] << 16 | p[19] << 24;
+        quint32 pl = p[0x4c] | p[0x4d] << 8 | p[0x4e] << 16 | p[0x4f] << 24;
+
+        // AMV
+        quint32 ms = p[20] | p[21] << 8 | p[22] << 16 | p[23] << 24;
+        quint32 ml = p[0x50] | p[0x51] << 8 | p[0x52] << 16 | p[0x53] << 24;
+
+        // Events
+        quint32 es = p[24] | p[25] << 8 | p[26] << 16 | p[27] << 24;
+        quint32 er = p[0x54] | p[0x55] << 8 | p[0x56] << 16 | p[0x57] << 24;  // number of records
+
+
+        compinfo.append(CompInfo(sess, date, fs, fl, ss, sl, ps, pl, ms, ml, es, er));
+
+        int dur = fl / 5;
+
+        sess->really_set_first(qint64(ts) * 1000L);
+        sess->really_set_last(qint64(ts+dur) * 1000L);
+        sessions[ts] = sess;
+
+//        qDebug() << date << ts << dur << QString().sprintf("%02i:%02i:%02i", dur / 3600, dur/60 % 60, dur % 60);
+
+        p += 0xd6;
+    }
+
+    delete [] comp;
+
+    //////////////////////////////////////////////////////////////////////
+    // Read Flow Waveform....
+    //////////////////////////////////////////////////////////////////////
+
+    int flowstart = index[FlowOffset];
+    int flowend = index[StatusOffset];
+
+    wmdata.seek(flowstart);
+
+    int flowsize = flowend - flowstart;
+    char * data = new char [flowsize];
+    memset((char *)data, 0, flowsize);
+    wmdata.read((char *)data, flowsize);
+
+    float dt = 1.0 / (1000.0 / flow_sample_duration); // samples per second
+
+    // Centre Waveform using High Pass Filter
+    HighPass(data, flowsize, 0.1f, dt);
+
+    //////////////////////////////////////////////////////////////////////
+    // Read Status....
+    //////////////////////////////////////////////////////////////////////
+
+    int st_start = index[StatusOffset];
+    int st_end = index[PresOffset];
+    int st_size = st_end - st_start;
+
+    char * st = new char [st_size];
+    memset(st, 0, st_size);
+
+    wmdata.seek(st_start);
+    wmdata.read(st, st_size);
+
+
+    //////////////////////////////////////////////////////////////////////
+    // Read Mask Pressure....
+    //////////////////////////////////////////////////////////////////////
+
+    int pr_start = index[PresOffset];
+    int pr_end = index[AMVOffset];
+    int pr_size = pr_end - pr_start;
+
+    char * pres = new char [pr_size];
+    memset(pres, 0, pr_size);
+
+    wmdata.seek(pr_start);
+    wmdata.read(pres, pr_size);
+
+    //////////////////////////////////////////////////////////////////////
+    // Read AMV....
+    //////////////////////////////////////////////////////////////////////
+
+    int mv_start = index[AMVOffset];
+    int mv_end = index[EventsOffset];
+    int mv_size = mv_end - mv_start;
+
+    char * mv = new char [mv_size];
+    memset(mv, 0, mv_size);
+
+    wmdata.seek(mv_start);
+    wmdata.read(mv, mv_size);
+
+    //////////////////////////////////////////////////////////////////////
+    // Read Events....
+    //////////////////////////////////////////////////////////////////////
+
+    int ev_start = index[EventsOffset];
+    int ev_end = wmdata.size();
+    int ev_size = ev_end - ev_start;
+
+    quint8 * ev = new quint8 [ev_size];
+    memset((char *) ev, 0, ev_size);
+
+    wmdata.seek(ev_start);
+    wmdata.read((char *) ev, ev_size);
+
+    //////////////////////////////////////////////////////////////////////
+    // Process sessions
+    //////////////////////////////////////////////////////////////////////
+
+    for (int i=0; i< compinfo.size(); ++i) {
+        const CompInfo & ci = compinfo.at(i);
+        Session * sess = ci.session;
+
+        qint64 ti = sess->first();
+
+        EventList * flow = sess->AddEventList(CPAP_FlowRate, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, flow_sample_duration);
+        flow->AddWaveform(ti, &data[ci.flow_start], ci.flow_size, (ci.flow_size/(1000.0/flow_sample_duration)) * 1000.0);
+
+        EventList * PR = sess->AddEventList(CPAP_MaskPressure, EVL_Waveform, 0.1f, 0.0, 0.0, 0.0, pressure_sample_duration);
+        PR->AddWaveform(ti, (unsigned char *)&pres[ci.pres_start], ci.pres_size, (ci.pres_size/(1000.0/pressure_sample_duration)) * 1000.0);
+
+        // Weinmann's MV graph is pretty dodgy... commenting this out and using my flow calced ones instead (the code below is mapped to snore for comparison purposes)
+        //EventList * MV = sess->AddEventList(CPAP_Snore, EVL_Waveform, 1.0f, 0.0, 0.0, 0.0, amv_sample_duration);
+        //MV->AddWaveform(ti, (unsigned char *)&mv[ci.amv_start], ci.amv_size, (ci.amv_size/(1000/amv_sample_duration)) * 1000L);
+
+        EventList * L = sess->AddEventList(CPAP_Leak, EVL_Event);
+        EventList * S = sess->AddEventList(CPAP_Snore, EVL_Event);
+        EventList * OA = sess->AddEventList(CPAP_Obstructive, EVL_Event);
+        EventList * A = sess->AddEventList(CPAP_Apnea, EVL_Event);
+        EventList * H = sess->AddEventList(CPAP_Hypopnea, EVL_Event);
+        EventList * FL = sess->AddEventList(CPAP_FlowLimit, EVL_Event);
+        EventList * VS = sess->AddEventList(CPAP_VSnore, EVL_Event);
+        quint64 tt = ti;
+        quint64 step = sess->length() / ci.event_recs;
+        unsigned char *p = &ev[ci.event_start];
+        for (quint32 j=0; j < ci.event_recs; ++j) {
+            QDate evdate = ci.time.date();
+            QTime evtime(p[1], p[2], p[3]);
+            if (evtime < ci.time.time()) {
+                evdate = evdate.addDays(1);
+            }
+            quint64 ts = QDateTime(evdate, evtime).toMSecsSinceEpoch();
+
+            // I think p[0] is amount of flow restriction..
+
+            unsigned char evcode = p[0];
+            EventStoreType data = p[4] | p[5] << 8;
+
+            if (evcode == '@') {
+                OA->AddEvent(ts,data/10.0);
+            } else if (evcode =='A') {
+                A->AddEvent(ts,data/10.0);
+            } else if (evcode == 'F') {
+                FL->AddEvent(ts,data/10.0);
+            } else if (evcode == '*') {
+                H->AddEvent(ts,data/10.0);
+            }
+/*            switch (evcode) {
+            case 0x03:
+                break;
+            case 0x04:
+                break;
+            case 0x08:
+                break;
+            case 0x09:
+                break;
+            case 0x0a:
+                break;
+            case 0x0b:
+                break;
+            case 0x0c:
+                break;
+            case 0x10:
+                break;
+            case 0x11:
+                break;
+            case 0x12:
+                break;
+            case 0x13:
+                S->AddEvent(ts, data);
+                break;
+            case 0x22:
+              //  VS->AddEvent(ts, data/10.0);
+
+                break;
+            case 0x28:
+                VS->AddEvent(ts, data/10.0);
+
+                break;
+            case 'F':
+                FL->AddEvent(ts, data/10.0);
+                break;
+            case '@':
+                OA->AddEvent(ts, data/10.0);
+                break;
+            case '\'':
+                //A->AddEvent(ts, data/10.0);
+                break;
+            case 'a':
+                A->AddEvent(ts, data/10.0);
+                break;
+            case 'A':
+               // A->AddEvent(ts, data/10.0);
+                break;
+            case '*':
+                H->AddEvent(ts, data/10.0);
+                break;
+            case 'd':
+                break;
+            case 0x91:
+                break;
+            case 0x96:
+                break;
+            case 0x84:
+                break;
+            default:
+                qDebug() << (int)evcode << endl;
+            }*/
+
+          //  S->AddEvent(ts, p[5]);
+
+
+
+            // p[5] == 0 corresponds to peak events
+            // p[5] == 1 corresponds to hypopnea/bstructive events
+
+            //if (p[5] == 2) OA->AddEvent(ts, p[4]);
+
+
+            // This is ugggggly...
+
+
+            tt += step;
+            p += 6;
+        }
+
+        sess->UpdateSummaries();
+        mach->AddSession(sess);
+    }
+    delete [] data;
+    delete [] st;
+    delete [] pres;
+    delete [] mv;
+    delete [] ev;
+
+    mach->Save();
+
+    return 1;
+
+/*
+
+    // Center the waveform
+    HighPass(data, flowsize, 0.6, dt);
+
+    EventList * flow = sess->AddEventList(CPAP_FlowRate, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, sample_duration);
+    flow->AddWaveform(tt, (char *)data, flowsize, (flowsize/(1000/sample_duration)) * 1000L);
+
+
+    qint64 ti = tt;
+    for (int i=0; i < pr_size; ++i) {
+        EventStoreType c = ((unsigned char *)pres)[i];
+        PR->AddEvent(ti, c);
+        ti += sample_duration * 2.5; //46296296296296;
+    }
+    // Their calcs is uglier than mine!
+    EventList * MV = sess->AddEventList(CPAP_Snore, EVL_Event, 1.0);
+
+
+    ti = tt;
+    for (int i=0; i < mv_size; ++i) {
+        EventStoreType c = ((unsigned char *)mv)[i];
+        MV->AddEvent(ti, c);
+        ti += sample_duration * 9;
+    }
+
+    // Their calcs is uglier than mine!
+    EventList * ST = sess->AddEventList(CPAP_Leak, EVL_Event, 1.0);
+    int st_start = index[StatusOffset];
+    int st_end = index[PresOffset];
+    int st_size = st_end - st_start;
+
+    char st[st_size];
+    memset(st, 0, st_size);
+
+    wmdata.seek(st_start);
+    wmdata.read(st, st_size);
+
+    ti = tt;
+    for (int i=0; i < st_size; ++i) {
+        EventStoreType c = ((unsigned char *)st)[i];
+ //       if (c & 0x80) {
+            ST->AddEvent(ti, c & 0x10);
+   //     }
+        ti += sample_duration*4;  // *9
+    }
+
+
+//    EventList * LEAK = sess->AddEventList(CPAP_Leak, EVL_Event);
+//    EventList * SNORE = sess->AddEventList(CPAP_Snore, EVL_Event);
+
+//    int ev_start = index[EventsOffset];
+//    int ev_end = wmdata.size();
+//    int ev_size = ev_end - ev_start;
+//    int recs = ev_size / 0x12;
+
+//    unsigned char ev[ev_size];
+//    memset((char *) ev, 0, ev_size);
+
+//    wmdata.seek(ev_start);
+//    wmdata.read((char *) ev, ev_size);
+
+    sess->really_set_last(flow->last());
+
+//    int pos = 0;
+//    ti = tt;
+
+//    // 6 byte repeating structure.. No Leaks :(
+//    do {
+//        //EventStoreType c = ((unsigned char*)ev)[pos+0]; // TV?
+//        //c = ((unsigned char*)ev)[pos+6]; // MV?
+
+//        EventStoreType c = ((EventStoreType*)ev)[pos+0];
+//        LEAK->AddEvent(ti, c);
+//        SNORE->AddEvent(ti, ((unsigned char*)ev)[pos+2]);
+//        pos += 0x6;
+//        ti += 30000;
+//        if (ti > sess->last())
+//            break;
+//    } while (pos < (ev_size - 0x12));
+
+
+
+    m->AddSession(sess);
+    sess->UpdateSummaries();
+
+    return 1;*/
+}
+
+void WeinmannLoader::initChannels()
+{
+    using namespace schema;
+    Channel * chan = nullptr;
+//    channel.add(GRP_CPAP, chan = new Channel(INTP_SmartFlex = 0x1165, SETTING,   SESSION,
+//        "INTPSmartFlex", QObject::tr("SmartFlex"),
+//        QObject::tr("Weinmann pressure relief setting."),
+//        QObject::tr("SmartFlex"),
+//        "", DEFAULT, Qt::green));
+
+
+//    chan->addOption(1, STR_TR_None);
+}
+
+bool weinmann_initialized = false;
+void WeinmannLoader::Register()
+{
+    if (weinmann_initialized) { return; }
+
+    qDebug() << "Registering WeinmannLoader";
+    RegisterLoader(new WeinmannLoader());
+    //InitModelMap();
+    weinmann_initialized = true;
+}
diff --git a/sleepyhead/SleepLib/loader_plugins/weinmann_loader.h b/sleepyhead/SleepLib/loader_plugins/weinmann_loader.h
new file mode 100644
index 0000000..bbd8626
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/weinmann_loader.h
@@ -0,0 +1,141 @@
+/* SleepLib Weinmann SOMNOsoft/Balance Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef WEINMANN_LOADER_H
+#define WEINMANN_LOADER_H
+
+#include "SleepLib/machine.h" // Base class: MachineLoader
+#include "SleepLib/machine_loader.h"
+#include "SleepLib/profiles.h"
+
+
+//********************************************************************************************
+/// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the following value when making changes to this loaders implementation.
+//
+const int weinmann_data_version = 3;
+//
+//********************************************************************************************
+
+/*! \class Weinmann
+    \brief Weinmann customized machine object
+    */
+class Weinmann: public CPAP
+{
+  public:
+    Weinmann(MachineID id = 0);
+    virtual ~Weinmann();
+};
+
+
+struct CompInfo
+{
+    CompInfo() {
+        session = nullptr;
+        flow_start = 0; flow_size = 0;
+        stat_start = 0; stat_size = 0;
+        pres_start = 0; pres_size = 0;
+        amv_start = 0; amv_size =0;
+        event_start = 0; event_recs = 0;
+    }
+    CompInfo(const CompInfo & copy) {
+        session = copy.session;
+        time = copy.time;
+        flow_start = copy.flow_start;
+        flow_size= copy.flow_size;
+        stat_start = copy.flow_start;
+        stat_size= copy.flow_size;
+        pres_start = copy.pres_start;
+        pres_size = copy.pres_size;
+        amv_start = copy.amv_start;
+        amv_size = copy.amv_size;
+        event_start = copy.event_start;
+        event_recs = copy.event_recs;
+    }
+    CompInfo(Session * sess, QDateTime dt, quint32 fs, quint32 fl, quint32 ss, quint32 sl,quint32 ps, quint32 pl, quint32 ms, quint32 ml, quint32 es, quint32 er):
+        session(sess), time(dt),
+        flow_start(fs), flow_size(fl),
+        stat_start(ss), stat_size(sl),
+        pres_start(ps), pres_size(pl),
+        amv_start(ms), amv_size(ml),
+        event_start(es), event_recs(er) {}
+    Session * session;
+    QDateTime time;
+    quint32 flow_start;
+    quint32 flow_size;
+    quint32 stat_start;
+    quint32 stat_size;
+    quint32 pres_start;
+    quint32 pres_size;
+    quint32 amv_start;
+    quint32 amv_size;
+    quint32 event_start;
+    quint32 event_recs;
+};
+
+const QString weinmann_class_name = STR_MACH_Weinmann;
+
+/*! \class WeinmannLoader
+    \brief Loader for Weinmann CPAP data
+    This is only relatively recent addition and still needs more work
+    */
+class WeinmannLoader : public CPAPLoader
+{
+  public:
+    WeinmannLoader();
+    virtual ~WeinmannLoader();
+
+    //! \brief Detect if the given path contains a valid Folder structure
+    virtual bool Detect(const QString & path);
+
+    //! \brief Scans path for Weinmann data signature, and Loads any new data
+    virtual int Open(QString path);
+
+    //! \brief Returns SleepLib database version of this Weinmann loader
+    virtual int Version() { return weinmann_data_version; }
+
+    //! \brief Returns the machine loader name of this class
+    virtual const QString &loaderName() { return weinmann_class_name; }
+
+    int ParseIndex(QFile & wmdata);
+
+
+    //! \brief Creates a machine object, indexed by serial number
+ //   Machine *CreateMachine(QString serial);
+
+    //! \brief Registers this MachineLoader with the master list, so Weinmann data can load
+    static void Register();
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_CPAP, 0, weinmann_class_name, QObject::tr("Weinmann"), QObject::tr("SOMNOsoft2"), QString(), QString(), QObject::tr(""), QDateTime::currentDateTime(), weinmann_data_version);
+    }
+    virtual void initChannels();
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // Now for some CPAPLoader overrides
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    virtual QString presRelType() { return QObject::tr("Unknown"); } // might not need this one
+
+    virtual ChannelID presRelSet() { return NoChannel; }
+    virtual ChannelID presRelLevel() { return NoChannel; }
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+  protected:
+    QHash<QString, int> index;
+    QList<CompInfo> compinfo;
+    QMap<SessionID, Session *> sessions;
+
+    QString last;
+
+    unsigned char *m_buffer;
+};
+
+
+#endif // WEINMANN_LOADER_H
diff --git a/sleepyhead/SleepLib/loader_plugins/zeo_loader.cpp b/sleepyhead/SleepLib/loader_plugins/zeo_loader.cpp
new file mode 100644
index 0000000..a3c1604
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/zeo_loader.cpp
@@ -0,0 +1,331 @@
+/* SleepLib ZEO Loader Implementation
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+//********************************************************************************************
+// IMPORTANT!!!
+//********************************************************************************************
+// Please INCREMENT the zeo_data_version in zel_loader.h when making changes to this loader
+// that change loader behaviour or modify channels.
+//********************************************************************************************
+
+#include <QDir>
+#include <QTextStream>
+#include "zeo_loader.h"
+#include "SleepLib/machine.h"
+
+ZEOLoader::ZEOLoader()
+{
+    m_type = MT_SLEEPSTAGE;
+}
+
+ZEOLoader::~ZEOLoader()
+{
+}
+
+int ZEOLoader::Open(QString path)
+{
+    Q_UNUSED(path)
+
+    QString newpath;
+
+    QString dirtag = "zeo";
+
+    // Could Scan the ZEO folder for a list of CSVs
+
+    path = path.replace("\\", "/");
+
+    if (path.toLower().endsWith("/" + dirtag)) {
+        return 0;
+        //newpath=path;
+    } else {
+        newpath = path + "/" + dirtag.toUpper();
+    }
+
+    //QString filename;
+
+    // ZEO folder structure detection stuff here.
+
+    return 0; // number of machines affected
+}
+
+/*15233: "Sleep Date"
+15234: "ZQ"
+15236: "Total Z"
+15237: "Time to Z"
+15237: "Time in Wake"
+15238: "Time in REM"
+15238: "Time in Light"
+15241: "Time in Deep"
+15242: "Awakenings"
+15245: "Start of Night"
+15246: "End of Night"
+15246: "Rise Time"
+15247: "Alarm Reason"
+15247: "Snooze Time"
+15254: "Wake Tone"
+15259: "Wake Window"
+15259: "Alarm Type"
+15260: "First Alarm Ring"
+15261: "Last Alarm Ring"
+15261: "First Snooze Time"
+15265: "Last Snooze Time"
+15266: "Set Alarm Time"
+15266: "Morning Feel"
+15267: "Sleep Graph"
+15267: "Detailed Sleep Graph"
+15268: "Firmware Version"  */
+
+int ZEOLoader::OpenFile(QString filename)
+{
+    QFile file(filename);
+
+    if (filename.toLower().endsWith(".csv")) {
+        if (!file.open(QFile::ReadOnly)) {
+            qDebug() << "Couldn't open zeo file" << filename;
+            return 0;
+        }
+    } else {// if (filename.toLower().endsWith(".dat")) {
+
+        return 0;
+        // not supported.
+    }
+
+    QTextStream text(&file);
+    QString headerdata = text.readLine();
+    QStringList header = headerdata.split(",");
+    QString line;
+    QStringList linecomp;
+    QDateTime start_of_night, end_of_night, rise_time;
+    SessionID sid;
+
+    //const qint64 WindowSize=30000;
+    qint64 st, tt;
+    int stage;
+
+    int ZQ, TotalZ, TimeToZ, TimeInWake, TimeInREM, TimeInLight, TimeInDeep, Awakenings;
+    int AlarmReason, SnoozeTime, WakeTone, WakeWindow, AlarmType, MorningFeel;
+    QString FirmwareVersion, MyZeoVersion;
+
+    QDateTime FirstAlarmRing, LastAlarmRing, FirstSnoozeTime, LastSnoozeTime, SetAlarmTime;
+
+    QStringList SG, DSG;
+
+    MachineInfo info = newInfo();
+    Machine *mach = CreateMachine(info);
+
+
+    int idxZQ = header.indexOf("ZQ");
+    int idxTotalZ = header.indexOf("Total Z");
+    int idxAwakenings = header.indexOf("Awakenings");
+    int idxSG = header.indexOf("Sleep Graph");
+    int idxDSG = header.indexOf("Detailed Sleep Graph");
+    int idxTimeInWake = header.indexOf("Time in Wake");
+    int idxTimeToZ = header.indexOf("Time to Z");
+    int idxTimeInREM = header.indexOf("Time in REM");
+    int idxTimeInLight = header.indexOf("Time in Light");
+    int idxTimeInDeep = header.indexOf("Time in Deep");
+    int idxStartOfNight = header.indexOf("Start of Night");
+    int idxEndOfNight = header.indexOf("End of Night");
+    int idxRiseTime = header.indexOf("Rise Time");
+    int idxAlarmReason = header.indexOf("Alarm Reason");
+    int idxSnoozeTime = header.indexOf("Snooze Time");
+    int idxWakeTone = header.indexOf("Wake Tone");
+    int idxWakeWindow = header.indexOf("Wake Window");
+    int idxAlarmType = header.indexOf("Alarm Type");
+    int idxFirstAlaramRing = header.indexOf("First Alarm Ring");
+    int idxLastAlaramRing = header.indexOf("Last Alarm Ring");
+    int idxFirstSnoozeTime = header.indexOf("First Snooze Time");
+    int idxLastSnoozeTime = header.indexOf("Last Snooze Time");
+    int idxSetAlarmTime = header.indexOf("Set Alarm Time");
+    int idxMorningFeel = header.indexOf("Morning Feel");
+    int idxFirmwareVersion = header.indexOf("Firmware Version");
+    int idxMyZEOVersion = header.indexOf("My ZEO Version");
+
+    bool ok;
+    bool dodgy;
+
+    do {
+        line = text.readLine();
+        dodgy = false;
+
+        if (line.isEmpty()) { continue; }
+
+        linecomp = line.split(",");
+        ZQ = linecomp[idxZQ].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        TotalZ = linecomp[idxTotalZ].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        TimeToZ = linecomp[idxTimeToZ].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        TimeInWake = linecomp[idxTimeInWake].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        TimeInREM = linecomp[idxTimeInREM].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        TimeInLight = linecomp[idxTimeInLight].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        TimeInDeep = linecomp[idxTimeInDeep].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        Awakenings = linecomp[idxAwakenings].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        start_of_night = QDateTime::fromString(linecomp[idxStartOfNight], "MM/dd/yyyy HH:mm");
+
+        if (!start_of_night.isValid()) { dodgy = true; }
+
+        end_of_night = QDateTime::fromString(linecomp[idxEndOfNight], "MM/dd/yyyy HH:mm");
+
+        if (!end_of_night.isValid()) { dodgy = true; }
+
+        rise_time = QDateTime::fromString(linecomp[idxRiseTime], "MM/dd/yyyy HH:mm");
+
+        if (!rise_time.isValid()) { dodgy = true; }
+
+        AlarmReason = linecomp[idxAlarmReason].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        SnoozeTime = linecomp[idxSnoozeTime].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        WakeTone = linecomp[idxWakeTone].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        WakeWindow = linecomp[idxWakeWindow].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        AlarmType = linecomp[idxAlarmType].toInt(&ok);
+
+        if (!ok) { dodgy = true; }
+
+        if (!linecomp[idxFirstAlaramRing].isEmpty()) {
+            FirstAlarmRing = QDateTime::fromString(linecomp[idxFirstAlaramRing], "MM/dd/yyyy HH:mm");
+
+            if (!FirstAlarmRing.isValid()) { dodgy = true; }
+        }
+
+        if (!linecomp[idxLastAlaramRing].isEmpty()) {
+            LastAlarmRing = QDateTime::fromString(linecomp[idxLastAlaramRing], "MM/dd/yyyy HH:mm");
+
+            if (!LastAlarmRing.isValid()) { dodgy = true; }
+        }
+
+        if (!linecomp[idxFirstSnoozeTime].isEmpty()) {
+            FirstSnoozeTime = QDateTime::fromString(linecomp[idxFirstSnoozeTime], "MM/dd/yyyy HH:mm");
+
+            if (!FirstSnoozeTime.isValid()) { dodgy = true; }
+        }
+
+        if (!linecomp[idxLastSnoozeTime].isEmpty()) {
+            LastSnoozeTime = QDateTime::fromString(linecomp[idxLastSnoozeTime], "MM/dd/yyyy HH:mm");
+
+            if (!LastSnoozeTime.isValid()) { dodgy = true; }
+        }
+
+        if (!linecomp[idxSetAlarmTime].isEmpty()) {
+            SetAlarmTime = QDateTime::fromString(linecomp[idxSetAlarmTime], "MM/dd/yyyy HH:mm");
+
+            if (!SetAlarmTime.isValid()) { dodgy = true; }
+        }
+
+        MorningFeel = linecomp[idxMorningFeel].toInt(&ok);
+
+        if (!ok) { MorningFeel = 0; }
+
+        FirmwareVersion = linecomp[idxFirmwareVersion];
+
+        if (idxMyZEOVersion >= 0) { MyZeoVersion = linecomp[idxMyZEOVersion]; }
+
+        if (dodgy) {
+            continue;
+        }
+
+        SG = linecomp[idxSG].split(" ");
+        DSG = linecomp[idxDSG].split(" ");
+
+        const int WindowSize = 30000;
+        sid = start_of_night.toTime_t();
+
+        if (DSG.size() == 0) {
+            continue;
+        }
+
+        if (mach->SessionExists(sid)) {
+            continue;
+        }
+
+        Session *sess = new Session(mach, sid);
+
+        sess->settings[ZEO_Awakenings] = Awakenings;
+        sess->settings[ZEO_MorningFeel] = MorningFeel;
+        sess->settings[ZEO_TimeToZ] = TimeToZ;
+        sess->settings[ZEO_ZQ] = ZQ;
+        sess->settings[ZEO_TimeInWake] = TimeInWake;
+        sess->settings[ZEO_TimeInREM] = TimeInREM;
+        sess->settings[ZEO_TimeInLight] = TimeInLight;
+        sess->settings[ZEO_TimeInDeep] = TimeInDeep;
+
+        st = qint64(start_of_night.toTime_t()) * 1000L;
+        sess->really_set_first(st);
+        tt = st;
+        EventList *sleepstage = sess->AddEventList(ZEO_SleepStage, EVL_Event, 1, 0, 0, 4);
+
+        for (int i = 0; i < DSG.size(); i++) {
+            stage = DSG[i].toInt(&ok);
+
+            if (ok) {
+                sleepstage->AddEvent(tt, stage);
+            }
+
+            tt += WindowSize;
+        }
+
+        sess->really_set_last(tt);
+        int size = DSG.size();
+        sess->SetChanged(true);
+        mach->AddSession(sess);
+
+
+        qDebug() << linecomp[0] << start_of_night << end_of_night << rise_time << size <<
+                 "30 second chunks";
+
+    } while (!line.isNull());
+
+    mach->Save();
+    return true;
+}
+
+static bool zeo_initialized = false;
+
+void ZEOLoader::Register()
+{
+    if (zeo_initialized) { return; }
+
+    qDebug("Registering ZEOLoader");
+    RegisterLoader(new ZEOLoader());
+    //InitModelMap();
+    zeo_initialized = true;
+}
+
diff --git a/sleepyhead/SleepLib/loader_plugins/zeo_loader.h b/sleepyhead/SleepLib/loader_plugins/zeo_loader.h
new file mode 100644
index 0000000..c8de86a
--- /dev/null
+++ b/sleepyhead/SleepLib/loader_plugins/zeo_loader.h
@@ -0,0 +1,45 @@
+/* SleepLib ZEO Loader Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef ZEOLOADER_H
+#define ZEOLOADER_H
+
+#include "SleepLib/machine_loader.h"
+
+const QString zeo_class_name = "ZEO";
+const int zeo_data_version = 1;
+
+
+/*! \class ZEOLoader
+    \brief Unfinished stub for loading ZEO Personal Sleep Coach data
+*/
+class ZEOLoader : public MachineLoader
+{
+  public:
+    ZEOLoader();
+    virtual ~ZEOLoader();
+
+    virtual bool Detect(const QString &path) { Q_UNUSED(path); return false; }  // bypass autoscanner
+
+    virtual int Open(QString path);
+    virtual int OpenFile(QString filename);
+    static void Register();
+
+    virtual int Version() { return zeo_data_version; }
+    virtual const QString &loaderName() { return zeo_class_name; }
+
+    //Machine *CreateMachine();
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_SLEEPSTAGE, 0, zeo_class_name, QObject::tr("Zeo"), QString(), QString(), QString(), QObject::tr("Personal Sleep Coach"), QDateTime::currentDateTime(), zeo_data_version);
+    }
+
+  protected:
+  private:
+};
+
+#endif // ZEOLOADER_H
diff --git a/sleepyhead/SleepLib/machine.cpp b/sleepyhead/SleepLib/machine.cpp
new file mode 100644
index 0000000..270f5d6
--- /dev/null
+++ b/sleepyhead/SleepLib/machine.cpp
@@ -0,0 +1,1185 @@
+/* SleepLib Machine Class Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QApplication>
+#include <QDir>
+#include <QDebug>
+#include <QString>
+#include <QObject>
+#include <QThreadPool>
+#include <QFile>
+#include <QDataStream>
+#include <QDomDocument>
+#include <QDomElement>
+
+
+#include <QDialog>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QLabel>
+#include "mainwindow.h"
+
+#include "progressdialog.h"
+
+#include <time.h>
+
+#include "machine.h"
+#include "profiles.h"
+#include <algorithm>
+#include "SleepLib/schema.h"
+#include "SleepLib/day.h"
+
+extern QProgressBar *qprogress;
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Machine Base-Class implmementation
+//////////////////////////////////////////////////////////////////////////////////////////
+Machine::Machine(MachineID id)
+{
+    day.clear();
+    highest_sessionid = 0;
+    m_unsupported = false;
+
+    if (!id) {
+        srand(time(nullptr));
+        MachineID temp;
+
+        do {
+            temp = rand();
+        } while (p_profile->machlist.find(temp) != p_profile->machlist.end());
+
+        m_id = temp;
+
+    } else { m_id = id; }
+    m_loader = nullptr;
+
+   // qDebug() << "Create Machine: " << hex << m_id; //%lx",m_id);
+    m_type = MT_UNKNOWN;
+    firstsession = true;
+}
+Machine::~Machine()
+{
+    saveSessionInfo();
+    qDebug() << "Destroy Machine" << info.loadername << hex << m_id;
+}
+Session *Machine::SessionExists(SessionID session)
+{
+    if (sessionlist.find(session) != sessionlist.end()) {
+        return sessionlist[session];
+    } else {
+        return nullptr;
+    }
+}
+
+const quint16 sessinfo_version = 2;
+
+bool Machine::saveSessionInfo()
+{
+    if (info.type == MT_JOURNAL) return false;
+
+    qDebug() << "Saving" << info.brand << "session info" << info.loadername;
+    QString filename = getDataPath() + "Sessions.info";
+    QFile file(filename);
+    if (!file.open(QFile::WriteOnly)) {
+        qDebug() << "Couldn't open" << filename << "for writing";
+        return false;
+    }
+
+    QDataStream out(&file);
+    out.setByteOrder(QDataStream::LittleEndian);
+    out.setVersion(QDataStream::Qt_5_0);
+
+    out << magic;
+    out << filetype_sessenabled;
+    out << sessinfo_version;
+
+    QHash<SessionID, Session *>::iterator s;
+
+    out << (int)sessionlist.size();
+    for (s = sessionlist.begin(); s != sessionlist.end(); ++s) {
+        Session * sess = s.value();
+        out << (quint32) sess->session();
+        out << (bool)(sess->enabled());
+
+        //out << sess->m_availableChannels;
+    }
+    qDebug() << "Done Saving" << info.brand << "session info";
+
+    return true;
+}
+
+bool Machine::loadSessionInfo()
+{
+    if (info.type == MT_JOURNAL)
+        return true;
+
+    QHash<SessionID, Session *>::iterator s;
+    QFile file(getDataPath() + "Sessions.info");
+    if (!file.open(QFile::ReadOnly)) {
+        for (s = sessionlist.begin(); s!= sessionlist.end(); ++s) {
+            Session * sess = s.value();
+            QHash<ChannelID, QVariant>::iterator it = sess->settings.find(SESSION_ENABLED);
+
+            bool b = true;
+            if (it != sess->settings.end()) {
+                b = it.value().toBool();
+            }
+            sess->setEnabled(b);        // Extract from session settings and save..
+        }
+        saveSessionInfo();
+        return true;
+    }
+
+    QDataStream in(&file);
+    in.setByteOrder(QDataStream::LittleEndian);
+    in.setVersion(QDataStream::Qt_5_0);
+
+    quint32 mag32;
+    in >> mag32;
+
+    quint16 ft16, version;
+    in >> ft16;
+    in >> version;
+
+    if (version == 1) {
+        // was available channels
+        QHash<ChannelID, bool> crap;
+        in >> crap;
+    }
+
+    int size;
+    in >> size;
+
+    quint32 sid;
+    bool b;
+
+    for (int i=0; i< size; ++i) {
+        in >> sid;
+        in >> b;
+
+        s = sessionlist.find(sid);
+
+        if (s != sessionlist.end()) {
+            Session * sess = s.value();
+
+            sess->setEnabled(b);
+        }
+    }
+    return true;
+}
+
+// Find date this session belongs in
+QDate Machine::pickDate(qint64 first)
+{
+    QTime split_time = p_profile->session->daySplitTime();
+    int combine_sessions = p_profile->session->combineCloseSessions();
+
+    QDateTime d2 = QDateTime::fromTime_t(first / 1000);
+
+    QDate date = d2.date();
+    QTime time = d2.time();
+
+    int closest_session = 0;
+
+    if (time < split_time) {
+        date = date.addDays(-1);
+    } else if (combine_sessions > 0) {
+        QMap<QDate, Day *>::iterator dit = day.find(date.addDays(-1)); // Check Day Before
+
+        if (dit != day.end()) {
+            QDateTime lt = QDateTime::fromTime_t(dit.value()->last() / 1000L);
+            closest_session = lt.secsTo(d2) / 60;
+
+            if (closest_session < combine_sessions) {
+                date = date.addDays(-1);
+            }
+        }
+    }
+
+    return date;
+}
+
+bool Machine::AddSession(Session *s)
+{
+    Q_ASSERT(s != nullptr);
+    Q_ASSERT(p_profile);
+    Q_ASSERT(p_profile->isOpen());
+
+    if (s->type() == MT_OXIMETER) {
+        int i=5;
+    }
+    updateChannels(s);
+
+    if (p_profile->session->ignoreOlderSessions()) {
+        qint64 ignorebefore = p_profile->session->ignoreOlderSessionsDate().toMSecsSinceEpoch();
+        if (s->last() < ignorebefore) {
+            skipped_sessions++;
+            return false;
+        }
+    }
+
+    if (s->session() > highest_sessionid) {
+        highest_sessionid = s->session();
+    }
+
+    QTime split_time;
+    int combine_sessions;
+    bool locksessions = p_profile->session->lockSummarySessions();
+
+    if (locksessions) {
+        split_time = s->summaryOnly() ? QTime(12,0,0) : p_profile->session->daySplitTime();
+        combine_sessions = s->summaryOnly() ? 0 : p_profile->session->combineCloseSessions();
+    } else {
+        split_time = p_profile->session->daySplitTime();
+        combine_sessions = p_profile->session->combineCloseSessions();
+    }
+
+    int ignore_sessions = p_profile->session->ignoreShortSessions();
+
+    int session_length = s->last() - s->first();
+    session_length /= 60000;
+
+    sessionlist[s->session()] = s; // To make sure it get's saved later even if it's not wanted.
+
+    //int drift=p_profile->cpap->clockDrift();
+
+    QDateTime d2 = QDateTime::fromTime_t(s->first() / 1000);
+
+    QDate date = d2.date();
+    QTime time = d2.time();
+
+    QMap<QDate, Day *>::iterator dit, nextday;
+
+    bool combine_next_day = false;
+    int closest_session = 0;
+
+
+    // Multithreaded import screws this up. :(
+
+    if (time < split_time) {
+        date = date.addDays(-1);
+    } else if (combine_sessions > 0) {
+        dit = day.find(date.addDays(-1)); // Check Day Before
+
+        if (dit != day.end()) {
+            QDateTime lt = QDateTime::fromTime_t(dit.value()->last() / 1000);
+            closest_session = lt.secsTo(d2) / 60;
+
+            if (closest_session < combine_sessions) {
+                date = date.addDays(-1);
+            } else {
+                if ((split_time < time) && (split_time.secsTo(time) < 2)) {
+                    if (s->machine()->loaderName() == STR_MACH_ResMed) {
+                        date = date.addDays(-1);
+                    }
+                }
+            }
+        } else {
+            nextday = day.find(date.addDays(1)); // Check Day Afterwards
+
+            if (nextday != day.end()) {
+                QDateTime lt = QDateTime::fromTime_t(nextday.value()->first() / 1000);
+                closest_session = d2.secsTo(lt) / 60;
+
+                if (closest_session < combine_sessions) {
+                    // add todays here. pull all tomorrows records to this date.
+                    combine_next_day = true;
+                }
+            }
+        }
+    }
+
+    if (session_length < ignore_sessions) {
+        // keep the session to save importing it again, but don't add it to the day record this time
+        return true;
+    }
+
+    if (!firstsession) {
+        if (firstday > date) { firstday = date; }
+
+        if (lastday < date) { lastday = date; }
+    } else {
+        firstday = lastday = date;
+        firstsession = false;
+    }
+
+
+    Day *dd = nullptr;
+    dit = day.find(date);
+
+    if (dit == day.end()) {
+        dit = day.insert(date, p_profile->addDay(date));
+    }
+    dd = dit.value();
+
+    dd->addSession(s);
+
+    if (combine_next_day) {
+        for (QList<Session *>::iterator i = nextday.value()->begin(); i != nextday.value()->end(); i++) {
+            // i may need to do something here
+            if (locksessions && (*i)->summaryOnly()) continue; // can't move summary only sessions..
+            unlinkSession(*i);
+            // Add it back
+
+            sessionlist[(*i)->session()] = *i;
+
+            dd->addSession(*i);
+        }
+
+//        QMap<QDate, QList<Day *> >::iterator nd = p_profile->daylist.find(date.addDays(1));
+//        if (nd != p_profile->daylist.end()) {
+//            p_profile->unlinkDay(nd.key(), nd.value());
+//        }
+
+//        QList<Day *>::iterator iend = nd.value().end();
+//        for (QList<Day *>::iterator i = nd.value()->begin(); i != iend; ++i) {
+//            if (*i == nextday.value()) {
+//                nd.value().erase(i);
+//            }
+//        }
+
+//        day.erase(nextday);
+    }
+
+    return true;
+}
+
+bool Machine::unlinkDay(Day * d)
+{
+    return day.remove(day.key(d)) > 0;
+}
+
+QString Machine::getPixmapPath()
+{
+    if (!loader()) return "";
+    return loader()->getPixmapPath(info.series);
+}
+
+QPixmap & Machine::getPixmap()
+{
+    static QPixmap pm;
+    if (!loader()) return pm;
+    return loader()->getPixmap(info.series);
+}
+
+bool Machine::unlinkSession(Session * sess)
+{
+    MachineType mt = sess->type();
+
+    // Remove the object from the machine object's session list
+    bool b=sessionlist.remove(sess->session());
+
+    QList<QDate> dates;
+
+    QList<Day *> days;
+    QMap<QDate, Day *>::iterator it;
+
+    Day * d;
+
+    // Doing this in case of accidental double linkages
+    for (it = day.begin(); it != day.end(); ++it) {
+        d = it.value();
+        if (it.value()->sessions.contains(sess)) {
+            days.push_back(d);
+            dates.push_back(it.key());
+        }
+    }
+
+    for (int i=0; i < days.size(); ++i) {
+        d = days.at(i);
+        if (d->sessions.removeAll(sess)) {
+            b=true;
+            if (!d->searchMachine(mt)) {
+                d->machines.remove(mt);
+                day.remove(dates[i]);
+            }
+
+            if (d->size() == 0) {
+                p_profile->unlinkDay(d);
+            }
+        }
+    }
+
+    return b;
+}
+
+// This functions purpose is murder and mayhem... It deletes all of a machines data.
+bool Machine::Purge(int secret)
+{
+    // Boring api key to stop this function getting called by accident :)
+    if (secret != 3478216) { return false; }
+
+    QString path = getDataPath();
+
+    QDir dir(path);
+
+    if (!dir.exists()) { // It doesn't exist anyway.
+        return true;
+    }
+
+    if (!dir.isReadable()) {
+        return false;
+    }
+
+    qDebug() << "Purging" << info.loadername << info.serial << dir.absoluteFilePath(path);
+
+    // Remove any imported file list
+    QFile impfile(getDataPath()+"/imported_files.csv");
+    impfile.remove();
+
+    QFile rxcache(p_profile->Get("{" + STR_GEN_DataFolder + "}/RXChanges.cache" ));
+    rxcache.remove();
+
+    QFile sumfile(getDataPath()+"Summaries.xml.gz");
+    sumfile.remove();
+
+    // Create a copy of the list so the hash can be manipulated
+    QList<Session *> sessions = sessionlist.values();
+
+    // Clean up any loaded sessions from memory first..
+    bool success = true;
+    for (int i=0; i < sessions.size(); ++i) {
+        Session * sess = sessions[i];
+        if (!sess->Destroy()) {
+            qDebug() << "Could not destroy "+ info.loadername +" ("+info.serial+") session" << sess->session();
+            success = false;
+        } else {
+//            sessionlist.remove(sess->session());
+        }
+
+        delete sess;
+    }
+
+    // Remove EVERYTHING under Events folder..
+    QString eventspath = getEventsPath();
+    QDir evdir(eventspath);
+    evdir.removeRecursively();
+
+    QString summariespath = getSummariesPath();
+    QDir sumdir(summariespath);
+    sumdir.removeRecursively();
+
+
+    // Clean up any straggling files (like from short sessions not being loaded...)
+    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+    dir.setSorting(QDir::Name);
+
+    QFileInfoList list = dir.entryInfoList();
+    int could_not_kill = 0;
+
+    int size = list.size();
+    for (int i = 0; i < size; ++i) {
+        QFileInfo fi = list.at(i);
+        QString fullpath = fi.canonicalFilePath();
+
+        QString ext_s = fullpath.section('.', -1);
+        bool ok;
+        ext_s.toInt(&ok, 10);
+
+        if (ok) {
+            qDebug() << "Deleting " << QDir::toNativeSeparators(fullpath);
+            if (!dir.remove(fullpath)) {
+                qDebug() << "Could not purge file" << fullpath;
+                success=false;
+                could_not_kill++;
+            }
+        } else {
+            qDebug() << "Didn't bother deleting cruft file" << fullpath;
+            // cruft file..
+        }
+    }
+
+
+    if (could_not_kill > 0) {
+        qWarning() << "Could not purge path" << could_not_kill << "files in " << path;
+        return false;
+    }
+
+    return true;
+}
+
+void Machine::setLoaderName(QString value)
+{
+    info.loadername = value;
+    m_loader = GetLoader(value);
+}
+
+void Machine::setInfo(MachineInfo inf)
+{
+    info = inf;
+    m_loader = GetLoader(inf.loadername);
+}
+
+
+//const quint32 channel_version=1;
+
+const QString Machine::getDataPath()
+{
+    if (m_dataPath.isEmpty()) {
+        m_dataPath = p_profile->Get("{" + STR_GEN_DataFolder + "}/" + info.loadername + "_" + (info.serial.isEmpty() ? hexid() : info.serial)) + "/";
+    }
+    return m_dataPath;
+}
+const QString Machine::getSummariesPath()
+{
+    return getDataPath() + "Summaries/";
+}
+const QString Machine::getEventsPath()
+{
+    return getDataPath() + "Events/";
+}
+
+const QString Machine::getBackupPath()
+{
+    return p_profile->Get("{" + STR_GEN_DataFolder + "}/" + info.loadername + "_" + (info.serial.isEmpty() ? hexid() : info.serial)  + "/Backup/");
+}
+
+bool Machine::Load()
+{
+    QString path = getDataPath();
+
+    QDir dir(path);
+    qDebug() << "Loading Database" << QDir::toNativeSeparators(path);
+
+    if (!dir.exists() || !dir.isReadable()) {
+        return false;
+    }
+
+    ProgressDialog * popup = new ProgressDialog(nullptr);
+
+    QPixmap image = getPixmap().scaled(64,64);
+    popup->setPixmap(image);
+    popup->setMessage(QObject::tr("Loading %1 data...").arg(info.brand));
+    popup->show();
+
+    QProgressBar * progress = popup->progress;
+
+    if (!LoadSummary(progress)) {
+        // No XML index file, so assume upgrading, or it simply just got screwed up or deleted...
+        QTime time;
+        time.start();
+        dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+
+        ///////////////////////////////////////////////////////////////////////
+        // First move any old files to correct locations
+        ///////////////////////////////////////////////////////////////////////
+        QString summarypath = getSummariesPath();
+        QString eventpath = getEventsPath();
+
+        if (!dir.exists(summarypath)) dir.mkpath(summarypath);
+
+        QStringList filters;
+        filters << "*.000";
+        dir.setNameFilters(filters);
+        QStringList filelist = dir.entryList();
+        int size = filelist.size();
+
+        if (progress) {
+            progress->setMinimum(0);
+            progress->setMaximum(0);
+            progress->setValue(0);
+            QApplication::processEvents();
+        }
+
+        for (int i=0; i < size; i++) {
+            QString filename = filelist.at(i);
+            QFile::copy(path+filename, summarypath+filename);
+            QFile::remove(path+filename);
+        }
+        // Copy old Event files to folder
+        filters.clear();
+        filters << "*.001";
+        dir.setNameFilters(filters);
+        filelist = dir.entryList();
+        size = filelist.size();
+        if (size > 0) {
+            if (!dir.exists(eventpath)) dir.mkpath(eventpath);
+            for (int i=0; i< filelist.size(); i++) {
+                if ((i % 50) == 0) { // This is slow.. :-/
+                    if (progress) { progress->setValue((float(i) / float(size) * 100.0)); }
+
+                    QApplication::processEvents();
+                }
+
+                QString filename = filelist.at(i);
+                QFile::copy(path+filename, eventpath+filename);
+                QFile::remove(path+filename);
+            }
+        }
+
+        ///////////////////////////////////////////////////////////////////////
+        // Now read summary files from correct location and load them
+        ///////////////////////////////////////////////////////////////////////
+        dir.setPath(summarypath);
+        filters.clear();
+        filters << "*.000";
+        dir.setNameFilters(filters);
+        filelist = dir.entryList();
+        size = filelist.size();
+
+        if (progress) {
+            progress->setMinimum(0);
+            progress->setMaximum(size);
+            progress->setValue(0);
+            QApplication::processEvents();
+        }
+
+        QString sesstr;
+        SessionID sessid;
+        bool ok;
+
+        for (int i=0; i < size; i++) {
+
+            if ((i % 50) == 0) { // This is slow.. :-/
+                if (progress) { progress->setValue(i); }
+
+                QApplication::processEvents();
+            }
+
+            QString filename = filelist.at(i);
+            sesstr = filename.section(".", 0, -2);
+            sessid = sesstr.toLong(&ok, 16);
+
+            if (!ok) { continue; }
+
+            Session *sess = new Session(this, sessid);
+
+            // Forced to load it, because know nothing about this session..
+            if (sess->LoadSummary()) {
+                AddSession(sess);
+            } else {
+                qWarning() << "Error loading summary file" << filename;
+                delete sess;
+            }
+        }
+
+        SaveSummary();
+        qDebug() << "Loaded" << info.model << "data in" << time.elapsed() << "ms";
+        if (progress) { progress->setValue(size); }
+    } else {
+        if (progress) { progress->setValue(100); }
+    }
+    loadSessionInfo();
+    QApplication::processEvents();
+    popup->hide();
+    delete popup;
+
+    return true;
+}
+
+bool Machine::SaveSession(Session *sess)
+{
+    QString path = getDataPath();
+
+    if (sess->IsChanged()) { sess->Store(path); }
+
+    return true;
+}
+
+void Machine::queSaveList(Session * sess)
+{
+    if (!m_save_threads_running) {
+        // Threads aren't being used.. so run the actual immediately...
+        int i = (float(m_donetasks) / float(m_totaltasks) * 100.0);
+        qprogress->setValue(i);
+        QApplication::processEvents();
+
+        sess->UpdateSummaries();
+        sess->Store(getDataPath());
+
+        if (!p_profile->session->cacheSessions()) {
+            sess->TrashEvents();
+        }
+
+    } else {
+        listMutex.lock();
+        m_savelist.append(sess);
+        listMutex.unlock();
+    }
+}
+
+Session *Machine::popSaveList()
+{
+    Session *sess = nullptr;
+    listMutex.lock();
+
+    if (!m_savelist.isEmpty()) {
+        sess = m_savelist.at(0);
+        m_savelist.pop_front();
+        m_donetasks++;
+    }
+
+    listMutex.unlock();
+    return sess;
+}
+
+// Call any time queing starts
+void Machine::StartSaveThreads()
+{
+    m_savelist.clear();
+    if (!p_profile->session->multithreading()) return;
+
+    QString path = getDataPath();
+
+    int threads = QThread::idealThreadCount();
+    savelistSem = new QSemaphore(threads);
+    savelistSem->acquire(threads);
+
+    m_save_threads_running = true;
+    m_donetasks=0;
+    m_totaltasks=0;
+
+    for (int i = 0; i < threads; i++) {
+        SaveThread * thr = new SaveThread(this, path);
+        QObject::connect(thr, SIGNAL(UpdateProgress(int)), qprogress, SLOT(setValue(int)));
+        thread.push_back(thr);
+        thread[i]->start();
+    }
+
+}
+
+// Call when all queing is completed
+void Machine::FinishSaveThreads()
+{
+    if (!m_save_threads_running)
+        return;
+
+    m_save_threads_running = false;
+
+    // Wait for all tasks to finish
+    while (!savelistSem->tryAcquire(thread.size(), 250)) {
+        if (qprogress) {
+            QApplication::processEvents();
+        }
+    }
+
+    for (int i = 0; i < thread.size(); ++i) {
+        while (thread[i]->isRunning()) {
+            SaveThread::msleep(250);
+            QApplication::processEvents();
+        }
+        QObject::disconnect(thread[i], SIGNAL(UpdateProgress(int)), qprogress, SLOT(setValue(int)));
+
+        delete thread[i];
+    }
+
+    delete savelistSem;
+}
+
+void SaveThread::run()
+{
+    bool running = true;
+    while (running) {
+        Session *sess = machine->popSaveList();
+        if (sess) {
+            if (machine->m_donetasks % 10 == 0) {
+                int i = (float(machine->m_donetasks) / float(machine->m_totaltasks) * 100.0);
+                emit UpdateProgress(i);
+            }
+            sess->UpdateSummaries();
+            machine->saveMutex.lock();
+            sess->Store(path);
+            machine->saveMutex.unlock();
+
+            sess->TrashEvents();
+        } else {
+            if (!machine->m_save_threads_running) {
+                break; // done
+            } else {
+                yieldCurrentThread(); // go do something else for a while
+            }
+        }
+    }
+
+    machine->savelistSem->release(1);
+}
+
+
+
+class SaveTask:public ImportTask
+{
+public:
+    SaveTask(Session * s, Machine * m): sess(s), mach(m) {}
+    virtual ~SaveTask() {}
+    virtual void run();
+
+protected:
+    Session * sess;
+    Machine * mach;
+};
+
+void SaveTask::run()
+{
+    sess->UpdateSummaries();
+    mach->saveMutex.lock();
+    sess->Store(mach->getDataPath());
+    mach->saveMutex.unlock();
+    sess->TrashEvents();
+}
+
+void Machine::queTask(ImportTask * task)
+{
+    if (0) { //p_profile->session->multithreading()) {
+        m_tasklist.push_back(task);
+        return;
+    }
+
+    task->run();
+    return;
+}
+
+void Machine::runTasks()
+{
+    if (0) { //!p_profile->session->multithreading()) {
+        Q_ASSERT(m_tasklist.isEmpty());
+        return;
+    }
+    QThreadPool * threadpool = QThreadPool::globalInstance();
+    int m_totaltasks=m_tasklist.size();
+    int m_currenttask=0;
+    while (!m_tasklist.isEmpty()) {
+        if (threadpool->tryStart(m_tasklist.at(0))) {
+            m_tasklist.pop_front();
+            float f = float(m_currenttask) / float(m_totaltasks) * 100.0;
+            qprogress->setValue(f);
+            m_currenttask++;
+        }
+        QApplication::processEvents();
+    }
+    QThreadPool::globalInstance()->waitForDone(-1);
+}
+
+bool Machine::hasModifiedSessions()
+{
+    QHash<SessionID, Session *>::iterator s;
+
+    for (s = sessionlist.begin(); s != sessionlist.end(); s++) {
+        if (s.value()->IsChanged()) {
+            return true;
+        }
+    }
+    return false;
+}
+
+const QString summaryFileName = "Summaries.xml";
+const int summaryxml_version=1;
+
+bool Machine::LoadSummary(QProgressBar * progress)
+{
+    QTime time;
+    time.start();
+    qDebug() << "Loading Summaries";
+
+    QString filename = getDataPath() + summaryFileName + ".gz";
+
+    QDomDocument doc;
+    QFile file(filename);
+    qDebug() << "Opening " << filename;
+
+    if (!file.open(QIODevice::ReadOnly)) {
+        qWarning() << "Could not open" << filename;
+        return false;
+    }
+
+    QByteArray data = file.readAll();
+
+    QByteArray uncompressed = gUncompress(data);
+
+    QString errorMsg;
+    int errorLine;
+
+    if (!doc.setContent(uncompressed, false, &errorMsg, &errorLine)) {
+        qWarning() << "Invalid XML Content in" << filename;
+        qWarning() << "Error line" << errorLine << ":" << errorMsg;
+        return false;
+    }
+
+    file.close();
+
+    QDomElement root = doc.documentElement();
+
+    if (root.tagName().compare("sessions", Qt::CaseInsensitive) != 0) {
+        qDebug() << "Summaries cache messed up, recreating...";
+        return false;
+    }
+    bool ok;
+    int version = root.attribute("version", "").toInt(&ok);
+    if (!ok || (version != summaryxml_version)) {
+        qDebug() << "Summaries cache outdated, recreating...";
+        return false;
+    }
+    QDomNode node;
+
+    bool s_ok;
+
+    QDomNodeList sessionlist = root.childNodes();
+
+    int size = sessionlist.size();
+
+    QMap<qint64, Session *>  sess_order;
+
+    for (int s=0; s < size; ++s) {
+        node = sessionlist.at(s);
+        QDomElement e = node.toElement();
+        SessionID sessid = e.attribute("id", "0").toLong(&s_ok);
+        qint64 first =  e.attribute("first", "0").toLongLong();
+        qint64 last =  e.attribute("last", "0").toLongLong();
+        bool enabled = e.attribute("enabled", "1").toInt() == 1;
+        bool events = e.attribute("events", "1").toInt() == 1;
+        if (s_ok) {
+            Session * sess = new Session(this, sessid);
+            sess->really_set_first(first);
+            sess->really_set_last(last);
+            sess->setEnabled(enabled);
+            sess->setSummaryOnly(!events);
+
+            if (e.hasChildNodes()) {
+                QList<ChannelID> available_channels;
+                QList<ChannelID> available_settings;
+
+                QDomElement chans = e.firstChildElement("channels");
+                if (chans.isElement()) {
+                    QDomNode node = chans.firstChild();
+                    QString txt = node.nodeValue();
+                    QStringList channels = txt.split(",");
+                    for (int i=0; i<channels.size(); ++i) {
+                        bool ok;
+                        ChannelID code = channels.at(i).toInt(&ok, 16);
+                        available_channels.append(code);
+                    }
+                }
+                sess->m_availableChannels = available_channels;
+
+                QDomElement sete = e.firstChildElement("settings");
+                if (sete.isElement()) {
+                    QString sets = sete.firstChild().nodeValue();
+                    QStringList settings = sets.split(",");
+                    for (int i=0; i<settings.size(); ++i) {
+                        bool ok;
+                        ChannelID code = settings.at(i).toInt(&ok, 16);
+                        available_settings.append(code);
+                    }
+                }
+                sess->m_availableSettings = available_settings;
+            }
+
+
+            sess_order[first] = sess;
+        }
+    }
+    QMap<qint64, Session *>::iterator it_end = sess_order.end();
+    QMap<qint64, Session *>::iterator it;
+    int cnt = 0;
+    bool loadSummaries = p_profile->session->preloadSummaries();
+
+    progress->setMaximum(sess_order.size());
+    for (it = sess_order.begin(); it != it_end; ++it, ++cnt) {
+        if ((cnt % 100) == 0) {
+            progress->setValue(cnt);
+            QApplication::processEvents();
+        }
+        Session * sess = it.value();
+        if (!AddSession(sess)) {
+            delete sess;
+        } else {
+            if (loadSummaries) sess->LoadSummary();
+        }
+    }
+    progress->setValue(sess_order.size());
+    QApplication::processEvents();
+
+    qDebug() << "Loaded" << info.series << info.model << "data in" << time.elapsed() << "ms";
+
+    return true;
+}
+
+bool Machine::SaveSummary()
+{
+    qDebug() << "Saving" << info.brand << info.model <<  "Summaries";
+    QString filename = getDataPath() + summaryFileName;
+
+    QDomDocument doc("SleepyHeadSessionIndex");
+
+    QDomElement root = doc.createElement("sessions");
+    root.setAttribute("version", summaryxml_version);
+    root.setAttribute("profile", p_profile->user->userName());
+    root.setAttribute("count", sessionlist.size());
+    root.setAttribute("loader", info.loadername);
+    root.setAttribute("serial", info.serial);
+
+    doc.appendChild(root);
+
+    if (!QDir().exists(getSummariesPath()))
+        QDir().mkpath(getSummariesPath());
+
+    QHash<SessionID, Session *>::iterator s;
+    QHash<SessionID, Session *>::iterator sess_end = sessionlist.end();
+
+    for (s = sessionlist.begin(); s != sess_end; ++s) {
+        QDomElement el = doc.createElement("session");
+        Session * sess = s.value();
+        el.setAttribute("id", (quint32)sess->session());
+        el.setAttribute("first", sess->realFirst());
+        el.setAttribute("last", sess->realLast());
+        el.setAttribute("enabled", sess->enabled() ? "1" : "0");
+        el.setAttribute("events", sess->summaryOnly() ? "0" : "1");
+
+        QHash<ChannelID, QVector<EventList *> >::iterator ev;
+        QHash<ChannelID, QVector<EventList *> >::iterator ev_end = sess->eventlist.end();
+        QStringList chanlist;
+        for (ev = sess->eventlist.begin(); ev != ev_end; ++ev) {
+            chanlist.append(QString::number(ev.key(), 16));
+        }
+        if (chanlist.size() == 0) {
+            for (int i=0; i<sess->m_availableChannels.size(); i++) {
+                ChannelID code = sess->m_availableChannels.at(i);
+                chanlist.append(QString::number(code, 16));
+            }
+        }
+
+        QDomElement chans = doc.createElement("channels");
+        chans.appendChild(doc.createTextNode(chanlist.join(",")));
+        el.appendChild(chans);
+
+        chanlist.clear();
+        QHash<ChannelID, QVariant>::iterator si;
+        QHash<ChannelID, QVariant>::iterator set_end = sess->settings.end();
+        for (si = sess->settings.begin(); si != set_end; ++si) {
+            chanlist.append(QString::number(si.key(), 16));
+        }
+        QDomElement settings = doc.createElement("settings");
+        settings.appendChild(doc.createTextNode(chanlist.join(",")));
+        el.appendChild(settings);
+
+        root.appendChild(el);
+        if (sess->IsChanged())
+            sess->StoreSummary();
+    }
+
+    QString xmltext;
+    QTextStream ts(&xmltext);
+    doc.save(ts, 1);
+
+    QByteArray data = gCompress(xmltext.toUtf8());
+
+    QFile file(filename + ".gz");
+
+    file.open(QFile::WriteOnly);
+    file.write(data);
+
+    return true;
+}
+
+bool Machine::Save()
+{
+    //int size;
+    int cnt = 0;
+
+    QString path = getDataPath();
+    QDir dir(path);
+
+    if (!dir.exists()) {
+        dir.mkdir(path);
+    }
+
+    QHash<SessionID, Session *>::iterator s;
+
+    m_savelist.clear();
+
+    // store any event summaries..
+    for (s = sessionlist.begin(); s != sessionlist.end(); s++) {
+        cnt++;
+
+        if ((*s)->IsChanged()) {
+            queTask(new SaveTask(*s, this));
+        }
+    }
+
+    runTasks();
+
+    return true;
+}
+
+void Machine::updateChannels(Session * sess)
+{
+    int size = sess->m_availableChannels.size();
+    for (int i=0; i < size; ++i) {
+        ChannelID code = sess->m_availableChannels.at(i);
+        m_availableChannels[code] = true;
+    }
+
+    size = sess->m_availableSettings.size();
+    for (int i=0; i < size; ++i) {
+        ChannelID code = sess->m_availableSettings.at(i);
+        m_availableSettings[code] = true;
+    }
+}
+
+QList<ChannelID> Machine::availableChannels(quint32 chantype)
+{
+    QList<ChannelID> list;
+
+    QHash<ChannelID, bool>::iterator end = m_availableChannels.end();
+    QHash<ChannelID, bool>::iterator it;
+    for (it = m_availableChannels.begin(); it != end; ++it) {
+        ChannelID code = it.key();
+        const schema::Channel & chan = schema::channel[code];
+        if (chan.type() & chantype) {
+            list.push_back(code);
+        }
+    }
+    return list;
+}
+
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// CPAP implmementation
+//////////////////////////////////////////////////////////////////////////////////////////
+CPAP::CPAP(MachineID id): Machine(id)
+{
+    m_type = MT_CPAP;
+}
+
+CPAP::~CPAP()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// Oximeter Class implmementation
+//////////////////////////////////////////////////////////////////////////////////////////
+Oximeter::Oximeter(MachineID id): Machine(id)
+{
+    m_type = MT_OXIMETER;
+}
+
+Oximeter::~Oximeter()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// SleepStage Class implmementation
+//////////////////////////////////////////////////////////////////////////////////////////
+SleepStage::SleepStage(MachineID id): Machine(id)
+{
+    m_type = MT_SLEEPSTAGE;
+}
+SleepStage::~SleepStage()
+{
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// PositionSensor Class implmementation
+//////////////////////////////////////////////////////////////////////////////////////////
+PositionSensor::PositionSensor(MachineID id): Machine(id)
+{
+    m_type = MT_POSITION;
+}
+PositionSensor::~PositionSensor()
+{
+}
diff --git a/sleepyhead/SleepLib/machine.h b/sleepyhead/SleepLib/machine.h
new file mode 100644
index 0000000..da99d55
--- /dev/null
+++ b/sleepyhead/SleepLib/machine.h
@@ -0,0 +1,314 @@
+/* SleepLib Machine Class Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef MACHINE_H
+#define MACHINE_H
+
+
+#include <QString>
+#include <QVariant>
+#include <QDateTime>
+#include <QPixmap>
+#include <QRunnable>
+#include <QThread>
+#include <QMutex>
+#include <QSemaphore>
+#include <QProgressBar>
+
+#include <QHash>
+#include <QVector>
+#include <list>
+
+#include "SleepLib/preferences.h"
+#include "SleepLib/machine_common.h"
+#include "SleepLib/event.h"
+#include "SleepLib/session.h"
+#include "SleepLib/schema.h"
+#include "SleepLib/day.h"
+
+
+class Day;
+class Session;
+class Profile;
+class Machine;
+
+/*! \class SaveThread
+    \brief This class is used in the multithreaded save code.. It accelerates the indexing of summary data.
+    */
+class SaveThread: public QThread
+{
+    Q_OBJECT
+  public:
+    SaveThread(Machine *m, QString p) { machine = m; path = p; }
+
+    //! \brief Static millisecond sleep function.. Can be used from anywhere
+    static void msleep(unsigned long msecs) { QThread::msleep(msecs); }
+
+    //! \brief Start Save processing thread running
+    virtual void run();
+  protected:
+    Machine *machine;
+    QString path;
+  signals:
+    //! \brief Signal sent to update the Progress Bar
+    void UpdateProgress(int i);
+};
+
+class ImportTask:public QRunnable
+{
+public:
+    explicit ImportTask() {}
+    virtual ~ImportTask() {}
+    virtual void run() {}
+};
+
+class MachineLoader;
+/*! \class Machine
+    \brief This Machine class is the Heart of SleepyLib, representing a single Machine and holding it's data
+
+    */
+class Machine
+{
+    friend class SaveThread;
+    friend class MachineLaoder;
+
+  public:
+    /*! \fn Machine(MachineID id=0);
+        \brief Constructs a Machine object with MachineID id
+
+        If supplied MachineID is zero, it will generate a new unused random one.
+        */
+    Machine(MachineID id = 0);
+    virtual ~Machine();
+
+    //! \brief Load all Machine summary data
+    bool Load();
+    bool LoadSummary(QProgressBar * progress);
+
+    //! \brief Save all Sessions where changed bit is set.
+    bool Save();
+    bool SaveSummary();
+
+    //! \brief Save individual session
+    bool SaveSession(Session *sess);
+
+    //! \brief Deletes the crud out of all machine data in the SleepLib database
+    bool Purge(int secret);
+
+    //! \brief Unlink a session from any Machine related indexes
+    bool unlinkSession(Session * sess);
+
+    bool unlinkDay(Day * day);
+
+    inline bool hasChannel(ChannelID code) {
+        return m_availableChannels.contains(code);
+    }
+
+    inline bool hasSetting(ChannelID code) {
+        return m_availableSettings.contains(code);
+    }
+
+    //! \brief Contains a secondary index of day data, containing just this machines sessions
+    QMap<QDate, Day *> day;
+
+    //! \brief Contains all sessions for this machine, indexed by SessionID
+    QHash<SessionID, Session *> sessionlist;
+
+    //! \brief List of text machine properties, like brand, model, etc...
+    QHash<QString, QString> properties;
+
+    //! \brief Returns a pointer to a valid Session object if SessionID exists
+    Session *SessionExists(SessionID session);
+
+    //! \brief Adds the session to this machine object, and the Master Profile list. (used during load)
+    bool AddSession(Session *s);
+
+    //! \brief Find the date this session belongs in, according to profile settings
+    QDate pickDate(qint64 start);
+
+    const QString getDataPath();
+    const QString getEventsPath();
+    const QString getSummariesPath();
+    const QString getBackupPath();
+
+    //! \brief Returns the machineID as a lower case hexadecimal string
+    QString hexid() { return QString().sprintf("%08lx", m_id); }
+
+
+    //! \brief Unused, increments the most recent sessionID
+    SessionID CreateSessionID() { return highest_sessionid + 1; }
+
+    //! \brief Returns this objects MachineID
+    const MachineID &id() { return m_id; }
+    void setId(MachineID id) { m_id = id; }
+
+    //! \brief Returns the date of the first loaded Session
+    const QDate &FirstDay() { return firstday; }
+
+    //! \brief Returns the date of the most recent loaded Session
+    const QDate &LastDay() { return lastday; }
+
+    //! \brief Add a new task to the multithreaded save code
+    void queSaveList(Session * sess);
+
+    bool hasModifiedSessions();
+
+    //! \brief Grab the next task in the multithreaded save code
+    Session *popSaveList();
+
+    //! \brief Start the save threads which handle indexing, file storage and waveform processing
+    void StartSaveThreads();
+
+    //! \brief Finish the save threads and safely close them
+    void FinishSaveThreads();
+
+    //! \brief The list of sessions that need saving (for multithreaded save code)
+    QList<Session *> m_savelist;
+
+    //yuck
+    QVector<SaveThread *>thread;
+    volatile int savelistCnt;
+    int savelistSize;
+    QMutex listMutex;
+    QSemaphore *savelistSem;
+
+    bool m_unsupported;
+
+    bool unsupported() { return m_unsupported; }
+    void setUnsupported(bool b) { m_unsupported = b; }
+
+    void lockSaveMutex() { listMutex.lock(); }
+    void unlockSaveMutex() { listMutex.unlock(); }
+    void skipSaveTask() { lockSaveMutex(); m_donetasks++; unlockSaveMutex(); }
+
+    void clearSkipped() { skipped_sessions = 0; }
+    int skippedSessions() { return skipped_sessions; }
+
+    inline int totalTasks() { return m_totaltasks; }
+    inline void setTotalTasks(int value) { m_totaltasks = value; }
+    inline int doneTasks() { return m_donetasks; }
+
+
+    inline MachineType type() const { return info.type; }
+    inline QString brand() const { return info.brand; }
+    inline QString loaderName() const { return info.loadername; }
+    inline QString model() const { return info.model; }
+    inline QString modelnumber() const { return info.modelnumber; }
+    inline QString serial() const { return info.serial; }
+    inline QString series() const { return info.series; }
+    inline quint32 cap() const { return info.cap; }
+
+    inline int version() const { return info.version; }
+    inline QDateTime lastImported() const { return info.lastimported; }
+
+    inline void setModel(QString value) { info.model = value; }
+    inline void setBrand(QString value) { info.brand = value; }
+    inline void setSerial(QString value) { info.serial = value; }
+    inline void setType(MachineType type) { info.type = type; }
+    inline void setCap(quint32 value) { info.cap = value; }
+
+    bool saveSessionInfo();
+    bool loadSessionInfo();
+
+    void setLoaderName(QString value);
+
+    QList<ChannelID> availableChannels(quint32 chantype);
+
+    MachineLoader * loader() { return m_loader; }
+
+    // much more simpler multithreading...
+    void queTask(ImportTask * task);
+    void runTasks();
+    QMutex saveMutex;
+
+    void setInfo(MachineInfo inf);
+    const MachineInfo getInfo() { return info; }
+
+    void updateChannels(Session * sess);
+
+
+    QString getPixmapPath();
+    QPixmap & getPixmap();
+
+    MachineInfo info;
+
+  protected:
+    QDate firstday, lastday;
+    SessionID highest_sessionid;
+    MachineID m_id;
+    MachineType m_type;
+    QString m_path;
+
+    MachineLoader * m_loader;
+
+    bool changed;
+    bool firstsession;
+    int m_totaltasks;
+    int m_donetasks;
+
+    int skipped_sessions;
+    volatile bool m_save_threads_running;
+
+    QList<ImportTask *> m_tasklist;
+
+    QHash<ChannelID, bool> m_availableChannels;
+    QHash<ChannelID, bool> m_availableSettings;
+
+    QString m_summaryPath;
+    QString m_eventsPath;
+    QString m_dataPath;
+};
+
+
+/*! \class CPAP
+    \brief A CPAP classed machine object..
+    */
+class CPAP: public Machine
+{
+  public:
+    CPAP(MachineID id = 0);
+    virtual ~CPAP();
+
+};
+
+
+/*! \class Oximeter
+    \brief An Oximeter classed machine object..
+    */
+class Oximeter: public Machine
+{
+  public:
+    Oximeter(MachineID id = 0);
+    virtual ~Oximeter();
+  protected:
+};
+
+/*! \class SleepStage
+    \brief A SleepStage classed machine object..
+    */
+class SleepStage: public Machine
+{
+  public:
+    SleepStage(MachineID id = 0);
+    virtual ~SleepStage();
+  protected:
+};
+
+/*! \class PositionSensor
+    \brief A PositionSensor classed machine object..
+    */
+class PositionSensor: public Machine
+{
+  public:
+    PositionSensor(MachineID id = 0);
+    virtual ~PositionSensor();
+  protected:
+};
+
+#endif // MACHINE_H
+
diff --git a/sleepyhead/SleepLib/machine_common.cpp b/sleepyhead/SleepLib/machine_common.cpp
new file mode 100644
index 0000000..c4eaecf
--- /dev/null
+++ b/sleepyhead/SleepLib/machine_common.cpp
@@ -0,0 +1,50 @@
+/* SleepLib Common Machine Stuff
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+
+#include "machine_common.h"
+
+
+ChannelID NoChannel, SESSION_ENABLED, CPAP_SummaryOnly;
+ChannelID CPAP_IPAP, CPAP_IPAPLo, CPAP_IPAPHi, CPAP_EPAP, CPAP_EPAPLo, CPAP_EPAPHi, CPAP_Pressure,
+          CPAP_PS, CPAP_Mode, CPAP_AHI,
+          CPAP_PressureMin, CPAP_PressureMax, CPAP_Ramp, CPAP_RampTime, CPAP_RampPressure, CPAP_Obstructive,
+          CPAP_Hypopnea,
+          CPAP_ClearAirway, CPAP_Apnea, CPAP_CSR, CPAP_LeakFlag, CPAP_ExP, CPAP_NRI, CPAP_VSnore,
+          CPAP_VSnore2,
+          CPAP_RERA, CPAP_PressurePulse, CPAP_FlowLimit, CPAP_SensAwake, CPAP_FlowRate, CPAP_MaskPressure,
+          CPAP_MaskPressureHi,
+          CPAP_RespEvent, CPAP_Snore, CPAP_MinuteVent, CPAP_RespRate, CPAP_TidalVolume, CPAP_PTB, CPAP_Leak,
+          CPAP_LeakMedian, CPAP_LeakTotal, CPAP_MaxLeak, CPAP_FLG, CPAP_IE, CPAP_Te, CPAP_Ti, CPAP_TgMV,
+          CPAP_UserFlag1, CPAP_UserFlag2, CPAP_UserFlag3, CPAP_BrokenSummary, CPAP_BrokenWaveform, CPAP_RDI,
+          CPAP_PresReliefMode, CPAP_PresReliefLevel, CPAP_PSMin, CPAP_PSMax, CPAP_Test1,
+          CPAP_Test2, CPAP_HumidSetting;
+
+
+ChannelID RMS9_E01, RMS9_E02, RMS9_SetPressure, RMS9_MaskOnTime;
+ChannelID INTELLIPAP_Unknown1, INTELLIPAP_Unknown2;
+
+ChannelID PRS1_00, PRS1_01, PRS1_08, PRS1_0A, PRS1_0B, PRS1_0C, PRS1_0E, PRS1_0F, CPAP_LargeLeak, PRS1_12,
+          PRS1_FlexMode, PRS1_FlexLevel, PRS1_HumidStatus, PRS1_HumidLevel, PRS1_SysLock,
+          PRS1_SysOneResistStat,
+          PRS1_SysOneResistSet, PRS1_HoseDiam, PRS1_AutoOn, PRS1_AutoOff, PRS1_MaskAlert, PRS1_ShowAHI;
+
+ChannelID OXI_Pulse, OXI_SPO2, OXI_Perf, OXI_PulseChange, OXI_SPO2Drop, OXI_Plethy;
+
+ChannelID Journal_Notes, Journal_Weight, Journal_BMI, Journal_ZombieMeter, LastUpdated,
+        Bookmark_Start, Bookmark_End, Bookmark_Notes;
+
+
+ChannelID ZEO_SleepStage, ZEO_ZQ, ZEO_TotalZ, ZEO_TimeToZ, ZEO_TimeInWake, ZEO_TimeInREM,
+          ZEO_TimeInLight, ZEO_TimeInDeep, ZEO_Awakenings,
+          ZEO_AlarmReason, ZEO_SnoozeTime, ZEO_WakeTone, ZEO_WakeWindow, ZEO_AlarmType, ZEO_MorningFeel,
+          ZEO_FirmwareVersion,
+          ZEO_FirstAlarmRing, ZEO_LastAlarmRing, ZEO_FirstSnoozeTime, ZEO_LastSnoozeTime, ZEO_SetAlarmTime,
+          ZEO_RiseTime;
+
+ChannelID POS_Orientation, POS_Inclination;
diff --git a/sleepyhead/SleepLib/machine_common.h b/sleepyhead/SleepLib/machine_common.h
new file mode 100644
index 0000000..77234aa
--- /dev/null
+++ b/sleepyhead/SleepLib/machine_common.h
@@ -0,0 +1,179 @@
+/* SleepLib Common Machine Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef MACHINE_COMMON_H
+#define MACHINE_COMMON_H
+
+#include <QHash>
+#include <QColor>
+#include <QVector>
+#include <QVariant>
+#include <QString>
+#include <QDateTime>
+#include <QDebug>
+using namespace std;
+
+// Do not change these without considering the consequences.. For one the Loader needs changing & version increase
+typedef quint32 ChannelID;
+typedef long MachineID;
+typedef long SessionID;
+typedef float EventDataType;
+typedef qint16 EventStoreType;
+
+//! \brief Exception class for out of Bounds error.. Unused.
+class BoundsError {};
+
+//! \brief Exception class for to trap old database versions.
+class OldDBVersion {};
+
+const quint32 magic = 0xC73216AB; // Magic number for SleepyHead Data Files.. Don't touch!
+
+//const int max_number_event_fields=10;
+// This should probably move somewhere else
+//! \fn timezoneOffset();
+//! \brief Calculate the timezone Offset in milliseconds between system timezone and UTC
+qint64 timezoneOffset();
+
+
+/*! \enum SummaryType
+    \brief Calculation/Display method to select from dealing with summary information
+  */
+enum SummaryType { ST_CNT, ST_SUM, ST_AVG, ST_WAVG, ST_PERC, ST_90P, ST_MIN, ST_MAX, ST_MID, ST_CPH, ST_SPH, ST_FIRST, ST_LAST, ST_HOURS, ST_SESSIONS, ST_SETMIN, ST_SETAVG, ST_SETMAX, ST_SETWAVG, ST_SETSUM, ST_SESSIONID, ST_DATE };
+
+/*! \enum MachineType
+    \brief Generalized type of a machine
+  */
+enum MachineType { MT_UNKNOWN = 0, MT_CPAP, MT_OXIMETER, MT_SLEEPSTAGE, MT_JOURNAL, MT_POSITION, MT_UNCATEGORIZED = 99};
+//void InitMapsWithoutAwesomeInitializerLists();
+
+// PAP Device Capabilities
+const quint32 CAP_Fixed               = 0x0000001;  // Constant PAP
+const quint32 CAP_Variable            = 0x0000002;  // Variable Base (EPAP) pressure
+const quint32 CAP_BiLevel             = 0x0000004;  // Fixed Pressure Support
+const quint32 CAP_Variable_PS         = 0x0000008;  // Pressure support can range
+const quint32 CAP_PressureRelief      = 0x0000010;  // Device has a pressure relief mode (EPR; Flex; SmartFlex)
+const quint32 CAP_Humidification      = 0x0000020;  // Device has a humidifier attached
+
+// PAP Mode Capabilities
+const quint32 PAP_CPAP                    = 0x0001;  // Fixed Pressure PAP
+const quint32 PAP_APAP                    = 0x0002;  // Auto Ranging PAP
+const quint32 PAP_BiLevelFixed            = 0x0004;  // Fixed BiLevel
+const quint32 PAP_BiLevelAutoFixed        = 0x0008;  // Auto BiLevel with Fixed EPAP
+const quint32 PAP_BiLevelAutoVariable     = 0x0010;  // Auto BiLevel with full ranging capabilities
+const quint32 PAP_ASV_Fixed               = 0x0020;  // ASV with fixed EPAP
+const quint32 PAP_ASV_Variable            = 0x0040;  // ASV with full ranging capabilities
+const quint32 PAP_SplitNight              = 0x8000;  // Split night capabilities
+
+
+
+/*! \enum CPAPMode
+    \brief CPAP Machines mode of operation
+  */
+enum CPAPMode { //:short
+    MODE_UNKNOWN = 0, MODE_CPAP, MODE_APAP, MODE_BILEVEL_FIXED, MODE_BILEVEL_AUTO_FIXED_PS, MODE_BILEVEL_AUTO_VARIABLE_PS, MODE_ASV, MODE_ASV_VARIABLE_EPAP
+};
+
+/*! \enum PRTypes
+    \brief Pressure Relief Types, used by CPAP machines
+  */
+enum PRTypes { //:short
+    PR_UNKNOWN = 0, PR_NONE, PR_CFLEX, PR_CFLEXPLUS, PR_AFLEX, PR_BIFLEX, PR_EPR, PR_SMARTFLEX, PR_EASYBREATHE, PR_SENSAWAKE
+};
+enum PRTimeModes { //:short
+    PM_UNKNOWN = 0, PM_RampOnly, PM_FullTime
+};
+
+
+struct MachineInfo {
+    MachineInfo() { type = MT_UNKNOWN; version = 0; cap=0; }
+    MachineInfo(const MachineInfo & copy) {
+        type = copy.type;
+        loadername = copy.loadername;
+        brand = copy.brand;
+        model = copy.model;
+        modelnumber = copy.modelnumber;
+        serial = copy.serial;
+        series = copy.series;
+        version = copy.version;
+        lastimported = copy.lastimported;
+        cap = copy.cap;
+    }
+
+    MachineInfo(MachineType type, quint32 cap, QString loadername, QString brand, QString model, QString modelnumber, QString serial, QString series, QDateTime lastimported, int version) :
+        type(type), cap(cap), loadername(loadername), brand(brand), model(model), modelnumber(modelnumber), serial(serial), series(series), lastimported(lastimported), version(version) {}
+
+    MachineType type;
+    quint32 cap;
+    QString loadername;
+    QString brand;
+    QString model;
+    QString modelnumber;
+    QString serial;
+    QString series;
+    QDateTime lastimported;
+    int version;
+};
+
+
+//extern map<ChannelID,QString> DefaultMCShortNames;
+//extern map<ChannelID,QString> DefaultMCLongNames;
+//extern map<PRTypes,QString> PressureReliefNames;
+//extern map<CPAPMode,QString> CPAPModeNames;
+
+/*! \enum MCDataType
+    \brief Data Types stored by Profile/Preferences objects, etc..
+    */
+
+enum MCDataType
+{ MC_bool = 0, MC_int, MC_long, MC_float, MC_double, MC_string, MC_datetime };
+
+
+extern ChannelID NoChannel, SESSION_ENABLED, CPAP_SummaryOnly;
+extern ChannelID CPAP_IPAP, CPAP_IPAPLo, CPAP_IPAPHi, CPAP_EPAP, CPAP_EPAPLo, CPAP_EPAPHi,
+       CPAP_Pressure, CPAP_PS, CPAP_PSMin, CPAP_PSMax,
+       CPAP_Mode, CPAP_AHI,
+       CPAP_PressureMin, CPAP_PressureMax, CPAP_Ramp, CPAP_RampTime, CPAP_RampPressure, CPAP_Obstructive,
+       CPAP_Hypopnea,
+       CPAP_ClearAirway, CPAP_Apnea, CPAP_CSR, CPAP_LeakFlag, CPAP_ExP, CPAP_NRI, CPAP_VSnore,
+       CPAP_VSnore2,
+       CPAP_RERA, CPAP_PressurePulse, CPAP_FlowLimit, CPAP_SensAwake, CPAP_FlowRate, CPAP_MaskPressure,
+       CPAP_MaskPressureHi,
+       CPAP_RespEvent, CPAP_Snore, CPAP_MinuteVent, CPAP_RespRate, CPAP_TidalVolume, CPAP_PTB, CPAP_Leak,
+       CPAP_LeakMedian, CPAP_LeakTotal, CPAP_MaxLeak, CPAP_FLG, CPAP_IE, CPAP_Te, CPAP_Ti, CPAP_TgMV,
+       CPAP_UserFlag1, CPAP_UserFlag2, CPAP_UserFlag3, CPAP_BrokenSummary, CPAP_BrokenWaveform, CPAP_RDI,
+       CPAP_PresReliefMode, CPAP_PresReliefLevel, CPAP_Test1, CPAP_Test2;
+
+extern ChannelID RMS9_E01, RMS9_E02, RMS9_SetPressure, RMS9_MaskOnTime;
+extern ChannelID PRS1_00, PRS1_01, PRS1_08, PRS1_0A, PRS1_0B, PRS1_0C, PRS1_0E, PRS1_0F, CPAP_LargeLeak,
+       PRS1_12,
+       PRS1_FlexMode, PRS1_FlexLevel, PRS1_HumidStatus, PRS1_HumidLevel, CPAP_HumidSetting, PRS1_SysLock,
+       PRS1_SysOneResistStat,
+       PRS1_SysOneResistSet, PRS1_HoseDiam, PRS1_AutoOn, PRS1_AutoOff, PRS1_MaskAlert, PRS1_ShowAHI;
+
+extern ChannelID INTELLIPAP_Unknown1, INTELLIPAP_Unknown2;
+
+extern ChannelID OXI_Pulse, OXI_SPO2, OXI_Perf, OXI_PulseChange, OXI_SPO2Drop, OXI_Plethy;
+
+extern ChannelID Journal_Notes, Journal_Weight, Journal_BMI, Journal_ZombieMeter, Bookmark_Start,
+       Bookmark_End, Bookmark_Notes, LastUpdated;
+
+extern ChannelID ZEO_SleepStage, ZEO_ZQ, ZEO_TotalZ, ZEO_TimeToZ, ZEO_TimeInWake, ZEO_TimeInREM,
+       ZEO_TimeInLight, ZEO_TimeInDeep, ZEO_Awakenings,
+       ZEO_AlarmReason, ZEO_SnoozeTime, ZEO_WakeTone, ZEO_WakeWindow, ZEO_AlarmType, ZEO_MorningFeel,
+       ZEO_FirmwareVersion,
+       ZEO_FirstAlarmRing, ZEO_LastAlarmRing, ZEO_FirstSnoozeTime, ZEO_LastSnoozeTime, ZEO_SetAlarmTime,
+       ZEO_RiseTime;
+
+extern ChannelID POS_Orientation, POS_Inclination;
+
+const QString GRP_CPAP = "CPAP";
+const QString GRP_POS = "POS";
+const QString GRP_OXI = "OXI";
+
+
+#endif // MACHINE_COMMON_H
diff --git a/sleepyhead/SleepLib/machine_loader.cpp b/sleepyhead/SleepLib/machine_loader.cpp
new file mode 100644
index 0000000..c7dc1e2
--- /dev/null
+++ b/sleepyhead/SleepLib/machine_loader.cpp
@@ -0,0 +1,388 @@
+/* SleepLib Machine Loader Class Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QProgressBar>
+#include <QApplication>
+#include <QFile>
+#include <QDir>
+#include <QThreadPool>
+
+extern QProgressBar *qprogress;
+
+#include "machine_loader.h"
+
+bool genpixmapinit = false;
+QPixmap * MachineLoader::genericCPAPPixmap;
+
+// This crap moves to Profile
+QList<MachineLoader *> m_loaders;
+
+QList<MachineLoader *> GetLoaders(MachineType mt)
+{
+    QList<MachineLoader *> list;
+    for (int i=0; i < m_loaders.size(); ++i) {
+        if (mt == MT_UNKNOWN) {
+            list.push_back(m_loaders.at(i));
+        } else {
+            MachineType mtype = m_loaders.at(i)->type();
+            if (mtype == mt) {
+                list.push_back(m_loaders.at(i));
+            }
+        }
+    }
+    return list;
+}
+
+MachineLoader * lookupLoader(Machine * m)
+{
+    for (int i=0; i < m_loaders.size(); ++i) {
+        MachineLoader * loader = m_loaders.at(i);
+        if (loader->loaderName() == m->loaderName())
+            return loader;
+    }
+    return nullptr;
+}
+
+MachineLoader * lookupLoader(QString loaderName)
+{
+    for (int i=0; i < m_loaders.size(); ++i) {
+        MachineLoader * loader = m_loaders.at(i);
+        if (loader->loaderName() == loaderName)
+            return loader;
+    }
+    return nullptr;
+}
+
+QHash<QString, QHash<QString, Machine *> > MachineList;
+
+
+void MachineLoader::removeMachine(Machine * m)
+{
+    m_machlist.removeAll(m);
+    QHash<QString, QHash<QString, Machine *> >::iterator mlit = MachineList.find(m->loaderName());
+
+    if (mlit != MachineList.end()) {
+        QHash<QString, Machine *>::iterator mit = mlit.value().find(m->serial());
+        if (mit != mlit.value().end()) {
+            mlit.value().erase(mit);
+        }
+    }
+
+}
+
+Machine * MachineLoader::lookupMachine(QString serial)
+{
+    QHash<QString, QHash<QString, Machine *> >::iterator mlit = MachineList.find(loaderName());
+    if (mlit != MachineList.end()) {
+        QHash<QString, Machine *>::iterator mit = mlit.value().find(serial);
+        if (mit != mlit.value().end()) {
+            return mit.value();
+        }
+    }
+    return nullptr;
+}
+
+Machine * MachineLoader::CreateMachine(MachineInfo info, MachineID id)
+{
+    Q_ASSERT(p_profile != nullptr);
+
+    Machine *m = nullptr;
+
+    QHash<QString, QHash<QString, Machine *> >::iterator mlit = MachineList.find(info.loadername);
+
+    if (mlit != MachineList.end()) {
+        QHash<QString, Machine *>::iterator mit = mlit.value().find(info.serial);
+        if (mit != mlit.value().end()) {
+            mit.value()->setInfo(info); // update info
+            return mit.value();
+        }
+    }
+
+    // Before we create, find any lost folder to get the old ID
+    if ((id == 0) && ((info.type == MT_OXIMETER) || (info.type == MT_JOURNAL) || (info.type == MT_POSITION)|| (info.type == MT_SLEEPSTAGE))) {
+        QString dataPath = p_profile->Get("{" + STR_GEN_DataFolder + "}/");
+        QDir dir(dataPath);
+        QStringList namefilter(QString(info.loadername+"_*"));
+        QStringList files = dir.entryList(namefilter, QDir::Dirs);
+        if (files.size() > 0) {
+            QString idstr = files[0].section("_",-1);
+            bool ok;
+            id = idstr.toInt(&ok, 16);
+        }
+    }
+
+    switch (info.type) {
+    case MT_CPAP:
+        m = new CPAP(id);
+        break;
+    case MT_SLEEPSTAGE:
+        m = new SleepStage(id);
+        break;
+    case MT_OXIMETER:
+        m = new Oximeter(id);
+        break;
+    case MT_POSITION:
+        m = new PositionSensor(id);
+        break;
+    case MT_JOURNAL:
+        m = new Machine(id);
+        m->setType(MT_JOURNAL);
+        break;
+    default:
+        m = new Machine(id);
+
+        break;
+    }
+
+    m->setInfo(info);
+
+    qDebug() << "Create" << info.loadername << "Machine" << (info.serial.isEmpty() ? m->hexid() : info.serial);
+
+    MachineList[info.loadername][info.serial] = m;
+    p_profile->AddMachine(m);
+
+    return m;
+}
+
+
+void RegisterLoader(MachineLoader *loader)
+{
+    loader->initChannels();
+    m_loaders.push_back(loader);
+}
+void DestroyLoaders()
+{
+    for (QList<MachineLoader *>::iterator i = m_loaders.begin(); i != m_loaders.end(); i++) {
+        delete(*i);
+    }
+
+    m_loaders.clear();
+}
+
+MachineLoader::MachineLoader() :QObject(nullptr)
+{
+    if (!genpixmapinit) {
+        genericCPAPPixmap = new QPixmap(genericPixmapPath);
+        genpixmapinit = true;
+    }
+    m_abort = false;
+    m_type = MT_UNKNOWN;
+    m_status = NEUTRAL;
+}
+
+MachineLoader::~MachineLoader()
+{
+    for (QList<Machine *>::iterator m = m_machlist.begin(); m != m_machlist.end(); m++) {
+        delete *m;
+    }
+}
+
+void MachineLoader::finishAddingSessions()
+{
+    QMap<SessionID, Session *>::iterator it;
+    QMap<SessionID, Session *>::iterator it_end = new_sessions.end();
+
+    // Using a map specifically so they are inserted in order.
+    for (it = new_sessions.begin(); it != it_end; ++it) {
+        Session * sess = it.value();
+        Machine * mach = sess->machine();
+        mach->AddSession(sess);
+    }
+
+    new_sessions.clear();
+
+    QHash<QString, QHash<QString, Machine *> >::iterator mlit = MachineList.find(loaderName());
+
+    if (mlit != MachineList.end()) {
+        for(QHash<QString, Machine *>::iterator mit = mlit.value().begin(); mit!=mlit.value().end(); ++mit) {
+            mit.value()->SaveSummary();
+        }
+    }
+
+}
+
+bool compressFile(QString inpath, QString outpath)
+{
+    if (outpath.isEmpty()) {
+        outpath = inpath + ".gz";
+    } else if (!outpath.endsWith(".gz")) {
+        outpath += ".gz";
+    }
+
+    QFile f(inpath);
+
+    if (!f.exists(inpath)) {
+        qDebug() << "compressFile()" << inpath << "does not exist";
+        return false;
+    }
+
+    qint64 size = f.size();
+
+    if (!f.open(QFile::ReadOnly)) {
+        qDebug() << "compressFile() Couldn't open" << inpath;
+        return false;
+    }
+
+    char *buf = new char [size];
+
+    if (!f.read(buf, size)) {
+        delete buf;
+        qDebug() << "compressFile() Couldn't read all of" << inpath;
+        return false;
+    }
+
+    f.close();
+    gzFile gz = gzopen(outpath.toLatin1(), "wb");
+
+    //gzbuffer(gz,65536*2);
+    if (!gz) {
+        qDebug() << "compressFile() Couldn't open" << outpath << "for writing";
+        delete buf;
+        return false;
+    }
+
+    gzwrite(gz, buf, size);
+    gzclose(gz);
+    delete buf;
+    return true;
+}
+
+void MachineLoader::queTask(ImportTask * task)
+{
+    m_tasklist.push_back(task);
+}
+
+void MachineLoader::runTasks(bool threaded)
+{
+    m_totaltasks=m_tasklist.size();
+    m_currenttask=0;
+
+    if (!threaded) {
+        while (!m_tasklist.isEmpty()) {
+            ImportTask * task = m_tasklist.takeFirst();
+            task->run();
+            float f = float(m_currenttask) / float(m_totaltasks) * 100.0;
+            qprogress->setValue(f);
+            m_currenttask++;
+            QApplication::processEvents();
+        }
+    } else {
+        QThreadPool * threadpool = QThreadPool::globalInstance();
+        while (!m_tasklist.isEmpty()) {
+            if (threadpool->tryStart(m_tasklist.at(0))) {
+                m_tasklist.pop_front();
+                float f = float(m_currenttask) / float(m_totaltasks) * 100.0;
+                qprogress->setValue(f);
+                m_currenttask++;
+            }
+            QApplication::processEvents();
+        }
+        QThreadPool::globalInstance()->waitForDone(-1);
+    }
+}
+
+
+QList<ChannelID> CPAPLoader::eventFlags(Day * day)
+{
+    Machine * mach = day->machine(MT_CPAP);
+
+    QList<ChannelID> list;
+
+    if (mach->loader() != this) {
+        qDebug() << "Trying to ask" << loaderName() << "for" << mach->loaderName() << "data";
+        return list;
+    }
+
+    list.push_back(CPAP_ClearAirway);
+    list.push_back(CPAP_Obstructive);
+    list.push_back(CPAP_Hypopnea);
+    list.push_back(CPAP_Apnea);
+
+    return list;
+}
+
+/*const QString machine_profile_name="MachineList.xml";
+
+void MachineLoader::LoadMachineList()
+{
+}
+
+void MachineLoader::StoreMachineList()
+{
+}
+void MachineLoader::LoadSummary(Machine *m, QString &filename)
+{
+    QFile f(filename);
+    if (!f.exists())
+        return;
+    f.open(QIODevice::ReadOnly);
+    if (!f.isReadable())
+        return;
+
+
+}
+void MachineLoader::LoadSummaries(Machine *m)
+{
+    QString path=(*profile)["ProfileDirectory"]+"/"+m_classname+"/"+mach->hexid();
+    QDir dir(path);
+    if (!dir.exists() || !dir.isReadable())
+        return false;
+
+    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
+    dir.setSorting(QDir::Name);
+
+    QString fullpath,ext_s,sesstr;
+    int ext;
+    SessionID sessid;
+    bool ok;
+    QMap<SessionID, int> sessions;
+    QFileInfoList list=dir.entryInfoList();
+    for (int i=0;i<list.size();i++) {
+        QFileInfo fi=list.at(i);
+        fullpath=fi.canonicalFilePath();
+        ext_s=fi.fileName().section(".",-1);
+        ext=ext_s.toInt(&ok,10);
+        if (!ok) continue;
+        sesstr=fi.fileName().section(".",0,-2);
+        sessid=sesstr.toLong(&ok,16);
+        if (!ok) continue;
+
+    }
+}
+
+void MachineLoader::LoadAllSummaries()
+{
+    for (int i=0;i<m_machlist.size();i++)
+        LoadSummaries(m_machlist[i]);
+}
+void MachineLoader::LoadAllEvents()
+{
+    for (int i=0;i<m_machlist.size();i++)
+        LoadEvents(m_machlist[i]);
+}
+void MachineLoader::LoadAllWaveforms()
+{
+    for (int i=0;i<m_machlist.size();i++)
+        LoadWaveforms(m_machlist[i]);
+}
+void MachineLoader::LoadAll()
+{
+    LoadAllSummaries();
+    LoadAllEvents();
+    LoadAllWaveforms();
+}
+
+void MachineLoader::Save(Machine *m)
+{
+}
+void MachineLoader::SaveAll()
+{
+    for (int i=0;i<m_machlist.size();i++)
+        Save(m_machlist[i]);
+}
+*/
diff --git a/sleepyhead/SleepLib/machine_loader.h b/sleepyhead/SleepLib/machine_loader.h
new file mode 100644
index 0000000..2ab2b12
--- /dev/null
+++ b/sleepyhead/SleepLib/machine_loader.h
@@ -0,0 +1,188 @@
+/* SleepLib MachineLoader Base Class Header
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef MACHINE_LOADER_H
+#define MACHINE_LOADER_H
+
+#include <QMutex>
+#include <QRunnable>
+#include <QPixmap>
+
+
+#include "profiles.h"
+#include "machine.h"
+#include "zlib.h"
+
+
+class MachineLoader;
+enum DeviceStatus { NEUTRAL, IMPORTING, LIVE, DETECTING };
+
+const QString genericPixmapPath = ":/icons/mask.png";
+
+
+/*! \class MachineLoader
+    \brief Base class to derive a new Machine importer from
+    */
+class MachineLoader: public QObject
+{
+    Q_OBJECT
+    friend class ImportThread;
+    friend class Machine;
+  public:
+    MachineLoader();
+    virtual ~MachineLoader();
+
+    //! \brief Detect if the given path contains a valid folder structure
+    virtual bool Detect(const QString & path) = 0;
+
+    //! \brief Look up and return machine model information stored at path
+    virtual MachineInfo PeekInfo(const QString & path) { Q_UNUSED(path); return MachineInfo(); }
+
+    //! \brief Override this to scan path and detect new machine data
+    virtual int Open(QString path) = 0;
+
+    //! \brief Override to returns the Version number of this MachineLoader
+    virtual int Version() = 0;
+
+    static Machine * CreateMachine(MachineInfo info, MachineID id = 0);
+    Machine * lookupMachine(QString serial);
+
+    // !\\brief Used internally by loaders, override to return base MachineInfo record
+    virtual MachineInfo newInfo() { return MachineInfo(); }
+
+    //! \brief Override to returns the class name of this MachineLoader
+    virtual const QString &loaderName() = 0;
+    inline MachineType type() { return m_type; }
+
+    void unsupported(Machine * m) {
+        Q_ASSERT(m != nullptr);
+        m->setUnsupported(true);
+        emit machineUnsupported(m);
+    }
+
+    void queTask(ImportTask * task);
+
+    void addSession(Session * sess)
+    {
+        sessionMutex.lock();
+        new_sessions[sess->session()] = sess;
+        sessionMutex.unlock();
+    }
+
+    //! \brief Process Task list using all available threads.
+    void runTasks(bool threaded=true);
+
+    int countTasks() { return m_tasklist.size(); }
+
+    inline bool isAborted() { return m_abort; }
+    void abort() { m_abort = true; }
+
+    virtual void process() {}
+
+    DeviceStatus status() { return m_status; }
+    void setStatus(DeviceStatus status) { m_status = status; }
+
+    QMutex sessionMutex;
+    QMutex saveMutex;
+
+    void removeMachine(Machine * m);
+
+    virtual void initChannels() {}
+    QPixmap & getPixmap(QString series) {
+        QHash<QString, QPixmap>::iterator it = m_pixmaps.find(series);
+        if (it != m_pixmaps.end()) {
+            return it.value();
+        }
+        return *genericCPAPPixmap;
+    }
+    QString getPixmapPath(QString series) {
+        QHash<QString, QString>::iterator it = m_pixmap_paths.find(series);
+        if (it != m_pixmap_paths.end()) {
+            return it.value();
+        }
+        return genericPixmapPath;
+    }
+
+signals:
+    void updateProgress(int cnt, int total);
+    void machineUnsupported(Machine *);
+
+protected:
+    //! \brief Contains a list of Machine records known by this loader
+    QList<Machine *> m_machlist;
+
+    static QPixmap * genericCPAPPixmap;
+
+    MachineType m_type;
+    QString m_class;
+    Profile *m_profile;
+
+    int m_currenttask;
+    int m_totaltasks;
+
+    bool m_abort;
+
+    DeviceStatus m_status;
+
+    void finishAddingSessions();
+    QMap<SessionID, Session *> new_sessions;
+
+    QHash<QString, QPixmap> m_pixmaps;
+    QHash<QString, QString> m_pixmap_paths;
+
+  private:
+    QList<ImportTask *> m_tasklist;
+};
+
+class CPAPLoader:public MachineLoader
+{
+    Q_OBJECT
+public:
+    CPAPLoader() : MachineLoader() {}
+    virtual ~CPAPLoader() {}
+
+    virtual QList<ChannelID> eventFlags(Day * day);
+
+    virtual QString PresReliefLabel() { return QString(""); }
+    virtual ChannelID PresReliefMode() { return NoChannel; }
+    virtual ChannelID PresReliefLevel() { return NoChannel; }
+    virtual ChannelID HumidifierConnected() { return NoChannel; }
+    virtual ChannelID HumidifierLevel() { return CPAP_HumidSetting; }
+    virtual ChannelID CPAPModeChannel() { return CPAP_Mode; }
+    virtual void initChannels() {}
+};
+
+struct ImportPath
+{
+    ImportPath() {
+        loader = nullptr;
+    }
+    ImportPath(const ImportPath & copy) {
+        loader = copy.loader;
+        path = copy.path;
+    }
+    ImportPath(QString path, MachineLoader * loader) :
+        path(path), loader(loader) {}
+
+    QString path;
+    MachineLoader * loader;
+};
+
+
+// Put in machine loader class as static??
+void RegisterLoader(MachineLoader *loader);
+MachineLoader * lookupLoader(Machine * m);
+MachineLoader * lookupLoader(QString loaderName);
+
+void DestroyLoaders();
+
+bool compressFile(QString inpath, QString outpath = "");
+
+QList<MachineLoader *> GetLoaders(MachineType mt = MT_UNKNOWN);
+
+#endif //MACHINE_LOADER_H
diff --git a/sleepyhead/SleepLib/preferences.cpp b/sleepyhead/SleepLib/preferences.cpp
new file mode 100644
index 0000000..864614b
--- /dev/null
+++ b/sleepyhead/SleepLib/preferences.cpp
@@ -0,0 +1,346 @@
+/* SleepLib Preferences Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QString>
+#include <QDomDocument>
+#include <QDomElement>
+#include <QDomNode>
+#include <QVariant>
+#include <QDateTime>
+#include <QDir>
+#include <QDesktopServices>
+#include <QDebug>
+#include <QSettings>
+#ifdef Q_OS_WIN32
+#include "windows.h"
+#include "lmcons.h"
+#endif
+
+#include "common.h"
+#include "preferences.h"
+
+const QString &getUserName()
+{
+    static QString userName;
+    userName = getenv("USER");
+
+    if (userName.isEmpty()) {
+        userName = QObject::tr("Windows User");
+
+#if defined (Q_OS_WIN32)
+#if defined(UNICODE)
+
+        if (QSysInfo::WindowsVersion >= QSysInfo::WV_NT) {
+            TCHAR winUserName[UNLEN + 1]; // UNLEN is defined in LMCONS.H
+            DWORD winUserNameSize = sizeof(winUserName);
+            GetUserNameW(winUserName, &winUserNameSize);
+            userName = QString::fromStdWString(winUserName);
+        } else
+#endif
+        {
+            char winUserName[UNLEN + 1]; // UNLEN is defined in LMCONS.H
+            DWORD winUserNameSize = sizeof(winUserName);
+            GetUserNameA(winUserName, &winUserNameSize);
+            userName = QString::fromLocal8Bit(winUserName);
+        }
+
+#endif
+    }
+
+    return userName;
+}
+
+
+QString GetAppRoot()
+{
+    QSettings settings(getDeveloperName(), getAppName());
+
+    QString HomeAppRoot = settings.value("Settings/AppRoot").toString();
+
+#if QT_VERSION  < QT_VERSION_CHECK(5,0,0)
+    const QString desktopFolder = QDesktopServices::storageLocation(
+                                      QDesktopServices::DocumentsLocation);
+#else
+    const QString desktopFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
+#endif
+
+    if (HomeAppRoot.isEmpty()) {
+        HomeAppRoot = desktopFolder + "/" + getDefaultAppRoot();
+    }
+
+    return HomeAppRoot;
+}
+
+
+Preferences::Preferences()
+{
+    p_name = "Preferences";
+    p_path = GetAppRoot();
+}
+
+Preferences::Preferences(QString name, QString filename)
+{
+    if (name.endsWith(STR_ext_XML)) {
+        p_name = name.section(".", 0, 0);
+    } else {
+        p_name = name;
+    }
+
+    if (filename.isEmpty()) {
+        p_filename = GetAppRoot() + "/" + p_name + STR_ext_XML;
+    } else {
+        if (!filename.contains("/")) {
+            p_filename = GetAppRoot() + "/";
+        } else { p_filename = ""; }
+
+        p_filename += filename;
+
+        if (!p_filename.endsWith(STR_ext_XML)) { p_filename += STR_ext_XML; }
+    }
+}
+
+Preferences::~Preferences()
+{
+    //Save(); // Don't..Save calls a virtual function.
+}
+
+/*int Preferences::GetCode(QString s)
+{
+    int prefcode=0;
+    for (QHash<int,QString>::iterator i=p_codes.begin(); i!=p_codes.end(); i++) {
+        if (i.value()==s) return i.key();
+        prefcode++;
+    }
+    p_codes[prefcode]=s;
+    return prefcode;
+}*/
+
+const QString Preferences::Get(QString name)
+{
+    QString temp;
+    QChar obr = QChar('{');
+    QChar cbr = QChar('}');
+    QString t, a, ref; // How I miss Regular Expressions here..
+
+    if (p_preferences.find(name) != p_preferences.end()) {
+        temp = "";
+        t = p_preferences[name].toString();
+
+        if (p_preferences[name].type() != QVariant::String) {
+            return t;
+        }
+    } else {
+        t = name; // parse the string..
+    }
+
+    while (t.contains(obr)) {
+        temp += t.section(obr, 0, 0);
+        a = t.section(obr, 1);
+
+        if (a.startsWith("{")) {
+            temp += obr;
+            t = a.section(obr, 1);
+            continue;
+        }
+
+        ref = a.section(cbr, 0, 0);
+
+        if (ref.toLower() == "home") {
+            temp += GetAppRoot();
+        } else if (ref.toLower() == "user") {
+            temp += getUserName();
+        } else if (ref.toLower() == "sep") { // redundant in QT
+            temp += "/";
+        } else {
+            temp += Get(ref);
+        }
+
+        t = a.section(cbr, 1);
+    }
+
+    temp += t;
+    temp.replace("}}", "}"); // Make things look a bit better when escaping braces.
+
+    return temp;
+}
+
+
+bool Preferences::Open(QString filename)
+{
+    if (!filename.isEmpty()) {
+        p_filename = filename;
+    }
+
+    QDomDocument doc(p_name);
+    QFile file(p_filename);
+    qDebug() << "Reading " << QDir::toNativeSeparators(p_filename);
+
+    if (!file.open(QIODevice::ReadOnly)) {
+        qWarning() << "Could not open" << QDir::toNativeSeparators(p_filename);
+        return false;
+    }
+
+    if (!doc.setContent(&file)) {
+        qWarning() << "Invalid XML Content in" << QDir::toNativeSeparators(p_filename);
+        return false;
+    }
+
+    file.close();
+
+
+    QDomElement root = doc.documentElement();
+
+    if (root.tagName() != STR_AppName) {
+        return false;
+    }
+
+    root = root.firstChildElement();
+
+    if (root.tagName() != p_name) {
+        return false;
+    }
+
+    bool ok;
+    p_preferences.clear();
+    QDomNode n = root.firstChild();
+
+    while (!n.isNull()) {
+        QDomElement e = n.toElement();
+
+        if (!e.isNull()) {
+            QString name = e.tagName();
+            QString type = e.attribute("type").toLower();
+            QString value = e.text();
+
+            if (type == "double") {
+                double d;
+                d = value.toDouble(&ok);
+
+                if (ok) {
+                    p_preferences[name] = d;
+                } else {
+                    qDebug() << "XML Error:" << name << "=" << value << "??";
+                }
+            } else if (type == "qlonglong") {
+                qint64 d;
+                d = value.toLongLong(&ok);
+
+                if (ok) {
+                    p_preferences[name] = d;
+                } else {
+                    qDebug() << "XML Error:" << name << "=" << value << "??";
+                }
+            } else if (type == "int") {
+                int d;
+                d = value.toInt(&ok);
+
+                if (ok) {
+                    p_preferences[name] = d;
+                } else {
+                    qDebug() << "XML Error:" << name << "=" << value << "??";
+                }
+            } else if (type == "bool") {
+                QString v = value.toLower();
+
+                if ((v == "true") || (v == "on") || (v == "yes")) {
+                    p_preferences[name] = true;
+                } else if ((v == "false") || (v == "off") || (v == "no")) {
+                    p_preferences[name] = false;
+                } else {
+                    int d;
+                    d = value.toInt(&ok);
+
+                    if (ok) {
+                        p_preferences[name] = d != 0;
+                    } else {
+                        qDebug() << "XML Error:" << name << "=" << value << "??";
+                    }
+                }
+            } else if (type == "qdatetime") {
+                QDateTime d;
+                d = QDateTime::fromString(value, "yyyy-MM-dd HH:mm:ss");
+
+                if (d.isValid()) {
+                    p_preferences[name] = d;
+                } else {
+                    qWarning() << "XML Error: Invalid DateTime record" << name << value;
+                }
+
+            } else if (type == "qtime") {
+                QTime d;
+                d = QTime::fromString(value, "hh:mm:ss");
+
+                if (d.isValid()) {
+                    p_preferences[name] = d;
+                } else {
+                    qWarning() << "XML Error: Invalid Time record" << name << value;
+                }
+
+            } else  {
+                p_preferences[name] = value;
+            }
+
+        }
+
+        n = n.nextSibling();
+    }
+
+    root = root.nextSiblingElement();
+    ExtraLoad(root);
+    return true;
+}
+
+bool Preferences::Save(QString filename)
+{
+    if (!filename.isEmpty()) {
+        p_filename = filename;
+    }
+
+    QDomDocument doc(p_name);
+
+    QDomElement droot = doc.createElement(STR_AppName);
+    doc.appendChild(droot);
+
+    QDomElement root = doc.createElement(p_name);
+    droot.appendChild(root);
+
+    for (QHash<QString, QVariant>::iterator i = p_preferences.begin(); i != p_preferences.end(); i++) {
+        QVariant::Type type = i.value().type();
+
+        if (type == QVariant::Invalid) { continue; }
+
+        QDomElement cn = doc.createElement(i.key());
+        cn.setAttribute("type", i.value().typeName());
+
+        if (type == QVariant::DateTime) {
+            cn.appendChild(doc.createTextNode(i.value().toDateTime().toString("yyyy-MM-dd HH:mm:ss")));
+        } else if (type == QVariant::Time) {
+            cn.appendChild(doc.createTextNode(i.value().toTime().toString("hh:mm:ss")));
+        } else {
+            cn.appendChild(doc.createTextNode(i.value().toString()));
+        }
+
+        root.appendChild(cn);
+    }
+
+    droot.appendChild(ExtraSave(doc));
+
+    QFile file(p_filename);
+
+    if (!file.open(QIODevice::WriteOnly)) {
+        return false;
+    }
+
+    QTextStream ts(&file);
+    ts << doc.toString();
+    file.close();
+
+    return true;
+}
+
+
diff --git a/sleepyhead/SleepLib/preferences.h b/sleepyhead/SleepLib/preferences.h
new file mode 100644
index 0000000..1848bff
--- /dev/null
+++ b/sleepyhead/SleepLib/preferences.h
@@ -0,0 +1,144 @@
+/* SleepLib Preferences Header
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef PREFERENCES_H
+#define PREFERENCES_H
+
+#include <QString>
+#include <QVariant>
+#include <QHash>
+#include <QDomElement>
+#include <QDomDocument>
+#include <map>
+
+const QString STR_ext_XML = ".xml";
+
+extern QString GetAppRoot(); //returns app root path plus trailing path separator.
+
+inline QString PrefMacro(QString s)
+{
+    return "{" + s + "}";
+}
+
+//! \brief Returns a QString containing the Username, according to the Operating System
+const QString &getUserName();
+
+
+/*! \class Preferences
+    \author Mark Watkins <jedimark_at_users.sourceforge.net>
+    \brief Holds a group of preference variables
+    */
+class Preferences
+{
+  public:
+    //! \brief Constructs a Preferences object 'name', and remembers sets the filename
+    Preferences(QString name, QString filename = "");
+    Preferences();
+    virtual ~Preferences();
+
+    //! \brief Returns a QString containing preference 'name', processing any {} macros
+    const QString Get(QString name);
+
+    //! \brief Returns the QVariant value of the selected preference.. Note, preference must exist, and will not expand {} macros
+    QVariant &operator[](QString name) {
+        return p_preferences[name];
+    }
+
+    //! \brief Sets the Preference 'name' to QVariant 'value'
+    void Set(QString name, QVariant value) {
+        p_preferences[name] = value;
+    }
+
+    //! \brief Returns true if preference 'name' exists
+    bool contains(QString name) {
+        return (p_preferences.contains(name));
+    }
+
+    //! \brief Create a preference and set the default if it doesn't exists
+    void init(QString name, QVariant value) {
+        if (!contains(name)) {
+            p_preferences[name] = value;
+        }
+    }
+
+    //! \brief Returns true if preference 'name' exists, and contains a boolean true value
+    bool ExistsAndTrue(QString name) {
+        QHash<QString, QVariant>::iterator i = p_preferences.find(name);
+
+        if (i == p_preferences.end()) { return false; }
+
+        return i.value().toBool();
+    }
+
+    //! \brief Removes preference 'name' from this Preferences group
+    void Erase(QString name) {
+        QHash<QString, QVariant>::iterator i = p_preferences.find(name);
+
+        if (i != p_preferences.end()) {
+            p_preferences.erase(i);
+        }
+    }
+
+    //! \brief Derive from this to handle Loading of any custom XML sections
+    virtual void ExtraLoad(QDomElement &root) { root = root; }
+
+    //! \brief Derive from this to handle Saving of any custom XML sections
+    //! \return Must return a QDomElement to be inserted into the generated XML
+    virtual QDomElement ExtraSave(QDomDocument &doc) { doc = doc; QDomElement e; return e; }
+
+    //! \brief Opens, processes the XML for this Preferences group, loading all preferences stored therein.
+    //! \note If filename is empty, it will use the one specified in the constructor
+    //! \returns true if succesful
+    virtual bool Open(QString filename = "");
+
+    //! \brief Saves all preferences to XML file.
+    //! \note If filename is empty, it will use the one specified in the constructor
+    //! \returns true if succesful
+    virtual bool Save(QString filename = "");
+
+    //! \note Sets a comment string whici will be stored in the XML
+    void SetComment(const QString &str) {
+        p_comment = str;
+    }
+
+    //! \brief Finds a given preference.
+    //! \returns a QHash<QString,QString>::iterator pointing to the preference named 'key', or an empty end() iterator
+    inline QHash<QString, QVariant>::iterator find(QString key) { return p_preferences.find(key); }
+
+    //! \brief Returns an empty iterator pointing to the end of the preferences list
+    inline QHash<QString, QVariant>::iterator end() { return p_preferences.end(); }
+
+    //! \brief Returns an iterator pointing to the first item in the preferences list
+    inline QHash<QString, QVariant>::iterator begin() { return p_preferences.begin(); }
+
+    //int  GetCode(QString name); // For registering/looking up new preference code.
+
+    //! \brief Stores all the variants indexed by a QString name for this Preferences object
+    QHash<QString, QVariant> p_preferences;
+
+    void setPath(const QString &path) { p_path = path; }
+    void setFilename(const QString &filename) { p_filename = filename; }
+
+    const QString name() { return p_name; }
+
+  protected:
+    //QHash<int,QString> p_codes;
+    QString p_comment;
+    QString p_name;
+    QString p_filename;
+    QString p_path;
+};
+
+//! \brief Main Preferences Object used throughout the application
+extern Preferences PREF;
+
+//! \brief Layout Preferences Object used throughout the application
+extern Preferences LAYOUT;
+
+#endif // PREFERENCES_H
+
diff --git a/sleepyhead/SleepLib/profiles.cpp b/sleepyhead/SleepLib/profiles.cpp
new file mode 100644
index 0000000..83f0dbd
--- /dev/null
+++ b/sleepyhead/SleepLib/profiles.cpp
@@ -0,0 +1,1809 @@
+/* SleepLib Profiles Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QString>
+#include <QDateTime>
+#include <QDir>
+#include <QMessageBox>
+#include <QDebug>
+#include <QProcess>
+#include <QByteArray>
+#include <QHostInfo>
+#include <algorithm>
+#include <cmath>
+
+#include "preferences.h"
+#include "profiles.h"
+#include "machine.h"
+#include "machine_common.h"
+
+#include "machine_loader.h"
+
+#include <QApplication>
+#include "mainwindow.h"
+
+extern MainWindow *mainwin;
+Preferences *p_pref;
+Preferences *p_layout;
+Profile *p_profile;
+
+Profile::Profile(QString path)
+  : is_first_day(true),
+     m_opened(false),
+     m_machopened(false)
+{
+    p_name = STR_GEN_Profile;
+
+    if (path.isEmpty()) {
+        p_path = GetAppRoot();
+    } else {
+        p_path = path;
+    }
+
+    (*this)[STR_GEN_DataFolder] = p_path;
+    path = path.replace("\\", "/");
+
+    if (!p_path.endsWith("/")) {
+        p_path += "/";
+    }
+
+    p_filename = p_path + p_name + STR_ext_XML;
+    machlist.clear();
+
+    doctor = nullptr;
+    user = nullptr;
+    cpap = nullptr;
+    oxi = nullptr;
+    appearance = nullptr;
+    session = nullptr;
+    general = nullptr;
+}
+
+Profile::~Profile()
+{
+    QString lockfile=p_path+"/lockfile";
+    QFile file(lockfile);
+    file.remove();
+
+    if (m_opened) {
+        delete user;
+        delete doctor;
+        delete cpap;
+        delete oxi;
+        delete appearance;
+        delete session;
+        delete general;
+
+
+        for (QHash<MachineID, Machine *>::iterator it = machlist.begin(); it != machlist.end(); it++) {
+            delete it.value();
+        }
+        m_opened=false;
+    }
+
+    for (QMap<QDate, Day *>::iterator d = daylist.begin(); d != daylist.end(); d++) {
+        delete d.value();
+    }
+
+}
+
+bool Profile::Save(QString filename)
+{
+    if (m_opened) {
+        return Preferences::Save(filename) && p_profile->StoreMachines();
+    } else return false;
+}
+
+bool Profile::removeLock()
+{
+    QString filename=p_path+"/lockfile";
+    QFile file(filename);
+    return file.remove();
+}
+
+QString Profile::checkLock()
+{
+
+    QString filename=p_path+"/lockfile";
+    QFile file(filename);
+
+    if (!file.exists())
+        return QString();
+
+    file.open(QFile::ReadOnly);
+    QString lockhost = file.readLine(1024).trimmed();
+    return lockhost;
+}
+
+bool Profile::Open(QString filename)
+{
+    p_profile = this;
+
+    if (filename.isEmpty()) {
+        filename=p_filename;
+    }
+    if (m_opened) {
+        qDebug() << "Profile" << filename << "all ready open";
+        return true;
+    }
+    bool b = Preferences::Open(filename);
+
+    m_opened=true;
+    doctor = new DoctorInfo(this);
+    user = new UserInfo(this);
+    cpap = new CPAPSettings(this);
+    oxi = new OxiSettings(this);
+    appearance = new AppearanceSettings(this);
+    session = new SessionSettings(this);
+    general = new UserSettings(this);
+    return b;
+}
+
+const QString STR_PROP_Brand = "brand";
+const QString STR_PROP_Model = "model";
+const QString STR_PROP_Series = "series";
+const QString STR_PROP_ModelNumber = "modelnumber";
+const QString STR_PROP_SubModel = "submodel";
+const QString STR_PROP_Serial = "serial";
+const QString STR_PROP_DataVersion = "dataversion";
+const QString STR_PROP_LastImported = "lastimported";
+
+bool Profile::OpenMachines()
+{
+    if (m_machopened)
+        return true;
+
+    if (!m_opened) {
+        Open();
+    }
+    QFile lockfile(p_path+"lockfile");
+    lockfile.open(QFile::WriteOnly);
+    QByteArray ba;
+    ba.append(QHostInfo::localHostName());
+    lockfile.write(ba);
+    lockfile.close();
+
+    QString filename = p_path+"machines.xml";
+    QFile file(filename);
+    if (!file.open(QFile::ReadOnly)) {
+        qWarning() << "Could not open" << QDir::toNativeSeparators(filename);
+        return false;
+    }
+    QDomDocument doc("machines.xml");
+
+    if (!doc.setContent(&file)) {
+        qWarning() << "Invalid XML Content in" << QDir::toNativeSeparators(filename);
+        return false;
+    }
+    file.close();
+    QDomElement root = doc.firstChild().toElement();
+
+    if (root.tagName().toLower() != "machines") {
+        //qDebug() << "No Machines Tag in Profiles.xml";
+        return false;
+    }
+
+    QDomElement elem = root.firstChildElement();
+
+    while (!elem.isNull()) {
+        QString pKey = elem.tagName();
+
+        if (pKey.toLower() != "machine") {
+            qWarning() << "Profile::ExtraLoad() pKey!=\"machine\"";
+            elem = elem.nextSiblingElement();
+            continue;
+        }
+
+        int m_id;
+        bool ok;
+        m_id = elem.attribute("id", "").toInt(&ok);
+        int mt;
+        mt = elem.attribute("type", "").toInt(&ok);
+        MachineType m_type = (MachineType)mt;
+
+        QString m_class = elem.attribute("class", "");
+
+        MachineInfo info;
+
+        info.type = m_type;
+        info.loadername = m_class;
+
+        QHash<QString, QString> prop;
+
+        QDomElement e = elem.firstChildElement();
+
+        for (; !e.isNull(); e = e.nextSiblingElement()) {
+            QString pKey = e.tagName();
+            QString key = pKey.toLower();
+            if (key == STR_PROP_Brand) {
+                info.brand = e.text();
+            } else if (key == STR_PROP_Model) {
+                info.model = e.text();
+            } else if (key == STR_PROP_ModelNumber) {
+                info.modelnumber = e.text();
+            } else if (key == STR_PROP_Serial) {
+                info.serial = e.text();
+            } else if (key == STR_PROP_Series) {
+                info.series = e.text();
+            } else if (key == STR_PROP_DataVersion) {
+                info.version = e.text().toInt();
+            } else if (key == STR_PROP_LastImported) {
+                info.lastimported = QDateTime::fromString(e.text(), Qt::ISODate);
+            } else if (key == "properties") {
+                QDomElement pe = e.firstChildElement();
+                for (; !pe.isNull(); pe = pe.nextSiblingElement()) {
+                    prop[pe.tagName()] = pe.text();
+                }
+            } else {
+                // skip any old rubbish
+                if ((key == "backuppath") || (key == "path") || (key == "submodel")) continue;
+
+                prop[pKey] = e.text();
+            }
+        }
+
+
+        Machine *m = nullptr;
+
+        m = MachineLoader::CreateMachine(info, m_id);
+        //m->setId(m_id);
+        if (m) m->properties = prop;
+
+        elem = elem.nextSiblingElement();
+    }
+
+    m_machopened = true;
+
+    return true;
+
+}
+
+bool Profile::StoreMachines()
+{
+    QDomDocument doc("Machines");
+    QDomElement elem = ExtraSave(doc);
+    doc.appendChild(elem);
+
+    QDomElement mach = doc.createElement("machines");
+
+    for (QHash<MachineID, Machine *>::iterator i = machlist.begin(); i != machlist.end(); i++) {
+        QDomElement me = doc.createElement("machine");
+        Machine *m = i.value();
+        me.setAttribute("id", (int)m->id());
+        me.setAttribute("type", (int)m->type());
+        me.setAttribute("class", m->loaderName());
+
+        QDomElement pe = doc.createElement("properties");
+        me.appendChild(pe);
+
+        for (QHash<QString, QString>::iterator j = i.value()->properties.begin(); j != i.value()->properties.end(); j++) {
+            QDomElement pp = doc.createElement(j.key());
+            pp.appendChild(doc.createTextNode(j.value()));
+            pe.appendChild(pp);
+        }
+
+        QDomElement mp = doc.createElement(STR_PROP_Brand);
+        mp.appendChild(doc.createTextNode(m->brand()));
+        me.appendChild(mp);
+
+        mp = doc.createElement(STR_PROP_Model);
+        mp.appendChild(doc.createTextNode(m->model()));
+        me.appendChild(mp);
+
+        mp = doc.createElement(STR_PROP_ModelNumber);
+        mp.appendChild(doc.createTextNode(m->modelnumber()));
+        me.appendChild(mp);
+
+        mp = doc.createElement(STR_PROP_Serial);
+        mp.appendChild(doc.createTextNode(m->serial()));
+        me.appendChild(mp);
+
+        mp = doc.createElement(STR_PROP_Series);
+        mp.appendChild(doc.createTextNode(m->series()));
+        me.appendChild(mp);
+
+        mp = doc.createElement(STR_PROP_DataVersion);
+        mp.appendChild(doc.createTextNode(QString::number(m->version())));
+        me.appendChild(mp);
+
+        mp = doc.createElement(STR_PROP_LastImported);
+        mp.appendChild(doc.createTextNode(m->lastImported().toString(Qt::ISODate)));
+        me.appendChild(mp);
+
+        mach.appendChild(me);
+    }
+
+    doc.appendChild(mach);
+
+    QString filename = p_path+"machines.xml";
+    QFile file(filename);
+    if (!file.open(QFile::WriteOnly)) {
+        return false;
+    }
+    file.write(doc.toByteArray());
+    return true;
+}
+
+
+#if defined(Q_OS_WIN)
+class Environment
+{
+public:
+    Environment();
+
+    QStringList path();
+    QString searchInDirectory(const QStringList & execs, QString directory);
+    QString searchInPath(const QString &executable, const QStringList & additionalDirs = QStringList());
+
+    QProcessEnvironment env;
+};
+Environment::Environment()
+{
+    env = QProcessEnvironment::systemEnvironment();
+}
+
+QStringList Environment::path()
+{
+    return env.value(QLatin1String("PATH"), "").split(';');
+}
+
+QString Environment::searchInDirectory(const QStringList & execs, QString directory)
+{
+    const QChar slash = QLatin1Char('/');
+
+    if (directory.isEmpty())
+        return QString();
+
+    if (!directory.endsWith(slash))
+        directory += slash;
+
+    foreach (const QString & exec, execs) {
+        QFileInfo fi(directory + exec);
+        if (fi.exists() && fi.isFile() && fi.isExecutable())
+            return fi.absoluteFilePath();
+    }
+    return QString();
+}
+
+QString Environment::searchInPath(const QString &executable, const QStringList & additionalDirs)
+{
+    if (executable.isEmpty()) return QString();
+
+    QString exec = QDir::cleanPath(executable);
+    QFileInfo fi(exec);
+
+    QStringList execs(exec);
+
+    if (fi.suffix().isEmpty()) {
+        QStringList extensions = env.value(QLatin1String("PATHEXT")).split(QLatin1Char(';'));
+
+        foreach (const QString &ext, extensions) {
+            QString tmp = executable + ext.toLower();
+            if (fi.isAbsolute()) {
+                if (QFile::exists(tmp))
+                    return tmp;
+            } else {
+                execs << tmp;
+            }
+        }
+    }
+
+    if (fi.isAbsolute())
+        return exec;
+
+    QSet<QString> alreadyChecked;
+    foreach (const QString &dir, additionalDirs) {
+        if (alreadyChecked.contains(dir))
+            continue;
+        alreadyChecked.insert(dir);
+        QString tmp = searchInDirectory(execs, dir);
+        if (!tmp.isEmpty())
+            return tmp;
+    }
+
+    if (executable.indexOf(QLatin1Char('/')) != -1)
+        return QString();
+
+    foreach (const QString &p, path()) {
+        if (alreadyChecked.contains(p))
+            continue;
+        alreadyChecked.insert(p);
+        QString tmp = searchInDirectory(execs, QDir::fromNativeSeparators(p));
+        if (!tmp.isEmpty())
+            return tmp;
+    }
+    return QString();
+}
+#endif
+
+// Borrowed from QtCreator (http://stackoverflow.com/questions/3490336/how-to-reveal-in-finder-or-show-in-explorer-with-qt)
+void showInGraphicalShell(const QString &pathIn)
+{
+    QWidget * parent = NULL;
+
+    // Mac, Windows support folder or file.
+#if defined(Q_OS_WIN)
+    Environment env;
+    const QString explorer = env.searchInPath(QLatin1String("explorer.exe"));
+    if (explorer.isEmpty()) {
+        QMessageBox::warning(parent,
+                             QObject::tr("Launching Windows Explorer failed"),
+                             QObject::tr("Could not find explorer.exe in path to launch Windows Explorer."));
+        return;
+    }
+    QString param;
+    //if (!QFileInfo(pathIn).isDir())
+        param = QLatin1String("/select,");
+    param += QDir::toNativeSeparators(pathIn);
+    QProcess::startDetached(explorer, QStringList(param));
+#elif defined(Q_OS_MAC)
+    Q_UNUSED(parent)
+    QStringList scriptArgs;
+    scriptArgs << QLatin1String("-e")
+               << QString::fromLatin1("tell application \"Finder\" to reveal POSIX file \"%1\"")
+                                     .arg(pathIn);
+    QProcess::execute(QLatin1String("/usr/bin/osascript"), scriptArgs);
+    scriptArgs.clear();
+    scriptArgs << QLatin1String("-e")
+               << QLatin1String("tell application \"Finder\" to activate");
+    QProcess::execute("/usr/bin/osascript", scriptArgs);
+#else
+    // we cannot select a file here, because no file browser really supports it...
+    /*
+    const QFileInfo fileInfo(pathIn);
+    const QString folder = fileInfo.absoluteFilePath();
+    const QString app = Utils::UnixUtils::fileBrowser(Core::ICore::instance()->settings());
+    QProcess browserProc;
+    const QString browserArgs = Utils::UnixUtils::substituteFileBrowserParameters(app, folder);
+    if (debug)
+        qDebug() <<  browserArgs;
+    bool success = browserProc.startDetached(browserArgs);
+    const QString error = QString::fromLocal8Bit(browserProc.readAllStandardError());
+    success = success && error.isEmpty();
+    if (!success) {
+        QMessageBox::warning(NULL,STR_MessageBox_Error, "Could not find the file browser for your system, you will have to find your profile directory yourself."+"\n\n"+error, QMessageBox::Ok);
+//        showGraphicalShellError(parent, app, error);
+    }*/
+#endif
+}
+
+int dirCount(QString path)
+{
+    QDir dir(path);
+
+    QStringList list = dir.entryList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs);
+    return list.size();
+}
+
+void Profile::DataFormatError(Machine *m)
+{
+    QString msg;
+
+    msg = "<font size=+1>"+QObject::tr("SleepyHead (%1) needs to upgrade its database for %2 %3 %4").
+            arg(FullVersionString).
+            arg(m->brand()).arg(m->model()).arg(m->serial())
+            + "</font><br/><br/>";
+
+    bool backups = false;
+    if (p_profile->session->backupCardData()) {
+        QString bpath = m->getBackupPath();
+        int cnt = dirCount(bpath);
+        if (cnt > 0) backups = true;
+    }
+
+    if (backups) {
+        msg = msg + QObject::tr("<b>SleepyHead maintains a backup of your devices data card that it uses for this purpose.</b>")+ "<br/><br/>";
+        msg = msg + QObject::tr("<i>Your old machine data should be regenerated provided this backup feature has not been disabled in preferences during a previous data import.</i>") + "<br/><br/>";
+        backups = true;
+    } else {
+        msg = msg + "<font size=+1>"+STR_MessageBox_Warning+":</font> "+QObject::tr("SleepyHead does not yet have any automatic card backups stored for this device.") + "<br/><br/>";
+        msg = msg + QObject::tr("This means you will need to import this machine data again afterwards from your own backups or data card.") + "<br/><br/>";
+    }
+
+    msg += "<font size=+1>"+QObject::tr("Important:")+"</font> "+QObject::tr("Once you upgrade, you <font size=+1>can not</font> use this profile with the previous version anymore.")+"<br/><br/>"+
+            QObject::tr("If you are concerned, click No to exit, and backup your profile manually, before starting SleepyHead again.")+ "<br/><br/>";
+    msg = msg + "<font size=+1>"+QObject::tr("Are you ready to upgrade, so you can run the new version of SleepyHead?")+"</font>";
+
+
+    QMessageBox * question = new QMessageBox(QMessageBox::Warning, QObject::tr("Machine Database Changes"), msg, QMessageBox::Yes | QMessageBox::No);
+    question->setDefaultButton(QMessageBox::Yes);
+
+    QFont font("Sans Serif", 11, QFont::Normal);
+
+    question->setFont(font);
+
+    if (question->exec() == QMessageBox::Yes) {
+        if (!m->Purge(3478216)) {
+            // Purge failed.. probably a permissions error.. let the user deal with it.
+            QMessageBox::critical(nullptr, STR_MessageBox_Error,
+                                  QObject::tr("Sorry, the purge operation failed, which means this version of SleepyHead can't start.")+"\n\n"+
+                                  QObject::tr("The machine data folder needs to be removed manually.")+"\n\n"+
+                                  QObject::tr("This folder currently resides at the following location:")+"\n\n"+
+                                  QDir::toNativeSeparators(Get(p_preferences[STR_GEN_DataFolder].toString())), QMessageBox::Ok);
+            QApplication::exit(-1);
+        }
+        // Note: I deliberately haven't added a Profile help for this
+        if (backups) {
+            mainwin->importCPAP(ImportPath(m->getBackupPath(), lookupLoader(m)), QObject::tr("Rebuilding from %1 Backup").arg(m->brand()));
+        } else {
+            if (!p_profile->session->backupCardData()) {
+                // Automatic backups not available for Intellipap users yet, so don't taunt them..
+                if (m->loaderName() != STR_MACH_Intellipap) {
+                    if (QMessageBox::question(nullptr, STR_MessageBox_Question, QObject::tr("Would you like to switch on automatic backups, so next time a new version of SleepyHead needs to do so, it can rebuild from these?"),
+                                              QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes)) {
+                        p_profile->session->setBackupCardData(true);
+                    }
+                }
+            }
+            QMessageBox::information(nullptr, STR_MessageBox_Information,
+                                     QObject::tr("SleepyHead will now start the import wizard so you can reinstall your %1 data.").arg(m->brand())
+                                     ,QMessageBox::Ok, QMessageBox::Ok);
+            mainwin->startImportDialog();
+        }
+        p_profile->Save();
+        delete question;
+
+    } else {
+        delete question;
+        QMessageBox::information(nullptr, STR_MessageBox_Information,
+            QObject::tr("SleepyHead will now exit, then (attempt to) launch your computers file manager so you can manually back your profile up:")+"\n\n"+
+            QDir::toNativeSeparators(Get(p_preferences[STR_GEN_DataFolder].toString()))+"\n\n"+
+            QObject::tr("Use your file manager to make a copy of your profile directory, then afterwards, restart Sleepyhead and complete the upgrade process.")
+                , QMessageBox::Ok, QMessageBox::Ok);
+
+        showInGraphicalShell(Get(p_preferences[STR_GEN_DataFolder].toString()));
+        QApplication::exit(-1);
+    }
+
+
+    return;
+
+}
+void Profile::LoadMachineData()
+{
+    if (!m_machopened) OpenMachines();
+    QHash<MachineID, QMap<QDate, QHash<ChannelID, EventDataType> > > cache;
+
+    for (QHash<MachineID, Machine *>::iterator i = machlist.begin(); i != machlist.end(); i++) {
+        Machine *m = i.value();
+
+        MachineLoader *loader = lookupLoader(m);
+
+        if (loader) {
+            if (m->version() < loader->Version()) {
+                DataFormatError(m);
+            } else {
+                try {
+                    m->Load();
+                } catch (OldDBVersion e) {
+                    Q_UNUSED(e)
+                    DataFormatError(m);
+                }
+            }
+        } else {
+            m->Load();
+        }
+    }
+}
+
+
+/**
+ * @brief Upgrade Machine XML section from old "profile.xml"
+ * @param root
+ */
+void Profile::ExtraLoad(QDomElement &root)
+{
+    if (root.tagName().toLower() != "machines") {
+        // Good!
+        return;
+    }
+
+    // Save this sucker
+    QDomDocument doc("Machines");
+
+    doc.appendChild(root);
+
+    QFile file(p_path+"/machines.xml");
+
+    file.open(QFile::WriteOnly);
+
+    file.write(doc.toByteArray());
+
+    file.close();
+}
+void Profile::AddMachine(Machine *m)
+{
+    if (!m) {
+        qWarning() << "Empty Machine in Profile::AddMachine()";
+        return;
+    }
+
+    machlist[m->id()] = m;
+}
+
+void Profile::DelMachine(Machine *m)
+{
+    if (!m) {
+        qWarning() << "Empty Machine in Profile::AddMachine()";
+        return;
+    }
+
+    m->loader()->removeMachine(m);
+    machlist.erase(machlist.find(m->id()));
+}
+
+Day *Profile::addDay(QDate date)
+{
+    QMap<QDate, Day *>::iterator dit = daylist.find(date);
+    if (dit == daylist.end()) {
+        dit = daylist.insert(date, new Day());
+    }
+    Day * day = dit.value();
+    day->setDate(date);
+
+    if (is_first_day) {
+        m_first = m_last = date;
+        is_first_day = false;
+    }
+
+    if (m_first > date) {
+        m_first = date;
+    }
+
+    if (m_last < date) {
+        m_last = date;
+    }
+    return day;
+}
+
+// Get Day record if data available for date and machine type,
+// and has enabled session data, else return nullptr
+Day *Profile::GetGoodDay(QDate date, MachineType type)
+{
+    Day *day = GetDay(date, type);
+    if (!day)
+        return nullptr;
+
+    // For a machine match, find at least one enabled Session.
+    for (int i = 0; i < day->size(); ++i) {
+        Session * sess = (*day)[i];
+        if (((type == MT_UNKNOWN) || (sess->type() == type)) && sess->enabled()) {
+            day->OpenSummary();
+
+            return day;
+        }
+    }
+
+    // No enabled Sessions were found.
+    return nullptr;
+}
+
+Day *Profile::FindGoodDay(QDate date, MachineType type)
+{
+    Day *day = FindDay(date, type);
+    if (!day)
+        return nullptr;
+
+    // For a machine match, find at least one enabled Session.
+    for (int i = 0; i < day->size(); ++i) {
+        Session * sess = (*day)[i];
+        if (((type == MT_UNKNOWN) || (sess->type() == type)) && sess->enabled()) {
+            return day;
+        }
+    }
+
+    // No enabled Sessions were found.
+    return nullptr;
+}
+
+
+Day *Profile::GetDay(QDate date, MachineType type)
+{
+    QMap<QDate, Day *>::iterator di = daylist.find(date);
+    if (di == daylist.end()) return nullptr;
+
+    Day * day = di.value();
+
+    if (type == MT_UNKNOWN) {
+        day->OpenSummary();
+        return day; // just want the day record
+    }
+
+    if (day->machines.contains(type)) {
+        day->OpenSummary();
+        return day;
+    }
+
+    return nullptr;
+}
+
+Day *Profile::FindDay(QDate date, MachineType type)
+{
+    QMap<QDate, Day *>::iterator di = daylist.find(date);
+    if (di == daylist.end()) return nullptr;
+
+    Day * day = di.value();
+
+    if (type == MT_UNKNOWN) {
+        return day; // just want the day record
+    }
+
+    if (day->machines.contains(type)) {
+        return day;
+    }
+
+    return nullptr;
+}
+
+
+int Profile::Import(QString path)
+{
+    int c = 0;
+    qDebug() << "Importing " << path;
+    path = path.replace("\\", "/");
+
+    if (path.endsWith("/")) {
+        path.chop(1);
+    }
+
+    QList<MachineLoader *>loaders = GetLoaders(MT_CPAP);
+
+    Q_FOREACH(MachineLoader * loader, loaders) {
+        if (c += loader->Open(path)) {
+            break;
+        }
+    }
+
+    return c;
+}
+
+MachineLoader *GetLoader(QString name)
+{
+    QList<MachineLoader *>loaders = GetLoaders();
+
+    Q_FOREACH(MachineLoader * loader, loaders) {
+        if (loader->loaderName() == name) {
+            return loader;
+        }
+    }
+
+    return nullptr;
+}
+
+
+// Returns a QVector containing all machine objects regisered of type t
+QList<Machine *> Profile::GetMachines(MachineType t)
+{
+    QList<Machine *> vec;
+    QHash<MachineID, Machine *>::iterator i;
+    QHash<MachineID, Machine *>::iterator machlist_end=machlist.end();
+
+    for (i = machlist.begin(); i != machlist_end; i++) {
+        if (!i.value()) {
+            qWarning() << "Profile::GetMachines() i->second == nullptr";
+            continue;
+        }
+
+        MachineType mt = i.value()->type();
+
+        if ((t == MT_UNKNOWN) || (mt == t)) {
+            vec.push_back(i.value());
+        }
+    }
+
+    return vec;
+}
+
+Machine *Profile::GetMachine(MachineType t)
+{
+    QList<Machine *>vec = GetMachines(t);
+
+    if (vec.size() == 0) {
+        return nullptr;
+    }
+
+    return vec[0];
+}
+
+//bool Profile::trashMachine(Machine * mach)
+//{
+//    QMap<QDate, QList<Day *> >::iterator it_end = daylist.end();
+//    QMap<QDate, QList<Day *> >::iterator it;
+
+//    QList<QDate> datelist;
+//    QList<Day *> days;
+
+//    for (it = daylist.begin(); it != it_end; ++it) {
+//        for (int i = 0; i< it.value().size(); ++i) {
+//            Day * day = it.value().at(i);
+//            if (day->machine() == mach) {
+//                days.push_back(day);
+//                datelist.push_back(it.key());
+//            }
+//        }
+//    }
+
+//    for (int i=0; i < datelist.size(); ++i) {
+//        Day * day = days.at(i);
+//        it = daylist.find(datelist.at(i));
+//        if (it != daylist.end()) {
+//            it.value().removeAll(day);
+//            if (it.value().size() == 0) {
+//                daylist.erase(it);
+//            }
+//        }
+//        mach->unlinkDay(days.at(i));
+//    }
+
+//}
+
+bool Profile::unlinkDay(Day * day)
+{
+    QMap<QDate, Day *>::iterator it;
+    QMap<QDate, Day *>::iterator it_end = daylist.end();
+
+    // Find the key...
+    for (it = daylist.begin(); it != it_end; ++it) {
+        if (it.value() == day) {
+            daylist.erase(it);
+            return true;
+        }
+    }
+    return false;
+}
+
+
+//Profile *profile=nullptr;
+QString SHA1(QString pass)
+{
+    return pass;
+}
+
+namespace Profiles {
+
+QMap<QString, Profile *> profiles;
+
+void Done()
+{
+    PREF.Save();
+    LAYOUT.Save();
+
+    p_profile->Save();
+    delete p_profile;
+
+    profiles.clear();
+    delete p_pref;
+    delete p_layout;
+    DestroyLoaders();
+}
+
+Profile *Get(QString name)
+{
+    if (profiles.find(name) != profiles.end()) {
+        return profiles[name];
+    }
+
+    return nullptr;
+}
+
+Profile *Create(QString name)
+{
+    QString path = PREF.Get("{home}/Profiles/") + name;
+    QDir dir(path);
+
+    if (!dir.exists(path)) {
+        dir.mkpath(path);
+    }
+
+    //path+="/"+name;
+    p_profile = new Profile(path);
+    p_profile->Open();
+    profiles[name] = p_profile;
+    p_profile->user->setUserName(name);
+    //p_profile->Set("Realname",realname);
+    //if (!password.isEmpty()) p_profile.user->setPassword(password);
+    p_profile->Set(STR_GEN_DataFolder, QString("{home}/Profiles/{") + QString(STR_UI_UserName) + QString("}"));
+
+    Machine *m = new Machine(0);
+    m->setType(MT_JOURNAL);
+    MachineInfo info(MT_JOURNAL, 0, STR_MACH_Journal, "SleepyHead", STR_MACH_Journal, QString(), m->hexid(), QString(), QDateTime::currentDateTime(), 0);
+
+    m->setInfo(info);
+    p_profile->AddMachine(m);
+
+    p_profile->Save();
+
+    return p_profile;
+}
+
+Profile *Get()
+{
+    // username lookup
+    //getUserName()
+    return profiles[getUserName()];;
+}
+
+void saveProfileList()
+{
+    QString filename = PREF.Get("{home}/profiles.xml");
+
+    QDomDocument doc("profiles");
+
+    QDomElement root = doc.createElement("profiles");
+    doc.appendChild(root);
+
+    QMap<QString, Profile *>::iterator it;
+
+    for (it = profiles.begin(); it != profiles.end(); ++it) {
+        QDomElement elem = doc.createElement("profile");
+        elem.setAttribute("name", it.key());
+        // Not technically nessesary..
+        elem.setAttribute("path", QString("{home}/Profiles/%1/Profile.xml").arg(it.key()));
+        root.appendChild(elem);
+    }
+
+    QFile file(filename);
+    file.open(QFile::WriteOnly);
+
+    file.write(doc.toByteArray());
+
+    file.close();
+}
+
+
+/**
+ * @brief Scan Profile directory loading user profiles
+ */
+void Scan()
+{
+    QString path = PREF.Get("{home}/Profiles");
+    QDir dir(path);
+
+    if (!dir.exists(path)) {
+        return;
+    }
+
+    if (!dir.isReadable()) {
+        qWarning() << "Can't open " << path;
+        return;
+    }
+
+    dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
+    //dir.setSorting(QDir::Name);
+
+    QFileInfoList list = dir.entryInfoList();
+
+    // Iterate through subdirectories and load profiles..
+    for (int i = 0; i < list.size(); i++) {
+        QFileInfo fi = list.at(i);
+        QString npath = fi.canonicalFilePath();
+        Profile *prof = new Profile(npath);
+        //prof->Open();
+
+        profiles[fi.fileName()] = prof;
+    }
+
+    // Update profiles.xml for mobile version
+    saveProfileList();
+}
+
+
+} // namespace Profiles
+
+
+// Returns a list of all days records matching machine type between start and end date
+QList<Day *> Profile::getDays(MachineType mt, QDate start, QDate end)
+{
+    QList<Day *> list;
+
+    if (!start.isValid()) {
+        return list;
+    }
+
+    if (!end.isValid()) {
+        return list;
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return list;
+    }
+
+    QMap<QDate, Day *>::iterator it;
+
+    do {
+        it = daylist.find(date);
+        if (it != daylist.end()) {
+            Day *day = it.value();
+            if (mt != MT_UNKNOWN) {
+                if (day->hasEnabledSessions(mt)) {
+                    list.push_back(day);
+                }
+            } else {
+                if (day->hasEnabledSessions()) {
+                    list.push_back(day);
+                }
+            }
+        }
+        date = date.addDays(1);
+    } while (date <= end);
+
+    return list;
+}
+
+int Profile::countDays(MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        return 0;
+    }
+
+    if (!end.isValid()) {
+        return 0;
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    int days = 0;
+
+    do {
+        Day *day = FindGoodDay(date, mt);
+
+        if (day) {
+            days++;
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    return days;
+
+}
+
+int Profile::countCompliantDays(MachineType mt, QDate start, QDate end)
+{
+    EventDataType compliance = cpap->complianceHours();
+
+    if (!start.isValid()) {
+        return 0;
+    }
+
+    if (!end.isValid()) {
+        return 0;
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    int days = 0;
+
+    do {
+        Day *day = FindGoodDay(date, mt);
+
+        if (day) {
+            if (day->hours(mt) > compliance) { days++; }
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    return days;
+}
+
+
+EventDataType Profile::calcCount(ChannelID code, MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    double val = 0;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            val += day->count(code);
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    return val;
+}
+
+double Profile::calcSum(ChannelID code, MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    double val = 0;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            val += day->sum(code);
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    return val;
+}
+
+EventDataType Profile::calcHours(MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    double val = 0;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            val += day->hours();
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    return val;
+}
+
+EventDataType Profile::calcAboveThreshold(ChannelID code, EventDataType threshold, MachineType mt,
+                                 QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    EventDataType val = 0;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            val += day->timeAboveThreshold(code, threshold);
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    return val;
+}
+
+EventDataType Profile::calcBelowThreshold(ChannelID code, EventDataType threshold, MachineType mt,
+                                 QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    EventDataType val = 0;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            val += day->timeBelowThreshold(code, threshold);
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    return val;
+}
+
+
+EventDataType Profile::calcAvg(ChannelID code, MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    double val = 0;
+    int cnt = 0;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            if (!day->summaryOnly() || day->hasData(code, ST_AVG)) {
+                val += day->sum(code);
+                cnt++;
+            }
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    if (!cnt) {
+        return 0;
+    }
+
+    return val / float(cnt);
+}
+
+EventDataType Profile::calcWavg(ChannelID code, MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    double val = 0, tmp, tmph, hours = 0;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            if (!day->summaryOnly() || day->hasData(code, ST_WAVG)) {
+                tmph = day->hours();
+                tmp = day->wavg(code);
+                val += tmp * tmph;
+                hours += tmph;
+            }
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    if (!hours) {
+        return 0;
+    }
+
+    val = val / hours;
+    return val;
+}
+
+EventDataType Profile::calcMin(ChannelID code, MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    bool first = true;
+
+    double min = 0, tmp;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            if (!day->summaryOnly() || day->hasData(code, ST_MIN)) {
+                tmp = day->Min(code);
+
+                if (first || (min > tmp)) {
+                    min = tmp;
+                    first = false;
+                }
+            }
+
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    if (first) {
+        min = 0;
+    }
+
+    return min;
+}
+EventDataType Profile::calcMax(ChannelID code, MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    bool first = true;
+    double max = 0, tmp;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            if (!day->summaryOnly() || day->hasData(code, ST_MAX)) {
+                tmp = day->Max(code);
+
+                if (first || (max < tmp)) {
+                    max = tmp;
+                    first = false;
+                }
+            }
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    if (first) {
+        max = 0;
+    }
+
+    return max;
+}
+EventDataType Profile::calcSettingsMin(ChannelID code, MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    bool first = true;
+    double min = 0, tmp;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            tmp = day->settings_min(code);
+
+            if (first || (min > tmp)) {
+                min = tmp;
+                first = false;
+            }
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    if (first) {
+        min = 0;
+    }
+
+    return min;
+}
+
+EventDataType Profile::calcSettingsMax(ChannelID code, MachineType mt, QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    bool first = true;
+    double max = 0, tmp;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            tmp = day->settings_max(code);
+
+            if (first || (max < tmp)) {
+                max = tmp;
+                first = false;
+            }
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+    if (first) {
+        max = 0;
+    }
+
+    return max;
+}
+
+struct CountSummary {
+    CountSummary(EventStoreType v) : val(v), count(0), time(0) {}
+    EventStoreType val;
+    EventStoreType count;
+    quint32 time;
+};
+
+EventDataType Profile::calcPercentile(ChannelID code, EventDataType percent, MachineType mt,
+                                      QDate start, QDate end)
+{
+    if (!start.isValid()) {
+        start = LastGoodDay(mt);
+    }
+
+    if (!end.isValid()) {
+        end = LastGoodDay(mt);
+    }
+
+    QDate date = start;
+
+    if (date.isNull()) {
+        return 0;
+    }
+
+    QMap<EventDataType, qint64> wmap;
+    QMap<EventDataType, qint64>::iterator wmi;
+
+    QHash<ChannelID, QHash<EventStoreType, EventStoreType> >::iterator vsi;
+    QHash<ChannelID, QHash<EventStoreType, quint32> >::iterator tsi;
+    EventDataType gain;
+    //bool setgain=false;
+    EventDataType value;
+    int weight;
+
+    qint64 SN = 0;
+    bool timeweight;
+    bool summaryOnly = false;
+
+    do {
+        Day *day = GetGoodDay(date, mt);
+
+        if (day) {
+            if (day->summaryOnly()) {
+                summaryOnly = true;
+                break;
+            }
+            for (int i = 0; i < day->size(); i++) {
+                for (QList<Session *>::iterator s = day->begin(); s != day->end(); s++) {
+                    if (!(*s)->enabled()) {
+                        continue;
+                    }
+
+                    Session *sess = *s;
+                    gain = sess->m_gain[code];
+
+                    if (!gain) { gain = 1; }
+
+                    vsi = sess->m_valuesummary.find(code);
+
+                    if (vsi == sess->m_valuesummary.end()) { continue; }
+
+                    tsi = sess->m_timesummary.find(code);
+                    timeweight = (tsi != sess->m_timesummary.end());
+
+                    QHash<EventStoreType, EventStoreType> &vsum = vsi.value();
+                    QHash<EventStoreType, quint32> &tsum = tsi.value();
+
+                    if (timeweight) {
+                        for (QHash<EventStoreType, quint32>::iterator k = tsum.begin(); k != tsum.end(); k++) {
+                            weight = k.value();
+                            value = EventDataType(k.key()) * gain;
+
+                            SN += weight;
+                            wmi = wmap.find(value);
+
+                            if (wmi == wmap.end()) {
+                                wmap[value] = weight;
+                            } else {
+                                wmi.value() += weight;
+                            }
+                        }
+                    } else {
+                        for (QHash<EventStoreType, EventStoreType>::iterator k = vsum.begin(); k != vsum.end(); k++) {
+                            weight = k.value();
+                            value = EventDataType(k.key()) * gain;
+
+                            SN += weight;
+                            wmi = wmap.find(value);
+
+                            if (wmi == wmap.end()) {
+                                wmap[value] = weight;
+                            } else {
+                                wmi.value() += weight;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        date = date.addDays(1);
+    } while (date <= end);
+
+
+    if (summaryOnly) {
+        // abort percentile calculation, there is not enough data
+        return 0;
+    }
+
+    QVector<ValueCount> valcnt;
+
+    // Build sorted list of value/counts
+    for (wmi = wmap.begin(); wmi != wmap.end(); wmi++) {
+        ValueCount vc;
+        vc.value = wmi.key();
+        vc.count = wmi.value();
+        vc.p = 0;
+        valcnt.push_back(vc);
+    }
+
+    // sort by weight, then value
+    qSort(valcnt);
+
+    //double SN=100.0/double(N); // 100% / overall sum
+    double p = 100.0 * percent;
+
+    double nth = double(SN) * percent; // index of the position in the unweighted set would be
+    double nthi = floor(nth);
+
+    qint64 sum1 = 0, sum2 = 0;
+    qint64 w1, w2 = 0;
+    double v1 = 0, v2 = 0;
+
+    int N = valcnt.size();
+    int k = 0;
+
+    for (k = 0; k < N; k++) {
+        v1 = valcnt[k].value;
+        w1 = valcnt[k].count;
+        sum1 += w1;
+
+        if (sum1 > nthi) {
+            return v1;
+        }
+
+        if (sum1 == nthi) {
+            break; // boundary condition
+        }
+    }
+
+    if (k >= N) {
+        return v1;
+    }
+
+    v2 = valcnt[k + 1].value;
+    w2 = valcnt[k + 1].count;
+    sum2 = sum1 + w2;
+    // value lies between v1 and v2
+
+    double px = 100.0 / double(SN); // Percentile represented by one full value
+
+    // calculate percentile ranks
+    double p1 = px * (double(sum1) - (double(w1) / 2.0));
+    double p2 = px * (double(sum2) - (double(w2) / 2.0));
+
+    // calculate linear interpolation
+    double v = v1 + ((p - p1) / (p2 - p1)) * (v2 - v1);
+
+    //  p1.....p.............p2
+    //  37     55            70
+
+    return v;
+}
+
+// Lookup first day record of the specified machine type, or return the first day overall if MT_UNKNOWN
+QDate Profile::FirstDay(MachineType mt)
+{
+    if ((mt == MT_UNKNOWN) || (!m_last.isValid()) || (!m_first.isValid())) {
+        return m_first;
+    }
+
+    QDate d = m_first;
+
+    do {
+        if (FindDay(d, mt) != nullptr) {
+            return d;
+        }
+
+        d = d.addDays(1);
+    } while (d <= m_last);
+
+    return m_last;
+}
+
+// Lookup last day record of the specified machine type, or return the first day overall if MT_UNKNOWN
+QDate Profile::LastDay(MachineType mt)
+{
+    if ((mt == MT_UNKNOWN) || (!m_last.isValid()) || (!m_first.isValid())) {
+        return m_last;
+    }
+
+    QDate d = m_last;
+
+    do {
+        if (FindDay(d, mt) != nullptr) {
+            return d;
+        }
+
+        d = d.addDays(-1);
+    } while (d >= m_first);
+
+    return m_first;
+}
+
+QDate Profile::FirstGoodDay(MachineType mt)
+{
+    if (mt == MT_UNKNOWN) {
+        return FirstDay();
+    }
+
+    QDate d = FirstDay(mt);
+    QDate l = LastDay(mt);
+
+    // No data will return invalid date records
+    if (!d.isValid() || !l.isValid()) {
+        return QDate();
+    }
+
+    do {
+        if (FindGoodDay(d, mt) != nullptr) {
+            return d;
+        }
+
+        d = d.addDays(1);
+    } while (d <= l);
+
+    return l; //m_last;
+}
+QDate Profile::LastGoodDay(MachineType mt)
+{
+    if (mt == MT_UNKNOWN) {
+        return FirstDay();
+    }
+
+    QDate d = LastDay(mt);
+    QDate f = FirstDay(mt);
+
+    if (!(d.isValid() && f.isValid())) {
+        return QDate();
+    }
+
+    do {
+        if (FindGoodDay(d, mt) != nullptr) {
+            return d;
+        }
+
+        d = d.addDays(-1);
+    } while (d >= f);
+
+    return f;
+}
+
+bool Profile::channelAvailable(ChannelID code)
+{
+    QHash<MachineID, Machine *>::iterator it;
+    QHash<MachineID, Machine *>::iterator machlist_end=machlist.end();
+
+    for (it = machlist.begin(); it != machlist_end; it++) {
+        Machine * mach = it.value();
+        if (mach->hasChannel(code))
+            return true;
+    }
+    return false;
+}
+
+bool Profile::hasChannel(ChannelID code)
+{
+    QDate d = LastDay();
+    QDate f = FirstDay();
+
+    if (!(d.isValid() && f.isValid())) {
+        return false;
+    }
+
+    QMap<QDate, Day *>::iterator dit;
+
+    bool found = false;
+
+    do {
+        dit = daylist.find(d);
+
+        if (dit != daylist.end()) {
+            Day *day = dit.value();
+
+
+            if (day->channelHasData(code)) {
+                found = true;
+                break;
+            }
+        }
+
+        d = d.addDays(-1);
+    } while (d >= f);
+
+    return found;
+}
diff --git a/sleepyhead/SleepLib/profiles.h b/sleepyhead/SleepLib/profiles.h
new file mode 100644
index 0000000..618cfb3
--- /dev/null
+++ b/sleepyhead/SleepLib/profiles.h
@@ -0,0 +1,860 @@
+/* SleepLib Profiles Header
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef PROFILES_H
+#define PROFILES_H
+
+#include <QString>
+#include <QCryptographicHash>
+#include <QThread>
+
+#include "version.h"
+#include "machine.h"
+#include "machine_loader.h"
+#include "preferences.h"
+#include "common.h"
+
+class Machine;
+
+enum Gender { GenderNotSpecified, Male, Female };
+enum MaskType { Mask_Unknown, Mask_NasalPillows, Mask_Hybrid, Mask_StandardNasal, Mask_FullFace };
+enum OverviewLinechartModes { OLC_Bartop, OLC_Lines };
+
+class DoctorInfo;
+class UserInfo;
+class UserSettings;
+class OxiSettings;
+class CPAPSettings;
+class AppearanceSettings;
+class SessionSettings;
+
+/*!
+  \class Profile
+  \author Mark Watkins
+  \date 28/04/11
+  \brief The User profile system, containing all information for a user, and an index into all Machine data
+ */
+class Profile : public Preferences
+{
+  public:
+    //! \brief Constructor.. Does not open profile
+    Profile(QString path);
+
+    virtual ~Profile();
+
+    //! \brief Open profile, parse profile.xml file, and initialize helper classes
+    virtual bool Open(QString filename = "");
+
+    //! \brief Parse machines.xml
+    bool OpenMachines();
+    bool StoreMachines();
+
+    //! \brief Returns hostname that locked profile, or empty string if unlocked
+    QString checkLock();
+
+    //! \brief Removes a lockfile
+    bool removeLock();
+
+    //! \brief Save Profile object (This is an extension to Preference::Save(..))
+    virtual bool Save(QString filename = "");
+
+    //! \brief Add machine to this profiles machlist
+    void AddMachine(Machine *m);
+
+    //! \brief Remove machine from this profiles machlist
+    void DelMachine(Machine *m);
+
+    //! \brief Loads all machine (summary) data belonging to this profile
+    void LoadMachineData();
+
+    //! \brief Barf because data format has changed. This does a purge of CPAP data for machine *m
+    void DataFormatError(Machine *m);
+
+    QString path() { return p_path; }
+
+        /*! \brief Import Machine Data
+        \param path containing import location
+     */
+    int Import(QString path);
+
+    //! \brief Removes a given day from the date, destroying the daylist date record if empty
+    bool unlinkDay(Day * day);
+
+//    bool trashMachine(Machine * mach);
+
+    //! \brief Add Day record to Profile Day list
+    Day *addDay(QDate date);
+
+    //! \brief Get Day record if data available for date and machine type, else return nullptr
+    Day *GetDay(QDate date, MachineType type = MT_UNKNOWN);
+
+    //! \brief Same as GetDay but does not open the summaries
+    Day *FindDay(QDate date, MachineType type = MT_UNKNOWN);
+
+    //! \brief Get Day record if data available for date and machine type,
+    //         and has enabled session data, else return nullptr
+    Day *GetGoodDay(QDate date, MachineType type);
+
+    //! \breif Same as GetGoodDay but does not open the summaries
+    Day *FindGoodDay(QDate date, MachineType type);
+
+    //! \brief Returns a list of all machines of type t
+    QList<Machine *> GetMachines(MachineType t = MT_UNKNOWN);
+
+    //! \brief Returns the machine of type t used on date, nullptr if none..
+    Machine *GetMachine(MachineType t, QDate date);
+
+    //! \brief return the first machine of type t
+    Machine *GetMachine(MachineType t);
+
+    //! \brief Returns true if this profile stores this variable identified by key
+    bool contains(QString key) { return p_preferences.contains(key); }
+
+
+    //! \brief Get all days records of machine type between start and end dates
+    QList<Day *> getDays(MachineType mt, QDate start, QDate end);
+
+    //! \brief Returns a count of all days (with data) of machine type, between start and end dates
+    int countDays(MachineType mt = MT_UNKNOWN, QDate start = QDate(), QDate end = QDate());
+
+    //! \brief Returns a count of all compliant days of machine type between start and end dates
+    int countCompliantDays(MachineType mt, QDate start, QDate end);
+
+    //! \brief Returns a count of all event entries for code, matching machine type between start an end dates
+    EventDataType calcCount(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(),
+                            QDate end = QDate());
+
+    //! \brief Returns a sum of all event data for Channel code, matching machine type between start an end dates
+    double calcSum(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(),
+                   QDate end = QDate());
+
+    //! \brief Returns a sum of all session durations for machine type, between start and end dates
+    EventDataType calcHours(MachineType mt = MT_CPAP, QDate start = QDate(), QDate end = QDate());
+
+    //! \brief Calculates Channel Average (Sums and counts all events, returning the sum divided by the count.)
+    EventDataType calcAvg(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(),
+                          QDate end = QDate());
+
+    //! \brief Calculates Channel Weighted Average between start and end dates
+    EventDataType calcWavg(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(),
+                           QDate end = QDate());
+
+    //! \brief Calculates the minimum value for channel code, between start and end dates
+    EventDataType calcMin(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(),
+                          QDate end = QDate());
+
+    //! \brief Calculates the maximum value for channel code, between start and end dates
+    EventDataType calcMax(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(),
+                          QDate end = QDate());
+
+    //! \brief Calculates a percentile value percent for channel code, between start and end dates
+    EventDataType calcPercentile(ChannelID code, EventDataType percent, MachineType mt = MT_CPAP,
+                                 QDate start = QDate(), QDate end = QDate());
+
+    //! \brief Tests if Channel code is available in all day sets
+    bool hasChannel(ChannelID code);
+
+
+    //! \brief Looks up if any machines report channel is available
+    bool channelAvailable(ChannelID code);
+
+
+    //! \brief Calculates the minimum session settings value for channel code, between start and end dates
+    EventDataType calcSettingsMin(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(),
+                                  QDate end = QDate());
+
+    //! \brief Calculates the maximum session settings value for channel code, between start and end dates
+    EventDataType calcSettingsMax(ChannelID code, MachineType mt = MT_CPAP, QDate start = QDate(),
+                                  QDate end = QDate());
+
+    //! \brief Calculates the time channel code spends above threshold value for machine type, between start and end dates
+    EventDataType calcAboveThreshold(ChannelID code, EventDataType threshold, MachineType mt = MT_CPAP,
+                                     QDate start = QDate(), QDate end = QDate());
+
+    //! \brief Calculates the time channel code spends below threshold value for machine type, between start and end dates
+    EventDataType calcBelowThreshold(ChannelID code, EventDataType threshold, MachineType mt = MT_CPAP,
+                                     QDate start = QDate(), QDate end = QDate());
+
+
+    // XML load components
+    virtual void ExtraLoad(QDomElement &root);
+
+    //! \brief Looks for the first date containing a day record matching machinetype
+    QDate FirstDay(MachineType mt = MT_UNKNOWN);
+
+    //! \brief Looks for the last date containing a day record matching machinetype
+    QDate LastDay(MachineType mt = MT_UNKNOWN);
+
+    //! \brief Looks for the first date containing a day record with enabled sessions matching machinetype
+    QDate FirstGoodDay(MachineType mt = MT_UNKNOWN);
+
+    //! \brief Looks for the last date containing a day record with enabled sessions matching machinetype
+    QDate LastGoodDay(MachineType mt = MT_UNKNOWN);
+
+    //! \brief Returns this profiles data folder
+    QString dataFolder() { return (*this).Get("{DataFolder}"); }
+
+    //! \brief Return if this profile has been opened or not
+    bool isOpen() { return m_opened; }
+
+    //! \brief QMap of day records (iterates in order).
+    QMap<QDate, Day *> daylist;
+
+    //! \brief List of machines, indexed by MachineID.
+    QHash<MachineID, Machine *> machlist;
+
+    bool is_first_day;
+
+    UserInfo *user;
+    CPAPSettings *cpap;
+    OxiSettings *oxi;
+    DoctorInfo *doctor;
+    AppearanceSettings *appearance;
+    UserSettings *general;
+    SessionSettings *session;
+
+  protected:
+    QDate m_first;
+    QDate m_last;
+
+    bool m_opened;
+    bool m_machopened;
+};
+
+class MachineLoader;
+extern MachineLoader *GetLoader(QString name);
+
+extern Preferences *p_pref;
+extern Preferences *p_layout;
+extern Profile *p_profile;
+
+// these are bad and must change
+#define PREF (*p_pref)
+#define LAYOUT (*p_layout)
+
+// DoctorInfo Strings
+const QString STR_DI_Name = "DoctorName";
+const QString STR_DI_Phone = "DoctorPhone";
+const QString STR_DI_Email = "DoctorEmail";
+const QString STR_DI_Practice = "DoctorPractice";
+const QString STR_DI_Address = "DoctorAddress";
+const QString STR_DI_PatientID = "DoctorPatientID";
+
+// UserInfo Strings
+const QString STR_UI_DOB = "DOB";
+const QString STR_UI_FirstName = "FirstName";
+const QString STR_UI_LastName = "LastName";
+const QString STR_UI_UserName = "UserName";
+const QString STR_UI_Password = "Password";
+const QString STR_UI_Address = "Address";
+const QString STR_UI_Phone = "Phone";
+const QString STR_UI_EmailAddress = "EmailAddress";
+const QString STR_UI_Country = "Country";
+const QString STR_UI_Height = "Height";
+const QString STR_UI_Gender = "Gender";
+const QString STR_UI_TimeZone = "TimeZone";
+const QString STR_UI_DST = "DST";
+
+// OxiSettings Strings
+const QString STR_OS_EnableOximetry = "EnableOximetry";
+const QString STR_OS_DefaultDevice = "DefaultOxiDevice";
+const QString STR_OS_SyncOximeterClock = "SyncOximeterClock";
+const QString STR_OS_OximeterType = "OximeterType";
+const QString STR_OS_OxiDiscardThreshold = "OxiDiscardThreshold";
+const QString STR_OS_SPO2DropDuration = "SPO2DropDuration";
+const QString STR_OS_SPO2DropPercentage = "SPO2DropPercentage";
+const QString STR_OS_PulseChangeDuration = "PulseChangeDuration";
+const QString STR_OS_PulseChangeBPM = "PulseChangeBPM";
+const QString STR_OS_SkipOxiIntroScreen = "SkipOxiIntroScreen";
+
+
+// CPAPSettings Strings
+const QString STR_CS_ComplianceHours = "ComplianceHours";
+const QString STR_CS_ShowCompliance = "ShowCompliance";
+const QString STR_CS_ShowLeaksMode = "ShowLeaksMode";
+const QString STR_CS_MaskStartDate = "MaskStartDate";
+const QString STR_CS_MaskDescription = "MaskDescription";
+const QString STR_CS_MaskType = "MaskType";
+const QString STR_CS_PrescribedMode = "CPAPPrescribedMode";
+const QString STR_CS_PrescribedMinPressure = "CPAPPrescribedMinPressure";
+const QString STR_CS_PrescribedMaxPressure = "CPAPPrescribedMaxPressure";
+const QString STR_CS_UntreatedAHI = "UntreatedAHI";
+const QString STR_CS_Notes = "CPAPNotes";
+const QString STR_CS_DateDiagnosed = "DateDiagnosed";
+const QString STR_CS_UserEventFlagging = "UserEventFlagging";
+const QString STR_CS_UserEventPieChart = "UserEventPieChart";
+const QString STR_CS_AutoImport = "AutoImport";
+const QString STR_CS_BrickWarning = "BrickWarning";
+
+const QString STR_CS_UserFlowRestriction = "UserFlowRestriction";
+const QString STR_CS_UserEventDuration = "UserEventDuration";
+const QString STR_CS_UserFlowRestriction2 = "UserFlowRestriction2";
+const QString STR_CS_UserEventDuration2 = "UserEventDuration2";
+const QString STR_CS_UserEventDuplicates = "UserEventDuplicates";
+const QString STR_CS_ResyncFromUserFlagging = "ResyncFromUserFlagging";
+
+const QString STR_CS_AHIWindow = "AHIWindow";
+const QString STR_CS_AHIReset = "AHIReset";
+const QString STR_CS_ClockDrift = "ClockDrift";
+const QString STR_CS_LeakRedline = "LeakRedline";
+const QString STR_CS_ShowLeakRedline = "ShowLeakRedline";
+
+// ImportSettings Strings
+const QString STR_IS_DaySplitTime = "DaySplitTime";
+const QString STR_IS_PreloadSummaries = "PreloadSummaries";
+const QString STR_IS_CacheSessions = "MemoryHog";
+const QString STR_IS_CombineCloseSessions = "CombineCloserSessions";
+const QString STR_IS_IgnoreShorterSessions = "IgnoreShorterSessions";
+const QString STR_IS_Multithreading = "EnableMultithreading";
+const QString STR_IS_BackupCardData = "BackupCardData";
+const QString STR_IS_CompressBackupData = "CompressBackupData";
+const QString STR_IS_CompressSessionData = "CompressSessionData";
+const QString STR_IS_IgnoreOlderSessions = "IgnoreOlderSessions";
+const QString STR_IS_IgnoreOlderSessionsDate = "IgnoreOlderSessionsDate";
+const QString STR_IS_LockSummarySessions = "LockSummarySessions";
+
+// AppearanceSettings Strings
+const QString STR_AS_GraphHeight = "GraphHeight";
+const QString STR_AS_AntiAliasing = "UseAntiAliasing";
+const QString STR_AS_GraphSnapshots = "EnableGraphSnapshots";
+const QString STR_AS_Animations = "AnimationsAndTransitions";
+const QString STR_AS_SquareWave = "SquareWavePlots";
+const QString STR_AS_OverlayType = "OverlayType";
+const QString STR_AS_OverviewLinechartMode = "OverviewLinechartMode";
+const QString STR_AS_UsePixmapCaching = "UsePixmapCaching";
+const QString STR_AS_AllowYAxisScaling = "AllowYAxisScaling";
+const QString STR_AS_GraphTooltips = "GraphTooltips";
+const QString STR_AS_LineThickness = "LineThickness";
+const QString STR_AS_LineCursorMode = "LineCursorMode";
+const QString STR_AS_CalendarVisible = "CalendarVisible";
+const QString STR_AS_RightSidebarVisible = "RightSidebarVisible";
+
+// UserSettings Strings
+const QString STR_US_UnitSystem = "UnitSystem";
+const QString STR_US_EventWindowSize = "EventWindowSize";
+const QString STR_US_SkipEmptyDays = "SkipEmptyDays";
+const QString STR_US_RebuildCache = "RebuildCache";
+const QString STR_US_ShowDebug = "ShowDebug";
+const QString STR_US_ShowPerformance = "ShowPerformance";
+const QString STR_US_LinkGroups = "LinkGroups";
+const QString STR_US_CalculateRDI = "CalculateRDI";
+const QString STR_US_ShowSerialNumbers = "ShowSerialNumbers";
+const QString STR_US_PrefCalcMiddle = "PrefCalcMiddle";
+const QString STR_US_PrefCalcPercentile = "PrefCalcPercentile";
+const QString STR_US_PrefCalcMax = "PrefCalcMax";
+const QString STR_US_TooltipTimeout = "TooltipTimeout";
+const QString STR_US_ScrollDampening = "ScrollDampening";
+const QString STR_US_ShowUnknownFlags = "ShowUnknownFlags";
+const QString STR_US_StatReportMode = "StatReportMode";
+const QString STR_US_LastOverviewRange = "LastOverviewRange";
+
+// Parent class for subclasses that manipulate the profile.
+class ProfileSettings
+{
+  public:
+    ProfileSettings(Profile *profile)
+      : m_profile(profile)
+    { }
+
+    inline void setPref(QString name, QVariant value) {
+        (*m_profile)[name] = value;
+    }
+
+    inline void initPref(QString name, QVariant value) {
+        m_profile->init(name, value);
+    }
+
+    inline QVariant getPref(QString name) const {
+        return (*m_profile)[name];
+    }
+
+    void setProfile(Profile *profile) {
+        m_profile = profile;
+    }
+
+  public:
+    Profile *m_profile;
+};
+
+class DoctorInfo : public ProfileSettings
+{
+  public:
+    DoctorInfo(Profile *profile)
+      : ProfileSettings(profile)
+    {
+        initPref(STR_DI_Name, QString());
+        initPref(STR_DI_Phone, QString());
+        initPref(STR_DI_Email, QString());
+        initPref(STR_DI_Practice, QString());
+        initPref(STR_DI_Address, QString());
+        initPref(STR_DI_PatientID, QString());
+    }
+
+    const QString name() const { return getPref(STR_DI_Name).toString(); }
+    const QString phone() const { return getPref(STR_DI_Phone).toString(); }
+    const QString email() const { return getPref(STR_DI_Email).toString(); }
+    const QString practiceName() const { return getPref(STR_DI_Practice).toString(); }
+    const QString address() const { return getPref(STR_DI_Address).toString(); }
+    const QString patientID() const { return getPref(STR_DI_PatientID).toString(); }
+
+    void setName(QString name) { setPref(STR_DI_Name, name); }
+    void setPhone(QString phone) { setPref(STR_DI_Phone, phone); }
+    void setEmail(QString phone) { setPref(STR_DI_Email, phone); }
+    void setPracticeName(QString practice) { setPref(STR_DI_Practice, practice); }
+    void setAddress(QString address) { setPref(STR_DI_Address, address); }
+    void setPatientID(QString pid) { setPref(STR_DI_PatientID, pid); }
+};
+
+
+/*! \class UserInfo
+    \brief Profile Options relating to the User Information
+    */
+class UserInfo : public ProfileSettings
+{
+  public:
+    UserInfo(Profile *profile)
+      : ProfileSettings(profile)
+    {
+        initPref(STR_UI_DOB, QDate(1970, 1, 1));
+        initPref(STR_UI_FirstName, QString());
+        initPref(STR_UI_LastName, QString());
+        initPref(STR_UI_UserName, QString());
+        initPref(STR_UI_Password, QString());
+        initPref(STR_UI_Address, QString());
+        initPref(STR_UI_Phone, QString());
+        initPref(STR_UI_EmailAddress, QString());
+        initPref(STR_UI_Country, QString());
+        initPref(STR_UI_Height, 0.0);
+        initPref(STR_UI_Gender, (int)GenderNotSpecified);
+        initPref(STR_UI_TimeZone, QString());
+        initPref(STR_UI_DST, false);
+    }
+
+    QDate DOB() const { return getPref(STR_UI_DOB).toDate(); }
+    const QString firstName() const { return getPref(STR_UI_FirstName).toString(); }
+    const QString lastName() const { return getPref(STR_UI_LastName).toString(); }
+    const QString userName() const { return getPref(STR_UI_UserName).toString(); }
+    const QString address() const { return getPref(STR_UI_Address).toString(); }
+    const QString phone() const { return getPref(STR_UI_Phone).toString(); }
+    const QString email() const { return getPref(STR_UI_EmailAddress).toString(); }
+    double height() const { return getPref(STR_UI_Height).toDouble(); }
+    const QString country() const { return getPref(STR_UI_Country).toString(); }
+    Gender gender() const { return (Gender)getPref(STR_UI_Gender).toInt(); }
+    const QString timeZone() const { return getPref(STR_UI_TimeZone).toString(); }
+    bool daylightSaving() const { return getPref(STR_UI_DST).toBool(); }
+
+    void setDOB(QDate date) { setPref(STR_UI_DOB, date); }
+    void setFirstName(QString name) { setPref(STR_UI_FirstName, name); }
+    void setLastName(QString name) { setPref(STR_UI_LastName, name); }
+    void setUserName(QString username) { setPref(STR_UI_UserName, username); }
+    void setAddress(QString address) { setPref(STR_UI_Address, address); }
+    void setPhone(QString phone) { setPref(STR_UI_Phone, phone); }
+    void setEmail(QString email) { setPref(STR_UI_EmailAddress, email); }
+    void setHeight(double height) { setPref(STR_UI_Height, height); }
+    void setCountry(QString country) { setPref(STR_UI_Country, country); }
+    void setGender(Gender g) { setPref(STR_UI_Gender, (int)g); }
+    void setTimeZone(QString tz) { setPref(STR_UI_TimeZone, tz); }
+    void setDaylightSaving(bool ds) { setPref(STR_UI_DST, ds); }
+
+    bool hasPassword() { return !getPref(STR_UI_Password).toString().isEmpty(); }
+
+    bool checkPassword(QString password) {
+        QByteArray ba = password.toUtf8();
+        QString hashedPass = QString(QCryptographicHash::hash(ba, QCryptographicHash::Sha1).toHex());
+        return getPref(STR_UI_Password).toString() == hashedPass;
+    }
+
+    void setPassword(QString password) {
+        QByteArray ba = password.toUtf8();
+        QString hashedPass = QString(QCryptographicHash::hash(ba, QCryptographicHash::Sha1).toHex());
+        setPref(STR_UI_Password, hashedPass);
+    }
+};
+
+/*! \class OxiSettings
+    \brief Profile Options relating to the Oximetry settings
+    */
+class OxiSettings : public ProfileSettings
+{
+  public:
+    //! \brief Create OxiSettings object given Profile *p, and initialize the defaults
+    OxiSettings(Profile *profile)
+      : ProfileSettings(profile)
+    {
+        initPref(STR_OS_EnableOximetry, false);
+        initPref(STR_OS_DefaultDevice, QString());
+        initPref(STR_OS_SyncOximeterClock, true);
+        initPref(STR_OS_OximeterType, 0);
+        initPref(STR_OS_OxiDiscardThreshold, 0.0);
+        initPref(STR_OS_SPO2DropDuration, 8.0);
+        initPref(STR_OS_SPO2DropPercentage, 3.0);
+        initPref(STR_OS_PulseChangeDuration, 8.0);
+        initPref(STR_OS_PulseChangeBPM, 5.0);
+        initPref(STR_OS_SkipOxiIntroScreen, false);
+    }
+
+    bool oximetryEnabled() const { return getPref(STR_OS_EnableOximetry).toBool(); }
+    QString defaultDevice() const { return getPref(STR_OS_DefaultDevice).toString(); }
+    bool syncOximeterClock() const { return getPref(STR_OS_SyncOximeterClock).toBool(); }
+    int oximeterType() const { return getPref(STR_OS_OximeterType).toInt(); }
+    double oxiDiscardThreshold() const { return getPref(STR_OS_OxiDiscardThreshold).toDouble(); }
+    double spO2DropDuration() const { return getPref(STR_OS_SPO2DropDuration).toDouble(); }
+    double spO2DropPercentage() const { return getPref(STR_OS_SPO2DropPercentage).toDouble(); }
+    double pulseChangeDuration() const { return getPref(STR_OS_PulseChangeDuration).toDouble(); }
+    double pulseChangeBPM() const { return getPref(STR_OS_PulseChangeBPM).toDouble(); }
+    bool skipOxiIntroScreen() const { return getPref(STR_OS_SkipOxiIntroScreen).toBool(); }
+
+
+    void setOximetryEnabled(bool enabled) { setPref(STR_OS_EnableOximetry, enabled); }
+    void setDefaultDevice(QString name) { setPref(STR_OS_DefaultDevice, name); }
+    void setSyncOximeterClock(bool synced) { setPref(STR_OS_SyncOximeterClock, synced); }
+    void setOximeterType(int oxitype) { setPref(STR_OS_OximeterType, oxitype); }
+    void setOxiDiscardThreshold(double thresh) { setPref(STR_OS_OxiDiscardThreshold, thresh); }
+    void setSpO2DropDuration(double duration) { setPref(STR_OS_SPO2DropDuration, duration); }
+    void setPulseChangeBPM(double bpm) { setPref(STR_OS_PulseChangeBPM, bpm); }
+    void setSkipOxiIntroScreen(bool skip) { setPref(STR_OS_SkipOxiIntroScreen, skip); }
+    void setSpO2DropPercentage(double percentage) {
+        setPref(STR_OS_SPO2DropPercentage, percentage);
+    }
+    void setPulseChangeDuration(double duration) {
+        setPref(STR_OS_PulseChangeDuration, duration);
+    }
+};
+
+/*! \class CPAPSettings
+    \brief Profile Options relating to the CPAP settings
+    */
+class CPAPSettings : public ProfileSettings
+{
+  public:
+    CPAPSettings(Profile *profile)
+      : ProfileSettings(profile)
+    {
+        initPref(STR_CS_ComplianceHours, 4);
+        initPref(STR_CS_ShowCompliance, true);
+        initPref(STR_CS_ShowLeaksMode, 0);
+        // TODO: jedimark: Check if this date is initiliazed yet
+        initPref(STR_CS_MaskStartDate, QDate());
+        initPref(STR_CS_MaskDescription, QString());
+        initPref(STR_CS_MaskType, Mask_Unknown);
+        initPref(STR_CS_PrescribedMode, MODE_UNKNOWN);
+        initPref(STR_CS_PrescribedMinPressure, 0.0);
+        initPref(STR_CS_PrescribedMaxPressure, 0.0);
+        initPref(STR_CS_UntreatedAHI, 0.0);
+        initPref(STR_CS_Notes, QString());
+        initPref(STR_CS_DateDiagnosed, QDate());
+        initPref(STR_CS_UserFlowRestriction, 20.0);
+        initPref(STR_CS_UserEventDuration, 8.0);
+        initPref(STR_CS_UserFlowRestriction2, 50.0);
+        initPref(STR_CS_UserEventDuration2, 8.0);
+        initPref(STR_CS_UserEventDuplicates, false);
+        initPref(STR_CS_UserEventFlagging, false);
+        initPref(STR_CS_AHIWindow, 60.0);
+        initPref(STR_CS_AHIReset, false);
+        initPref(STR_CS_LeakRedline, 24.0);
+        initPref(STR_CS_ShowLeakRedline, true);
+        initPref(STR_CS_UserEventPieChart, false);
+        initPref(STR_CS_ResyncFromUserFlagging, false);
+        initPref(STR_CS_AutoImport, false);
+        initPref(STR_CS_BrickWarning, true);
+
+        initPref(STR_CS_ClockDrift, (int)0);
+        m_clock_drift = getPref(STR_CS_ClockDrift).toInt();
+    }
+
+    //Getters
+    double complianceHours() const { return getPref(STR_CS_ComplianceHours).toDouble(); }
+    bool showComplianceInfo() const { return getPref(STR_CS_ShowCompliance).toBool(); }
+    int leakMode() const { return getPref(STR_CS_ShowLeaksMode).toInt(); }
+    QDate maskStartDate() const { return getPref(STR_CS_MaskStartDate).toDate(); }
+    QString maskDescription() const { return getPref(STR_CS_MaskDescription).toString(); }
+    MaskType maskType() const { return (MaskType)getPref(STR_CS_MaskType).toInt(); }
+    CPAPMode mode() const { return CPAPMode(getPref(STR_CS_PrescribedMode).toInt()); }
+    double minPressure() const { return getPref(STR_CS_PrescribedMinPressure).toDouble(); }
+    double maxPressure() const { return getPref(STR_CS_PrescribedMaxPressure).toDouble(); }
+    double untreatedAHI() const { return getPref(STR_CS_UntreatedAHI).toDouble(); }
+    const QString notes() const { return getPref(STR_CS_Notes).toString(); }
+    QDate dateDiagnosed() const { return getPref(STR_CS_DateDiagnosed).toDate(); }
+    double userFlowRestriction() const { return getPref(STR_CS_UserFlowRestriction).toDouble(); }
+    double userEventDuration() const { return getPref(STR_CS_UserEventDuration).toDouble(); }
+    double userFlowRestriction2() const { return getPref(STR_CS_UserFlowRestriction2).toDouble(); }
+    double userEventDuration2() const { return getPref(STR_CS_UserEventDuration2).toDouble(); }
+    bool userEventDuplicates() const { return getPref(STR_CS_UserEventDuplicates).toBool(); }
+    double AHIWindow() const { return getPref(STR_CS_AHIWindow).toDouble(); }
+    bool AHIReset() const { return getPref(STR_CS_AHIReset).toBool(); }
+    bool userEventFlagging() const { return getPref(STR_CS_UserEventFlagging).toBool(); }
+    int clockDrift() const { return m_clock_drift; }
+    EventDataType leakRedline() const { return getPref(STR_CS_LeakRedline).toFloat(); }
+    bool showLeakRedline() const { return getPref(STR_CS_ShowLeakRedline).toBool(); }
+    bool userEventPieChart() const { return getPref(STR_CS_UserEventPieChart).toBool(); }
+    bool resyncFromUserFlagging() const { return getPref(STR_CS_ResyncFromUserFlagging).toBool(); }
+    bool autoImport() const { return getPref(STR_CS_AutoImport).toBool(); }
+    bool brickWarning() const { return getPref(STR_CS_BrickWarning).toBool(); }
+
+    //Setters
+    void setMode(CPAPMode mode) { setPref(STR_CS_PrescribedMode, (int)mode); }
+    void setMinPressure(double pressure) { setPref(STR_CS_PrescribedMinPressure, pressure); }
+    void setMaxPressure(double pressure) { setPref(STR_CS_PrescribedMaxPressure, pressure); }
+    void setUntreatedAHI(double ahi) { setPref(STR_CS_UntreatedAHI, ahi); }
+    void setNotes(QString notes) { setPref(STR_CS_Notes, notes); }
+    void setDateDiagnosed(QDate date) { setPref(STR_CS_DateDiagnosed, date); }
+    void setComplianceHours(double hours) { setPref(STR_CS_ComplianceHours, hours); }
+    void setShowComplianceInfo(bool b) { setPref(STR_CS_ShowCompliance, b); }
+    void setLeakMode(int leakmode) { setPref(STR_CS_ShowLeaksMode, (int)leakmode); }
+    void setMaskStartDate(QDate date) { setPref(STR_CS_MaskStartDate, date); }
+    void setMaskType(MaskType masktype) { setPref(STR_CS_MaskType, (int)masktype); }
+    void setUserFlowRestriction(double flow) { setPref(STR_CS_UserFlowRestriction, flow); }
+    void setUserEventDuration(double duration) { setPref(STR_CS_UserEventDuration, duration); }
+    void setUserFlowRestriction2(double flow) { setPref(STR_CS_UserFlowRestriction2, flow); }
+    void setUserEventDuration2(double duration) { setPref(STR_CS_UserEventDuration2, duration); }
+    void setAHIWindow(double window) { setPref(STR_CS_AHIWindow, window); }
+    void setAHIReset(bool reset) { setPref(STR_CS_AHIReset, reset); }
+    void setUserEventFlagging(bool flagging) { setPref(STR_CS_UserEventFlagging, flagging); }
+    void setUserEventDuplicates(bool dup) { setPref(STR_CS_UserEventDuplicates, dup); }
+    void setMaskDescription(QString description) {
+        setPref(STR_CS_MaskDescription, description);
+    }
+    void setClockDrift(int seconds) {
+        setPref(STR_CS_ClockDrift, m_clock_drift = (int)seconds);
+    }
+    void setLeakRedline(EventDataType value) { setPref(STR_CS_LeakRedline, value); }
+    void setShowLeakRedline(bool reset) { setPref(STR_CS_ShowLeakRedline, reset); }
+    void setUserEventPieChart(bool b) { setPref(STR_CS_UserEventPieChart, b); }
+    void setResyncFromUserFlagging(bool b) { setPref(STR_CS_ResyncFromUserFlagging, b); }
+    void setAutoImport(bool b) { setPref(STR_CS_AutoImport, b); }
+    void setBrickWarning(bool b) { setPref(STR_CS_BrickWarning, b); }
+
+  public:
+    int m_clock_drift;
+};
+
+/*! \class ImportSettings
+    \brief Profile Options relating to the Import process
+    */
+class SessionSettings : public ProfileSettings
+{
+  public:
+    SessionSettings(Profile *profile)
+      : ProfileSettings(profile)
+    {
+        initPref(STR_IS_DaySplitTime, QTime(12, 0, 0));
+        initPref(STR_IS_CacheSessions, false);
+        initPref(STR_IS_PreloadSummaries, false);
+        initPref(STR_IS_CombineCloseSessions, 240);
+        initPref(STR_IS_IgnoreShorterSessions, 5);
+        initPref(STR_IS_Multithreading, QThread::idealThreadCount() > 1);
+        initPref(STR_IS_BackupCardData, true);
+        initPref(STR_IS_CompressBackupData, false);
+        initPref(STR_IS_CompressSessionData, false);
+        initPref(STR_IS_IgnoreOlderSessions, false);
+        initPref(STR_IS_IgnoreOlderSessionsDate, QDateTime(QDate::currentDate().addYears(-1), daySplitTime()) );
+        initPref(STR_IS_LockSummarySessions, true);
+
+    }
+
+    QTime daySplitTime() const { return getPref(STR_IS_DaySplitTime).toTime(); }
+    bool cacheSessions() const { return getPref(STR_IS_CacheSessions).toBool(); }
+    bool preloadSummaries() const { return getPref(STR_IS_PreloadSummaries).toBool(); }
+    double combineCloseSessions() const { return getPref(STR_IS_CombineCloseSessions).toDouble(); }
+    double ignoreShortSessions() const { return getPref(STR_IS_IgnoreShorterSessions).toDouble(); }
+    bool multithreading() const { return getPref(STR_IS_Multithreading).toBool(); }
+    bool compressSessionData() const { return getPref(STR_IS_CompressSessionData).toBool(); }
+    bool compressBackupData() const { return getPref(STR_IS_CompressBackupData).toBool(); }
+    bool backupCardData() const { return getPref(STR_IS_BackupCardData).toBool(); }
+    bool ignoreOlderSessions() const { return getPref(STR_IS_IgnoreOlderSessions).toBool(); }
+    QDateTime ignoreOlderSessionsDate() const { return getPref(STR_IS_IgnoreOlderSessionsDate).toDateTime(); }
+    bool lockSummarySessions() const { return getPref(STR_IS_LockSummarySessions).toBool(); }
+
+    void setDaySplitTime(QTime time) { setPref(STR_IS_DaySplitTime, time); }
+    void setCacheSessions(bool c) { setPref(STR_IS_CacheSessions, c); }
+    void setPreloadSummaries(bool b) { setPref(STR_IS_PreloadSummaries, b); }
+    void setCombineCloseSessions(double val) { setPref(STR_IS_CombineCloseSessions, val); }
+    void setIgnoreShortSessions(double val) { setPref(STR_IS_IgnoreShorterSessions, val); }
+    void setMultithreading(bool enabled) { setPref(STR_IS_Multithreading, enabled); }
+    void setBackupCardData(bool enabled) { setPref(STR_IS_BackupCardData, enabled); }
+    void setCompressBackupData(bool enabled) { setPref(STR_IS_CompressBackupData, enabled); }
+    void setCompressSessionData(bool enabled) { setPref(STR_IS_CompressSessionData, enabled); }
+    void setIgnoreOlderSessions(bool enabled) { setPref(STR_IS_IgnoreOlderSessions, enabled); }
+    void setIgnoreOlderSessionsDate(QDate date) { setPref(STR_IS_IgnoreOlderSessionsDate, QDateTime(date, daySplitTime())); }
+    void setLockSummarySessions(bool b) { setPref(STR_IS_LockSummarySessions, b); }
+
+};
+
+/*! \class AppearanceSettings
+    \brief Profile Options relating to Visual Appearance
+    */
+class AppearanceSettings : public ProfileSettings
+{
+  public:
+    //! \brief Create AppearanceSettings object given Profile *p, and initialize the defaults
+    AppearanceSettings(Profile *profile)
+      : ProfileSettings(profile)
+    {
+        initPref(STR_AS_GraphHeight, 180.0);
+        initPref(STR_AS_AntiAliasing, true);
+        initPref(STR_AS_GraphSnapshots, true);
+        initPref(STR_AS_Animations, true);
+        initPref(STR_AS_SquareWave, false);
+        initPref(STR_AS_AllowYAxisScaling, true);
+        initPref(STR_AS_GraphTooltips, true);
+        initPref(STR_AS_UsePixmapCaching, false);
+        initPref(STR_AS_OverlayType, ODT_Bars);
+        initPref(STR_AS_OverviewLinechartMode, OLC_Bartop);
+        initPref(STR_AS_LineThickness, 1.0);
+        initPref(STR_AS_LineCursorMode, true);
+        initPref(STR_AS_CalendarVisible, true);
+        initPref(STR_AS_RightSidebarVisible, true);
+    }
+
+    //! \brief Returns the normal (unscaled) height of a graph
+    int graphHeight() const { return getPref(STR_AS_GraphHeight).toInt(); }
+    //! \brief Returns true if AntiAliasing (the graphical smoothing method) is enabled
+    bool antiAliasing() const { return getPref(STR_AS_AntiAliasing).toBool(); }
+    //! \brief Returns true if renderPixmap function is in use, which takes snapshots of graphs
+    bool graphSnapshots() const { return getPref(STR_AS_GraphSnapshots).toBool(); }
+    //! \brief Returns true if Graphical animations & Transitions will be drawn
+    bool animations() const { return getPref(STR_AS_Animations).toBool(); }
+    //! \brief Returns true if PixmapCaching acceleration will be used
+    bool usePixmapCaching() const { return getPref(STR_AS_UsePixmapCaching).toBool(); }
+    //! \brief Returns true if Square Wave plots are preferred (where possible)
+    bool squareWavePlots() const { return getPref(STR_AS_SquareWave).toBool(); }
+    //! \brief Whether to allow double clicking on Y-Axis labels to change vertical scaling mode
+    bool allowYAxisScaling() const { return getPref(STR_AS_AllowYAxisScaling).toBool(); }
+    //! \brief Whether to show graph tooltips
+    bool graphTooltips() const { return getPref(STR_AS_GraphTooltips).toBool(); }
+    //! \brief Pen width of line plots
+    float lineThickness() const { return getPref(STR_AS_LineThickness).toFloat(); }
+    //! \brief Whether to show line cursor
+    bool lineCursorMode() const { return getPref(STR_AS_LineCursorMode).toBool(); }
+    //! \brief Whether to show the calendar
+    bool calendarVisible() const { return getPref(STR_AS_CalendarVisible).toBool(); }
+    //! \brief Whether to show the right sidebar
+    bool rightSidebarVisible() const { return getPref(STR_AS_RightSidebarVisible).toBool(); }
+
+
+    //! \brief Returns the type of overlay flags (which are displayed over the Flow Waveform)
+    OverlayDisplayType overlayType() const {
+        return (OverlayDisplayType)getPref(STR_AS_OverlayType).toInt();
+    }
+    //! \brief Returns the display type of Overview pages linechart
+    OverviewLinechartModes overviewLinechartMode() const {
+        return (OverviewLinechartModes)getPref(STR_AS_OverviewLinechartMode).toInt();
+    }
+
+    //! \brief Set the normal (unscaled) height of a graph.
+    void setGraphHeight(int height) { setPref(STR_AS_GraphHeight, height); }
+    //! \brief Set to true to turn on AntiAliasing (the graphical smoothing method)
+    void setAntiAliasing(bool aa) { setPref(STR_AS_AntiAliasing, aa); }
+    //! \brief Set to true if renderPixmap functions are in use, which takes snapshots of graphs.
+    void setGraphSnapshots(bool gs) { setPref(STR_AS_GraphSnapshots, gs); }
+    //! \brief Set to true if Graphical animations & Transitions will be drawn
+    void setAnimations(bool anim) { setPref(STR_AS_Animations, anim); }
+    //! \brief Set to true to use Pixmap Caching of Text and other graphics caching speedup techniques
+    void setUsePixmapCaching(bool b) { setPref(STR_AS_UsePixmapCaching, b); }
+    //! \brief Set whether or not to useSquare Wave plots (where possible)
+    void setSquareWavePlots(bool sw) { setPref(STR_AS_SquareWave, sw); }
+    //! \brief Sets the type of overlay flags (which are displayed over the Flow Waveform)
+    void setOverlayType(OverlayDisplayType od) { setPref(STR_AS_OverlayType, (int)od); }
+    //! \brief Sets whether to allow double clicking on Y-Axis labels to change vertical scaling mode
+    void setAllowYAxisScaling(bool b) { setPref(STR_AS_AllowYAxisScaling, b); }
+    //! \brief Sets whether to allow double clicking on Y-Axis labels to change vertical scaling mode
+    void setGraphTooltips(bool b) { setPref(STR_AS_GraphTooltips, b); }
+    //! \brief Sets the type of overlay flags (which are displayed over the Flow Waveform)
+    void setOverviewLinechartMode(OverviewLinechartModes od) {
+        setPref(STR_AS_OverviewLinechartMode, (int)od);
+    }
+    //! \brief Set the pen width of line plots.
+    void setLineThickness(float size) { setPref(STR_AS_LineThickness, size); }
+    //! \brief Sets whether to display Line Cursor
+    void setLineCursorMode(bool b) { setPref(STR_AS_LineCursorMode, b); }
+    //! \brief Sets whether to display the (Daily View) Calendar
+    void setCalendarVisible(bool b) { setPref(STR_AS_CalendarVisible, b); }
+    //! \brief Sets whether to display the right sidebar
+    void setRightSidebarVisible(bool b) { setPref(STR_AS_RightSidebarVisible, b); }
+};
+
+/*! \class UserSettings
+    \brief Profile Options relating to General User Settings
+    */
+class UserSettings : public ProfileSettings
+{
+  public:
+    UserSettings(Profile *profile)
+      : ProfileSettings(profile)
+    {
+        initPref(STR_US_UnitSystem, US_Metric);
+        initPref(STR_US_EventWindowSize, 4.0);
+        initPref(STR_US_SkipEmptyDays, true);
+        initPref(STR_US_RebuildCache, false); // FIXME: jedimark: can't remember...
+        initPref(STR_US_ShowDebug, false);
+        initPref(STR_US_ShowPerformance, false);
+        initPref(STR_US_CalculateRDI, false);
+        initPref(STR_US_ShowSerialNumbers, false);
+        initPref(STR_US_PrefCalcMiddle, (int)0);
+        initPref(STR_US_PrefCalcPercentile, (double)95.0);
+        initPref(STR_US_PrefCalcMax, (int)0);
+        initPref(STR_US_TooltipTimeout, (int)2500);
+        initPref(STR_US_ScrollDampening, (int)50);
+        initPref(STR_US_StatReportMode, 0);
+        initPref(STR_US_ShowUnknownFlags, false);
+        initPref(STR_US_LastOverviewRange, 4);
+    }
+
+    UnitSystem unitSystem() const { return (UnitSystem)getPref(STR_US_UnitSystem).toInt(); }
+    double eventWindowSize() const { return getPref(STR_US_EventWindowSize).toDouble(); }
+    bool skipEmptyDays() const { return getPref(STR_US_SkipEmptyDays).toBool(); }
+    bool rebuildCache() const { return getPref(STR_US_RebuildCache).toBool(); }
+    bool showDebug() const { return getPref(STR_US_ShowDebug).toBool(); }
+    bool showPerformance() const { return getPref(STR_US_ShowPerformance).toBool(); }
+    bool calculateRDI() const { return getPref(STR_US_CalculateRDI).toBool(); }
+    bool showSerialNumbers() const { return getPref(STR_US_ShowSerialNumbers).toBool(); }
+    int prefCalcMiddle() const { return getPref(STR_US_PrefCalcMiddle).toInt(); }
+    double prefCalcPercentile() const { return getPref(STR_US_PrefCalcPercentile).toDouble(); }
+    int prefCalcMax() const { return getPref(STR_US_PrefCalcMax).toInt(); }
+    int tooltipTimeout() const { return getPref(STR_US_TooltipTimeout).toInt(); }
+    int scrollDampening() const { return getPref(STR_US_ScrollDampening).toInt(); }
+    int statReportMode() const { return getPref(STR_US_StatReportMode).toInt(); }
+    bool showUnknownFlags() const { return getPref(STR_US_ShowUnknownFlags).toBool(); }
+    int lastOverviewRange() const { return getPref(STR_US_LastOverviewRange).toInt(); }
+
+    void setUnitSystem(UnitSystem us) { setPref(STR_US_UnitSystem, (int)us); }
+    void setEventWindowSize(double size) { setPref(STR_US_EventWindowSize, size); }
+    void setSkipEmptyDays(bool skip) { setPref(STR_US_SkipEmptyDays, skip); }
+    void setRebuildCache(bool rebuild) { setPref(STR_US_RebuildCache, rebuild); }
+    void setShowDebug(bool b) { setPref(STR_US_ShowDebug, b); }
+    void setShowPerformance(bool b) { setPref(STR_US_ShowPerformance, b); }
+    void setCalculateRDI(bool rdi) { setPref(STR_US_CalculateRDI, rdi); }
+    void setShowSerialNumbers(bool enabled) { setPref(STR_US_ShowSerialNumbers, enabled); }
+    void setPrefCalcMiddle(int i) { setPref(STR_US_PrefCalcMiddle, i); }
+    void setPrefCalcPercentile(double p) { setPref(STR_US_PrefCalcPercentile, p); }
+    void setPrefCalcMax(int i) { setPref(STR_US_PrefCalcMax, i); }
+    void setTooltipTimeout(int i) { setPref(STR_US_TooltipTimeout, i); }
+    void setScrollDampening(int i) { setPref(STR_US_ScrollDampening, i); }
+    void setStatReportMode(int i) { setPref(STR_US_StatReportMode, i); }
+    void setShowUnknownFlags(bool b) { setPref(STR_US_ShowUnknownFlags, b); }
+    void setLastOverviewRange(int i) { setPref(STR_US_LastOverviewRange, i); }
+};
+
+//! \brief Returns a count of all files & directories in a supplied folder
+int dirCount(QString path);
+
+
+namespace Profiles {
+
+extern QMap<QString, Profile *> profiles;
+void Scan(); // Initialize and load Profile
+void Done(); // Save all Profile objects and clear list
+
+Profile *Create(QString name);
+Profile *Get(QString name);
+Profile *Get();
+
+}
+
+#endif // PROFILES_H
+
diff --git a/sleepyhead/SleepLib/progressdialog.cpp b/sleepyhead/SleepLib/progressdialog.cpp
new file mode 100644
index 0000000..e3f2bb1
--- /dev/null
+++ b/sleepyhead/SleepLib/progressdialog.cpp
@@ -0,0 +1,38 @@
+/* SleepLib Progress Dialog Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "progressdialog.h"
+
+ProgressDialog::ProgressDialog(QWidget * parent):
+    QDialog(parent, Qt::SplashScreen)
+{
+    waitmsg = new QLabel(QObject::tr("PLease Wait..."));
+    hlayout = new QHBoxLayout;
+
+    imglabel = new QLabel(this);
+
+    vlayout = new QVBoxLayout;
+    progress = new QProgressBar(this);
+    this->setLayout(vlayout);
+    vlayout->addLayout(hlayout);
+    hlayout->addWidget(imglabel);
+    hlayout->addWidget(waitmsg,1,Qt::AlignCenter);
+    vlayout->addWidget(progress,1);
+    progress->setMaximum(100);
+}
+
+ProgressDialog::~ProgressDialog()
+{
+}
+
+void ProgressDialog::doUpdateProgress(int cnt, int total)
+{
+    progress->setMaximum(total);
+    progress->setValue(cnt);
+}
+
diff --git a/sleepyhead/SleepLib/progressdialog.h b/sleepyhead/SleepLib/progressdialog.h
new file mode 100644
index 0000000..fd5c7cc
--- /dev/null
+++ b/sleepyhead/SleepLib/progressdialog.h
@@ -0,0 +1,37 @@
+/* SleepLib Progress Dialog Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef PROGRESSDIALOG_H
+#define PROGRESSDIALOG_H
+
+#include <QDialog>
+#include <QHBoxLayout>
+#include <QVBoxLayout>
+#include <QLabel>
+#include <QProgressBar>
+
+class ProgressDialog:public QDialog {
+public:
+    explicit ProgressDialog(QWidget * parent);
+    virtual ~ProgressDialog();
+
+    void setMessage(QString msg) { waitmsg->setText(msg); }
+    void setPixmap(QPixmap &pixmap) { imglabel->setPixmap(pixmap); }
+    QProgressBar * progress;
+public slots:
+    void doUpdateProgress(int cnt, int total);
+
+protected:
+    QLabel * waitmsg;
+    QHBoxLayout *hlayout;
+    QLabel * imglabel;
+    QVBoxLayout * vlayout;
+
+};
+
+#endif // PROGRESSDIALOG_H
diff --git a/sleepyhead/SleepLib/schema.cpp b/sleepyhead/SleepLib/schema.cpp
new file mode 100644
index 0000000..a554347
--- /dev/null
+++ b/sleepyhead/SleepLib/schema.cpp
@@ -0,0 +1,965 @@
+/* Channel / Schema Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QFile>
+#include <QDebug>
+#include <QDomDocument>
+#include <QDomElement>
+#include <QDomNode>
+#include <QMessageBox>
+#include <QApplication>
+
+#include "common.h"
+#include "schema.h"
+#include "common_gui.h"
+
+#include "SleepLib/profiles.h"
+
+QColor adjustcolor(QColor color, float ar=1.0, float ag=1.0, float ab=1.0)
+{
+    int r = color.red();
+    int g = color.green();
+    int b = color.blue();
+
+    r += rand() & 64;
+    g += rand() & 64;
+    b += rand() & 64;
+
+    r = qMin(int(r * ar), 255);
+    g = qMin(int(g * ag), 255);
+    b = qMin(int(b * ab), 255);
+
+    return QColor(r,g,b, color.alpha());
+}
+
+
+QColor darken(QColor color, float p);
+
+
+
+namespace schema {
+
+void resetChannels();
+
+ChannelList channel;
+Channel EmptyChannel;
+Channel *SessionEnabledChannel;
+
+QHash<QString, ChanType> ChanTypes;
+QHash<QString, DataType> DataTypes;
+QHash<QString, ScopeType> Scopes;
+
+bool schema_initialized = false;
+
+void setOrders() {
+    schema::channel[CPAP_CSR].setOrder(1);
+    schema::channel[CPAP_Ramp].setOrder(2);
+    schema::channel[CPAP_LargeLeak].setOrder(2);
+    schema::channel[CPAP_ClearAirway].setOrder(3);
+    schema::channel[CPAP_Obstructive].setOrder(4);
+    schema::channel[CPAP_Apnea].setOrder(4);
+    schema::channel[CPAP_NRI].setOrder(3);
+    schema::channel[CPAP_Hypopnea].setOrder(5);
+    schema::channel[CPAP_FlowLimit].setOrder(6);
+    schema::channel[CPAP_RERA].setOrder(6);
+    schema::channel[CPAP_VSnore].setOrder(7);
+    schema::channel[CPAP_VSnore2].setOrder(8);
+    schema::channel[CPAP_ExP].setOrder(6);
+    schema::channel[CPAP_UserFlag1].setOrder(256);
+    schema::channel[CPAP_UserFlag2].setOrder(257);
+}
+
+void init()
+{
+    if (schema_initialized) { return; }
+
+    schema_initialized = true;
+
+    EmptyChannel = Channel(0, DATA, MT_UNKNOWN, DAY, "Empty", "Empty", "Empty Channel", "", "");
+    SessionEnabledChannel = new Channel(1, DATA, MT_UNKNOWN, DAY, "Enabled", "Enabled", "Session Enabled", "", "");
+
+    channel.channels[1] = SessionEnabledChannel;
+    channel.names["Enabled"] = SessionEnabledChannel;
+    SESSION_ENABLED = 1;
+    ChanTypes["data"] = DATA;
+    //Types["waveform"]=WAVEFORM;
+    ChanTypes["setting"] = SETTING;
+
+    Scopes["session"] = SESSION;
+    Scopes["day"] = DAY;
+    Scopes["machine"] = MACHINE;
+    Scopes["global"] = GLOBAL;
+
+    DataTypes[""] = DEFAULT;
+    DataTypes["bool"] = BOOL;
+    DataTypes["double"] = DOUBLE;
+    DataTypes["integer"] = INTEGER;
+    DataTypes["string"] = STRING;
+    DataTypes["richtext"] = RICHTEXT;
+    DataTypes["date"] = DATE;
+    DataTypes["datetime"] = DATETIME;
+    DataTypes["time"] = TIME;
+
+    if (!schema::channel.Load(":/docs/channels.xml")) {
+        QMessageBox::critical(0, STR_MessageBox_Error,
+                              QObject::tr("Couldn't parse Channels.xml, this build is seriously borked, no choice but to abort!!"),
+                              QMessageBox::Ok);
+        QApplication::exit(-1);
+    }
+
+
+    // Lookup Code strings are used internally and not meant to be tranlsated
+
+    //                  Group                ChannelID            Code    Type     Scope    Lookup Code      Translable Name                 Description                                   Shortened Name              Units String            FieldType   Default Color
+
+    // Pressure Related Settings
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_Pressure      = 0x110C, WAVEFORM,    MT_CPAP, SESSION, "Pressure",
+                        STR_TR_Pressure,                QObject::tr("Therapy Pressure"),              STR_TR_Pressure,
+                        STR_UNIT_CMH2O,         DEFAULT,    QColor("dark green")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_IPAP          = 0x110D, WAVEFORM,    MT_CPAP, SESSION, "IPAP",
+                        STR_TR_IPAP,                    QObject::tr("Inspiratory Pressure"),          STR_TR_IPAP,
+                        STR_UNIT_CMH2O,         DEFAULT,    QColor("red")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_IPAPLo        = 0x1110, WAVEFORM,    MT_CPAP, SESSION, "IPAPLo",
+                        STR_TR_IPAPLo,                  QObject::tr("Lower Inspiratory Pressure"),    STR_TR_IPAPLo,
+                        STR_UNIT_CMH2O,         DEFAULT,    QColor("orange")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_IPAPHi        = 0x1111, WAVEFORM,    MT_CPAP, SESSION, "IPAPHi",
+                        STR_TR_IPAPHi,                  QObject::tr("Higher Inspiratory Pressure"),   STR_TR_IPAPHi,
+                        STR_UNIT_CMH2O,         DEFAULT,    QColor("orange")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_EPAP          = 0x110E, WAVEFORM,    MT_CPAP, SESSION, "EPAP",
+                        STR_TR_EPAP,                    QObject::tr("Expiratory Pressure"),           STR_TR_EPAP,
+                        STR_UNIT_CMH2O,         DEFAULT,    QColor("green")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_EPAPLo        = 0x111C, WAVEFORM,    MT_CPAP, SESSION, "EPAPLo",
+                        STR_TR_EPAPLo,                  QObject::tr("Lower Expiratory Pressure"),     STR_TR_EPAPLo,
+                        STR_UNIT_CMH2O,         DEFAULT,    QColor("light blue")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_EPAPHi        = 0x111D, WAVEFORM,    MT_CPAP, SESSION, "EPAPHi",
+                        STR_TR_EPAPHi,                  QObject::tr("Higher Expiratory Pressure"),    STR_TR_EPAPHi,
+                        STR_UNIT_CMH2O,         DEFAULT,    QColor("aqua")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_PS            = 0x110F, WAVEFORM,    MT_CPAP, SESSION, "PS",
+                        STR_TR_PS,                      QObject::tr("Pressure Support"),              STR_TR_PS,
+                        STR_UNIT_CMH2O,         DEFAULT,    QColor("grey")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_PSMin         = 0x111A, SETTING, MT_CPAP, SESSION, "PSMin",
+                        QObject::tr("PS Min") ,         QObject::tr("Pressure Support Minimum"),
+                        QObject::tr("PS Min"),      STR_UNIT_CMH2O,         DEFAULT,    QColor("dark cyan")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_PSMax         = 0x111B, SETTING, MT_CPAP, SESSION, "PSMax",
+                        QObject::tr("PS Max"),          QObject::tr("Pressure Support Maximum"),
+                        QObject::tr("PS Max"),      STR_UNIT_CMH2O,         DEFAULT,    QColor("dark magenta")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_PressureMin   = 0x1020, SETTING, MT_CPAP, SESSION,
+                        "PressureMin",   QObject::tr("Min Pressure") ,   QObject::tr("Minimum Therapy Pressure"),
+                        QObject::tr("Pressure Min"),     STR_UNIT_CMH2O,         DEFAULT,    QColor("orange")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_PressureMax   = 0x1021, SETTING, MT_CPAP, SESSION,
+                        "PressureMax",   QObject::tr("Max Pressure"),    QObject::tr("Maximum Therapy Pressure"),
+                        QObject::tr("Pressure Max"),     STR_UNIT_CMH2O,         DEFAULT,    QColor("light blue")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_RampTime      = 0x1022, SETTING, MT_CPAP, SESSION,
+                        "RampTime",      QObject::tr("Ramp Time") ,      QObject::tr("Ramp Delay Period"),
+                        QObject::tr("Ramp Time"),   STR_UNIT_Minutes, DEFAULT,    QColor("black")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_RampPressure  = 0x1023, SETTING, MT_CPAP, SESSION,
+                        "RampPressure",  QObject::tr("Ramp Pressure"),   QObject::tr("Starting Ramp Pressure"),
+                        QObject::tr("Ramp Pressure"),    STR_UNIT_CMH2O,         DEFAULT,    QColor("black")));
+
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_Ramp      = 0x1027, SPAN, MT_CPAP, SESSION,
+                        "Ramp",      QObject::tr("Ramp Event") ,      QObject::tr("Ramp Event"),
+                        QObject::tr("Ramp"),   STR_UNIT_EventsPerHour, DEFAULT,    QColor("light blue")));
+
+
+    // Flags
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_CSR           = 0x1000, SPAN,    MT_CPAP, SESSION, "CSR",
+                        QObject::tr("Cheyne Stokes Respiration"),
+                        QObject::tr("An abnormal period of Periodic Breathing/Cheyne Stokes Respiration"),
+                        QObject::tr("CSR"),       STR_UNIT_Percentage,            DEFAULT,    COLOR_CSR));
+
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_ClearAirway   = 0x1001, FLAG,    MT_CPAP, SESSION,
+                        "ClearAirway",    QObject::tr("Clear Airway"),
+                        QObject::tr("An apnea where the airway is open"),
+                        QObject::tr("CA"),       STR_UNIT_EventsPerHour,    DEFAULT,    QColor("purple")));
+
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_Obstructive   = 0x1002, FLAG,    MT_CPAP, SESSION,
+                        "Obstructive",    QObject::tr("Obstructive"),
+                        QObject::tr("An apnea caused by airway obstruction"),
+                        QObject::tr("OA"),       STR_UNIT_EventsPerHour,    DEFAULT,    QColor("#40c0ff")));
+
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_Hypopnea      = 0x1003, FLAG,    MT_CPAP, SESSION,
+                        "Hypopnea",       QObject::tr("Hypopnea"),
+                        QObject::tr("A partially obstructed airway"),
+                        QObject::tr("H"),        STR_UNIT_EventsPerHour,    DEFAULT,    QColor("blue")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_Apnea         = 0x1004, FLAG,    MT_CPAP, SESSION, "Apnea",
+                        QObject::tr("Unclassified Apnea"),
+                        QObject::tr("An apnea that could not fit into a category"),
+                        QObject::tr("UA"),       STR_UNIT_EventsPerHour,    DEFAULT,    QColor("dark green")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_FlowLimit     = 0x1005, FLAG,    MT_CPAP, SESSION,
+                        "FlowLimit",      QObject::tr("Flow Limitation"),
+                        QObject::tr("An restriction in breathing from normal, causing a flattening of the flow waveform."),
+                        QObject::tr("FL"),       STR_UNIT_EventsPerHour,    DEFAULT,    QColor("#404040")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_RERA          = 0x1006, FLAG,    MT_CPAP, SESSION, "RERA",
+                        QObject::tr("RERA"),
+                        QObject::tr("Respiratory Effort Related Arousal: An restriction in breathing that causes an either an awakening or sleep disturbance."),
+                        QObject::tr("RE"),       STR_UNIT_EventsPerHour,    DEFAULT,    COLOR_Gold));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_VSnore        = 0x1007, FLAG,    MT_CPAP, SESSION, "VSnore",
+                        QObject::tr("Vibratory Snore"),                       QObject::tr("A vibratory snore"),
+                        QObject::tr("VS"),       STR_UNIT_EventsPerHour,    DEFAULT,    QColor("red")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_VSnore2       = 0x1008, FLAG,    MT_CPAP, SESSION, "VSnore2",
+                        QObject::tr("Vibratory Snore (VS2) "),
+                        QObject::tr("A vibratory snore as detcted by a System One machine"),
+                        QObject::tr("VS2"),      STR_UNIT_EventsPerHour,    DEFAULT,    QColor("red")));
+
+    // This Large Leak record is just a flag marker, used by Intellipap for one
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_LeakFlag      = 0x100a, FLAG,    MT_CPAP, SESSION,
+                        "LeakFlag",       QObject::tr("Leak Flag"),
+                        QObject::tr("A large mask leak affecting machine performance."),
+                        QObject::tr("LF"),       STR_UNIT_EventsPerHour,    DEFAULT,    QColor("light gray")));
+
+    // The following is a Large Leak record that references a waveform span
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_LargeLeak = 0x1158,      SPAN,    MT_CPAP, SESSION,
+                        "LeakSpan",       QObject::tr("Large Leak"),
+                        QObject::tr("A large mask leak affecting machine performance."),
+                        QObject::tr("LL"),       STR_UNIT_EventsPerHour,    DEFAULT,    QColor("light gray")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_NRI           = 0x100b, FLAG,    MT_CPAP, SESSION, "NRI",
+                        QObject::tr("Non Responding Event"),
+                        QObject::tr("A type of respiratory event that won't respond to a pressure increase."),
+                        QObject::tr("NR"),       STR_UNIT_EventsPerHour,    DEFAULT,    QColor("orange")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_ExP           = 0x100c, FLAG,    MT_CPAP, SESSION, "ExP",
+                        QObject::tr("Expiratory Puff"),
+                        QObject::tr("Intellipap event where you breathe out your mouth."),
+                        QObject::tr("EP"),       STR_UNIT_EventsPerHour,    DEFAULT,    QColor("dark magenta")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_SensAwake     = 0x100d, FLAG,    MT_CPAP, SESSION,
+                        "SensAwake",      QObject::tr("SensAwake"),
+                        QObject::tr("SensAwake feature will reduce pressure when waking is detected."),
+                        QObject::tr("SA"),       STR_UNIT_EventsPerHour,    DEFAULT,    COLOR_Gold));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_UserFlag1     = 0x101e, FLAG,    MT_CPAP, SESSION,
+                        "UserFlag1",      QObject::tr("User Flag #1"),
+                        QObject::tr("A user definable event detected by SleepyHead's flow waveform processor."),
+                        QObject::tr("UF1"),      STR_UNIT_EventsPerHour,    DEFAULT,    QColor(0xc0,0xc0,0xe0)));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_UserFlag2     = 0x101f, FLAG,    MT_CPAP, SESSION,
+                        "UserFlag2",      QObject::tr("User Flag #2"),
+                        QObject::tr("A user definable event detected by SleepyHead's flow waveform processor."),
+                        QObject::tr("UF2"),      STR_UNIT_EventsPerHour,    DEFAULT,    QColor(0xa0,0xa0,0xc0)));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_UserFlag3     = 0x1024, FLAG,    MT_CPAP, SESSION,
+                        "UserFlag3",      QObject::tr("User Flag #3"),
+                        QObject::tr("A user definable event detected by SleepyHead's flow waveform processor."),
+                        QObject::tr("UF3"),      STR_UNIT_EventsPerHour,    DEFAULT,    QColor("dark grey")));
+
+
+    // Oximetry
+    schema::channel.add(GRP_OXI, new Channel(OXI_Pulse           = 0x1800, WAVEFORM,    MT_OXIMETER, SESSION, "Pulse",
+                        QObject::tr("Pulse Rate"),                    QObject::tr("Heart rate in beats per minute"),
+                        QObject::tr("Pulse Rate"), STR_UNIT_BPM,     DEFAULT,    QColor("red")));
+
+    schema::channel[OXI_Pulse].setLowerThreshold(40);
+    schema::channel[OXI_Pulse].setUpperThreshold(130);
+
+    schema::channel.add(GRP_OXI, new Channel(OXI_SPO2            = 0x1801, WAVEFORM,    MT_OXIMETER, SESSION, "SPO2",
+                        QObject::tr("SpO2 %"),                        QObject::tr("Blood-oxygen saturation percentage"),
+                        QObject::tr("SpO2"),       STR_UNIT_Percentage,          DEFAULT,    QColor("blue")));
+
+    schema::channel[OXI_SPO2].setLowerThreshold(88);
+
+    schema::channel.add(GRP_OXI, new Channel(OXI_Plethy          = 0x1802, WAVEFORM,    MT_OXIMETER, SESSION, "Plethy",
+                        QObject::tr("Plethysomogram"),
+                        QObject::tr("An optical Photo-plethysomogram showing heart rhythm"),
+                        QObject::tr("Plethy"),     STR_UNIT_Hz,           DEFAULT,    QColor("#404040")));
+
+    schema::channel.add(GRP_OXI, new Channel(OXI_Perf             = 0x1805, WAVEFORM,    MT_OXIMETER, SESSION, "Perf. Index",
+                        QObject::tr("Perfusion Index"),
+                        QObject::tr("A relative assessment of the pulse strength at the monitoring site"),
+                        QObject::tr("Perf. Index %"), STR_UNIT_Percentage,     DEFAULT,   QColor("magenta")));
+
+    schema::channel.add(GRP_OXI, new Channel(OXI_PulseChange     = 0x1803, FLAG,   MT_OXIMETER,   SESSION,
+                        "PulseChange",      QObject::tr("Pulse Change"),
+                        QObject::tr("A sudden (user definable) change in heart rate"),
+                        QObject::tr("PC"),         STR_UNIT_EventsPerHour,    DEFAULT,   QColor("light grey")));
+
+    schema::channel.add(GRP_OXI, new Channel(OXI_SPO2Drop        = 0x1804, FLAG,   MT_OXIMETER,  SESSION,
+                        "SPO2Drop",         QObject::tr("SpO2 Drop"),
+                        QObject::tr("A sudden (user definable) drop in blood oxygen saturation"),
+                        QObject::tr("SD"),         STR_UNIT_EventsPerHour,    DEFAULT,    QColor("light blue")));
+
+    //      <channel id="0x1100" class="data" name="FlowRate" details="Flow Rate" label="Flow Rate" unit="L/min" color="black"/>
+    //      <channel id="0x1101" class="data" name="MaskPressure" details="Mask Pressure" label="Mask Pressure" unit="cmH20" color="blue"/>
+    //      <channel id="0x1102" class="data" name="MaskPressureHi" details="Mask Pressure" label="Mask Pressure (Hi-Res)" unit="cmH20" color="blue" link="0x1101"/>
+    //      <channel id="0x1103" class="data" name="TidalVolume" details="Tidal Volume" label="Tidal Volume" unit="ml" color="magenta"/>
+    //      <channel id="0x1104" class="data" name="Snore" details="Snore" label="Snore" unit="unknown" color="grey"/>
+    //      <channel id="0x1105" class="data" name="MinuteVent" details="Minute Ventilation" label="Minute Vent." unit="L/min" color="dark cyan"/>
+    //      <channel id="0x1106" class="data" name="RespRate" details="Respiratory Rate" label="Resp. Rate" unit="breaths/min" color="dark magenta"/>
+    //      <channel id="0x1107" class="data" name="PTB" details="Patient Triggered Breaths" label="Pat. Trig. Breaths" unit="%" color="dark grey"/>
+    //      <channel id="0x1108" class="data" name="Leak" details="Leak Rate" label="Leaks" unit="L/min" color="dark green"/>
+
+    //      <channel id="0x1109" class="data" name="IE" details="Inspiratory:Expiratory" label="I:E" unit="ratio" color="dark red"/>
+    //      <channel id="0x110a" class="data" name="Te" details="Expiratory Time" label="Exp Time" unit="seconds" color="dark green"/>
+    //      <channel id="0x110b" class="data" name="Ti" details="Inspiratory Time" label="Insp Time" unit="seconds" color="dark blue"/>
+    //      <channel id="0x1112" class="data" name="RespEvent" details="Respiratory Events" label="Resp Events" unit="" color="black"/>
+    //      <channel id="0x1113" class="data" name="FLG" details="Flow Limit Graph" label="Flow Limit" unit="0-1" color="dark grey"/>
+    //      <channel id="0x1114" class="data" name="TgMV" details="Target Minute Ventilation" label="Target Vent." unit="" color="dark cyan"/>
+    //      <channel id="0x1115" class="data" name="MaxLeak" details="Maximum Leak" label="MaxLeaks" unit="L/min" color="dark red"/>
+    //      <channel id="0x1116" class="data" name="AHI" details="Apnea / Hypopnea Index" label="AHI/Hr" unit="events/hr" color="dark red"/>
+    //      <channel id="0x1117" class="data" name="LeakTotal" details="Total Leak Rate" label="Total Leaks" unit="L/min" color="dark green"/>
+    //      <channel id="0x1118" class="data" name="LeakMedian" details="Median Leak Rate" label="Median Leaks" unit="L/min" color="dark green"/>
+    //      <channel id="0x1119" class="data" name="RDI" details="Respiratory Disturbance Index" label="RDI" unit="events/hr" color="dark red"/>
+
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_FlowRate          = 0x1100, WAVEFORM,    MT_CPAP, SESSION,
+                        "FlowRate",          QObject::tr("Flow Rate"),
+                        QObject::tr("Breathing flow rate waveform"),                 QObject::tr("Flow Rate"),
+                        STR_UNIT_LPM,    DEFAULT,    QColor("black")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_MaskPressure      = 0x1101, WAVEFORM,    MT_CPAP, SESSION,
+                        "MaskPressure",      QObject::tr("Mask Pressure"),
+                        QObject::tr("Mask Pressure"),                                QObject::tr("Mask Pressure"),
+                        STR_UNIT_CMH2O,    DEFAULT,    QColor("blue")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_MaskPressureHi    = 0x1102, WAVEFORM,    MT_CPAP, SESSION,
+                        "MaskPressureHi",    QObject::tr("Mask Pressure"),
+                        QObject::tr("Mask Pressure (High resolution)"),              QObject::tr("Mask Pressure"),
+                        STR_UNIT_CMH2O,    DEFAULT,    QColor("blue"), 0x1101)); // linked to CPAP_MaskPressure
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_TidalVolume       = 0x1103, WAVEFORM,    MT_CPAP, SESSION,
+                        "TidalVolume",       QObject::tr("Tidal Volume"),
+                        QObject::tr("Amount of air displaced per breath"),           QObject::tr("Tidal Volume"),
+                        STR_UNIT_ml,    DEFAULT,    QColor("magenta")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_Snore             = 0x1104, WAVEFORM,   MT_CPAP,  SESSION,
+                        "Snore",             QObject::tr("Snore"),
+                        QObject::tr("Graph displaying snore volume"),                QObject::tr("Snore"),
+                        STR_UNIT_Unknown,       DEFAULT,    QColor("grey")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_MinuteVent        = 0x1105, WAVEFORM,    MT_CPAP, SESSION,
+                        "MinuteVent",        QObject::tr("Minute Ventilation"),
+                        QObject::tr("Amount of air displaced per minute"),           QObject::tr("Minute Vent."),
+                        STR_UNIT_LPM,    DEFAULT,    QColor("dark cyan")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_RespRate          = 0x1106, WAVEFORM,    MT_CPAP, SESSION,
+                        "RespRate",          QObject::tr("Respiratory Rate"),
+                        QObject::tr("Rate of breaths per minute"),                   QObject::tr("Resp. Rate"),
+                        STR_UNIT_BreathsPerMinute,      DEFAULT,    QColor("dark magenta")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_PTB               = 0x1107, WAVEFORM,    MT_CPAP, SESSION, "PTB",
+                        QObject::tr("Patient Triggered Breaths"),
+                        QObject::tr("Percentage of breaths triggered by patient"),   QObject::tr("Pat. Trig. Breaths"),
+                        STR_UNIT_Percentage,        DEFAULT,    QColor("dark grey")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_Leak              = 0x1108, WAVEFORM,    MT_CPAP, SESSION,
+                        "Leak",              QObject::tr("Leak Rate"),
+                        QObject::tr("Rate of detected mask leakage"),                QObject::tr("Leak Rate"),
+                        STR_UNIT_LPM,    DEFAULT,    QColor("dark green")));
+
+    schema::channel[CPAP_Leak].setLowerThreshold(24.0);
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_IE                = 0x1109, WAVEFORM,   MT_CPAP,  SESSION, "IE",
+                        QObject::tr("I:E Ratio"),
+                        QObject::tr("Ratio between Inspiratory and Expiratory time"), QObject::tr("I:E Ratio"),
+                        STR_UNIT_Ratio,    DEFAULT,    QColor("dark red")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_Te                = 0x110A, WAVEFORM,   MT_CPAP,  SESSION, "Te",
+                        QObject::tr("Expiratory Time"),                    QObject::tr("Time taken to breathe out"),
+                        QObject::tr("Exp. Time"),          STR_UNIT_Seconds,  DEFAULT,    QColor("dark green")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_Ti                = 0x110B, WAVEFORM,    MT_CPAP, SESSION, "Ti",
+                        QObject::tr("Inspiratory Time"),                   QObject::tr("Time taken to breathe in"),
+                        QObject::tr("Insp. Time"),         STR_UNIT_Seconds,  DEFAULT,    QColor("dark blue")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_RespEvent         = 0x1112, DATA,   MT_CPAP,  SESSION,
+                        "RespEvent",         QObject::tr("Respiratory Event"),
+                        QObject::tr("A ResMed data source showing Respiratory Events"),  QObject::tr("Resp. Event"),
+                        STR_UNIT_EventsPerHour,   DEFAULT,    QColor("black")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_FLG               = 0x1113, WAVEFORM,   MT_CPAP,  SESSION, "FLG",
+                        QObject::tr("Flow Limitation"),
+                        QObject::tr("Graph showing severity of flow limitations"),   QObject::tr("Flow Limit."),
+                        STR_UNIT_Severity,      DEFAULT,    QColor("dark gray")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_TgMV              = 0x1114, WAVEFORM,  MT_CPAP,   SESSION,
+                        "TgMV",              QObject::tr("Target Minute Ventilation"),
+                        QObject::tr("Target Minute Ventilation?"),                   QObject::tr("Target Vent."),
+                        STR_UNIT_LPM,       DEFAULT,    QColor("dark cyan")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_MaxLeak           = 0x1115, WAVEFORM,   MT_CPAP,  SESSION,
+                        "MaxLeak",           QObject::tr("Maximum Leak"),
+                        QObject::tr("The maximum rate of mask leakage"),             QObject::tr("Max Leaks"),
+                        STR_UNIT_LPM,    DEFAULT,    QColor("dark red")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_AHI               = 0x1116, WAVEFORM,   MT_CPAP,  SESSION, "AHI",
+                        QObject::tr("Apnea Hypopnea Index"),
+                        QObject::tr("Graph showing running AHI for the past hour"),  QObject::tr("AHI"),
+                        STR_UNIT_EventsPerHour, DEFAULT,  QColor("dark red")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_LeakTotal         = 0x1117, WAVEFORM,   MT_CPAP,  SESSION,
+                        "LeakTotal",         QObject::tr("Total Leak Rate"),
+                        QObject::tr("Detected mask leakage including natural Mask leakages"),  QObject::tr("Total Leaks"),
+                        STR_UNIT_LPM,    DEFAULT,    QColor("dark green")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_LeakMedian        = 0x1118, WAVEFORM,   MT_CPAP,  SESSION,
+                        "LeakMedian",        QObject::tr("Median Leak Rate"),
+                        QObject::tr("Median rate of detected mask leakage"),         QObject::tr("Median Leaks"),
+                        STR_UNIT_LPM,    DEFAULT,    QColor("dark green")));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_RDI               = 0x1119, WAVEFORM,   MT_CPAP,  SESSION, "RDI",
+                        QObject::tr("Respiratory Disturbance Index"),
+                        QObject::tr("Graph showing running RDI for the past hour"),  QObject::tr("RDI"),
+                        STR_UNIT_EventsPerHour, DEFAULT,  QColor("dark red")));
+
+    // Positional sensors
+    schema::channel.add(GRP_POS, new Channel(POS_Orientation         = 0x2990, WAVEFORM,   MT_POSITION,  SESSION,
+                        "Orientation",      QObject::tr("Orientation"),
+                        QObject::tr("Sleep position in degrees"),  QObject::tr("Orientation"),  STR_UNIT_Degrees,
+                        DEFAULT,  QColor("dark blue")));
+
+    schema::channel.add(GRP_POS, new Channel(POS_Inclination         = 0x2991, WAVEFORM,   MT_POSITION, SESSION,
+                        "Inclination",      QObject::tr("Inclination"),
+                        QObject::tr("Upright angle in degrees"),  QObject::tr("Inclination"),  STR_UNIT_Degrees,
+                        DEFAULT,  QColor("dark magenta")));
+
+    schema::channel.add(GRP_CPAP, new Channel(RMS9_MaskOnTime = 0x1025, DATA,   MT_CPAP,  SESSION,
+                        "MaskOnTime",      QObject::tr("Mask On Time"),
+                        QObject::tr("Time started according to str.edf"),  QObject::tr("Mask On Time"),  STR_UNIT_Unknown,
+                        DEFAULT,  Qt::black));
+
+    schema::channel.add(GRP_CPAP, new Channel(CPAP_SummaryOnly = 0x1026, DATA,   MT_CPAP,  SESSION,
+                        "SummaryOnly",      QObject::tr("Summary Only"),
+                        QObject::tr("CPAP Session contains summary data only"),  QObject::tr("Summary Only"),  STR_UNIT_Unknown,
+                        DEFAULT,  Qt::black));
+
+    Channel *ch;
+    schema::channel.add(GRP_CPAP, ch = new Channel(CPAP_Mode = 0x1200, SETTING,   MT_CPAP,  SESSION,
+                        "PAPMode",      QObject::tr("PAP Mode"),
+                        QObject::tr("PAP Device Mode"),
+                        QObject::tr("PAP Mode"),  QString(),
+                        LOOKUP,  Qt::black));
+
+    ch->addOption(0, STR_TR_Unknown);
+    ch->addOption(1, STR_TR_CPAP);
+    ch->addOption(2, QObject::tr("APAP (Variable)"));
+    ch->addOption(3, QObject::tr("Fixed Bi-Level"));
+    ch->addOption(4, QObject::tr("Auto Bi-Level (Fixed PS)"));
+    ch->addOption(5, QObject::tr("Auto Bi-Level (Variable PS)"));
+    ch->addOption(6, QObject::tr("ASV (Fixed EPAP)"));
+    ch->addOption(7, QObject::tr("ASV (Variable EPAP)"));
+
+
+//    <channel id="0x1200" class="setting" scope="!session" name="PAPMode" details="PAP Mode" label="PAP Mode" type="integer">
+//     <option id="0" value="CPAP"/>
+//     <option id="1" value="Auto"/>
+//     <option id="2" value="Fixed Bi-Level"/>
+//     <option id="3" value="Auto Bi-Level"/>
+//     <option id="4" value="ASV"/>
+//     <option id="5" value="ASV Auto EPAP"/>
+//    </channel>
+
+
+    NoChannel = 0;
+    //    CPAP_IPAP=schema::channel["IPAP"].id();
+    //    CPAP_IPAPLo=schema::channel["IPAPLo"].id();
+    //    CPAP_IPAPHi=schema::channel["IPAPHi"].id();
+    //    CPAP_EPAP=schema::channel["EPAP"].id();
+    //    CPAP_Pressure=schema::channel["Pressure"].id();
+    //    CPAP_PS=schema::channel["PS"].id();
+    //    CPAP_PSMin=schema::channel["PSMin"].id();
+    //    CPAP_PSMax=schema::channel["PSMax"].id();
+//    CPAP_Mode = schema::channel["PAPMode"].id();
+    CPAP_BrokenSummary = schema::channel["BrokenSummary"].id();
+    CPAP_BrokenWaveform = schema::channel["BrokenWaveform"].id();
+    //    CPAP_PressureMin=schema::channel["PressureMin"].id();
+    //    CPAP_PressureMax=schema::channel["PressureMax"].id();
+    //    CPAP_RampTime=schema::channel["RampTime"].id();
+    //    CPAP_RampPressure=schema::channel["RampPressure"].id();
+    //    CPAP_Obstructive=schema::channel["Obstructive"].id();
+    //    CPAP_Hypopnea=schema::channel["Hypopnea"].id();
+    //    CPAP_ClearAirway=schema::channel["ClearAirway"].id();
+    //    CPAP_Apnea=schema::channel["Apnea"].id();
+    //    CPAP_CSR=schema::channel["CSR"].id();
+    //    CPAP_LeakFlag=schema::channel["LeakFlag"].id();
+    //    CPAP_ExP=schema::channel["ExP"].id();
+    //    CPAP_NRI=schema::channel["NRI"].id();
+    //    CPAP_VSnore=schema::channel["VSnore"].id();
+    //    CPAP_VSnore2=schema::channel["VSnore2"].id();
+    //    CPAP_RERA=schema::channel["RERA"].id();
+    //    CPAP_PressurePulse=schema::channel["PressurePulse"].id();
+    //    CPAP_FlowLimit=schema::channel["FlowLimit"].id();
+    //    CPAP_FlowRate=schema::channel["FlowRate"].id();
+    //    CPAP_MaskPressure=schema::channel["MaskPressure"].id();
+    //    CPAP_MaskPressureHi=schema::channel["MaskPressureHi"].id();
+    //    CPAP_RespEvent=schema::channel["RespEvent"].id();
+    //    CPAP_Snore=schema::channel["Snore"].id();
+    //    CPAP_MinuteVent=schema::channel["MinuteVent"].id();
+    //    CPAP_RespRate=schema::channel["RespRate"].id();
+    //    CPAP_TidalVolume=schema::channel["TidalVolume"].id();
+    //    CPAP_PTB=schema::channel["PTB"].id();
+    //    CPAP_Leak=schema::channel["Leak"].id();
+    //    CPAP_LeakMedian=schema::channel["LeakMedian"].id();
+    //    CPAP_LeakTotal=schema::channel["LeakTotal"].id();
+    //    CPAP_MaxLeak=schema::channel["MaxLeak"].id();
+    //    CPAP_FLG=schema::channel["FLG"].id();
+    //    CPAP_IE=schema::channel["IE"].id();
+    //    CPAP_Te=schema::channel["Te"].id();
+    //    CPAP_Ti=schema::channel["Ti"].id();
+    //    CPAP_TgMV=schema::channel["TgMV"].id();
+    CPAP_Test1 = schema::channel["TestChan1"].id();
+    CPAP_Test2 = schema::channel["TestChan2"].id();
+
+    //    CPAP_UserFlag1=schema::channel["UserFlag1"].id();
+    //    CPAP_UserFlag2=schema::channel["UserFlag2"].id();
+    //    CPAP_UserFlag3=schema::channel["UserFlag3"].id();
+    RMS9_E01 = schema::channel["RMS9_E01"].id();
+    RMS9_E02 = schema::channel["RMS9_E02"].id();
+    RMS9_SetPressure = schema::channel["SetPressure"].id(); // TODO: this isn't needed anymore
+    CPAP_HumidSetting = schema::channel["HumidSet"].id();
+    INTELLIPAP_Unknown1 = schema::channel["IntUnk1"].id();
+    INTELLIPAP_Unknown2 = schema::channel["IntUnk2"].id();
+    //    OXI_Pulse=schema::channel["Pulse"].id();
+    //    OXI_SPO2=schema::channel["SPO2"].id();
+    //    OXI_PulseChange=schema::channel["PulseChange"].id();
+    //    OXI_SPO2Drop=schema::channel["SPO2Drop"].id();
+    //    OXI_Plethy=schema::channel["Plethy"].id();
+    //    CPAP_AHI=schema::channel["AHI"].id();
+    //    CPAP_RDI=schema::channel["RDI"].id();
+    Journal_Notes = schema::channel["Journal"].id();
+    Journal_Weight = schema::channel["Weight"].id();
+    Journal_BMI = schema::channel["BMI"].id();
+    Journal_ZombieMeter = schema::channel["ZombieMeter"].id();
+    LastUpdated = schema::channel["LastUpdated"].id();
+    Bookmark_Start = schema::channel["BookmarkStart"].id();
+    Bookmark_End = schema::channel["BookmarkEnd"].id();
+    Bookmark_Notes = schema::channel["BookmarkNotes"].id();
+
+    ZEO_SleepStage = schema::channel["SleepStage"].id();
+    ZEO_ZQ = schema::channel["ZeoZQ"].id();
+    ZEO_Awakenings = schema::channel["Awakenings"].id();
+    ZEO_MorningFeel = schema::channel["MorningFeel"].id();
+    ZEO_TimeInWake = schema::channel["TimeInWake"].id();
+    ZEO_TimeInREM = schema::channel["TimeInREM"].id();
+    ZEO_TimeInLight = schema::channel["TimeInLight"].id();
+    ZEO_TimeInDeep = schema::channel["TimeInDeep"].id();
+    ZEO_TimeToZ = schema::channel["TimeToZ"].id();
+
+    schema::channel[CPAP_Leak].setShowInOverview(true);
+    schema::channel[CPAP_RespRate].setShowInOverview(true);
+    schema::channel[CPAP_MinuteVent].setShowInOverview(true);
+    schema::channel[CPAP_TidalVolume].setShowInOverview(true);
+    schema::channel[CPAP_CSR].setShowInOverview(true);
+    schema::channel[CPAP_LargeLeak].setShowInOverview(true);
+}
+
+
+void resetChannels()
+{
+    schema::channel.channels.clear();
+    schema::channel.names.clear();
+    schema::channel.groups.clear();
+
+    schema_initialized = false;
+    init();
+
+    QList<MachineLoader *> list = GetLoaders();
+    for (int i=0; i< list.size(); ++i) {
+        MachineLoader * loader = list.at(i);
+        loader->initChannels();
+    }
+    setOrders();
+}
+
+Channel::Channel(ChannelID id, ChanType type, MachineType machtype, ScopeType scope, QString code, QString fullname,
+                 QString description, QString label, QString unit, DataType datatype, QColor color, int link):
+    m_id(id),
+    m_type(type),
+    m_machtype(machtype),
+    m_scope(scope),
+    m_code(code),
+    m_fullname(fullname),
+    m_description(description),
+    m_label(label),
+    m_unit(unit),
+    m_datatype(datatype),
+    m_defaultcolor(color),
+    m_link(link),
+    m_upperThreshold(0),
+    m_lowerThreshold(0),
+    m_upperThresholdColor(Qt::red),
+    m_lowerThresholdColor(Qt::green),
+    m_enabled(true),
+    m_order(255)
+{
+    if (type == WAVEFORM) {
+        calc[Calc_Min] = ChannelCalc(id, Calc_Min, adjustcolor(color, 0.25f, 1.0f, 1.3f), false);
+        calc[Calc_Middle] = ChannelCalc(id, Calc_Middle, adjustcolor(color, 1.3f, 1.0f, 1.0f), false);
+        calc[Calc_Perc] = ChannelCalc(id, Calc_Perc, adjustcolor(color, 1.1f, 1.2f, 1.0f), false);
+        calc[Calc_Max] = ChannelCalc(id, Calc_Max,  adjustcolor(color, 0.5f, 1.2f, 1.0f), false);
+
+        calc[Calc_Zero] = ChannelCalc(id, Calc_Zero, Qt::red, false);
+        calc[Calc_LowerThresh] = ChannelCalc(id, Calc_LowerThresh, Qt::blue, false);
+        calc[Calc_UpperThresh] = ChannelCalc(id, Calc_UpperThresh, Qt::red, false);
+    }
+    m_showInOverview = false;
+}
+bool Channel::isNull()
+{
+    return (this == &EmptyChannel);
+}
+
+ChannelList::ChannelList()
+    : m_doctype("channels")
+{
+}
+ChannelList::~ChannelList()
+{
+    for (QHash<ChannelID, Channel *>::iterator i = channels.begin(); i != channels.end(); i++) {
+        delete i.value();
+    }
+}
+bool ChannelList::Load(QString filename)
+{
+    QDomDocument doc(m_doctype);
+    QFile file(filename);
+    qDebug() << "Opening " << filename;
+
+    if (!file.open(QIODevice::ReadOnly)) {
+        qWarning() << "Could not open" << filename;
+        return false;
+    }
+
+    QString errorMsg;
+    int errorLine;
+
+    if (!doc.setContent(&file, false, &errorMsg, &errorLine)) {
+        qWarning() << "Invalid XML Content in" << filename;
+        qWarning() << "Error line" << errorLine << ":" << errorMsg;
+        return false;
+    }
+
+    file.close();
+
+
+    QDomElement root = doc.documentElement();
+
+    if (root.tagName().toLower() != "channels") {
+        return false;
+    }
+
+    QString language = root.attribute("language", "en");
+    QString version = root.attribute("version", "");
+
+    if (version.isEmpty()) {
+        qWarning() << "No Version Field in" << m_doctype << "Schema, assuming 1.0" << filename;
+        version = "1.0";
+    }
+
+    qDebug() << "Processing xml file:" << m_doctype << language << version;
+    QDomNodeList grp = root.elementsByTagName("group");
+    QDomNode node, n, ch;
+    QDomElement e;
+
+    bool ok;
+    int id, linkid;
+    QString chantype, scopestr, typestr, name, group, idtxt, details, label, unit, datatypestr,
+            defcolor, link;
+    ChanType type;
+    DataType datatype;
+    Channel *chan;
+    QColor color;
+    //bool multi;
+    ScopeType scope;
+    int line;
+
+    for (int i = 0; i < grp.size(); i++) {
+        node = grp.at(i);
+        group = node.toElement().attribute("name");
+        //qDebug() << "Group Name" << group;
+        // Why do I have to skip the first node here? (shows up empty)
+        n = node.firstChildElement();
+
+        while (!n.isNull()) {
+            line = n.lineNumber();
+            e = n.toElement();
+
+            if (e.nodeName().toLower() != "channel") {
+                qWarning() << "Ignoring unrecognized schema type " << e.nodeName() << "in" << filename << "line" <<
+                           line;
+                continue;
+            }
+
+            ch = n.firstChild();
+            n = n.nextSibling();
+
+            idtxt = e.attribute("id");
+            id = idtxt.toInt(&ok, 16);
+
+            if (!ok) {
+                qWarning() << "Dodgy ID number " << e.nodeName() << "in" << filename << "line" << line;
+                continue;
+            }
+
+            chantype = e.attribute("class", "data").toLower();
+
+            if (!ChanTypes.contains(chantype)) {
+                qWarning() << "Dodgy class " << chantype << "in" << filename << "line" << line;
+                continue;
+            }
+
+            type = ChanTypes[chantype];
+
+            scopestr = e.attribute("scope", "session");
+
+            if (scopestr.at(0) == QChar('!')) {
+                scopestr = scopestr.mid(1);
+                //multi=true;
+            } //multi=false;
+
+            if (!Scopes.contains(scopestr)) {
+                qWarning() << "Dodgy Scope " << scopestr << "in" << filename << "line" << line;
+                continue;
+            }
+
+            scope = Scopes[scopestr];
+            name = e.attribute("name", "");
+            details = e.attribute("details", "");
+            label = e.attribute("label", "");
+
+            if (name.isEmpty() || details.isEmpty() || label.isEmpty()) {
+                qWarning() << "Missing name,details or label attribute in" << filename << "line" << line;
+                continue;
+            }
+
+            unit = e.attribute("unit");
+
+            defcolor = e.attribute("color", "black");
+            color = QColor(defcolor);
+
+            if (!color.isValid()) {
+                qWarning() << "Invalid Color " << defcolor << "in" << filename << "line" << line;
+                color = Qt::black;
+            }
+
+            datatypestr = e.attribute("type", "").toLower();
+
+            link = e.attribute("link", "");
+
+            if (!link.isEmpty()) {
+                linkid = link.toInt(&ok, 16);
+
+                if (!ok) {
+                    qWarning() << "Dodgy Link ID number " << e.nodeName() << "in" << filename << " line" << line;
+                }
+            } else { linkid = 0; }
+
+            if (DataTypes.contains(datatypestr)) {
+                datatype = DataTypes[typestr];
+            } else {
+                qWarning() << "Ignoring unrecognized schema datatype in" << filename << "line" << line;
+                continue;
+            }
+
+            if (channels.contains(id)) {
+                qWarning() << "Schema already contains id" << id << "in" << filename << "line" << line;
+                continue;
+            }
+
+            if (names.contains(name)) {
+                qWarning() << "Schema already contains name" << name << "in" << filename << "line" << line;
+                continue;
+            }
+
+            chan = new Channel(id, type, MT_UNKNOWN, scope, name, name, details, label, unit, datatype, color, linkid);
+            channels[id] = chan;
+            names[name] = chan;
+            //qDebug() << "Channel" << id << name << label;
+            groups[group][name] = chan;
+
+            if (linkid > 0) {
+                if (channels.contains(linkid)) {
+                    Channel *it = channels[linkid];
+                    it->m_links.push_back(chan);
+                    //int i=0;
+                } else {
+                    qWarning() << "Linked channel must be defined first in" << filename << "line" << line;
+                }
+            }
+
+            // process children
+            while (!ch.isNull()) {
+                e = ch.toElement();
+                QString sub = ch.nodeName().toLower();
+                QString id2str, name2str;
+                int id2;
+
+                if (sub == "option") {
+                    id2str = e.attribute("id");
+                    id2 = id2str.toInt(&ok, 10);
+                    name2str = e.attribute("value");
+                    //qDebug() << sub << id2 << name2str;
+                    chan->addOption(id2, name2str);
+                } else if (sub == "color") {
+                }
+
+                ch = ch.nextSibling();
+            }
+        }
+    }
+
+    return true;
+}
+
+void ChannelList::add(QString group, Channel *chan)
+{
+    Q_ASSERT(chan != nullptr);
+
+    if (channels.contains(chan->id())) {
+        qWarning() << "Channels already contains id" << chan->id() << chan->code();
+        Q_ASSERT(false);
+        return;
+    }
+
+    if (names.contains(chan->code())) {
+        qWarning() << "Channels already contains name" << chan->id() << chan->code();
+        Q_ASSERT(false);
+        return;
+    }
+
+    channels[chan->id()] = chan;
+    names[chan->code()] = chan;
+    groups[group][chan->code()] = chan;
+
+    if (channels.contains(chan->linkid())) {
+        Channel *it = channels[chan->linkid()];
+        it->m_links.push_back(chan);
+        //int i=0;
+    } else {
+        if (chan->linkid()>0) {
+            qWarning() << "Linked channel must be defined first for" << chan->code();
+        }
+    }
+}
+
+bool ChannelList::Save(QString filename)
+{
+    qDebug() << "Saving Channels.xml";
+    if (filename.isEmpty()) {
+        filename = p_profile->Get("{DataFolder}/") + "channels.xml";
+    }
+
+    QDomDocument doc("channels");
+
+    QDomElement droot = doc.createElement(STR_AppName);
+    doc.appendChild(droot);
+
+    QDomElement root = doc.createElement("channels");
+    droot.appendChild(root);
+
+    QHash<QString, QHash<QString, Channel *> >::iterator git;
+    QHash<QString, QHash<QString, Channel *> >::iterator groups_end = groups.end();
+
+    for (git = groups.begin(); git != groups_end; ++git) {
+        QHash<QString, Channel *> & chanlist = git.value();
+        QHash<QString, Channel *>::iterator it;
+        QHash<QString, Channel *>::iterator chend = chanlist.end();
+
+        QDomElement grp = doc.createElement("group");
+        grp.setAttribute("name", git.key());
+        root.appendChild(grp);
+
+        for (it =chanlist.begin(); it!= chend; ++it) {
+            Channel * chan = it.value();
+            QDomElement cn = doc.createElement("channel");
+            cn.setAttribute("id", chan->id());
+            cn.setAttribute("code", it.key());
+            cn.setAttribute("label", chan->label());
+            cn.setAttribute("name", chan->fullname());
+            cn.setAttribute("description", chan->description());
+            cn.setAttribute("color", chan->defaultColor().name());
+            cn.setAttribute("upper", chan->upperThreshold());
+            cn.setAttribute("lower", chan->lowerThreshold());
+            cn.setAttribute("order", chan->order());
+            cn.setAttribute("type", chan->type());
+            cn.setAttribute("datatype", chan->datatype());
+            cn.setAttribute("overview", chan->showInOverview());
+            QHash<int, QString>::iterator op;
+            for (op = chan->m_options.begin(); op!=chan->m_options.end(); ++op) {
+                QDomElement c2 = doc.createElement("option");
+                c2.setAttribute("key", op.key());
+                c2.setAttribute("value", op.value());
+                cn.appendChild(c2);
+            }
+
+            //cn.appendChild(doc.createTextNode(i.value().toDateTime().toString("yyyy-MM-dd HH:mm:ss")));
+            grp.appendChild(cn);
+        }
+
+    }
+
+
+    QFile file(filename);
+
+    if (!file.open(QIODevice::WriteOnly)) {
+        return false;
+    }
+
+    QTextStream ts(&file);
+    ts << doc.toString();
+    file.close();
+
+
+    return true;
+}
+
+}
+
+QString ChannelCalc::label()
+{
+    QString lab = schema::channel[code].label();
+    QString m_label;
+    switch(type) {
+    case Calc_Min:
+        m_label = QString("%1 %2").arg(STR_TR_Min).arg(lab);
+        break;
+    case Calc_Middle:
+        m_label = Day::calcMiddleLabel(code);
+        break;
+    case Calc_Perc:
+        m_label = Day::calcPercentileLabel(code);
+        break;
+    case Calc_Max:
+        m_label = Day::calcMaxLabel(code);
+        break;
+    case Calc_Zero:
+        m_label = QObject::tr("Zero");
+        break;
+    case Calc_UpperThresh:
+        m_label = QString("%1 %2").arg(lab).arg(QObject::tr("Upper Threshold"));
+        break;
+    case Calc_LowerThresh:
+        m_label = QString("%1 %2").arg(lab).arg(QObject::tr("Lower Threshold"));
+        break;
+    }
+    return m_label;
+
+}
+
+//typedef schema::Channel * ChannelID;
diff --git a/sleepyhead/SleepLib/schema.h b/sleepyhead/SleepLib/schema.h
new file mode 100644
index 0000000..6934eea
--- /dev/null
+++ b/sleepyhead/SleepLib/schema.h
@@ -0,0 +1,325 @@
+/* Schema Header (Parse Channel XML data)
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef SCHEMA_H
+#define SCHEMA_H
+
+#include <QColor>
+#include <QHash>
+#include <QVariant>
+#include <QString>
+#include "machine_common.h"
+
+namespace GraphFlags {
+const quint32 Shadow = 1;
+const quint32 Foobar = 2;
+const quint32 XTicker = 4;
+const quint32 YTicker = 8;
+const quint32 XGrid = 16;
+const quint32 YGrid = 32;
+}
+
+enum ChannelCalcType {
+    Calc_Zero, Calc_Min, Calc_Middle, Calc_Perc, Calc_Max, Calc_UpperThresh, Calc_LowerThresh
+};
+
+struct ChannelCalc {
+public:
+    ChannelCalc() {
+        code = 0;
+        enabled = false;
+        color = Qt::black;
+        type = Calc_Zero;
+    }
+    ChannelCalc(const ChannelCalc & copy) {
+        code = copy.code;
+        color = copy.color;
+        enabled = copy.enabled;
+        type = copy.type;
+    }
+    ChannelCalc(ChannelID code, ChannelCalcType type, QColor color, bool enabled):
+        code(code), type(type), color(color), enabled(enabled) {}
+
+    QString label();
+
+    ChannelID code;
+    ChannelCalcType type;
+    QColor color;
+    bool enabled;
+};
+
+namespace schema {
+void resetChannels();
+void setOrders();
+
+
+enum Function {
+    NONE = 0, AVG, WAVG, MIN, MAX, SUM, CNT, P90, CPH, SPH, HOURS, SET
+};
+
+enum ChanType {
+    DATA = 1,
+    SETTING = 2,
+    FLAG = 4,
+    MINOR_FLAG = 8,
+    SPAN = 16,
+    WAVEFORM = 32,
+    UNKNOWN = 64,
+
+    ALL = 0xFFFF
+};
+
+enum DataType {
+    DEFAULT = 0, INTEGER, BOOL, DOUBLE, STRING, RICHTEXT, DATE, TIME, DATETIME, LOOKUP
+};
+enum ScopeType {
+    GLOBAL = 0, MACHINE, DAY, SESSION
+};
+class Channel;
+extern Channel EmptyChannel;
+
+/*! \class Channel
+    \brief Contains information about a SleepLib data Channel (aka signals)
+    */
+class Channel
+{
+  public:
+    Channel() { m_id = 0; m_upperThreshold = 0; m_lowerThreshold = 0; m_enabled = true; m_order = 255; m_machtype = MT_UNKNOWN; m_showInOverview = false; }
+    Channel(ChannelID id, ChanType type, MachineType machtype, ScopeType scope, QString code, QString fullname,
+            QString description, QString label, QString unit, DataType datatype = DEFAULT, QColor = Qt::black,
+            int link = 0);
+    void addColor(Function f, QColor color) { m_colors[f] = color; }
+    void addOption(int i, QString option) { m_options[i] = option; }
+
+    inline ChannelID id() const { return m_id; }
+    inline ChanType type() const { return m_type; }
+    inline DataType datatype() const { return m_datatype; }
+    inline MachineType machtype() const { return m_machtype; }
+    const QString &code() { return m_code; }
+    const QString &fullname() { return m_fullname; }
+    const QString &description() { return m_description; }
+    const QString &label() { return m_label; }
+    const QString &units() { return m_unit; }
+    inline short order() const { return m_order; }
+
+    bool showInOverview() { return m_showInOverview; }
+
+    inline EventDataType upperThreshold() const { return m_upperThreshold; }
+    inline EventDataType lowerThreshold() const { return m_lowerThreshold; }
+    inline QColor upperThresholdColor() const { return m_upperThresholdColor; }
+    inline QColor lowerThresholdColor() const { return m_lowerThresholdColor; }
+
+    inline ChannelID linkid() const { return m_link; }
+
+
+    void setFullname(QString fullname) { m_fullname = fullname; }
+    void setLabel(QString label) { m_label = label; }
+    void setType(ChanType type) { m_type = type; }
+    void setUnit(QString unit) { m_unit = unit; }
+    void setDescription(QString desc) { m_description = desc; }
+    void setUpperThreshold(EventDataType value) { m_upperThreshold = value; }
+    void setUpperThresholdColor(QColor color) { m_upperThresholdColor = color; }
+    void setLowerThreshold(EventDataType value) { m_lowerThreshold = value; }
+    void setLowerThresholdColor(QColor color) { m_lowerThresholdColor = color; }
+    void setOrder(short order) { m_order = order; }
+
+    void setShowInOverview(bool b) { m_showInOverview = b; }
+
+    QString option(int i) {
+        if (m_options.contains(i)) {
+            return m_options[i];
+        }
+
+        return QString();
+    }
+    inline QColor defaultColor() const { return m_defaultcolor; }
+    inline void setDefaultColor(QColor color) { m_defaultcolor = color; }
+    QHash<int, QString> m_options;
+    QHash<Function, QColor> m_colors;
+    QList<Channel *> m_links;              // better versions of this data type
+    bool isNull();
+
+    inline bool enabled() const { return m_enabled; }
+    void setEnabled(bool value) { m_enabled = value; }
+
+    QHash<ChannelCalcType, ChannelCalc> calc;
+
+  protected:
+    int m_id;
+
+    ChanType m_type;
+    MachineType m_machtype;
+    ScopeType m_scope;
+
+    QString m_code; // Untranslatable
+
+    QString m_fullname; // Translatable Name
+    QString m_description;
+    QString m_label;
+    QString m_unit;
+    DataType m_datatype;
+    QColor m_defaultcolor;
+
+
+    int m_link;
+
+    EventDataType m_upperThreshold;
+    EventDataType m_lowerThreshold;
+    QColor m_upperThresholdColor;
+    QColor m_lowerThresholdColor;
+
+
+    bool m_enabled;
+    short m_order;
+
+    bool m_showInOverview;
+};
+
+/*! \class ChannelList
+    \brief A list containing a group of Channel objects, and XML storage and retrieval capability
+    */
+class ChannelList
+{
+  public:
+    ChannelList();
+    virtual ~ChannelList();
+
+    //! \brief Loads Channel list from XML file specified by filename
+    bool Load(QString filename);
+
+    //! \brief Stores Channel list to XML file specified by filename
+    bool Save(QString filename = QString());
+
+    void add(QString group, Channel *chan);
+
+    //! \brief Looks up Channel in this List with the index idx, returns EmptyChannel if not found
+    Channel & operator[](ChannelID idx) {
+        if (channels.contains(idx)) {
+            return *channels[idx];
+        } else {
+            return EmptyChannel;
+        }
+    }
+    //! \brief Looks up Channel from this list by name, returns Empty Channel if not found.
+    Channel &operator[](QString name) {
+        if (names.contains(name)) {
+            return *names[name];
+        } else {
+            return EmptyChannel;
+        }
+    }
+
+    //! \brief Channel List indexed by integer ID
+    QHash<ChannelID, Channel *> channels;
+
+    //! \brief Channel List index by name
+    QHash<QString, Channel *> names;
+
+    //! \brief Channel List indexed by group
+    QHash<QString, QHash<QString, Channel *> > groups;
+    QString m_doctype;
+};
+extern ChannelList channel;
+
+/*enum LayerType {
+    UnspecifiedLayer, Waveform, Flag, Overlay, Group
+};
+
+
+// ?????
+class Layer
+{
+public:
+    Layer(ChannelID code, QColor colour, QString label=QString());
+    virtual ~Layer();
+    Layer *addLayer(Layer *layer);// { m_layers.push_back(layer); return layer; }
+    void setMin(EventDataType min) { m_min=min; m_hasmin=true; }
+    void setMax(EventDataType max) { m_max=max; m_hasmax=true; }
+    EventDataType Min() { return m_min; }
+    EventDataType Max() { return m_max; }
+    bool visible() { return m_visible; }
+    void setVisible(bool b) { m_visible=b; }
+protected:
+    LayerType m_type;
+    ChannelID m_code;
+    QColor m_colour;
+    QString m_label;
+    EventDataType m_min;
+    EventDataType m_max;
+    bool m_hasmin;
+    bool m_hasmax;
+    bool m_visible;
+    QVector<Layer *> m_layers;
+};
+
+class WaveformLayer: public Layer
+{
+public:
+    WaveformLayer(ChannelID code, QColor colour, float min=0, float max=0);
+    virtual ~WaveformLayer();
+};
+
+enum FlagVisual { Bar, Span, Dot };
+class OverlayLayer: public Layer
+{
+public:
+    OverlayLayer(ChannelID code, QColor colour, FlagVisual visual=Bar);
+    virtual ~OverlayLayer();
+protected:
+    FlagVisual m_visual;
+};
+class GroupLayer: public Layer // Effectively an empty Layer container
+{
+public:
+    GroupLayer();
+    virtual ~GroupLayer();
+};
+class FlagGroupLayer: public GroupLayer
+{
+public:
+    FlagGroupLayer();
+    virtual ~FlagGroupLayer();
+};
+class FlagLayer: public Layer
+{
+public:
+    FlagLayer(ChannelID code, QColor colour, FlagVisual visual=Bar);
+    virtual ~FlagLayer();
+protected:
+    FlagVisual m_visual;
+};
+class Graph
+{
+public:
+    Graph(QString name,quint32 flags=GraphFlags::XTicker | GraphFlags::YTicker | GraphFlags::XGrid);
+    Layer *addLayer(Layer *layer) { m_layers.push_back(layer); return layer; }
+    int height() { if (m_visible) return m_height; else return 0;}
+    void setHeight(int h) { m_height=h; }
+    bool visible() { return m_visible; }
+    void setVisible(bool b) { m_visible=b; }
+protected:
+    QString m_name;
+    int m_height;
+    QVector<Layer *> m_layers;
+    bool m_visible;
+};
+class GraphGroup
+{
+public:
+    GraphGroup(QString name);
+    GraphGroup();
+    Graph *addGraph(Graph *graph) { m_graphs.push_back(graph); return graph; }
+protected:
+    QVector<Graph *>m_graphs;
+}; */
+
+void init();
+
+} // namespace
+
+#endif // SCHEMA_H
diff --git a/sleepyhead/SleepLib/serialoximeter.cpp b/sleepyhead/SleepLib/serialoximeter.cpp
new file mode 100644
index 0000000..f6450c8
--- /dev/null
+++ b/sleepyhead/SleepLib/serialoximeter.cpp
@@ -0,0 +1,150 @@
+/* SleepLib Machine Loader Class Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QtSerialPort/QSerialPortInfo>
+
+#include "serialoximeter.h"
+
+// Possibly need to replan this to include oximetry
+
+QList<SerialOximeter *> GetOxiLoaders()
+{
+    QList<SerialOximeter *> oxiloaders;
+
+    QList<MachineLoader *> loaders = GetLoaders(MT_OXIMETER);
+
+    Q_FOREACH(MachineLoader * loader, loaders) {
+        SerialOximeter * oxi = qobject_cast<SerialOximeter *>(loader);
+        oxiloaders.push_back(oxi);
+    }
+
+    return oxiloaders;
+}
+bool SerialOximeter::scanDevice(QString keyword, quint16 vendor_id, quint16 product_id)
+{
+    static bool dumponce = true;
+    QStringList ports;
+
+    //qDebug() << "Scanning for USB Serial devices";
+    QList<QSerialPortInfo> list=QSerialPortInfo::availablePorts();
+
+    // How does the mac detect this as a SPO2 device?
+    for (int i=0;i<list.size();i++) {
+        const QSerialPortInfo * info = &list.at(i);
+        QString name = info->portName();
+        QString desc = info->description();
+
+        if ((!keyword.isEmpty() && (desc.contains(keyword, Qt::CaseInsensitive) || name.contains(keyword, Qt::CaseInsensitive))) ||
+            ((info->hasVendorIdentifier() && (info->vendorIdentifier() == vendor_id))
+                && (info->hasProductIdentifier() && (info->productIdentifier() == product_id))))
+        {
+            ports.push_back(name);
+            QString dbg=QString("Found Serial Port: Name: %1 Desc: %2 Manufacturer: %3 Location: %4").arg(name).arg(desc).arg(info->manufacturer()).arg(info->systemLocation());
+
+            if (info->hasProductIdentifier()) //60000
+                dbg += QString(" PID: %1").arg(info->productIdentifier());
+            if (info->hasVendorIdentifier()) // 4292
+                dbg += QString(" VID: %1").arg(info->vendorIdentifier());
+
+            qDebug() << dbg.toLocal8Bit().data();
+            break;
+        } else if (dumponce) {
+            QString dbg=QString("Other Serial Port: Name: %1 Desc: %2 Manufacturer: %3 Location: %4").arg(name).arg(desc).arg(info->manufacturer()).arg(info->systemLocation());
+
+            if (info->hasProductIdentifier()) //60000
+                dbg += QString(" PID: %1").arg(info->productIdentifier());
+            if (info->hasVendorIdentifier()) // 4292
+                dbg += QString(" VID: %1").arg(info->vendorIdentifier());
+
+            qDebug() << dbg.toLocal8Bit().data();
+        }
+    }
+    dumponce = false;
+    if (ports.isEmpty()) {
+        return false;
+    }
+    if (ports.size()>1) {
+        qDebug() << "More than one serial device matching these parameters was found, choosing the first by default";
+    }
+    port=ports.at(0);
+    return true;
+}
+
+void SerialOximeter::closeDevice()
+{
+    killTimers();
+    disconnect(&serial,SIGNAL(readyRead()), this, SLOT(dataAvailable()));
+    serial.close();
+    m_streaming = false;
+    qDebug() << "Port" << port << "closed";
+}
+
+bool SerialOximeter::openDevice()
+{
+    if (port.isEmpty()) {
+        if (!scanDevice("",m_vendorID, m_productID))
+            return false;
+    }
+    serial.setPortName(port);
+    if (!serial.open(QSerialPort::ReadWrite))
+        return false;
+
+    // forward this stuff
+
+    // Set up serial port attributes
+    serial.setBaudRate(QSerialPort::Baud19200);
+    serial.setParity(QSerialPort::OddParity);
+    serial.setStopBits(QSerialPort::OneStop);
+    serial.setDataBits(QSerialPort::Data8);
+    serial.setFlowControl(QSerialPort::NoFlowControl);
+
+    m_streaming = true;
+    m_abort = false;
+    m_importing = false;
+
+    // connect relevant signals
+    connect(&serial,SIGNAL(readyRead()), this, SLOT(dataAvailable()));
+
+    return true;
+}
+
+void SerialOximeter::dataAvailable()
+{
+    QByteArray bytes;
+
+    int available = serial.bytesAvailable();
+    bytes.resize(available);
+
+    int bytesread = serial.read(bytes.data(), available);
+    if (bytesread == 0)
+        return;
+
+    if (m_abort) {
+        closeDevice();
+        return;
+    }
+
+    processBytes(bytes);
+}
+
+void SerialOximeter::stopRecording()
+{
+    closeDevice();
+    m_status = NEUTRAL;
+    emit importComplete(this);
+}
+
+void SerialOximeter::trashRecords()
+{
+    QMap<QDateTime, QVector<OxiRecord> *>::iterator it;
+    for (it = oxisessions.begin(); it != oxisessions.end(); ++it) {
+        delete it.value();
+    }
+    oxisessions.clear();
+    oxirec = nullptr;
+}
diff --git a/sleepyhead/SleepLib/serialoximeter.h b/sleepyhead/SleepLib/serialoximeter.h
new file mode 100644
index 0000000..08ba17e
--- /dev/null
+++ b/sleepyhead/SleepLib/serialoximeter.h
@@ -0,0 +1,145 @@
+/* SleepLib MachineLoader Base Class Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef SERIALOXIMETER_H
+#define SERIALOXIMETER_H
+
+#include <QTimer>
+#include <QtSerialPort/QSerialPort>
+
+#include "SleepLib/machine_loader.h"
+
+const int START_TIMEOUT = 30000;
+
+
+struct OxiRecord
+{
+    quint8 pulse;
+    quint8 spo2;
+    quint16 perf;
+
+    OxiRecord():pulse(0), spo2(0),perf(0) {}
+    OxiRecord(quint8 p, quint8 s): pulse(p), spo2(s) {}
+    OxiRecord(quint8 p, quint8 s, quint16 pi): pulse(p), spo2(s), perf(pi) {} // with perfusion index
+    OxiRecord(const OxiRecord & copy) { pulse = copy.pulse; spo2 = copy.spo2; perf = copy.perf; }
+};
+
+class SerialOximeter : public MachineLoader
+{
+Q_OBJECT
+public:
+    SerialOximeter() : MachineLoader() {
+        m_importing = m_streaming = false;
+        m_productID = m_vendorID = 0;
+        have_perfindex = false;
+    }
+    virtual ~SerialOximeter() {}
+
+    virtual bool Detect(const QString &path)=0;
+    virtual int Open(QString path)=0;
+
+    static void Register() {}
+
+    virtual int Version()=0;
+    virtual const QString &loaderName()=0;
+
+    virtual QDateTime getDateTime(int session) { Q_UNUSED(session); return QDateTime(); }
+    virtual int getDuration(int session) { Q_UNUSED(session); return 0; }
+    virtual int getSessionCount() { return 0; }
+    virtual QString getUser() { return QString(); }
+    virtual QString getModel() { return QString(); }
+    virtual QString getVendor()  { return QString(); }
+    virtual QString getDeviceString()  { return QString(); }
+
+    virtual void getSessionData(int session) { Q_UNUSED(session); }
+    virtual void syncClock() {}
+
+    virtual QString getDeviceID() { return QString(); }
+    virtual void setDeviceID(QString) {}
+
+    virtual void eraseSession(int /*user*/, int /*session*/) {}
+
+
+
+    virtual bool commandDriven() { return false; }
+
+    virtual MachineInfo newInfo() {
+        return MachineInfo(MT_OXIMETER, 0, "", QString(), QString(), QString(), QString(), "Generic", QDateTime::currentDateTime(), 0);
+    }
+
+    // Serial Stuff
+    virtual bool scanDevice(QString keyword="",quint16 vendor_id=0, quint16 product_id=0);
+    virtual bool openDevice();
+    virtual void closeDevice();
+
+    inline bool isStreaming() { return m_streaming; }
+    inline bool isImporting() { return m_importing; }
+
+    bool havePerfIndex() { return have_perfindex; }
+
+    virtual void process() {}
+
+    //virtual Machine *CreateMachine()=0;
+
+    // available sessions
+    QMap<QDateTime, QVector<OxiRecord> *> oxisessions;
+
+    // current session
+    QVector<OxiRecord> * oxirec;
+
+    QDateTime startTime() { return m_startTime; }
+    void setStartTime(QDateTime datetime) { m_startTime = datetime; }
+    virtual bool isStartTimeValid() { return true; }
+    virtual void setDuration(int) { }
+
+    virtual qint64 importResolution() { return 1000; }
+    virtual qint64 liveResolution() { return 20; }
+
+    void trashRecords();
+    virtual void resetDevice() {}
+
+
+signals:
+    void noDeviceFound();
+    void deviceDetected();
+    void updatePlethy(QByteArray plethy);
+    void importComplete(SerialOximeter *);
+
+protected slots:
+    virtual void dataAvailable();
+    virtual void resetImportTimeout() {}
+    virtual void startImportTimeout() {}
+
+    virtual void stopRecording();
+    virtual void shutdownPorts() {}
+//    virtual void abortTask();
+
+protected:
+    virtual void processBytes(QByteArray buffer) { Q_UNUSED(buffer) }
+
+    virtual void killTimers() {}
+    virtual void requestData() {}
+
+    QString port;
+    QSerialPort serial;
+
+    QTimer startTimer;
+    QTimer resetTimer;
+
+    QDateTime m_startTime;
+
+    quint16 m_productID;
+    quint16 m_vendorID;
+
+    bool m_streaming;
+    bool m_importing;
+    bool have_perfindex;
+
+};
+
+#endif // SERIALOXIMETER_H
diff --git a/sleepyhead/SleepLib/session.cpp b/sleepyhead/SleepLib/session.cpp
new file mode 100644
index 0000000..54857ad
--- /dev/null
+++ b/sleepyhead/SleepLib/session.cpp
@@ -0,0 +1,2262 @@
+/* SleepLib Session Implementation
+ * This stuff contains the base calculation smarts
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "session.h"
+#include <cmath>
+#include <QDir>
+#include <QDebug>
+#include <QMessageBox>
+#include <QMetaType>
+#include <algorithm>
+#include <limits>
+
+#include "SleepLib/calcs.h"
+#include "SleepLib/profiles.h"
+
+using namespace std;
+
+// This is the uber important database version for SleepyHeads internal storage
+// Increment this after stuffing with Session's save & load code.
+const quint16 summary_version = 17;
+const quint16 events_version = 10;
+
+Session::Session(Machine *m, SessionID session)
+{
+    s_lonesession = false;
+
+    if (!session) {
+        session = m->CreateSessionID();
+    }
+
+    s_machine = m;
+    s_machtype = m->type();
+    s_session = session;
+    s_changed = false;
+    s_events_loaded = false;
+    s_summary_loaded = false;
+    _first_session = true;
+    s_enabled = -1;
+
+    s_first = s_last = 0;
+    s_evchecksum_checked = false;
+
+    s_summaryOnly = false;
+
+    destroyed = false;
+}
+
+Session::~Session()
+{
+    TrashEvents();
+    destroyed = true;
+}
+
+void Session::TrashEvents()
+// Trash this sessions Events and release memory.
+{
+    QVector<EventList *>::iterator j;
+    QVector<EventList *>::iterator j_end;
+    QHash<ChannelID, QVector<EventList *> >::iterator i;
+    QHash<ChannelID, QVector<EventList *> >::iterator i_end=eventlist.end();
+
+    if (s_changed) {
+        // Save first..
+    }
+
+    for (i = eventlist.begin(); i != i_end; ++i) {
+        j_end=i.value().end();
+        for (j = i.value().begin(); j != j_end; ++j) {
+            EventList * ev = *j;
+            ev->clear();
+            ev->m_data.squeeze();
+            ev->m_data2.squeeze();
+            ev->m_time.squeeze();
+            delete ev;
+        }
+    }
+
+    s_events_loaded = false;
+    eventlist.clear();
+    eventlist.squeeze();
+}
+
+QString Session::eventFile() const
+{
+    return s_machine->getEventsPath()+QString().sprintf("%08lx.001", s_session);
+}
+
+//const int max_pack_size=128;
+bool Session::OpenEvents()
+{
+    if (s_events_loaded) {
+        return true;
+    }
+
+    s_events_loaded = eventlist.size() > 0;
+
+    if (s_events_loaded) {
+        return true;
+    }
+
+
+    QString filename = eventFile();
+    bool b = LoadEvents(filename);
+
+    if (!b) {
+//        qWarning() << "Error Loading Events" << filename;
+        return false;
+    }
+    qDebug() << "Loading" << s_machine->loaderName() << "Events" << filename;
+
+    return s_events_loaded = true;
+}
+
+bool Session::Destroy()
+{
+    QString path = s_machine->getDataPath();
+
+    QDir dir(path);
+    QString base;
+    base.sprintf("%08lx", s_session);
+    base = path + "/" + base;
+
+    dir.remove(base + ".000");
+    dir.remove(base + ".001");
+
+    return s_machine->unlinkSession(this); //!dir.exists(base + ".000") && !dir.exists(base + ".001");
+}
+
+bool Session::Store(QString path)
+// Storing Session Data in our format
+// {DataDir}/{MachineID}/{SessionID}.{ext}
+{
+    QDir dir(path);
+
+    if (!dir.exists(path)) {
+        dir.mkpath(path);
+    }
+
+    //qDebug() << "Storing Session: " << base;
+    bool a;
+
+    a = StoreSummary(); // if actually has events
+
+    //qDebug() << " Summary done";
+    if (eventlist.size() > 0) {
+        StoreEvents();
+    } else { // who cares..
+        //qDebug() << "Trying to save empty events file";
+    }
+
+    //qDebug() << " Events done";
+    s_changed = false;
+    s_events_loaded = true;
+
+    //} else {
+    //    qDebug() << "Session::Store() No event data saved" << s_session;
+    //}
+
+    return a;
+}
+/*QDataStream & operator<<(QDataStream & out, const Session & session)
+{
+    session.StoreSummaryData(out);
+    return out;
+}
+
+void Session::StoreSummaryData(QDataStream & out) const
+{
+    out << summary_version;
+    out << (quint32)s_session;
+    out << s_first;  // Session Start Time
+    out << s_last;   // Duration of sesion in seconds.
+
+    out << settings;
+    out << m_cnt;
+    out << m_sum;
+    out << m_avg;
+    out << m_wavg;
+
+    out << m_min;
+    out << m_max;
+
+    out << m_physmin;
+    out << m_physmax;
+
+    out << m_cph;
+    out << m_sph;
+
+    out << m_firstchan;
+    out << m_lastchan;
+
+    out << m_valuesummary;
+    out << m_timesummary;
+
+    out << m_gain;
+
+    out << m_availableChannels;
+
+    out << m_timeAboveTheshold;
+    out << m_upperThreshold;
+    out << m_timeBelowTheshold;
+    out << m_lowerThreshold;
+
+    out << s_summaryOnly;
+}
+
+QDataStream & operator>>(QDataStream & in, Session & session)
+{
+    session.LoadSummaryData(in);
+    return in;
+}
+
+
+void Session::LoadSummaryData(QDataStream & in)
+{
+    quint16 version;
+    in >> version;
+
+    quint32 t32;
+    in >> t32;      // Sessionid;
+    s_session = t32;
+
+    in >> s_first;  // Start time
+    in >> s_last;   // Duration
+
+    in >> settings;
+    in >> m_cnt;
+    in >> m_sum;
+    in >> m_avg;
+    in >> m_wavg;
+
+    in >> m_min;
+    in >> m_max;
+
+    in >> m_physmin;
+    in >> m_physmax;
+
+    in >> m_cph;
+    in >> m_sph;
+    in >> m_firstchan;
+    in >> m_lastchan;
+
+    in >> m_valuesummary;
+    in >> m_timesummary;
+
+    in >> m_gain;
+
+    in >> m_availableChannels;
+    in >> m_timeAboveTheshold;
+    in >> m_upperThreshold;
+    in >> m_timeBelowTheshold;
+    in >> m_lowerThreshold;
+
+    in >> s_summaryOnly;
+
+    s_enabled = 1;
+} */
+
+QDataStream & operator>>(QDataStream & in, SessionSlice & slice)
+{
+    in >> slice.start;
+    quint32 length;
+    in >> length;
+    slice.end = slice.start + length;
+
+    quint16 i;
+    in >> i;
+    slice.status = (SliceStatus)i;
+    return in;
+}
+QDataStream & operator<<(QDataStream & out, const SessionSlice & slice)
+{
+    out << slice.start;
+    quint32 length = slice.end - slice.start;
+    out << length;
+    out << (quint16)slice.status;
+    return out;
+}
+
+bool Session::StoreSummary()
+{
+    QString filename = s_machine->getSummariesPath() + QString().sprintf("%08lx.000", s_session);
+
+    QFile file(filename);
+    if (!file.open(QIODevice::WriteOnly)) {
+        QDir dir;
+        dir.mkpath(s_machine->getSummariesPath());
+
+        if (!file.open(QIODevice::WriteOnly)) {
+            qDebug() << "Summary open for writing failed";
+            return false;
+        }
+    }
+
+    QDataStream out(&file);
+    out.setVersion(QDataStream::Qt_4_6);
+    out.setByteOrder(QDataStream::LittleEndian);
+
+    out << (quint32)magic;
+    out << (quint16)summary_version;
+    out << (quint16)filetype_summary;
+    out << (quint32)s_machine->id();
+
+    out << (quint32)s_session;
+    out << s_first;  // Session Start Time
+    out << s_last;   // Duration of sesion in seconds.
+    //out << (quint16)settings.size();
+
+    out << settings;
+    out << m_cnt;
+
+    out << m_sum;
+    out << m_avg;
+    out << m_wavg;
+
+    out << m_min;
+    out << m_max;
+    out << m_physmin;
+    out << m_physmax;
+    out << m_cph;
+    out << m_sph;
+    out << m_firstchan;
+    out << m_lastchan;
+
+    // <- 8
+    out << m_valuesummary;
+    out << m_timesummary;
+    // 8 ->
+
+    // <- 9
+    out << m_gain;
+    // 9 ->
+
+    // <- 15
+    out << m_availableChannels;
+    out << m_timeAboveTheshold;
+    out << m_upperThreshold;
+    out << m_timeBelowTheshold;
+    out << m_lowerThreshold;
+
+    out << s_summaryOnly;
+    // 13 ->
+
+    out << m_slices;
+
+    file.close();
+    return true;
+}
+
+
+bool Session::LoadSummary()
+{
+    static int sumcnt = 0;
+
+    if (s_summary_loaded) return true;
+    QString filename = s_machine->getSummariesPath() + QString().sprintf("%08lx.000", s_session);
+
+
+    if (filename.isEmpty()) {
+        qDebug() << "Empty summary filename";
+        return false;
+    }
+
+    QFile file(filename);
+
+    if (!file.open(QIODevice::ReadOnly)) {
+        qDebug() << "Couldn't open summary file" << filename;
+        return false;
+    }
+
+
+   // qDebug() << "Loading" << s_machine->loaderName() << "Summary" << filename << sumcnt++;
+
+    QDataStream in(&file);
+    in.setVersion(QDataStream::Qt_4_6);
+    in.setByteOrder(QDataStream::LittleEndian);
+
+    quint32 t32;
+    quint16 t16;
+
+    //QHash<ChannelID,MCDataType> mctype;
+    //QVector<ChannelID> mcorder;
+    in >> t32;
+
+    if (t32 != magic) {
+        qDebug() << "Wrong magic number in " << filename;
+        return false;
+    }
+
+    quint16 version;
+    in >> version;      // DB Version
+
+    if (version < 6) {
+        //throw OldDBVersion();
+        qWarning() << "Old dbversion " << version <<
+                   "summary file.. Sorry, you need to purge and reimport";
+        return false;
+    }
+
+    in >> t16;      // File Type
+
+    if (t16 != filetype_summary) {
+        qDebug() << "Wrong file type"; //wrong file type
+        return false;
+    }
+
+
+    qint32 ts32;
+    in >> ts32;      // MachineID (dont need this result)
+
+    bool upgrade = false;
+    if (ts32 != s_machine->id()) {
+        upgrade = true;
+        qWarning() << "Machine ID does not match in" << filename <<
+                   " I will try to load anyway in case you know what your doing.";
+    }
+
+    in >> t32;      // Sessionid;
+    s_session = t32;
+
+    in >> s_first;  // Start time
+    in >> s_last;   // Duration // (16bit==Limited to 18 hours)
+
+    QHash<ChannelID, EventDataType> cruft;
+
+    if (version < 7) {
+        // This code is deprecated.. just here incase anyone tries anything crazy...
+        QHash<QString, QVariant> v1;
+        in >> v1;
+        settings.clear();
+        ChannelID code;
+
+        for (QHash<QString, QVariant>::iterator i = v1.begin(); i != v1.end(); i++) {
+            code = schema::channel[i.key()].id();
+            settings[code] = i.value();
+        }
+
+        QHash<QString, int> zcnt;
+        in >> zcnt;
+        for (QHash<QString, int>::iterator i = zcnt.begin(); i != zcnt.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_cnt[code] = i.value();
+        }
+
+        QHash<QString, double> zsum;
+        in >> zsum;
+
+        for (QHash<QString, double>::iterator i = zsum.begin(); i != zsum.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_sum[code] = i.value();
+        }
+
+        QHash<QString, EventDataType> ztmp;
+        in >> ztmp; // avg
+
+        for (QHash<QString, EventDataType>::iterator i = ztmp.begin(); i != ztmp.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_avg[code] = i.value();
+        }
+
+        ztmp.clear();
+        in >> ztmp; // wavg
+
+        for (QHash<QString, EventDataType>::iterator i = ztmp.begin(); i != ztmp.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_wavg[code] = i.value();
+        }
+
+        ztmp.clear();
+        in >> ztmp; // 90p
+        ztmp.clear();
+        in >> ztmp; // min
+
+        for (QHash<QString, EventDataType>::iterator i = ztmp.begin(); i != ztmp.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_min[code] = i.value();
+        }
+
+        ztmp.clear();
+        in >> ztmp; // max
+
+        for (QHash<QString, EventDataType>::iterator i = ztmp.begin(); i != ztmp.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_max[code] = i.value();
+        }
+
+        ztmp.clear();
+        in >> ztmp; // cph
+
+        for (QHash<QString, EventDataType>::iterator i = ztmp.begin(); i != ztmp.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_cph[code] = i.value();
+        }
+
+        ztmp.clear();
+        in >> ztmp; // sph
+
+        for (QHash<QString, EventDataType>::iterator i = ztmp.begin(); i != ztmp.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_sph[code] = i.value();
+        }
+
+        QHash<QString, quint64> ztim;
+        in >> ztim; //firstchan
+
+        for (QHash<QString, quint64>::iterator i = ztim.begin(); i != ztim.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_firstchan[code] = i.value();
+        }
+
+        ztim.clear();
+        in >> ztim; // lastchan
+
+        for (QHash<QString, quint64>::iterator i = ztim.begin(); i != ztim.end(); i++) {
+            code = schema::channel[i.key()].id();
+            m_lastchan[code] = i.value();
+        }
+
+        //SetChanged(true);
+    } else {
+        // version > 7
+
+        in >> settings;
+        if (version < 13) {
+            QHash<ChannelID, int> cnt2;
+            in >> cnt2;
+
+            QHash<ChannelID, int>::iterator it;
+
+            for (it = cnt2.begin(); it != cnt2.end(); ++it) {
+                m_cnt[it.key()] = it.value();
+            }
+        } else {
+            in >> m_cnt;
+        }
+        in >> m_sum;
+        in >> m_avg;
+        in >> m_wavg;
+
+        if (version < 11) {
+            cruft.clear();
+            in >> cruft; // 90%
+
+            if (version >= 10) {
+                cruft.clear();
+                in >> cruft;// med
+                cruft.clear();
+                in >> cruft; //p95
+            }
+        }
+
+        in >> m_min;
+        in >> m_max;
+
+        // Added 24/10/2013 by MW to support physical graph min/max values
+        if (version >= 12) {
+            in >> m_physmin;
+            in >> m_physmax;
+        }
+
+        in >> m_cph;
+        in >> m_sph;
+        in >> m_firstchan;
+        in >> m_lastchan;
+
+        if (version >= 8) {
+            in >> m_valuesummary;
+            in >> m_timesummary;
+
+            if (version >= 9) {
+                in >> m_gain;
+            }
+        }
+
+        // screwed up with version 14
+        if (version >= 15) {
+            in >> m_availableChannels;
+            in >> m_timeAboveTheshold;
+            in >> m_upperThreshold;
+            in >> m_timeBelowTheshold;
+            in >> m_lowerThreshold;
+        } // else this is ugly.. forced machine database upgrade will solve it though.
+
+        if (version == 13) {
+            QHash<ChannelID, QVariant>::iterator it = settings.find(CPAP_SummaryOnly);
+            if (it != settings.end()) {
+                s_summaryOnly = (*it).toBool();
+            } else s_summaryOnly = false;
+        } else if (version > 13) {
+            in >> s_summaryOnly;
+        }
+
+        if (version == 16) {
+            QList<SessionSlice> slices;
+            in >> slices;
+            m_slices.clear();
+            for (int i=0;i<slices.size(); ++i) {
+                m_slices.append(slices[i]);
+            }
+        } else if (version >= 17) {
+            in >> m_slices;
+        }
+    }
+
+    // not really a good idea to do this... should flag and do a reindex
+    if (upgrade || (version < summary_version)) {
+
+        qDebug() << "Upgrading Summary file to version" << summary_version;
+        if (!s_summaryOnly) {
+            OpenEvents();
+            UpdateSummaries();
+            TrashEvents();
+        } else {
+            // summary only upgrades go here.
+        }
+        StoreSummary();
+    }
+
+    s_summary_loaded = true;
+    return true;
+}
+
+const quint16 compress_method = 1;
+
+bool Session::StoreEvents()
+{
+    QString path = s_machine->getEventsPath();
+    QDir dir;
+    dir.mkpath(path);
+    QString filename = path+QString().sprintf("%08lx.001", s_session);
+
+    QFile file(filename);
+    file.open(QIODevice::WriteOnly);
+
+    QByteArray headerbytes;
+    QDataStream header(&headerbytes, QIODevice::WriteOnly);
+    header.setVersion(QDataStream::Qt_4_6);
+    header.setByteOrder(QDataStream::LittleEndian);
+
+    header << (quint32)magic;      // New Magic Number
+    header << (quint16)events_version; // File Version
+    header << (quint16)filetype_data;  // File type 1 == Event
+    header << (quint32)s_machine->id();// Machine Type
+    header << (quint32)s_session;      // This session's ID
+    header << s_first;
+    header << s_last;
+
+    quint16 compress = 0;
+
+    if (p_profile->session->compressSessionData()) {
+        compress = compress_method;
+    }
+
+    header << (quint16)compress;
+
+    header << (quint16)s_machine->type();// Machine Type
+
+    QByteArray databytes;
+    QDataStream out(&databytes, QIODevice::WriteOnly);
+    out.setVersion(QDataStream::Qt_4_6);
+    out.setByteOrder(QDataStream::LittleEndian);
+
+    out << (qint16)eventlist.size(); // Number of event categories
+
+    QHash<ChannelID, QVector<EventList *> >::iterator i;
+    QHash<ChannelID, QVector<EventList *> >::iterator i_end=eventlist.end();
+
+    qint16 ev_size;
+
+    for (i = eventlist.begin(); i != i_end; i++) {
+        ev_size=i.value().size();
+
+        out << i.key(); // ChannelID
+        out << (qint16)ev_size;
+
+
+        for (int j = 0; j < ev_size; j++) {
+            EventList &e = *i.value()[j];
+            out << e.first();
+            out << e.last();
+            out << (qint32)e.count();
+            out << (qint8)e.type();
+            out << e.rate();
+            out << e.gain();
+            out << e.offset();
+            out << e.Min();
+            out << e.Max();
+            out << e.dimension();
+            out << e.hasSecondField();
+
+            if (e.hasSecondField()) {
+                out << e.min2();
+                out << e.max2();
+            }
+        }
+    }
+
+    for (i = eventlist.begin(); i != i_end; i++) {
+        ev_size=i.value().size();
+
+        for (int j = 0; j < ev_size; j++) {
+            EventList &e = *i.value()[j];
+            // ****** This is assuming little endian ******
+
+            // Store the raw event list data in EventStoreType (16bit short)
+            EventStoreType *ptr = e.m_data.data();
+            out.writeRawData((char *)ptr, e.count() << 1);
+
+            //*** Don't delete these comments ***
+            //            for (quint32 c=0;c<e.count();c++) {
+            //                out << *ptr++;//e.raw(c);
+            //            }
+
+            // Store the second field, only if there
+            if (e.hasSecondField()) {
+                ptr = e.m_data2.data();
+                out.writeRawData((char *)ptr, e.count() << 1);
+                //*** Don't delete these comments ***
+                //                for (quint32 c=0;c<e.count();c++) {
+                //                    out << *ptr++; //e.raw2(c);
+                //                }
+            }
+
+            // Store the time delta fields for non-waveform EventLists
+            if (e.type() != EVL_Waveform) {
+                quint32 *tptr = e.m_time.data();
+                out.writeRawData((char *)tptr, e.count() << 2);
+                //*** Don't delete these comments ***
+                //                for (quint32 c=0;c<e.count();c++) {
+                //                    out << *tptr++; //e.getTime()[c];
+                //                }
+            }
+        }
+    }
+
+    qint32 datasize = databytes.size();
+
+    // Checksum the _uncompressed_ data
+    quint16 chk = 0;
+
+    if (compress) {
+        // This checksum is hideously slow.. only using during compression, and not sure I should at all :-/
+        chk = qChecksum(databytes.data(), databytes.size());
+    }
+
+    header << datasize;
+    header << chk;
+
+    QByteArray data;
+
+    if (compress > 0) {
+        data = qCompress(databytes);
+    } else {
+        data = databytes;
+    }
+
+    file.write(headerbytes);
+    file.write(data);
+    file.close();
+    return true;
+}
+bool Session::LoadEvents(QString filename)
+{
+    quint32 magicnum, machid, sessid;
+    quint16 version, type, crc16, machtype, compmethod;
+    quint8 t8;
+    qint32 datasize;
+
+    if (filename.isEmpty()) {
+        qDebug() << "Session::LoadEvents() Filename is empty";
+        return false;
+    }
+
+    QFile file(filename);
+
+    if (!file.open(QIODevice::ReadOnly)) {
+        qDebug() << "No Event/Waveform data available for" << s_session;
+        return false;
+    }
+
+    QByteArray headerbytes = file.read(42);
+
+    QDataStream header(headerbytes);
+    header.setVersion(QDataStream::Qt_4_6);
+    header.setByteOrder(QDataStream::LittleEndian);
+
+    header >> magicnum;         // Magic Number (quint32)
+    header >> version;          // Version (quint16)
+    header >> type;             // File type (quint16)
+    header >> machid;           // Machine ID (quint32)
+    header >> sessid;           //(quint32)
+    header >> s_first;          //(qint64)
+    header >> s_last;           //(qint64)
+
+    if (type != filetype_data) {
+        qDebug() << "Wrong File Type in " << filename;
+        return false;
+    }
+
+    if (magicnum != magic) {
+        qWarning() << "Wrong Magic number in " << filename;
+        return false;
+    }
+
+    if (version < 6) {  // prior to version 6 is too old to deal with
+        qDebug() << "Old File Version, can't open file";
+        return false;
+    }
+
+    if (version < 10) {
+        file.seek(32);
+    } else {
+        header >> compmethod;   // Compression Method (quint16)
+        header >> machtype;     // Machine Type (quint16)
+        header >> datasize;     // Size of Uncompressed Data (quint32)
+        header >> crc16;        // CRC16 of Uncompressed Data (quint16)
+    }
+
+    QByteArray databytes, temp = file.readAll();
+    file.close();
+
+    if (version >= 10) {
+        if (compmethod > 0) {
+            databytes = qUncompress(temp);
+
+            if (!s_evchecksum_checked) {
+                if (databytes.size() != datasize) {
+                    qDebug() << "File" << filename << "has returned wrong datasize";
+                    return false;
+                }
+
+                quint16 crc = qChecksum(databytes.data(), databytes.size());
+
+                if (crc != crc16) {
+                    qDebug() << "CRC Doesn't match in" << filename;
+                    return false;
+                }
+
+                s_evchecksum_checked = true;
+            }
+        } else {
+            databytes = temp;
+        }
+    } else { databytes = temp; }
+
+    QDataStream in(databytes);
+    in.setVersion(QDataStream::Qt_4_6);
+    in.setByteOrder(QDataStream::LittleEndian);
+
+    qint16 mcsize;
+    in >> mcsize;   // number of Machine Code lists
+
+    ChannelID code;
+    qint64 ts1, ts2;
+    qint32 evcount;
+    EventListType elt;
+    EventDataType rate, gain, offset, mn, mx;
+    qint16 size2;
+    QVector<ChannelID> mcorder;
+    QVector<qint16> sizevec;
+    QString dim;
+
+    for (int i = 0; i < mcsize; i++) {
+        if (version < 8) {
+            QString txt;
+            in >> txt;
+            code = schema::channel[txt].id();
+        } else {
+            in >> code;
+        }
+
+        mcorder.push_back(code);
+        in >> size2;
+        sizevec.push_back(size2);
+
+        for (int j = 0; j < size2; j++) {
+            in >> ts1;
+            in >> ts2;
+            in >> evcount;
+            in >> t8;
+            elt = (EventListType)t8;
+            in >> rate;
+            in >> gain;
+            in >> offset;
+            in >> mn;
+            in >> mx;
+            in >> dim;
+            bool second_field = false;
+
+            if (version >= 7) { // version 7 added this field
+                in >> second_field;
+            }
+
+            EventList *elist = AddEventList(code, elt, gain, offset, mn, mx, rate, second_field);
+            elist->setDimension(dim);
+
+            //eventlist[code].push_back(elist);
+            elist->m_count = evcount;
+            elist->m_first = ts1;
+            elist->m_last = ts2;
+
+            if (second_field) {
+                EventDataType min, max;
+                in >> min;
+                in >> max;
+                elist->setMin2(min);
+                elist->setMax2(max);
+            }
+        }
+    }
+
+    //EventStoreType t;
+    //quint32 x;
+
+    for (int i = 0; i < mcsize; i++) {
+        code = mcorder[i];
+        size2 = sizevec[i];
+
+        for (int j = 0; j < size2; j++) {
+            EventList &evec = *eventlist[code][j];
+            evec.m_data.resize(evec.m_count);
+            EventStoreType *ptr = evec.m_data.data();
+
+            // ****** This is assuming little endian ******
+
+            in.readRawData((char *)ptr, evec.m_count << 1);
+
+            //*** Don't delete these comments ***
+            //            for (quint32 c=0;c<evec.m_count;c++) {
+            //                in >> t;
+            //                *ptr++=t;
+            //            }
+            if (evec.hasSecondField()) {
+                evec.m_data2.resize(evec.m_count);
+                ptr = evec.m_data2.data();
+
+                in.readRawData((char *)ptr, evec.m_count << 1);
+                //*** Don't delete these comments ***
+                //                for (quint32 c=0;c<evec.m_count;c++) {
+                //                    in >> t;
+                //                    *ptr++=t;
+                //                }
+            }
+
+            if (evec.type() != EVL_Waveform) {
+                evec.m_time.resize(evec.m_count);
+                quint32 *tptr = evec.m_time.data();
+
+                in.readRawData((char *)tptr, evec.m_count << 2);
+                //*** Don't delete these comments ***
+                //                for (quint32 c=0;c<evec.m_count;c++) {
+                //                    in >> x;
+                //                    *tptr++=x;
+                //                }
+            }
+        }
+    }
+
+    if (version < events_version) {
+        qDebug() << "Upgrading Events file" << filename << "to version" << events_version;
+        UpdateSummaries();
+        StoreEvents();
+    }
+
+    return true;
+}
+
+void Session::destroyEvent(ChannelID code)
+{
+    QHash<ChannelID, QVector<EventList *> >::iterator it = eventlist.find(code);
+
+    if (it != eventlist.end()) {
+        for (int i = 0; i < it.value().size(); i++) {
+            delete it.value()[i];
+        }
+
+        eventlist.erase(it);
+    }
+
+    m_gain.erase(m_gain.find(code));
+    m_firstchan.erase(m_firstchan.find(code));
+    m_lastchan.erase(m_lastchan.find(code));
+    m_sph.erase(m_sph.find(code));
+    m_cph.erase(m_cph.find(code));
+    m_min.erase(m_min.find(code));
+    m_max.erase(m_max.find(code));
+    m_avg.erase(m_avg.find(code));
+    m_wavg.erase(m_wavg.find(code));
+    m_sum.erase(m_sum.find(code));
+    m_cnt.erase(m_cnt.find(code));
+    m_valuesummary.erase(m_valuesummary.find(code));
+    m_timesummary.erase(m_timesummary.find(code));
+    // does not trash settings..
+}
+
+void Session::updateCountSummary(ChannelID code)
+{
+    QHash<ChannelID, QVector<EventList *> >::iterator ev = eventlist.find(code);
+
+    if (ev == eventlist.end()) { return; }
+
+    QHash<ChannelID, QHash<EventStoreType, EventStoreType> >::iterator vs = m_valuesummary.find(code);
+
+    if (vs != m_valuesummary.end()) { // already calculated?
+        return;
+    }
+
+    QHash<EventStoreType, EventStoreType> valsum;
+    QHash<EventStoreType, quint32> timesum;
+
+    QHash<EventStoreType, EventStoreType>::iterator it;
+    QHash<EventStoreType, EventStoreType>::iterator valsum_end;
+
+    EventDataType raw, lastraw = 0;
+    qint64 start, time, lasttime = 0;
+    qint32 len, cnt;
+    quint32 *tptr;
+    EventStoreType *dptr, * eptr;
+
+    int ev_size=ev.value().size();
+    for (int i = 0; i < ev_size; i++) {
+        EventList &e = *(ev.value()[i]);
+        start = e.first();
+        cnt = e.count();
+        dptr = e.rawData();
+        eptr = dptr + cnt;
+
+        EventDataType rate = 0;
+
+        m_gain[code] = e.gain();
+
+        if (e.type() == EVL_Event) {
+            lastraw = *dptr++;
+            tptr = e.rawTime();
+            lasttime = start + *tptr++;
+            // Event version
+
+            for (; dptr < eptr; dptr++) {
+                time = start + *tptr++;
+                raw = *dptr;
+
+                valsum[raw]++;
+
+                // elapsed time in seconds since last event occurred
+                len = (time - lasttime) / 1000L;
+
+                timesum[lastraw] += len;
+
+                lastraw = raw;
+                lasttime = time;
+            }
+        } else {
+            // Waveform version, first just count
+            for (; dptr < eptr; dptr++) {
+                raw = *dptr;
+                valsum[raw]++;
+            }
+
+            // Then process the list of values, time is simply (rate * count)
+            rate = e.rate();
+            EventDataType t;
+
+            QHash<EventStoreType, EventStoreType>::iterator it = valsum.begin();
+            QHash<EventStoreType, EventStoreType>::iterator valsum_end = valsum.end();
+
+            for (; it != valsum_end; ++it) {
+                t = EventDataType(it.value()) * rate;
+                timesum[it.key()] += t;
+            }
+        }
+    }
+
+    if (valsum.size() == 0) { return; }
+
+    m_valuesummary[code] = valsum;
+    m_timesummary[code] = timesum;
+}
+
+void Session::UpdateSummaries()
+{
+    ChannelID id;
+    calcAHIGraph(this);
+
+    // Calculates RespRate and related waveforms (Tv, MV, Te, Ti) if missing
+    calcRespRate(this);
+
+    calcLeaks(this);
+    flagLargeLeaks(this);
+
+    calcSPO2Drop(this);
+    calcPulseChange(this);
+
+    QHash<ChannelID, QVector<EventList *> >::iterator c = eventlist.begin();
+    QHash<ChannelID, QVector<EventList *> >::iterator ev_end = eventlist.end();
+
+    m_availableChannels.clear();
+
+    for (; c != ev_end; c++) {
+        id = c.key();
+        m_availableChannels.push_back(id);
+
+        schema::ChanType ctype = schema::channel[id].type();
+        if (ctype != schema::SETTING) {
+            //sum(id); // avg calculates this and cnt.
+            if (c.value().size() > 0) {
+                EventList *el = c.value()[0];
+                EventDataType gain = el->gain();
+                m_gain[id] = gain;
+            }
+
+            if (!((id == CPAP_FlowRate) || (id == CPAP_MaskPressureHi) || (id == CPAP_RespEvent)
+                    || (id == CPAP_MaskPressure))) {
+                updateCountSummary(id);
+            }
+
+            Min(id);
+            Max(id);
+            count(id);
+            last(id);
+            first(id);
+
+            if (((id == CPAP_FlowRate)
+                 || (id == CPAP_MaskPressureHi)
+                 || (id == CPAP_RespEvent)
+                 || (id == CPAP_MaskPressure))) {
+                continue;
+            }
+
+            cph(id);
+            sph(id);
+            avg(id);
+            wavg(id);
+        }
+    }
+    timeAboveThreshold(CPAP_Leak, p_profile->cpap->leakRedline());
+
+    s_machine->updateChannels(this);
+}
+
+EventDataType Session::SearchValue(ChannelID code, qint64 time, bool square)
+{
+    qint64 t1, t2, start;
+    QHash<ChannelID, QVector<EventList *> >::iterator it;
+    it = eventlist.find(code);
+    quint32 *tptr;
+    int cnt;
+
+    EventDataType a,b,c,d,e;
+    if (it != eventlist.end()) {
+        int el_size=it.value().size();
+        for (int i = 0; i < el_size; i++)  {
+            EventList *el = it.value()[i];
+            if ((time >= el->first()) && (time < el->last())) {
+                cnt = el->count();
+
+                if (el->type() == EVL_Waveform) {
+                    qint64 tt = time - el->first();
+
+                    double i = tt / el->rate();
+
+                    int i1 = int(floor(i));
+                    int i2 = int(ceil(i));
+
+                    a = el->data(i1);
+
+                    if (i2 >= cnt) { return a; }
+
+                    qint64 t1 = i1 * el->rate();
+                    qint64 t2 = i2 * el->rate();
+
+                    c = EventDataType(t2 - t1);
+                    if (c == 0) return 0;
+                    d = EventDataType(t2 - tt);
+
+                    e = d/c;
+                    b = el->data(i2);
+
+                    return b + ((a-b) * e);
+
+                } else {
+                    start = el->first();
+                    tptr = el->rawTime();
+                    // TODO: square plots need fixing
+                    if (square) {
+                        for (int j = 0; j < cnt-1; ++j) {
+                            tptr++;
+                            t2 = start + *tptr;
+                            if (t2 > time) {
+                                return el->data(j);
+                            }
+                        }
+                    } else {
+                        for (int j = 0; j < cnt-1; ++j) {
+                            tptr++;
+                            t2 = start + *tptr;
+                            if (t2 > time) {
+                                tptr--;
+                                t1 = start + *tptr;
+                                c = EventDataType(t2 - t1);
+                                d = EventDataType(t2 - time);
+                                e = d/c;
+                                a = el->data(j);
+                                b = el->data(j+1);
+                                if (a == b) {
+                                    return a;
+                                } else {
+                                    return b + ((a-b) * e);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    return 0;
+}
+
+QString Session::dimension(ChannelID id)
+{
+    // Cheat for now
+    return schema::channel[id].units();
+}
+
+EventDataType Session::Min(ChannelID id)
+{
+    QHash<ChannelID, EventDataType>::iterator i = m_min.find(id);
+
+    if (i != m_min.end()) {
+        return i.value();
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        m_min[id] = 0;
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+
+    bool first = true;
+    EventDataType min = 0, t1;
+
+    int evec_size = evec.size();
+
+    for (int i = 0; i < evec_size; ++i) {
+        if (evec[i]->count() != 0) {
+            t1 = evec[i]->Min();
+
+            if ((t1 == 0) && (t1 == evec[i]->Max())) { continue; }
+
+            if (first) {
+                min = t1;
+                first = false;
+            } else {
+                if (min > t1) { min = t1; }
+            }
+        }
+    }
+
+    m_min[id] = min;
+    return min;
+}
+
+EventDataType Session::Max(ChannelID id)
+{
+    QHash<ChannelID, EventDataType>::iterator i = m_max.find(id);
+
+    if (i != m_max.end()) {
+        return i.value();
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        m_max[id] = 0;
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+
+    bool first = true;
+    EventDataType max = 0, t1;
+
+    int evec_size=evec.size();
+
+    for (int i = 0; i < evec_size; ++i) {
+        if (evec.at(i)->count() != 0) {
+            t1 = evec.at(i)->Max();
+
+            if (t1 == 0 && t1 == evec.at(i)->Min()) { continue; }
+
+            if (first) {
+                max = t1;
+                first = false;
+            } else {
+                if (max < t1) { max = t1; }
+            }
+        }
+    }
+
+    m_max[id] = max;
+    return max;
+}
+
+////
+EventDataType Session::physMin(ChannelID id)
+{
+    QHash<ChannelID, EventDataType>::iterator i = m_physmin.find(id);
+
+    if (i != m_physmin.end()) {
+        return i.value();
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        m_physmin[id] = 0;
+        return 0;
+    }
+
+    EventDataType min = floor(Min(id));
+    m_physmin[id] = min;
+    return min;
+}
+
+EventDataType Session::physMax(ChannelID id)
+{
+    QHash<ChannelID, EventDataType>::iterator i = m_physmax.find(id);
+
+    if (i != m_physmax.end()) {
+        return i.value();
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        m_physmax[id] = 0;
+        return 0;
+    }
+
+    EventDataType max = ceil(Max(id) + 0.5);
+    m_physmax[id] = max;
+    return max;
+}
+
+
+qint64 Session::first(ChannelID id)
+{
+    qint64 drift = qint64(p_profile->cpap->clockDrift()) * 1000L;
+    qint64 tmp;
+    QHash<ChannelID, quint64>::iterator i = m_firstchan.find(id);
+
+    if (i != m_firstchan.end()) {
+        tmp = i.value();
+
+        if (s_machine->type() == MT_CPAP) {
+            tmp += drift;
+        }
+
+        return tmp;
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+
+    bool first = true;
+    qint64 min = 0, t1;
+
+    int evec_size=evec.size();
+    for (int i = 0; i < evec_size; ++i) {
+        t1 = evec[i]->first();
+
+        if (first) {
+            min = t1;
+            first = false;
+        } else {
+            if (min > t1) { min = t1; }
+        }
+    }
+
+    m_firstchan[id] = min;
+
+    if (s_machine->type() == MT_CPAP) {
+        min += drift;
+    }
+
+    return min;
+}
+qint64 Session::last(ChannelID id)
+{
+    qint64 drift = qint64(p_profile->cpap->clockDrift()) * 1000L;
+    qint64 tmp;
+    QHash<ChannelID, quint64>::iterator i = m_lastchan.find(id);
+
+    if (i != m_lastchan.end()) {
+        tmp = i.value();
+
+        if (s_machine->type() == MT_CPAP) {
+            tmp += drift;
+        }
+
+        return tmp;
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+
+    bool first = true;
+    qint64 max = 0, t1;
+
+    int evec_size=evec.size();
+
+    for (int i = 0; i < evec_size; ++i) {
+        t1 = evec[i]->last();
+
+        if (first) {
+            max = t1;
+            first = false;
+        } else {
+            if (max < t1) { max = t1; }
+        }
+    }
+
+    m_lastchan[id] = max;
+
+    if (s_machine->type() == MT_CPAP) {
+        max += drift;
+    }
+
+    return max;
+}
+bool Session::channelDataExists(ChannelID id)
+{
+    if (s_events_loaded) {
+        QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+        if (j == eventlist.end()) { // eventlist not loaded.
+            return false;
+        }
+
+        return true;
+    } else {
+        qDebug() << "Calling channelDataExists without open eventdata!";
+    }
+
+    return false;
+}
+bool Session::channelExists(ChannelID id)
+{
+    if (!enabled()) { return false; }
+
+    if (s_events_loaded) {
+        QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+        if (j == eventlist.end()) { // eventlist not loaded.
+            return false;
+        }
+    } else {
+        QHash<ChannelID, EventDataType>::iterator q = m_cnt.find(id);
+
+        if (q == m_cnt.end()) {
+            return false;
+        }
+
+        if (q.value() == 0) { return false; }
+    }
+
+    return true;
+}
+
+EventDataType Session::countInsideSpan(ChannelID span, ChannelID code)
+{
+    // TODO: Cache me!
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(span);
+
+    if (j == eventlist.end()) {
+        return 0;
+    }
+    QVector<EventList *> &evec = j.value();
+
+    qint64 t1,t2;
+
+    int evec_size=evec.size();
+
+    QList<qint64> start;
+    QList<qint64> end;
+
+    // Simplify the span flags to start and end times list
+    for (int el = 0; el < evec_size; ++el) {
+        EventList &ev = *evec[el];
+
+        for (quint32 i=0; i < ev.count(); ++i) {
+            end.push_back(t2=ev.time(i));
+            start.push_back(t2 - (qint64(ev.data(i)) * 1000L));
+        }
+    }
+
+    j = eventlist.find(code);
+
+    if (j == eventlist.end()) {
+        return 0;
+    }
+    QVector<EventList *> &evec2 = j.value();
+    evec_size=evec2.size();
+    int count = 0;
+
+    int spans = start.size();
+
+    for (int el = 0; el < evec_size; ++el) {
+        EventList &ev = *evec2[el];
+
+        for (quint32 i=0; i < ev.count(); ++i) {
+            t1 = ev.time(i);
+            for (int z=0; z < spans; ++z) {
+                if ((t1 >= start.at(z)) && (t1 <= end.at(z))) {
+                    count++;
+                    break;
+                }
+            }
+        }
+    }
+    return count;
+}
+
+EventDataType Session::rangeCount(ChannelID id, qint64 first, qint64 last)
+{
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+    int total = 0, cnt;
+
+    qint64 t, start;
+
+    int evec_size=evec.size();
+
+    for (int i = 0; i < evec_size; ++i) {
+        EventList &ev = *evec[i];
+
+        if ((ev.last() < first) || (ev.first() > last)) {
+            continue;
+        }
+
+        if (ev.type() == EVL_Waveform) {
+            qint64 et = last;
+
+            if (et > ev.last()) {
+                et = ev.last();
+            }
+
+            qint64 st = first;
+
+            if (st < ev.first()) {
+                st = ev.first();
+            }
+
+            t = (et - st) / ev.rate();
+            total += t;
+        } else {
+            cnt = ev.count();
+            start = ev.first();
+            quint32 *tptr = ev.rawTime();
+            quint32 *eptr = tptr + cnt;
+
+            for (; tptr < eptr; tptr++) {
+                t = start + *tptr;
+
+                if (t >= first) {
+                    if (t <= last) {
+                        total++;
+                    } else { break; }
+                }
+            }
+        }
+    }
+
+    return (EventDataType)total;
+}
+
+double Session::rangeSum(ChannelID id, qint64 first, qint64 last)
+{
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+    double sum = 0, gain;
+
+    qint64 t, start;
+    EventStoreType *dptr, * eptr;
+    quint32 *tptr;
+    int cnt, idx = 0;
+
+    qint64 rate;
+
+    int evec_size=evec.size();
+
+    for (int i = 0; i < evec_size; i++) {
+        EventList &ev = *evec[i];
+
+        if ((ev.last() < first) || (ev.first() > last)) {
+            continue;
+        }
+
+        start = ev.first();
+        dptr = ev.rawData();
+        cnt = ev.count();
+        eptr = dptr + cnt;
+        gain = ev.gain();
+        rate = ev.rate();
+
+        if (ev.type() == EVL_Waveform) {
+            if (first > ev.first()) {
+                // Skip the samples before first
+                idx = (first - ev.first()) / rate;
+            }
+
+            dptr += idx; //???? foggy.
+
+            t = start;
+
+            for (; dptr < eptr; dptr++) { //int j=idx;j<cnt;j++) {
+                if (t <= last) {
+                    sum += EventDataType(*dptr) * gain;
+                } else { break; }
+
+                t += rate;
+            }
+        } else {
+            tptr = ev.rawTime();
+
+            for (; dptr < eptr; dptr++) {
+                t = start + *tptr++;
+
+                if (t >= first) {
+                    if (t <= last) {
+                        sum += EventDataType(*dptr) * gain;
+                    } else { break; }
+                }
+            }
+        }
+    }
+
+    return sum;
+}
+EventDataType Session::rangeMin(ChannelID id, qint64 first, qint64 last)
+{
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+    EventDataType gain, v, min = std::numeric_limits<EventDataType>::max();
+
+    qint64 t, start, rate;
+    EventStoreType *dptr, * eptr;
+    quint32 *tptr;
+    int cnt, idx;
+
+    int evec_size=evec.size();
+
+    for (int i = 0; i < evec_size; ++i) {
+        EventList &ev = *evec[i];
+
+        if ((ev.last() < first) || (ev.first() > last)) {
+            continue;
+        }
+
+        dptr = ev.rawData();
+        start = ev.first();
+        cnt = ev.count();
+        eptr = dptr + cnt;
+        gain = ev.gain();
+
+        if (ev.type() == EVL_Waveform) {
+            rate = ev.rate();
+            t = start;
+            idx = 0;
+
+            if (first > ev.first()) {
+                // Skip the samples before first
+                idx = (first - ev.first()) / rate;
+            }
+
+            dptr += idx;
+
+            for (; dptr < eptr; dptr++) { //int j=idx;j<cnt;j++) {
+                if (t <= last) {
+                    v = EventDataType(*dptr) * gain;
+
+                    if (v < min) {
+                        min = v;
+                    }
+                } else { break; }
+
+                t += rate;
+            }
+        } else {
+            tptr = ev.rawTime();
+
+            for (; dptr < eptr; dptr++) { //int j=0;j<cnt;j++) {
+                t = start + *tptr++;
+
+                if (t >= first) {
+                    if (t <= last) {
+                        v = EventDataType(*dptr) * gain;
+
+                        if (v < min) {
+                            min = v;
+                        }
+                    } else { break; }
+                }
+            }
+        }
+    }
+
+    return min;
+}
+
+EventDataType Session::rangeMax(ChannelID id, qint64 first, qint64 last)
+{
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+    EventDataType gain, v, max = std::numeric_limits<EventDataType>::min();
+
+    qint64 t, start, rate;
+    EventStoreType *dptr, * eptr;
+    quint32 *tptr;
+    int cnt, idx;
+
+    int evec_size=evec.size();
+
+    for (int i = 0; i < evec_size; i++) {
+        EventList &ev = *evec[i];
+
+        if ((ev.last() < first) || (ev.first() > last)) {
+            continue;
+        }
+
+        start = ev.first();
+        dptr = ev.rawData();
+        cnt = ev.count();
+        eptr = dptr + cnt;
+        gain = ev.gain();
+
+        if (ev.type() == EVL_Waveform) {
+            rate = ev.rate();
+            t = start;
+            idx = 0;
+
+            if (first > ev.first()) {
+                // Skip the samples before first
+                idx = (first - ev.first()) / rate;
+            }
+
+            dptr += idx;
+
+            for (; dptr < eptr; dptr++) { //int j=idx;j<cnt;j++) {
+                if (t <= last) {
+                    v = EventDataType(*dptr) * gain;
+
+                    if (v > max) { max = v; }
+                } else { break; }
+
+                t += rate;
+            }
+        } else {
+            tptr = ev.rawTime();
+
+            for (; dptr < eptr; dptr++) {
+                t = start + *tptr++;
+
+                if (t >= first) {
+                    if (t <= last) {
+                        v = EventDataType(*dptr) * gain;
+
+                        if (v > max) { max = v; }
+                    } else { break; }
+                }
+            }
+        }
+    }
+
+    return max;
+}
+
+EventDataType Session::count(ChannelID id)
+{
+    QHash<ChannelID, EventDataType>::iterator i = m_cnt.find(id);
+
+    if (i != m_cnt.end()) {
+        return i.value();
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+//        m_cnt[id] = 0;
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+
+    int sum = 0;
+    int evec_size=evec.size();
+    if (evec_size == 0)
+        return 0;
+
+    for (int i = 0; i < evec_size; ++i) {
+        sum += evec.at(i)->count();
+    }
+
+    m_cnt[id] = sum;
+    return sum;
+}
+
+double Session::sum(ChannelID id)
+{
+    QHash<ChannelID, double>::iterator i = m_sum.find(id);
+
+    if (i != m_sum.end()) {
+        return i.value();
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        m_sum[id] = 0;
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+
+    double gain, sum = 0;
+    EventStoreType *dptr, * eptr;
+    int cnt;
+
+    int evec_size=evec.size();
+
+    for (int i = 0; i < evec_size; ++i) {
+        EventList &ev = *(evec[i]);
+        gain = ev.gain();
+        cnt = ev.count();
+        dptr = ev.rawData();
+        eptr = dptr + cnt;
+
+        for (; dptr < eptr; dptr++) {
+            sum += double(*dptr) * gain;
+        }
+    }
+
+    m_sum[id] = sum;
+    return sum;
+}
+
+EventDataType Session::avg(ChannelID id)
+{
+    QHash<ChannelID, EventDataType>::iterator i = m_avg.find(id);
+
+    if (i != m_avg.end()) {
+        return i.value();
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+
+    if (j == eventlist.end()) {
+        m_avg[id] = 0;
+        return 0;
+    }
+
+    QVector<EventList *> &evec = j.value();
+
+    double val = 0, gain;
+    int cnt = 0;
+    EventStoreType *dptr, * eptr;
+    int evec_size=evec.size();
+
+    for (int i = 0; i < evec_size; ++i) {
+        EventList &ev = *(evec[i]);
+        dptr = ev.rawData();
+        gain = ev.gain();
+        cnt = ev.count();
+        eptr = dptr + cnt;
+
+        for (; dptr < eptr; dptr++) {
+            val += double(*dptr) * gain;
+        }
+    }
+
+    if (cnt > 0) { // Shouldn't really happen.. Should aways contain data
+        val /= double(cnt);
+    }
+
+    m_avg[id] = val;
+    return val;
+}
+EventDataType Session::cph(ChannelID id) // count per hour
+{
+    QHash<ChannelID, EventDataType>::iterator i = m_cph.find(id);
+
+    if (i != m_cph.end()) {
+        return i.value();
+    }
+
+    EventDataType val = count(id);
+    val /= hours();
+
+    m_cph[id] = val;
+    return val;
+}
+EventDataType Session::sph(ChannelID id) // sum per hour, assuming id is a time field in seconds
+{
+    QHash<ChannelID, EventDataType>::iterator i = m_sph.find(id);
+
+    if (i != m_sph.end()) {
+        return i.value();
+    }
+
+    EventDataType val = sum(id) / 3600.0;
+    val = 100.0 / hours() * val;
+    m_sph[id] = val;
+    return val;
+}
+
+EventDataType Session::timeAboveThreshold(ChannelID id, EventDataType threshold)
+{
+    QHash<ChannelID, EventDataType>::iterator th = m_upperThreshold.find(id);
+    if (th != m_upperThreshold.end()) {
+        if (fabs(th.value()-threshold) < 0.00000001) { // close enough
+            th = m_timeAboveTheshold.find(id);
+            if (th != m_timeAboveTheshold.end()) {
+                return th.value();
+            }
+        }
+    }
+    bool loaded = s_events_loaded;
+
+    OpenEvents();
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+    if (j == eventlist.end()) {
+        if (!loaded) {
+            TrashEvents();
+        }
+        return 0.0f;
+    }
+
+    QVector<EventList *> &evec = j.value();
+    int evec_size=evec.size();
+
+    qint64 ti, started=0, total=0;
+    EventDataType data;
+    int elsize;
+    for (int i = 0; i < evec_size; ++i) {
+        EventList &ev = *(evec[i]);
+        elsize = ev.count();
+
+        for (int j=0; j < elsize; ++j) {
+            ti=ev.time(j);
+            data=ev.data(j);
+
+            if (started == 0) {
+                if (data >= threshold) {
+                    started=ti;
+                }
+            } else {
+                if (data < threshold) {
+                    total += ti-started;
+                    started = 0;
+                }
+            }
+        }
+    }
+    if (started) {
+        total += ti-started;
+    }
+    EventDataType time = double(total) / 60000.0;
+
+    m_timeAboveTheshold[id] = time;
+    m_upperThreshold[id] = threshold;
+    if (!loaded) this->TrashEvents(); // otherwise leave it open
+    return time;
+}
+
+EventDataType Session::timeBelowThreshold(ChannelID id, EventDataType threshold)
+{
+    QHash<ChannelID, EventDataType>::iterator th = m_lowerThreshold.find(id);
+    if (th != m_lowerThreshold.end()) {
+        if (fabs(th.value()-threshold) < 0.00000001) { // close enough
+            th = m_timeBelowTheshold.find(id);
+            if (th != m_timeBelowTheshold.end()) {
+                return th.value();
+            }
+        }
+    }
+    bool loaded = s_events_loaded;
+
+    QHash<ChannelID, QVector<EventList *> >::iterator j = eventlist.find(id);
+    if (j == eventlist.end()) {
+        return 0.0f;
+    }
+
+    QVector<EventList *> &evec = j.value();
+    int evec_size=evec.size();
+
+    qint64 ti, started=0, total=0;
+    EventDataType data;
+    int elsize;
+    for (int i = 0; i < evec_size; ++i) {
+        EventList &ev = *(evec[i]);
+        elsize = ev.count();
+
+        for (int j=0; j < elsize; ++j) {
+            ti=ev.time(j);
+            data=ev.data(j);
+
+            if (started == 0) {
+                if (data <= threshold) {
+                    started=ti;
+                }
+            } else {
+                if (data > threshold) {
+                    total += ti-started;
+                    started = 0;
+                }
+            }
+        }
+    }
+
+    if (started) {
+        total += ti-started;
+    }
+
+    EventDataType time = double(total) / 60000.0;
+
+    m_timeBelowTheshold[id] = time;
+    m_lowerThreshold[id] = threshold;
+    if (!loaded) this->TrashEvents(); // otherwise leave it open
+
+    return time;
+}
+
+
+bool sortfunction(EventStoreType i, EventStoreType j) { return (i < j); }
+
+EventDataType Session::percentile(ChannelID id, EventDataType percent)
+{
+    QHash<ChannelID, QVector<EventList *> >::iterator jj = eventlist.find(id);
+
+    if (jj == eventlist.end()) {
+        return 0;
+    }
+
+    QVector<EventList *> &evec = jj.value();
+
+    if (percent > 1.0) {
+        qWarning() << "Session::percentile() called with > 1.0";
+        return 0;
+    }
+
+    int evec_size = evec.size();
+
+    if (evec_size == 0) {
+        return 0;
+    }
+
+    QVector<EventStoreType> array;
+
+    EventDataType gain = evec[0]->gain();
+
+    EventStoreType *dptr, * sptr, *eptr;
+
+    int tt = 0, cnt = 0;
+
+    for (int i = 0; i < evec_size; ++i) {
+        EventList &ev = *evec[i];
+        cnt = ev.count();
+        tt += cnt;
+    }
+
+    array.resize(tt);
+
+    for (int i = 0; i < evec_size; ++i) {
+        EventList &ev = *evec[i];
+        sptr = ev.rawData();
+        dptr = array.data();
+
+        eptr = sptr + cnt;
+
+        for (; sptr < eptr; sptr++) {
+            *dptr++ = * sptr;
+        }
+    }
+
+    int n = array.size() * percent;
+
+    if (n > array.size() - 1) { n--; }
+
+    nth_element(array.begin(), array.begin() + n, array.end());
+
+    // slack, no averaging.. fixme if this function is ever used..
+    return array[n] * gain;
+}
+
+EventDataType Session::wavg(ChannelID id)
+{
+    QHash<EventStoreType, quint32> vtime;
+    QHash<ChannelID, EventDataType>::iterator i = m_wavg.find(id);
+
+    if (i != m_wavg.end()) {
+        return i.value();
+    }
+
+    updateCountSummary(id);
+
+    QHash<ChannelID, QHash<EventStoreType, quint32> >::iterator j2 = m_timesummary.find(id);
+
+    if (j2 == m_timesummary.end()) {
+        return 0;
+    }
+
+    QHash<EventStoreType, quint32> &timesum = j2.value();
+
+    if (!m_gain.contains(id)) {
+        return 0;
+    }
+
+    double s0 = 0, s1 = 0, s2;
+
+    EventDataType val, gain = m_gain[id];
+
+    QHash<EventStoreType, quint32>::iterator vi = timesum.begin();
+    QHash<EventStoreType, quint32>::iterator ts_end = timesum.end();
+
+    for (; vi != ts_end; vi++) {
+        val = vi.key() * gain;
+        s2 = vi.value();
+        s0 += s2;
+        s1 += val * s2;
+    }
+
+    if (s0 > 0) {
+        val = s1 / s0;
+    } else { val = 0; }
+
+    m_wavg[id] = val;
+    return val;
+}
+
+EventList *Session::AddEventList(ChannelID code, EventListType et, EventDataType gain,
+                                 EventDataType offset, EventDataType min, EventDataType max, EventDataType rate, bool second_field)
+{
+    schema::Channel *channel = &schema::channel[code];
+
+    if (!channel) {
+        qWarning() << "Channel" << code << "does not exist!";
+        //return nullptr;
+    }
+
+    EventList *el = new EventList(et, gain, offset, min, max, rate, second_field);
+
+    eventlist[code].push_back(el);
+    //s_machine->registerChannel(chan);
+    return el;
+}
+void Session::offsetSession(qint64 offset)
+{
+    //qDebug() << "Session starts" << QDateTime::fromTime_t(s_first/1000).toString("yyyy-MM-dd HH:mm:ss");
+    s_first += offset;
+    s_last += offset;
+    QHash<ChannelID, quint64>::iterator it;
+
+    QHash<ChannelID, quint64>::iterator end;
+
+    it = m_firstchan.begin();
+    end = m_firstchan.end();
+    for (; it != end; it++) {
+        if (it.value() > 0) {
+            it.value() += offset;
+        }
+    }
+
+    it = m_lastchan.begin();
+    end = m_lastchan.end();
+    for (; it != end; it++) {
+        if (it.value() > 0) {
+            it.value() += offset;
+        }
+    }
+
+    QHash<ChannelID, QVector<EventList *> >::iterator i;
+    QHash<ChannelID, QVector<EventList *> >::iterator el_end=eventlist.end();
+
+    int el_s;
+
+    for (i = eventlist.begin(); i != el_end; i++) {
+        el_s=i.value().size();
+        for (int j = 0; j < el_s; j++) {
+            EventList *e = i.value()[j];
+
+            e->setFirst(e->first() + offset);
+            e->setLast(e->last() + offset);
+        }
+    }
+
+    qDebug() << "Session now starts" << QDateTime::fromTime_t(s_first /
+             1000).toString("yyyy-MM-dd HH:mm:ss");
+
+}
+
+qint64 Session::first()
+{
+    qint64 start = s_first;
+
+    if (s_machine->type() == MT_CPAP) {
+        start += qint64(p_profile->cpap->clockDrift()) * 1000L;
+    }
+
+    return start;
+}
+
+qint64 Session::last()
+{
+    qint64 last = s_last;
+
+    if (s_machine->type() == MT_CPAP) {
+        last += qint64(p_profile->cpap->clockDrift()) * 1000L;
+    }
+
+    return last;
+}
diff --git a/sleepyhead/SleepLib/session.h b/sleepyhead/SleepLib/session.h
new file mode 100644
index 0000000..a072a5a
--- /dev/null
+++ b/sleepyhead/SleepLib/session.h
@@ -0,0 +1,443 @@
+/* SleepLib Session Header
+ *
+ * This stuff contains the session calculation smarts
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef SESSION_H
+#define SESSION_H
+
+#define SESSION_DEBUG
+
+#include <QDebug>
+#include <QHash>
+#include <QVector>
+
+#include "SleepLib/machine.h"
+#include "SleepLib/schema.h"
+#include "SleepLib/event.h"
+//class EventList;
+class Machine;
+
+enum SliceStatus {
+    UnknownStatus=0, EquipmentOff, EquipmentLeaking, EquipmentOn
+};
+
+class SessionSlice
+{
+public:
+    SessionSlice() {
+        start = end = 0;
+        status = UnknownStatus;
+    }
+    SessionSlice(const SessionSlice & copy) {
+        start = copy.start;
+        end = copy.end;
+        status = copy.status;
+    }
+    SessionSlice(qint64 start, qint64 end, SliceStatus status):start(start), end(end), status(status) {}
+
+    qint64 start;
+    qint64 end;
+    SliceStatus status;
+};
+
+/*! \class Session
+    \brief Contains a single Sessions worth of machine event/waveform information.
+
+    This class also contains all the primary database logic for SleepLib
+    */
+class Session
+{
+    friend class Day;
+    friend class Machine;
+  public:
+    /*! \fn Session(Machine *,SessionID);
+        \brief Create a session object belonging to Machine, with supplied SessionID
+        If sessionID is 0, the next in sequence will be picked
+        */
+    Session(Machine *, SessionID);
+    virtual ~Session();
+
+    inline bool checkInside(qint64 time) {
+        return ((time >= s_first) && (time <= s_last));
+    }
+
+    //! \brief Stores the session in the directory supplied by path
+    bool Store(QString path);
+
+    //! \brief Writes the Sessions Summary Indexes to filename, in SleepLibs custom data format.
+    bool StoreSummary();
+
+//    //! \brief Save the Sessions Summary Indexes to the stream
+//    void StoreSummaryData(QDataStream & out) const;
+
+    //! \brief Writes the Sessions EventLists to filename, in SleepLibs custom data format.
+    bool StoreEvents();
+
+    //bool Load(QString path);
+
+//    //! \brief Loads the Sessions Summary Indexes from stream
+//    void LoadSummaryData(QDataStream & in);
+
+    //! \brief Loads the Sessions Summary Indexes from filename, from SleepLibs custom data format.
+    bool LoadSummary();
+
+    //! \brief Loads the Sessions EventLists from filename, from SleepLibs custom data format.
+    bool LoadEvents(QString filename);
+
+    //! \brief Loads the events for this session when requested (only the summaries are loaded at startup)
+    bool OpenEvents();
+
+    //! \brief Put the events away until needed again, freeing memory
+    void TrashEvents();
+
+    //! \brief Returns true if session contains an empty duration
+    inline bool isEmpty() { return (s_first == s_last); }
+
+    //! \brief Search for Event code happening at supplied time (ms since epoch)
+    EventDataType SearchValue(ChannelID code, qint64 time, bool square);
+
+    //! \brief Return the sessionID
+    inline const SessionID &session() {
+        return s_session;
+    }
+
+    //! \brief Returns whether or not session is being used.
+    inline bool enabled() const { return s_enabled; }
+
+    //! \brief Sets whether or not session is being used.
+    void setEnabled(bool b) { s_enabled = b; }
+
+    inline qint64 realFirst() const { return s_first; }
+    inline qint64 realLast() const { return s_last; }
+
+    //! \brief Return the start of this sessions time range (in milliseconds since epoch)
+    qint64 first();
+
+    //! \brief Return the end of this sessions time range (in milliseconds since epoch)
+    qint64 last();
+
+    //! \brief Return the millisecond length of this session
+    qint64 length() {
+        return s_last - s_first;
+//        qint64 t;
+//        int size = m_slices.size();
+//        if (size == 0) {
+//            t = (s_last - s_first);
+//        } else {
+//            t = 0;
+//            for (int i=0; i<size; ++i) {
+//                const SessionSlice & slice = m_slices.at(i);
+//                if (slice.status == EquipmentOn) {
+//                    t += slice.end - slice.start;
+//                }
+//            }
+//        }
+
+//        return t;
+    }
+
+    //! \brief Set this Sessions ID (Not does not update indexes)
+    void SetSessionID(SessionID s) {
+        s_session = s;
+    }
+
+    //! \brief Moves all of this session data by offset d milliseconds
+    void offsetSession(qint64 d);
+
+    //! \brief Just set the start of the timerange without comparing
+    void really_set_first(qint64 d) { s_first = d; }
+
+    //! \brief Just set the end of the timerange without comparing
+    void really_set_last(qint64 d) { s_last = d; }
+
+    void set_first(qint64 d) {
+        if (!s_first) { s_first = d; }
+        else if (d < s_first) { s_first = d; }
+    }
+    void set_last(qint64 d) {
+        if (d <= s_first) {
+            qWarning() << "Session::set_last() d<=s_first";
+            return;
+        }
+
+        if (!s_last) { s_last = d; }
+        else if (s_last < d) { s_last = d; }
+    }
+
+    //! \brief Return Session Length in decimal hours
+    double hours() {
+        double t;
+        int size = m_slices.size();
+        if (size == 0) {
+            t = (s_last - s_first) / 3600000.0;
+        } else {
+            t = 0;
+            for (int i=0; i<size; ++i) {
+                const SessionSlice & slice = m_slices.at(i);
+                if (slice.status == EquipmentOn) {
+                    t += slice.end - slice.start;
+                }
+            }
+        }
+        return t;
+    }
+
+    //! \brief Flag this Session as dirty, so Machine object can save it
+    void SetChanged(bool val) {
+        s_changed = val;
+        s_events_loaded = val; // dirty hack putting this here
+    }
+
+    //! \brief Return this Sessions dirty status
+    bool IsChanged() {
+        return s_changed;
+    }
+
+    //! \brief Return the unit type string used by events of supplied channel
+    QString dimension(ChannelID);
+
+
+    //! \brief Contains all the EventLists, indexed by ChannelID
+    QHash<ChannelID, QVector<EventList *> > eventlist;
+
+    //! \brief Sessions Settings List, contianing single settings for this session.
+    QHash<ChannelID, QVariant> settings;
+
+    // Session caches
+    QHash<ChannelID, EventDataType> m_cnt;
+    QHash<ChannelID, double> m_sum;
+    QHash<ChannelID, EventDataType> m_avg;
+    QHash<ChannelID, EventDataType> m_wavg;
+
+    QHash<ChannelID, EventDataType> m_min; // The actual minimum
+    QHash<ChannelID, EventDataType> m_max;
+
+    // This could go in channels, but different machines interpret it differently
+    // Under the new SleepyLib data Device model this can be done, but unfortunately not here..
+    QHash<ChannelID, EventDataType> m_physmin; // The physical minimum for graph display purposes
+    QHash<ChannelID, EventDataType> m_physmax; // The physical maximum
+
+    QHash<ChannelID, EventDataType> m_cph; // Counts per hour (eg AHI)
+    QHash<ChannelID, EventDataType> m_sph; // % indice (eg % night in CSR)
+    QHash<ChannelID, quint64> m_firstchan;
+    QHash<ChannelID, quint64> m_lastchan;
+
+    QHash<ChannelID, QHash<EventStoreType, EventStoreType> > m_valuesummary;
+    QHash<ChannelID, QHash<EventStoreType, quint32> > m_timesummary;
+    QHash<ChannelID, EventDataType> m_gain;
+
+    QHash<ChannelID, EventDataType> m_lowerThreshold;
+    QHash<ChannelID, EventDataType> m_timeBelowTheshold;
+    QHash<ChannelID, EventDataType> m_upperThreshold;
+    QHash<ChannelID, EventDataType> m_timeAboveTheshold;
+
+    QList<ChannelID> m_availableChannels;
+    QList<ChannelID> m_availableSettings;
+
+    QVector<SessionSlice> m_slices;
+
+    //! \brief Generates sum and time data for each distinct value in 'code' events..
+    void updateCountSummary(ChannelID code);
+
+    //! \brief Destroy any trace of event 'code', freeing any memory if loaded.
+    void destroyEvent(ChannelID code);
+
+    // UpdateSummaries may recalculate all these, but it may be faster setting upfront
+    void setCount(ChannelID id, EventDataType val) { m_cnt[id] = val; }
+    void setSum(ChannelID id, EventDataType val) { m_sum[id] = val; }
+    void setMin(ChannelID id, EventDataType val) { m_min[id] = val; }
+    void setMax(ChannelID id, EventDataType val) { m_max[id] = val; }
+    void setPhysMin(ChannelID id, EventDataType val) { m_physmin[id] = val; }
+    void setPhysMax(ChannelID id, EventDataType val) { m_physmax[id] = val; }
+    void updateMin(ChannelID id, EventDataType val) {
+        QHash<ChannelID, EventDataType>::iterator i = m_min.find(id);
+
+        if (i == m_min.end()) {
+            m_min[id] = val;
+        } else if (i.value() > val) {
+            i.value() = val;
+        }
+    }
+    void updateMax(ChannelID id, EventDataType val) {
+        QHash<ChannelID, EventDataType>::iterator i = m_max.find(id);
+
+        if (i == m_max.end()) {
+            m_max[id] = val;
+        } else if (i.value() < val) {
+            i.value() = val;
+        }
+    }
+
+    void setAvg(ChannelID id, EventDataType val) { m_avg[id] = val; }
+    void setWavg(ChannelID id, EventDataType val) { m_wavg[id] = val; }
+    //    void setMedian(ChannelID id,EventDataType val) { m_med[id]=val; }
+    //    void set90p(ChannelID id,EventDataType val) { m_90p[id]=val; }
+    //    void set95p(ChannelID id,EventDataType val) { m_95p[id]=val; }
+    void setCph(ChannelID id, EventDataType val) { m_cph[id] = val; }
+    void setSph(ChannelID id, EventDataType val) { m_sph[id] = val; }
+    void setFirst(ChannelID id, qint64 val) { m_firstchan[id] = val; }
+    void setLast(ChannelID id, qint64 val) { m_lastchan[id] = val; }
+
+    EventDataType count(ChannelID id);
+
+    //! \brief Returns the Count of all events of type id between time range
+    EventDataType rangeCount(ChannelID id, qint64 first, qint64 last);
+
+    //! \brief Returns the Sum of all events of type id between time range
+    double rangeSum(ChannelID id, qint64 first, qint64 last);
+
+    //! \brief Returns the minimum of events of type id between time range
+    EventDataType rangeMin(ChannelID id, qint64 first, qint64 last);
+
+    //! \brief Returns the maximum of events of type id between time range
+    EventDataType rangeMax(ChannelID id, qint64 first, qint64 last);
+
+    //! \brief Returns the count of code events inside span flag event durations
+    EventDataType countInsideSpan(ChannelID span, ChannelID code);
+
+    //! \brief Returns (and caches) the Sum of all events of type id
+    double sum(ChannelID id);
+
+    //! \brief Returns (and caches) the Average of all events of type id
+    EventDataType avg(ChannelID id);
+
+    //! \brief Returns (and caches) the Time Weighted Average of all events of type id
+    EventDataType wavg(ChannelID i);
+
+    //! \brief Returns (and caches) the Minimum of all events of type id
+    EventDataType Min(ChannelID id);
+
+    //! \brief Returns (and caches) the Maximum of all events of type id
+    EventDataType Max(ChannelID id);
+
+    //! \brief Returns (and caches) the Minimum of all events of type id
+    EventDataType physMin(ChannelID id);
+
+    //! \brief Returns (and caches) the Maximum of all events of type id
+    EventDataType physMax(ChannelID id);
+
+    //! \brief Returns (and caches) the 90th Percentile of all events of type id
+    EventDataType p90(ChannelID id);
+
+    //! \brief Returns (and caches) the 95th Percentile of all events of type id
+    EventDataType p95(ChannelID id);
+
+    //! \brief Returns (and caches) the Median (50th Perc) of all events of type id
+    EventDataType median(ChannelID id);
+
+    //! \brief Returns (and caches) the Count-Per-Hour of all events of type id
+    EventDataType cph(ChannelID id);
+
+    //! \brief Returns (and caches) the Sum-Per-Hour of all events of type id
+    EventDataType sph(ChannelID id);
+
+    //! \brief Returns (without caching) the requested Percentile of all events of type id
+    EventDataType percentile(ChannelID id, EventDataType percentile);
+
+    //! \brief Returns the amount of time (in decimal minutes) the Channel spent above the threshold
+    EventDataType timeAboveThreshold(ChannelID id, EventDataType threshold);
+
+    //! \brief Returns the amount of time (in decimal minutes) the Channel spent below the threshold
+    EventDataType timeBelowThreshold(ChannelID id, EventDataType threshold);
+
+    //! \brief Returns true if the channel has events loaded, or a record of a count for when they are not
+    bool channelExists(ChannelID name);
+
+    //! \brief Returns true if the channel has event data available (must be loaded first)
+    bool channelDataExists(ChannelID id);
+
+    bool IsLoneSession() { return s_lonesession; }
+    void SetLoneSession(bool b) { s_lonesession = b; }
+
+    bool eventsLoaded() { return s_events_loaded; }
+
+    //! \brief Update this sessions first time if it's less than the current record
+    inline void updateFirst(qint64 v) { if (!s_first) { s_first = v; } else if (s_first > v) { s_first = v; } }
+
+    //! \brief Update this sessions latest time if it's more than the current record
+    inline void updateLast(qint64 v) { if (!s_last) { s_last = v; } else if (s_last < v) { s_last = v; } }
+
+    //! \brief Returns (and caches) the first time for Channel code
+    qint64 first(ChannelID code);
+
+    //! \brief Returns (and caches) the last time for Channel code
+    qint64 last(ChannelID code);
+
+    //! \brief Regenerates the Session Index Caches, and calls the fun calculation functions
+    void UpdateSummaries();
+
+    //! \brief Creates and returns a new EventList for the supplied Channel code
+    EventList *AddEventList(ChannelID code, EventListType et, EventDataType gain = 1.0,
+                            EventDataType offset = 0.0, EventDataType min = 0.0, EventDataType max = 0.0,
+                            EventDataType rate = 0.0, bool second_field = false);
+
+    //! \brief Returns this sessions MachineID
+    Machine *machine() { return s_machine; }
+
+    //! \brief Returns true if session only contains summary data
+    inline bool summaryOnly() {
+        return s_summaryOnly;
+    }
+
+    inline void setSummaryOnly(bool b) {
+        s_summaryOnly = b;
+    }
+
+    void setOpened(bool b = true) {
+        s_events_loaded = b;
+        s_summary_loaded = b;
+    }
+
+    //! \brief Completely purges Session from memory and disk.
+    bool Destroy();
+
+    void wipeSummary() {
+        s_first = s_last = 0;
+        s_enabled = true;
+        m_cph.clear();
+        m_sum.clear();
+        m_cnt.clear();
+    }
+
+
+    QString eventFile() const;
+
+    MachineType type() { return s_machtype; }
+
+
+
+#if defined(SESSION_DEBUG)
+    QStringList session_files;
+#endif
+
+protected:
+    SessionID s_session;
+
+    Machine *s_machine;
+    qint64 s_first;
+    qint64 s_last;
+    bool s_changed;
+    bool s_lonesession;
+    bool s_evchecksum_checked;
+    bool _first_session;
+    bool s_summaryOnly;
+
+    bool s_summary_loaded;
+    bool s_events_loaded;
+    bool s_enabled;
+
+    // for debugging
+    bool destroyed;
+    MachineType s_machtype;
+};
+
+QDataStream & operator<<(QDataStream & out, const Session & session);
+QDataStream & operator>>(QDataStream & in, Session & session);
+
+#endif // SESSION_H
diff --git a/sleepyhead/UpdaterWindow.cpp b/sleepyhead/UpdaterWindow.cpp
new file mode 100644
index 0000000..755bb8f
--- /dev/null
+++ b/sleepyhead/UpdaterWindow.cpp
@@ -0,0 +1,688 @@
+/* UpdaterWindow
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#include <QMessageBox>
+#include <QResource>
+#include <QProgressBar>
+#include <QTimer>
+#include <QFile>
+#include <QDir>
+#include <QDate>
+#include <QDebug>
+#include <QXmlSimpleReader>
+#include <QCryptographicHash>
+#include <QDesktopWidget>
+
+#include "SleepLib/profiles.h"
+#include <quazip/quazip.h>
+#include <quazip/quazipfile.h>
+#include "UpdaterWindow.h"
+#include "ui_UpdaterWindow.h"
+#include "version.h"
+#include "mainwindow.h"
+#include "common_gui.h"
+
+extern MainWindow *mainwin;
+
+UpdaterWindow::UpdaterWindow(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::UpdaterWindow)
+{
+    ui->setupUi(this);
+
+
+    QDesktopWidget *desktop = QApplication::desktop();
+
+    int screenWidth = desktop->width(); // get width of screen
+    int screenHeight = desktop->height(); // get height of screen
+
+    QSize windowSize = size(); // size of our application window
+    int width = windowSize.width();
+    int height = windowSize.height();
+
+    // little computations
+    int x = (screenWidth - width) / 2;
+    int y = (screenHeight - height) / 2;
+    y -= 50;
+
+    // move window to desired coordinates
+    move(x, y);
+
+
+
+    requestmode = RM_None;
+    netmanager = new QNetworkAccessManager(this);
+    connect(netmanager, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFinished(QNetworkReply *)));
+    update = nullptr;
+    ui->stackedWidget->setCurrentIndex(0);
+}
+
+UpdaterWindow::~UpdaterWindow()
+{
+    disconnect(netmanager, SIGNAL(finished(QNetworkReply *)), this,
+               SLOT(replyFinished(QNetworkReply *)));
+    delete ui;
+}
+
+
+void UpdaterWindow::checkForUpdates()
+{
+    QString filename = QApplication::applicationDirPath() + "/update.xml";
+
+    // Check updates.xml file if it's still recent..
+    if (QFile::exists(filename)) {
+        QFileInfo fi(filename);
+        QDateTime created = fi.created();
+        int age = created.secsTo(QDateTime::currentDateTime());
+
+        if (age < 7200) {
+            QFile file(filename);
+            file.open(QFile::ReadOnly);
+            ParseUpdateXML(&file);
+            file.close();
+            return;
+        }
+    }
+
+    mainwin->Notify(tr("Checking for SleepyHead Updates"));
+
+    // language code?
+    update_url =
+        QUrl("http://sourceforge.net/projects/sleepyhead/files/AutoUpdate/update.xml/download");
+    downloadUpdateXML();
+}
+
+void UpdaterWindow::downloadUpdateXML()
+{
+    requestmode = RM_CheckUpdates;
+
+    QNetworkRequest req = QNetworkRequest(update_url);
+    req.setRawHeader("User-Agent", "Wget/1.12 (linux-gnu)");
+    reply = netmanager->get(req);
+    ui->plainTextEdit->appendPlainText(tr("Requesting ") + update_url.toString());
+    netmanager->connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this,
+                        SLOT(downloadProgress(qint64, qint64)));
+    dltime.start();
+}
+
+void UpdaterWindow::dataReceived()
+{
+    QString rs = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString();
+
+    if (rs != "200") { return; }
+
+    QByteArray read = reply->read(reply->bytesAvailable());
+    qDebug() << "Received" << read.size() << "bytes";
+    file.write(read);
+}
+
+void UpdaterWindow::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
+{
+    QString rs = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString();
+
+    if (rs != "200") { return; }
+
+    if (ui->tableWidget->rowCount() > 0) {
+        double f = (double(bytesReceived) / double(bytesTotal)) * 100.0;
+        QProgressBar *bar = qobject_cast<QProgressBar *>(ui->tableWidget->cellWidget(current_row, 3));
+
+        if (bar) {
+            bar->setValue(f);
+        }
+
+        ui->tableWidget->item(current_row, 2)->setText(QString::number(bytesTotal / 1048576.0, 'f',
+                3) + "MB");
+    }
+
+    //ui->progressBar->setValue(f);
+    // int elapsed=dltime.elapsed();
+}
+
+void UpdaterWindow::requestFile()
+{
+    if (!update) { return; }
+
+    QProgressBar *bar = qobject_cast<QProgressBar *>(ui->tableWidget->cellWidget(current_row, 3));
+    QString style = "QProgressBar{\
+            border: 1px solid gray;\
+            border-radius: 3px;\
+            text-align: center;\
+            text-decoration: bold;\
+            color: yellow;\
+            }\
+            QProgressBar::chunk {\
+            background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 \"light green\", stop: 1 green);\
+            width: 10px;\
+            margin: 0px;\
+            }";
+
+    if (bar) {
+        bar->setStyleSheet(style);
+    }
+
+    QString filename = update->filename;
+    ui->plainTextEdit->appendPlainText(tr("Requesting ") + update->url);
+
+    requestmode = RM_GetFile;
+
+    QString path = QApplication::applicationDirPath() + "/Download";
+    QDir().mkpath(path);
+    path += "/" + filename;
+    ui->plainTextEdit->appendPlainText(tr("Saving as ") + path);
+    file.setFileName(path);
+    file.open(QFile::WriteOnly);
+    dltime.start();
+
+    QNetworkRequest req = QNetworkRequest(QUrl(update->url));
+    req.setRawHeader("User-Agent", "Wget/1.12 (linux-gnu)");
+    reply = netmanager->get(req);
+    connect(reply, SIGNAL(readyRead()), this, SLOT(dataReceived()));
+    connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64,
+            qint64)));
+}
+
+// Compare supplied version string with current version
+// < 0 = this one is newer or version supplied is dodgy, 0 = same, and > 0 there is a newer version
+int compareVersion(QString version)
+{
+    QStringList parts = version.split(".");
+    bool ok;
+
+    if (parts.size() < 3) {
+        // dodgy version string supplied.
+        return -1;
+    }
+
+    short major = parts[0].toInt(&ok);
+    if (!ok) return -1;
+
+    short minor = parts[1].toInt(&ok);
+    if (!ok) return -1;
+
+    if (major > major_version) {
+        return 1;
+    } else if (major < major_version) {
+        return -1;
+    }
+
+    if (minor > minor_version) {
+        return 1;
+    } else if (minor < minor_version) {
+        return -1;
+    }
+
+    QStringList patchver = parts[2].split("-");
+
+    short revision = patchver[0].toInt(&ok);
+    if (!ok) return -1;
+
+    if (revision > revision_number) {
+        return 1;
+    } else if (revision < revision_number) {
+        return -1;
+    }
+
+    short build = patchver[1].toInt(&ok);
+    if (!ok) return -1;
+
+    if (build > build_number) {
+        return 1;
+    } else if (build < build_number) {
+        return -1;
+    }
+
+    // patchver[1] = tag..
+
+    // Versions match
+    return 0;
+}
+
+void UpdaterWindow::ParseUpdateXML(QIODevice *dev)
+{
+    QXmlInputSource src(dev);
+    QXmlSimpleReader reader;
+    reader.setContentHandler(&updateparser);
+    UpdateStatus AcceptUpdates = PREF[STR_PREF_AllowEarlyUpdates].toBool() ?
+                                 UPDATE_TESTING : UPDATE_BETA;
+
+    if (reader.parse(src)) {
+        ui->plainTextEdit->appendPlainText(tr("XML update structure parsed cleanly"));
+
+        QStringList versions;
+
+        for (QHash<QString, Release>::iterator it = updateparser.releases.begin(); it != updateparser.releases.end(); ++it) {
+            versions.push_back(it.key());
+        }
+
+        // Um... not optimal.
+        qSort(versions);
+
+        QString platform = PlatformString.toLower();
+        release = nullptr;
+
+        // Find the highest version number available for this platform
+        for (int i = versions.size() - 1; i >= 0; i--) {
+            QString verstr = versions[i];
+            release = &updateparser.releases[verstr];
+
+            if (release->updates.contains(platform)  // Valid Release?
+                    && (release->status >= AcceptUpdates)
+                    && (release->version >= VersionString)) {
+                break;
+            } else { release = nullptr; }
+        }
+
+        if (!release) {
+            mainwin->Notify(tr("No updates were found for your platform."), tr("SleepyHead Updates"), 5000);
+            PREF[STR_GEN_UpdatesLastChecked] = QDateTime::currentDateTime();
+            close();
+            return;
+        }
+
+        qDebug() << "Version" << release->version << "has release section" << platform;
+
+        QString latestapp = "", latestqt = "";
+        updates.clear();
+        Update *upd = nullptr;
+        Update *upq = nullptr;
+
+        for (int i = 0; i < release->updates[platform].size(); i++) {
+            update = &release->updates[platform][i];
+
+            if (update->type == "qtlibs") {
+                qDebug() << "QT Version" << update->version;
+
+                if (update->version > latestqt) {
+                    if (update->status >= AcceptUpdates) {
+                        latestqt = update->version;
+                        upq = update;
+                    }
+                }
+            } else if (update->type == "application") {
+                qDebug() << "Application Version" << update->version;
+
+                if (update->version > latestapp) {
+                    if (update->status >= AcceptUpdates) {
+                        latestapp = update->version;
+                        upd = update;
+                    }
+                }
+            }
+        }
+
+        if (!upq && !upd) {
+            mainwin->Notify(tr("No new updates were found for your platform."),
+                            tr("SleepyHead Updates"),
+                            5000);
+            PREF[STR_GEN_UpdatesLastChecked] = QDateTime::currentDateTime();
+            close();
+            return;
+        }
+
+        if (upq && (upq->version > QT_VERSION_STR)) {
+            updates.push_back(upq);
+        }
+
+        if (upd && upd->version > FullVersionString) {
+            updates.push_back(upd);
+        }
+
+
+        if (updates.size() > 0) {
+            QString html = "<html><h3>" + tr("SleepyHead v%1, codename \"%2\"").arg(release->version).
+                    arg(release->codename) + "</h3><p>" + release->notes[""] + "</p><b>";
+            html += platform.left(1).toUpper() + platform.mid(1);
+            html += " " + tr("platform notes") + "</b><p>" + release->notes[platform] + "</p></html>";
+            ui->webView->setHtml(html);
+            QString info;
+
+            if (compareVersion(release->version)) {
+                ui->Title->setText("<font size=+1>" + tr("A new version of SleepyHead is available!") + "</font>");
+                info = tr("Shiny new <b>v%1</b> is available. You're running old and busted v%2").
+                        arg(latestapp).arg(FullVersionString);
+                ui->notesTabWidget->setCurrentIndex(0);
+            } else {
+                ui->Title->setText("<font size=+1>" + tr("An update for SleepyHead is available.") + "</font>");
+                info = tr("Version <b>%1</b> is available. You're currently running v%1").
+                        arg(latestapp).arg(FullVersionString);
+                ui->notesTabWidget->setCurrentIndex(1);
+            }
+
+            ui->versionInfo->setText(info);
+
+            QString notes;
+
+            for (int i = 0; i < release->updates[platform].size(); i++) {
+                update = &release->updates[platform][i];
+
+                if ((update->type == "application") && (update->version > FullVersionString)) {
+                    notes += "<b>" + tr("SleepyHead v%1 build notes").arg(update->version) + "</b><br/>" +
+                             update->notes.trimmed() + "<br/><br/>";
+                } else if ((update->type == "qtlibs") && (update->version > QT_VERSION_STR)) {
+                    notes += "<b>" + tr("Update to QtLibs (v%1)").arg(update->version) + "</b><br/>" +
+                             update->notes.trimmed();
+                }
+            }
+
+            ui->buildNotes->setText(notes);
+            setWindowModality(Qt::ApplicationModal);
+            show();
+        }
+    } else {
+        mainwin->Notify(tr("There was an error parsing the XML Update file."));
+    }
+}
+
+void UpdaterWindow::replyFinished(QNetworkReply *reply)
+{
+    netmanager->disconnect(reply, SIGNAL(downloadProgress(qint64, qint64)), this,
+                           SLOT(downloadProgress(qint64, qint64)));
+
+    if (reply->error() == QNetworkReply::NoError) {
+
+        if (requestmode == RM_CheckUpdates) {
+            QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
+
+            if (!redirectUrl.isEmpty() && (redirectUrl != reply->url())) {
+                update_url = redirectUrl;
+                reply->deleteLater();
+                QTimer::singleShot(100, this, SLOT(downloadUpdateXML()));
+                return;
+            }
+
+            ui->plainTextEdit->appendPlainText(tr("%1 bytes received").arg(reply->size()));
+            QString filename = QApplication::applicationDirPath() + "/update.xml";
+            qDebug() << filename;
+            QFile file(filename);
+            file.open(QFile::WriteOnly);
+            file.write(reply->readAll());
+            file.close();
+            file.open(QFile::ReadOnly);
+            //QTextStream ts(&file);
+            ParseUpdateXML(&file);
+            file.close();
+            reply->deleteLater();
+        } else if (requestmode == RM_GetFile) {
+            disconnect(reply, SIGNAL(readyRead()), this, SLOT(dataReceived()));
+            file.close();
+            //HttpStatusCodeAttribute
+            QString rs = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString();
+            qDebug() << "HTTP Status Code" << rs;
+
+            bool failed = false;
+
+            if (rs == "404") {
+                qDebug() << "File not found";
+                failed = true;
+            } else {
+                QUrl redirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl();
+
+                if (!redirectUrl.isEmpty() && (redirectUrl != reply->url())) {
+                    file.open(QFile::WriteOnly); //reopen file..
+                    update->url = redirectUrl.toString();
+                    ui->plainTextEdit->appendPlainText(tr("Redirected to ") + update->url);
+                    QTimer::singleShot(100, this, SLOT(requestFile()));
+                    reply->deleteLater();
+                    return;
+                }
+
+                ui->plainTextEdit->appendPlainText("Received " + QString::number(file.size()) + " bytes");
+
+                if (update->size > 0) {
+                    double s1 = update->size / 1048576.0;
+                    double s2 = ui->tableWidget->item(current_row, 2)->text().toDouble();
+
+                    if (s1 != s2) {
+                        failed = true;
+                        ui->plainTextEdit->appendPlainText(tr("File size mismatch for %1").arg(update->filename));
+                    }
+                } else {
+                    QString path = QApplication::applicationDirPath() + "/Download/" + update->filename;
+                    QFile f(path);
+                    f.open(QFile::ReadOnly);
+                    QCryptographicHash hash(QCryptographicHash::Sha1);
+                    hash.addData(f.readAll());
+                    QString res = hash.result().toHex();
+
+                    if (res != update->hash) {
+                        ui->plainTextEdit->appendPlainText(tr("File integrity check failed for %1").arg(update->filename));
+                        failed = true;
+                    }
+                }
+            }
+
+            reply->deleteLater();
+            QProgressBar *bar = qobject_cast<QProgressBar *>(ui->tableWidget->cellWidget(current_row, 3));
+
+            if (!failed) {
+                //file.open(QFile::ReadOnly);
+                QuaZip zip(&file);
+
+                if (!zip.open(QuaZip::mdUnzip)) {
+                    failed = true;
+                } else {
+
+                    QStringList files = zip.getFileNameList();
+                    QFile f;
+                    int errors = 0;
+                    int fsize = files.size();
+                    QByteArray ba;
+                    QStringList update_txt;
+
+                    QString apppath = QApplication::applicationDirPath() + "/";
+                    QString backups = apppath + "Backups/";
+                    QString downloads = apppath + "Downloads/";
+                    QDir().mkpath(backups);
+
+                    for (int i = 0; i < fsize; i++) {
+                        ui->plainTextEdit->appendPlainText(tr("Extracting ") + files.at(i));
+                        QuaZipFile qzf(file.fileName(), files.at(i));
+                        qzf.open(QuaZipFile::ReadOnly);
+
+                        QString path = downloads + files.at(i);
+
+                        if (path.endsWith("/") || path.endsWith("\\")) {
+                            QDir().mkpath(path);
+
+                            if (update->unzipped_path.isEmpty()) {
+                                update->unzipped_path = path;
+                            }
+                        } else {
+                            ba = qzf.readAll();
+
+                            if (qzf.getZipError()) {
+                                errors++;
+                            } else if (files.at(i) == "update.txt") {
+                                QTextStream ts(ba);
+                                QString line;
+
+                                do {
+                                    line = ts.readLine();
+
+                                    if (!line.isNull()) { update_txt.append(line); }
+                                } while (!line.isNull());
+                            } else {
+                                QString fn = files.at(i).section("/", -1);
+                                QFile::Permissions perm = QFile::permissions(apppath + fn);
+
+                                // delete backups
+                                if (f.exists(backups + fn)) { f.remove(backups + fn); }
+
+                                // rename (move) current file to backup
+                                if (!f.rename(apppath + fn, backups + fn)) {
+                                    errors++;
+                                }
+
+                                //Save zip data as new file
+                                f.setFileName(apppath + fn);
+                                f.open(QFile::WriteOnly);
+                                f.write(ba);
+                                f.close();
+                                f.setPermissions(perm);
+                            }
+                        }
+
+                        if (bar) {
+                            bar->setValue((1.0 / float(fsize)*float(i + 1)) * 100.0);
+                            QApplication::processEvents();
+                        }
+
+                        qzf.close();
+                    }
+
+                    zip.close();
+
+                    if (errors) {
+                        // gone and wrecked the install here..
+                        // probably should wait till get here before replacing files..
+                        // but then again, this is probably what would screw up
+                        mainwin->Notify(tr("You might need to reinstall manually. Sorry :("),
+                                        tr("Ugh.. Something went wrong with unzipping."), 5000);
+                        // TODO: Roll back from the backup folder
+                        failed = true;
+                    }
+                }
+            }
+
+            ui->tableWidget->item(current_row, 0)->setCheckState(Qt::Checked);
+
+            if (failed) {
+                qDebug() << "File is corrupted";
+
+                if (bar) {
+                    bar->setFormat(tr("Failed"));
+                    QString style = "QProgressBar{\
+                        border: 1px solid gray;\
+                        border-radius: 3px;\
+                        text-align: center;\
+                        text-decoration: bold;\
+                        color: yellow;\
+                        }\
+                        QProgressBar::chunk {\
+                        background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 \"dark red\", stop: 1 red);\
+                        width: 10px;\
+                        margin: 0px;\
+                        }";
+                    //: qlineargradient(x1: 0, y1: 0.5, x2: 1, y2: 0.5, stop: 0 red, stop: 1 white);
+                    bar->setStyleSheet(style);
+                }
+            }
+
+            ui->tableWidget->item(current_row, 0)->setData(Qt::UserRole + 1, failed);
+            QTimer::singleShot(100, this, SLOT(upgradeNext()));
+            ui->plainTextEdit->appendPlainText(tr("Download Complete"));
+        }
+
+    } else {
+        mainwin->Notify(tr("There was an error completing a network request:\n\n(") + reply->errorString()
+                        + ")");
+    }
+}
+
+void UpdaterWindow::on_CloseButton_clicked()
+{
+    close();
+}
+
+void UpdaterWindow::upgradeNext()
+{
+    QTableWidgetItem *item;
+    bool fnd = false;
+
+    for (current_row = 0; current_row < ui->tableWidget->rowCount(); current_row++) {
+        item = ui->tableWidget->item(current_row, 0);
+        bool complete = item->checkState() == Qt::Checked;
+
+        if (complete) {
+            continue;
+        }
+
+        update = item->data(Qt::UserRole).value<Update *>();
+        qDebug() << "Processing" << update->url;
+        fnd = true;
+        requestFile();
+        break;
+    }
+
+    if (!fnd) {
+        bool ok = true;
+
+        for (current_row = 0; current_row < ui->tableWidget->rowCount(); current_row++) {
+            bool failed = ui->tableWidget->item(current_row, 0)->data(Qt::UserRole + 1).toBool();
+
+            if (failed) {
+                ok = false;
+                break;
+            }
+        }
+
+        if (ok) {
+            success = true;
+            //QMessageBox::information(this,tr("Updates Complete"),tr("SleepyHead has been updated and needs to restart."),QMessageBox::Ok);
+            ui->downloadTitle->setText(tr("Update Complete!"));
+            ui->FinishedButton->setVisible(true);
+            ui->downloadLabel->setText(
+                tr("Updates Complete. SleepyHead needs to restart now, click Finished to do so."));
+            PREF[STR_GEN_UpdatesLastChecked] = QDateTime::currentDateTime();
+        } else {
+            ui->downloadTitle->setText(tr("Update Failed :("));
+            success = false;
+            ui->downloadLabel->setText(tr("Download Error. Sorry, try again later."));
+            ui->FinishedButton->setVisible(true);
+            //QMessageBox::warning(this,tr("Download Error"),tr("Sorry, could not get all necessary files for upgrade.. Try again later."),QMessageBox::Ok);
+            //close();
+        }
+    }
+}
+
+
+void UpdaterWindow::on_upgradeButton_clicked()
+{
+    if (!updates.size()) { return; }
+
+    ui->tableWidget->clearContents();
+    ui->tableWidget->setColumnHidden(4, true);
+    ui->tableWidget->setColumnHidden(5, true);
+    ui->FinishedButton->setVisible(false);
+    ui->downloadLabel->setText(tr("Downloading & Installing Updates..."));
+    ui->downloadTitle->setText(tr("Please wait while downloading and installing updates."));
+    success = false;
+
+    for (int i = 0; i < updates.size(); i++) {
+        update = updates.at(i);
+        ui->tableWidget->insertRow(i);
+        QTableWidgetItem *item = new QTableWidgetItem(update->type);
+        QVariant av;
+        av.setValue(update);
+        item->setData(Qt::UserRole, av);
+        item->setCheckState(Qt::Unchecked);
+        item->setFlags(Qt::ItemIsEnabled);
+        ui->tableWidget->setItem(i, 0, item);
+        ui->tableWidget->setItem(i, 1, new QTableWidgetItem(update->version));
+        ui->tableWidget->setItem(i, 2, new QTableWidgetItem(QString::number(update->size / 1048576.0, 'f',
+                                 3) + "MB"));
+        QProgressBar *bar = new QProgressBar(ui->tableWidget);
+        bar->setMaximum(100);
+        bar->setValue(0);
+
+        ui->tableWidget->setCellWidget(i, 3, bar);
+        ui->tableWidget->setItem(i, 4, new QTableWidgetItem(update->url));
+    }
+
+    ui->stackedWidget->setCurrentIndex(1);
+    upgradeNext();
+}
+
+void UpdaterWindow::on_FinishedButton_clicked()
+{
+    if (success) {
+        mainwin->RestartApplication();
+    } else { close(); }
+}
diff --git a/sleepyhead/UpdaterWindow.h b/sleepyhead/UpdaterWindow.h
new file mode 100644
index 0000000..621beab
--- /dev/null
+++ b/sleepyhead/UpdaterWindow.h
@@ -0,0 +1,105 @@
+/* UpdaterWindow
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef UPDATEWINDOW_H
+#define UPDATEWINDOW_H
+
+#include <QSystemTrayIcon>
+#include <QNetworkAccessManager>
+#include <QTableWidgetItem>
+#include <QMenu>
+#include <QMainWindow>
+#include <QUrl>
+
+#include "version.h"
+#include "updateparser.h"
+
+namespace Ui {
+class UpdaterWindow;
+}
+
+/*! \enum RequestMode
+    \brief Used in replyFinished() to differentiate the current update task.
+*/
+enum RequestMode { RM_None, RM_CheckUpdates, RM_GetFile };
+
+
+/*! \class UpdaterWindow
+    \brief Auto-Update Module for SleepyHead
+
+    This class handles the complete Auto-Update procedure for SleepyHead, it does the network checks,
+    parses the update.xml from SourceForge host, checks for any new updates, and provides the UI
+    and mechanisms to download and replace the binaries according to what is specified in update.xml.
+  */
+class UpdaterWindow : public QMainWindow
+{
+    Q_OBJECT
+
+  public:
+    explicit UpdaterWindow(QWidget *parent = 0);
+    ~UpdaterWindow();
+
+    //! Start the
+    void checkForUpdates();
+
+    /*! \fn ParseUpdateXML(QIODevice * dev)
+        \brief Parses the update.xml from either QFile or QNetworkReply source
+        */
+    void ParseUpdateXML(QIODevice *dev);
+
+  protected slots:
+    //! \brief Network reply completed
+    void replyFinished(QNetworkReply *reply);
+
+    //! \brief Update the progress bars as data is received
+    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
+
+    //! \brief Save incomming data
+    void dataReceived();
+
+    //! \brief Request a file to download
+    void requestFile();
+
+    //! \brief Request the update.xml file
+    void downloadUpdateXML();
+
+  private slots:
+    //! \brief Just close the Updater window
+    void on_CloseButton_clicked();
+
+    //! \brief Start processing the download que, and applying the updates
+    void on_upgradeButton_clicked();
+
+    //! \brief Selects the next file in the download queue
+    void upgradeNext();
+
+    //! \brief Click on finished, restart if app has been upgraded, otherwise just close the window.
+    void on_FinishedButton_clicked();
+
+  private:
+
+    //! \brief Holds the results of parsing the update.xml file
+    UpdateParser updateparser;
+
+    Ui::UpdaterWindow *ui;
+
+    RequestMode requestmode;
+    QTime dltime;
+
+    Update *update;
+    Release *release;
+    QFile file;
+    QNetworkAccessManager *netmanager;
+    QNetworkReply *reply;
+    QList<Update *> updates;
+    int current_row;
+    bool success;
+    QUrl update_url; // for update.xml redirects..
+};
+
+#endif // UPDATEWINDOW_H
diff --git a/sleepyhead/UpdaterWindow.ui b/sleepyhead/UpdaterWindow.ui
new file mode 100644
index 0000000..e9ded06
--- /dev/null
+++ b/sleepyhead/UpdaterWindow.ui
@@ -0,0 +1,363 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>UpdaterWindow</class>
+ <widget class="QMainWindow" name="UpdaterWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>589</width>
+    <height>416</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>SleepyHead Updater</string>
+  </property>
+  <property name="windowIcon">
+   <iconset>
+    <normaloff>:/images/sheep.png</normaloff>:/images/sheep.png</iconset>
+  </property>
+  <widget class="QWidget" name="centralWidget">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <property name="spacing">
+     <number>0</number>
+    </property>
+    <property name="margin">
+     <number>0</number>
+    </property>
+    <item>
+     <widget class="QStackedWidget" name="stackedWidget">
+      <property name="currentIndex">
+       <number>0</number>
+      </property>
+      <widget class="QWidget" name="frontPage">
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="0" column="0">
+         <widget class="QLabel" name="Title">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="font">
+           <font>
+            <pointsize>14</pointsize>
+            <weight>75</weight>
+            <bold>true</bold>
+           </font>
+          </property>
+          <property name="text">
+           <string>A new version of $APP is available</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1" rowspan="3">
+         <layout class="QVBoxLayout" name="verticalLayout_5">
+          <item>
+           <widget class="QLabel" name="graphicLabel">
+            <property name="maximumSize">
+             <size>
+              <width>100</width>
+              <height>100</height>
+             </size>
+            </property>
+            <property name="text">
+             <string/>
+            </property>
+            <property name="pixmap">
+             <pixmap resource="Resources.qrc">:/docs/sheep.png</pixmap>
+            </property>
+            <property name="scaledContents">
+             <bool>true</bool>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </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>40</height>
+             </size>
+            </property>
+           </spacer>
+          </item>
+         </layout>
+        </item>
+        <item row="1" column="0">
+         <widget class="QLabel" name="versionInfo">
+          <property name="text">
+           <string>Version Information</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="0">
+         <widget class="QTabWidget" name="notesTabWidget">
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="relNotesTab">
+           <attribute name="title">
+            <string>Release Notes</string>
+           </attribute>
+           <layout class="QVBoxLayout" name="verticalLayout_8">
+            <property name="spacing">
+             <number>0</number>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QWebView" name="webView">
+              <property name="url">
+               <url>
+                <string>about:blank</string>
+               </url>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="buildNotesTab">
+           <attribute name="title">
+            <string>Build Notes</string>
+           </attribute>
+           <layout class="QVBoxLayout" name="verticalLayout_9">
+            <property name="spacing">
+             <number>0</number>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QTextEdit" name="buildNotes">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" 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="readOnly">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+        <item row="3" column="0" colspan="2">
+         <widget class="QFrame" name="frame_2">
+          <property name="frameShape">
+           <enum>QFrame::Box</enum>
+          </property>
+          <property name="frameShadow">
+           <enum>QFrame::Sunken</enum>
+          </property>
+          <layout class="QHBoxLayout" name="horizontalLayout_3">
+           <item>
+            <widget class="QPushButton" name="CloseButton">
+             <property name="text">
+              <string>Maybe &Later</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="upgradeButton">
+             <property name="text">
+              <string>&Upgrade Now</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="page">
+       <layout class="QVBoxLayout" name="verticalLayout_2">
+        <property name="spacing">
+         <number>4</number>
+        </property>
+        <property name="margin">
+         <number>4</number>
+        </property>
+        <item>
+         <widget class="QLabel" name="downloadTitle">
+          <property name="font">
+           <font>
+            <weight>75</weight>
+            <bold>true</bold>
+           </font>
+          </property>
+          <property name="text">
+           <string>Please wait while updates are downloaded and installed...</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <layout class="QHBoxLayout" name="horizontalLayout"/>
+        </item>
+        <item>
+         <widget class="QTabWidget" name="tabWidget">
+          <property name="currentIndex">
+           <number>0</number>
+          </property>
+          <widget class="QWidget" name="tabUpdates">
+           <attribute name="title">
+            <string>Updates</string>
+           </attribute>
+           <layout class="QVBoxLayout" name="verticalLayout_3">
+            <property name="spacing">
+             <number>0</number>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QTableWidget" name="tableWidget">
+              <property name="editTriggers">
+               <set>QAbstractItemView::NoEditTriggers</set>
+              </property>
+              <property name="alternatingRowColors">
+               <bool>true</bool>
+              </property>
+              <property name="selectionMode">
+               <enum>QAbstractItemView::NoSelection</enum>
+              </property>
+              <property name="selectionBehavior">
+               <enum>QAbstractItemView::SelectRows</enum>
+              </property>
+              <attribute name="horizontalHeaderStretchLastSection">
+               <bool>true</bool>
+              </attribute>
+              <attribute name="verticalHeaderVisible">
+               <bool>false</bool>
+              </attribute>
+              <column>
+               <property name="text">
+                <string>Component</string>
+               </property>
+              </column>
+              <column>
+               <property name="text">
+                <string>Version</string>
+               </property>
+              </column>
+              <column>
+               <property name="text">
+                <string>Size</string>
+               </property>
+              </column>
+              <column>
+               <property name="text">
+                <string>Progress</string>
+               </property>
+              </column>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+          <widget class="QWidget" name="tabLog">
+           <attribute name="title">
+            <string>Log</string>
+           </attribute>
+           <layout class="QVBoxLayout" name="verticalLayout_4">
+            <property name="spacing">
+             <number>0</number>
+            </property>
+            <property name="margin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QPlainTextEdit" name="plainTextEdit"/>
+            </item>
+           </layout>
+          </widget>
+         </widget>
+        </item>
+        <item>
+         <widget class="QWidget" name="widget" native="true">
+          <layout class="QHBoxLayout" name="horizontalLayout_2">
+           <property name="spacing">
+            <number>0</number>
+           </property>
+           <property name="margin">
+            <number>0</number>
+           </property>
+           <item>
+            <widget class="QLabel" name="downloadLabel">
+             <property name="text">
+              <string>Downloading & Installing Updates</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="QPushButton" name="FinishedButton">
+             <property name="text">
+              <string>&Finished</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <customwidgets>
+  <customwidget>
+   <class>QWebView</class>
+   <extends>QWidget</extends>
+   <header>QtWebKit/QWebView</header>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/sleepyhead/build_number.h b/sleepyhead/build_number.h
new file mode 100644
index 0000000..aaaf589
--- /dev/null
+++ b/sleepyhead/build_number.h
@@ -0,0 +1 @@
+const int build_number = 0;
diff --git a/sleepyhead/common_gui.cpp b/sleepyhead/common_gui.cpp
new file mode 100644
index 0000000..b792102
--- /dev/null
+++ b/sleepyhead/common_gui.cpp
@@ -0,0 +1,139 @@
+/* Common GUI Functions Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "common_gui.h"
+
+#ifndef BUILD_WITH_MSVC
+# include <unistd.h>
+#endif
+
+#if (QT_VERSION >= QT_VERSION_CHECK(4,8,0))
+// Qt 4.8 makes this a whole lot easier
+Qt::DayOfWeek firstDayOfWeekFromLocale()
+{
+    return QLocale::system().firstDayOfWeek();
+}
+#elif defined(__GLIBC__)
+# include <langinfo.h>
+Qt::DayOfWeek firstDayOfWeekFromLocale()
+{
+    const unsigned char *const s = nl_langinfo(_NL_TIME_FIRST_WEEKDAY);
+
+    if (s && *s >= 1 && *s <= 7) {
+        // Map between nl_langinfo and Qt:
+        //              Sun Mon Tue Wed Thu Fri Sat
+        // nl_langinfo:  1   2   3   4   5   6   7
+        //   DayOfWeek:  7   1   2   3   4   5   6
+        return (Qt::DayOfWeek)((*s + 5) % 7 + 1);
+    }
+
+    return Qt::Monday;
+}
+#elif defined(Q_OS_WIN)
+# include "windows.h"
+Qt::DayOfWeek firstDayOfWeekFromLocale()
+{
+    Qt::DayOfWeek firstDay = Qt::Monday; // Fallback, acknowledging the awesome concept of weekends.
+    WCHAR wsDay[4];
+# if defined(_WIN32_WINNT_VISTA) && WINVER >= _WIN32_WINNT_VISTA && defined(LOCALE_NAME_USER_DEFAULT)
+
+    if (GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, wsDay, 4)) {
+# else
+
+    if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, wsDay, 4)) {
+# endif
+        bool ok;
+        int wfd = QString::fromWCharArray(wsDay).toInt(&ok) + 1;
+
+        if (ok) {
+            return (Qt::DayOfWeek)(unsigned char)wfd;
+        }
+    }
+
+    return firstDay;
+}
+
+#endif // QT_VERSION
+
+// Flag Colors
+QColor COLOR_Hypopnea       = Qt::blue;
+QColor COLOR_Obstructive    = COLOR_Aqua;
+QColor COLOR_Apnea          = Qt::darkGreen;
+QColor COLOR_CSR            = COLOR_LightGreen;
+QColor COLOR_LargeLeak      = COLOR_LightGray;
+QColor COLOR_Ramp           = COLOR_LightBlue;
+QColor COLOR_ClearAirway    = QColor("#b254cd");
+QColor COLOR_RERA           = COLOR_Gold;
+QColor COLOR_VibratorySnore = QColor("#ff4040");
+QColor COLOR_FlowLimit      = QColor("#404040");
+QColor COLOR_SensAwake      = COLOR_Gold;
+QColor COLOR_LeakFlag       = QColor("#40c0c0"); // Qt::darkBlue;
+QColor COLOR_NRI            = QColor("orange"); //COLOR_ClearAirway;
+QColor COLOR_ExP            = Qt::darkCyan;
+QColor COLOR_PressurePulse  = Qt::red;
+QColor COLOR_PulseChange    = COLOR_LightGray;
+QColor COLOR_SPO2Drop       = COLOR_LightBlue;
+QColor COLOR_UserFlag1      = QColor("#e0e0e0");
+QColor COLOR_UserFlag2      = QColor("#c0c0e0");
+
+// Chart Colors
+QColor COLOR_EPAP         = Qt::blue;
+QColor COLOR_IPAP         = Qt::red;
+QColor COLOR_IPAPLo       = Qt::darkRed;
+QColor COLOR_IPAPHi       = Qt::darkRed;
+QColor COLOR_Plethy       = Qt::darkBlue;
+QColor COLOR_Pulse        = Qt::red;
+QColor COLOR_SPO2         = Qt::blue;
+QColor COLOR_FlowRate     = Qt::black;
+QColor COLOR_Pressure     = Qt::darkGreen;
+QColor COLOR_RDI          = COLOR_LightGreen;
+QColor COLOR_AHI          = COLOR_LightGreen;
+QColor COLOR_Leak         = COLOR_DarkMagenta;
+QColor COLOR_LeakTotal    = COLOR_DarkYellow;
+QColor COLOR_MaxLeak      = COLOR_DarkRed;
+QColor COLOR_Snore        = COLOR_DarkGray;
+QColor COLOR_RespRate     = COLOR_DarkBlue;
+QColor COLOR_MaskPressure = COLOR_Blue;
+QColor COLOR_PTB          = COLOR_Gray;       // Patient-Triggered Breathing
+QColor COLOR_MinuteVent   = COLOR_Cyan;
+QColor COLOR_TgMV         = COLOR_DarkCyan;
+QColor COLOR_TidalVolume  = COLOR_Magenta;
+QColor COLOR_FLG          = COLOR_DarkBlue;   // Flow Limitation Graph
+QColor COLOR_IE           = COLOR_DarkRed;    // Inspiratory Expiratory Ratio
+QColor COLOR_Te           = COLOR_DarkGreen;
+QColor COLOR_Ti           = COLOR_DarkBlue;
+QColor COLOR_SleepStage   = COLOR_Gray;
+
+//#include <windows.h>
+//#include <tchar.h>
+
+//typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
+
+//LPFN_ISWOW64PROCESS fnIsWow64Process;
+
+//BOOL IsWow64()
+//{
+//    BOOL bIsWow64 = FALSE;
+
+//    //IsWow64Process is not available on all supported versions of Windows.
+//    //Use GetModuleHandle to get a handle to the DLL that contains the function
+//    //and GetProcAddress to get a pointer to the function if available.
+
+//    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
+//        GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
+
+//    if(NULL != fnIsWow64Process)
+//    {
+//        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
+//        {
+//            //handle error
+//        }
+//    }
+//    return bIsWow64;
+//}
+
diff --git a/sleepyhead/common_gui.h b/sleepyhead/common_gui.h
new file mode 100644
index 0000000..a6b6019
--- /dev/null
+++ b/sleepyhead/common_gui.h
@@ -0,0 +1,88 @@
+/* Common GUI Functions Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef COMMON_GUI_H
+#define COMMON_GUI_H
+
+#include <QLocale>
+#include "Graphs/glcommon.h"
+
+//! \brief Gets the first day of week from the system locale, to show in the calendars.
+Qt::DayOfWeek firstDayOfWeekFromLocale();
+
+const QString CSTR_GFX_ANGLE = "ANGLE";
+const QString CSTR_GFX_OpenGL = "OpenGL";
+const QString CSTR_GFX_BrokenGL = "BrokenGL";
+
+const QString STR_GRAPH_EventBreakdown = "EventBreakdown";
+const QString STR_GRAPH_SleepFlags = "SF";
+const QString STR_GRAPH_Weight = "Weight";
+const QString STR_GRAPH_BMI = "BMI";
+const QString STR_GRAPH_Zombie = "Zombie";
+const QString STR_GRAPH_Sessions = "Sessions";
+const QString STR_GRAPH_SessionTimes = "SessionTimes";
+const QString STR_GRAPH_Usage = "Usage";
+const QString STR_GRAPH_AHI = "AHI";
+const QString STR_GRAPH_PeakAHI = "PeakAHI";
+
+//! \brief Returns a text string naming the current graphics engine
+QString getGraphicsEngine();
+QString getOpenGLVersionString();
+float getOpenGLVersion();
+
+
+// Flag Colors
+extern QColor COLOR_Hypopnea;
+extern QColor COLOR_Obstructive;
+extern QColor COLOR_Apnea;
+extern QColor COLOR_CSR;
+extern QColor COLOR_LargeLeak;
+extern QColor COLOR_Ramp;
+extern QColor COLOR_ClearAirway;
+extern QColor COLOR_RERA;
+extern QColor COLOR_VibratorySnore;
+extern QColor COLOR_FlowLimit;
+extern QColor COLOR_SensAwake;
+extern QColor COLOR_LeakFlag;
+extern QColor COLOR_NRI;
+extern QColor COLOR_ExP;
+extern QColor COLOR_PressurePulse;
+extern QColor COLOR_PulseChange;
+extern QColor COLOR_SPO2Drop;
+extern QColor COLOR_UserFlag1;
+extern QColor COLOR_UserFlag2;
+
+// Chart Colors
+extern QColor COLOR_EPAP;
+extern QColor COLOR_IPAP;
+extern QColor COLOR_IPAPLo;
+extern QColor COLOR_IPAPHi;
+extern QColor COLOR_Plethy;
+extern QColor COLOR_Pulse;
+extern QColor COLOR_SPO2;
+extern QColor COLOR_FlowRate;
+extern QColor COLOR_Pressure;
+extern QColor COLOR_RDI;
+extern QColor COLOR_AHI;
+extern QColor COLOR_Leak;
+extern QColor COLOR_LeakTotal;
+extern QColor COLOR_MaxLeak;
+extern QColor COLOR_Snore;
+extern QColor COLOR_RespRate;
+extern QColor COLOR_MaskPressure;
+extern QColor COLOR_PTB;            // Patient Triggered Breathing
+extern QColor COLOR_MinuteVent;
+extern QColor COLOR_TgMV;
+extern QColor COLOR_TidalVolume;
+extern QColor COLOR_FLG;            // Flow Limitation Graph
+extern QColor COLOR_IE;             // Inspiratory Expiratory Ratio
+extern QColor COLOR_Te;
+extern QColor COLOR_Ti;
+extern QColor COLOR_SleepStage;
+
+#endif // COMMON_GUI_H
diff --git a/sleepyhead/daily.cpp b/sleepyhead/daily.cpp
new file mode 100644
index 0000000..a4fe41c
--- /dev/null
+++ b/sleepyhead/daily.cpp
@@ -0,0 +1,2563 @@
+/* Daily Panel
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QTextCharFormat>
+#include <QPalette>
+#include <QTextBlock>
+#include <QColorDialog>
+#include <QSpacerItem>
+#include <QBuffer>
+#include <QPixmap>
+#include <QMessageBox>
+#include <QResizeEvent>
+#include <QScrollBar>
+#include <QSpacerItem>
+#include <QWebFrame>
+#include <QFontMetrics>
+#include <QLabel>
+
+#include <cmath>
+//#include <QPrinter>
+//#include <QProgressBar>
+
+#include "daily.h"
+#include "ui_daily.h"
+
+#include "common_gui.h"
+#include "SleepLib/profiles.h"
+#include "SleepLib/session.h"
+#include "Graphs/graphdata_custom.h"
+#include "Graphs/gLineOverlay.h"
+#include "Graphs/gFlagsLine.h"
+#include "Graphs/gFooBar.h"
+#include "Graphs/gXAxis.h"
+#include "Graphs/gYAxis.h"
+#include "Graphs/gSegmentChart.h"
+#include "Graphs/gStatsLine.h"
+#include "Graphs/gdailysummary.h"
+#include "Graphs/MinutesAtPressure.h"
+
+//extern QProgressBar *qprogress;
+extern MainWindow * mainwin;
+
+// This was Sean Stangl's idea.. but I couldn't apply that patch.
+inline QString channelInfo(ChannelID code) {
+    return schema::channel[code].fullname()+"\n"+schema::channel[code].description()+"\n("+schema::channel[code].units()+")";
+}
+
+void Daily::setCalendarVisible(bool visible)
+{
+    on_calButton_toggled(visible);
+}
+
+void Daily::setSidebarVisible(bool visible)
+{
+    QList<int> a;
+
+    int panel_width = visible ? 370 : 0;
+    a.push_back(panel_width);
+    a.push_back(this->width() - panel_width);
+    ui->splitter_2->setStretchFactor(1,1);
+    ui->splitter_2->setSizes(a);
+    ui->splitter_2->setStretchFactor(1,1);
+}
+
+Daily::Daily(QWidget *parent,gGraphView * shared)
+    :QWidget(parent), ui(new Ui::Daily)
+{
+    ui->setupUi(this);
+
+    // Remove Incomplete Extras Tab
+    //ui->tabWidget->removeTab(3);
+
+    ZombieMeterMoved=false;
+    BookmarksChanged=false;
+
+    lastcpapday=nullptr;
+
+    setSidebarVisible(true);
+
+    layout=new QHBoxLayout();
+    layout->setSpacing(0);
+    layout->setMargin(0);
+    layout->setContentsMargins(0,0,0,0);
+
+    dateDisplay=new MyLabel(this);
+    dateDisplay->setAlignment(Qt::AlignCenter);
+    QFont font = dateDisplay->font();
+    font.setPointSizeF(font.pointSizeF()*1.3F);
+    dateDisplay->setFont(font);
+    QPalette palette = dateDisplay->palette();
+    palette.setColor(QPalette::Base, Qt::blue);
+    dateDisplay->setPalette(palette);
+    //dateDisplay->setTextFormat(Qt::RichText);
+    ui->sessionBarLayout->addWidget(dateDisplay,1);
+
+//    const bool sessbar_under_graphs=false;
+//    if (sessbar_under_graphs) {
+//        ui->sessionBarLayout->addWidget(sessbar,1);
+//    } else {
+//        ui->splitter->insertWidget(2,sessbar);
+//        sessbar->setMaximumHeight(sessbar->height());
+//        sessbar->setMinimumHeight(sessbar->height());
+//    }
+
+
+    ui->calNavWidget->setMaximumHeight(ui->calNavWidget->height());
+    ui->calNavWidget->setMinimumHeight(ui->calNavWidget->height());
+    sessbar=nullptr;
+
+    webView=new MyWebView(this);
+
+
+
+    QWebSettings::globalSettings()->setAttribute(QWebSettings::PluginsEnabled, true);
+
+    ui->tabWidget->insertTab(0,webView,QIcon(),"Details");
+
+    ui->graphFrame->setLayout(layout);
+    //ui->graphMainArea->setLayout(layout);
+
+    ui->graphMainArea->setAutoFillBackground(false);
+
+    GraphView=new gGraphView(ui->graphFrame,shared);
+    GraphView->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
+
+    snapGV=new gGraphView(GraphView);
+    snapGV->setMinimumSize(172,172);
+    snapGV->hideSplitter();
+    snapGV->hide();
+
+    scrollbar=new MyScrollBar(ui->graphFrame);
+    scrollbar->setOrientation(Qt::Vertical);
+    scrollbar->setSizePolicy(QSizePolicy::Maximum,QSizePolicy::Expanding);
+    scrollbar->setMaximumWidth(20);
+
+    ui->bookmarkTable->setColumnCount(2);
+    ui->bookmarkTable->setColumnWidth(0,70);
+    //ui->bookmarkTable->setEditTriggers(QAbstractItemView::SelectedClicked);
+    //ui->bookmarkTable->setColumnHidden(2,true);
+    //ui->bookmarkTable->setColumnHidden(3,true);
+    GraphView->setScrollBar(scrollbar);
+    layout->addWidget(GraphView,1);
+    layout->addWidget(scrollbar,0);
+
+    int default_height = p_profile->appearance->graphHeight();
+
+    gGraph *GAHI = nullptr,
+//            *TAP = nullptr,
+            *SF = nullptr,
+            *AHI = nullptr;
+
+    const QString STR_GRAPH_DailySummary = "DailySummary";
+    const QString STR_GRAPH_TAP = "TimeAtPressure";
+
+//    gGraph * SG;
+//    graphlist[STR_GRAPH_DailySummary] = SG = new gGraph(STR_GRAPH_DailySummary, GraphView, QObject::tr("Summary"), QObject::tr("Summary of this daily information"), default_height);
+//    SG->AddLayer(new gLabelArea(nullptr),LayerLeft,gYAxis::Margin);
+//    SG->AddLayer(new gDailySummary());
+
+    graphlist[STR_GRAPH_SleepFlags] = SF = new gGraph(STR_GRAPH_SleepFlags, GraphView, STR_TR_EventFlags, STR_TR_EventFlags, default_height);
+    SF->setPinned(true);
+
+    ChannelID cpapcodes[] = {
+        CPAP_FlowRate, CPAP_MaskPressure, CPAP_Pressure, CPAP_Leak, CPAP_Snore,  CPAP_FLG, CPAP_RespRate,
+        CPAP_TidalVolume, CPAP_MinuteVent,CPAP_PTB, CPAP_RespEvent, CPAP_Ti, CPAP_Te,
+        CPAP_IE, ZEO_SleepStage, POS_Inclination, POS_Orientation, CPAP_Test1
+    };
+
+    int cpapsize = sizeof(cpapcodes) / sizeof(ChannelID);
+
+    ChannelID oxicodes[] = {
+        OXI_Pulse, OXI_SPO2, OXI_Perf, OXI_Plethy
+    };
+    int oxisize = sizeof(oxicodes) / sizeof(ChannelID);
+
+
+    for (int i=0; i < cpapsize; ++i) {
+        ChannelID code = cpapcodes[i];
+        graphlist[schema::channel[code].code()] = new gGraph(schema::channel[code].code(), GraphView, schema::channel[code].label(), channelInfo(code), default_height);
+    }
+
+    //int oxigrp=p_profile->ExistsAndTrue("SyncOximetry") ? 0 : 1; // Contemplating killing this setting...
+    for (int i=0; i < oxisize; ++i) {
+        ChannelID code = oxicodes[i];
+        graphlist[schema::channel[code].code()] = new gGraph(schema::channel[code].code(), GraphView, schema::channel[code].label(), channelInfo(code), default_height);
+    }
+
+    if (p_profile->general->calculateRDI()) {
+        AHI=new gGraph("AHI", GraphView,STR_TR_RDI, channelInfo(CPAP_RDI), default_height);
+    } else {
+        AHI=new gGraph("AHI", GraphView,STR_TR_AHI, channelInfo(CPAP_AHI), default_height);
+    }
+
+    graphlist["AHI"] = AHI;
+
+    graphlist[STR_GRAPH_EventBreakdown] = GAHI = new gGraph(STR_GRAPH_EventBreakdown, snapGV,tr("Breakdown"),tr("events"),172);
+    gSegmentChart * evseg=new gSegmentChart(GST_Pie);
+    evseg->AddSlice(CPAP_Hypopnea,QColor(0x40,0x40,0xff,0xff),STR_TR_H);
+    evseg->AddSlice(CPAP_Apnea,QColor(0x20,0x80,0x20,0xff),STR_TR_UA);
+    evseg->AddSlice(CPAP_Obstructive,QColor(0x40,0xaf,0xbf,0xff),STR_TR_OA);
+    evseg->AddSlice(CPAP_ClearAirway,QColor(0xb2,0x54,0xcd,0xff),STR_TR_CA);
+    evseg->AddSlice(CPAP_RERA,QColor(0xff,0xff,0x80,0xff),STR_TR_RE);
+    evseg->AddSlice(CPAP_NRI,QColor(0x00,0x80,0x40,0xff),STR_TR_NR);
+    evseg->AddSlice(CPAP_FlowLimit,QColor(0x40,0x40,0x40,0xff),STR_TR_FL);
+    evseg->AddSlice(CPAP_SensAwake,QColor(0x40,0xC0,0x40,0xff),STR_TR_SA);
+    if (p_profile->cpap->userEventPieChart()) {
+        evseg->AddSlice(CPAP_UserFlag1,QColor(0xe0,0xe0,0xe0,0xff),tr("UF1"));
+        evseg->AddSlice(CPAP_UserFlag2,QColor(0xc0,0xc0,0xe0,0xff),tr("UF2"));
+    }
+
+
+
+    GAHI->AddLayer(evseg);
+    GAHI->setMargins(0,0,0,0);
+
+    gFlagsGroup *fg=new gFlagsGroup();
+    SF->AddLayer(fg);
+
+
+    SF->setBlockZoom(true);
+    SF->AddLayer(new gShadowArea());
+
+    SF->AddLayer(new gLabelArea(fg),LayerLeft,gYAxis::Margin);
+
+    //SF->AddLayer(new gFooBar(),LayerBottom,0,1);
+    SF->AddLayer(new gXAxis(COLOR_Text,false),LayerBottom,0,gXAxis::Margin);
+
+
+    // The following list contains graphs that don't have standard xgrid/yaxis labels
+    QStringList skipgraph;
+    skipgraph.push_back(STR_GRAPH_EventBreakdown);
+    skipgraph.push_back(STR_GRAPH_SleepFlags);
+    skipgraph.push_back(STR_GRAPH_DailySummary);
+    skipgraph.push_back(STR_GRAPH_TAP);
+
+    QHash<QString, gGraph *>::iterator it;
+
+    for (it = graphlist.begin(); it != graphlist.end(); ++it) {
+        if (skipgraph.contains(it.key())) continue;
+        it.value()->AddLayer(new gXGrid());
+    }
+
+
+    gLineChart *l;
+    l=new gLineChart(CPAP_FlowRate,false,false);
+
+    gGraph *FRW = graphlist[schema::channel[CPAP_FlowRate].code()];
+
+    // Then the graph itself
+    FRW->AddLayer(l);
+
+
+//    FRW->AddLayer(AddOXI(new gLineOverlayBar(OXI_SPO2Drop, COLOR_SPO2Drop, STR_TR_O2)));
+
+    bool square=p_profile->appearance->squareWavePlots();
+    gLineChart *pc=new gLineChart(CPAP_Pressure, square);
+    graphlist[schema::channel[CPAP_Pressure].code()]->AddLayer(pc);
+
+  //  graphlist[schema::channel[CPAP_Pressure].code()]->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_Ramp, COLOR_Ramp, schema::channel[CPAP_Ramp].label(), FT_Span)));
+
+    pc->addPlot(CPAP_EPAP, square);
+    pc->addPlot(CPAP_IPAPLo, square);
+    pc->addPlot(CPAP_IPAP, square);
+    pc->addPlot(CPAP_IPAPHi, square);
+
+    gGraph * TAP2;
+    graphlist[STR_GRAPH_TAP] = TAP2 = new gGraph(STR_GRAPH_TAP, GraphView, QObject::tr("By Pressure"), QObject::tr("Statistics at Pressure"), default_height);
+    MinutesAtPressure * map;
+    TAP2->AddLayer(map = new MinutesAtPressure());
+    TAP2->AddLayer(new gLabelArea(map),LayerLeft,gYAxis::Margin);
+    TAP2->setBlockSelect(true);
+
+    if (p_profile->general->calculateRDI()) {
+        AHI->AddLayer(new gLineChart(CPAP_RDI, square));
+//        AHI->AddLayer(AddCPAP(new AHIChart(QColor("#37a24b"))));
+    } else {
+        AHI->AddLayer(new gLineChart(CPAP_AHI, square));
+    }
+
+    // this is class wide because the leak redline can be reset in preferences..
+    // Better way would be having a search for linechart layers in graphlist[...]
+    gLineChart *leakchart=new gLineChart(CPAP_Leak, square);
+  //  graphlist[schema::channel[CPAP_Leak].code()]->AddLayer(AddCPAP(new gLineOverlayBar(CPAP_LargeLeak, COLOR_LargeLeak, STR_TR_LL, FT_Span)));
+
+    leakchart->addPlot(CPAP_LeakTotal, square);
+    leakchart->addPlot(CPAP_MaxLeak, square);
+//    schema::channel[CPAP_Leak].setUpperThresholdColor(Qt::red);
+//    schema::channel[CPAP_Leak].setLowerThresholdColor(Qt::green);
+
+    graphlist[schema::channel[CPAP_Leak].code()]->AddLayer(leakchart);
+    //LEAK->AddLayer(AddCPAP(new gLineChart(CPAP_Leak, COLOR_Leak,square)));
+    //LEAK->AddLayer(AddCPAP(new gLineChart(CPAP_MaxLeak, COLOR_MaxLeak,square)));
+    graphlist[schema::channel[CPAP_Snore].code()]->AddLayer(new gLineChart(CPAP_Snore, true));
+
+    graphlist[schema::channel[CPAP_PTB].code()]->AddLayer(new gLineChart(CPAP_PTB, square));
+    graphlist[schema::channel[CPAP_Test1].code()]->AddLayer(new gLineChart(CPAP_Test1, false));
+
+
+    gLineChart *lc = nullptr;
+    graphlist[schema::channel[CPAP_MaskPressure].code()]->AddLayer(new gLineChart(CPAP_MaskPressure, false));
+    graphlist[schema::channel[CPAP_RespRate].code()]->AddLayer(lc=new gLineChart(CPAP_RespRate, false));
+
+    graphlist[schema::channel[POS_Inclination].code()]->AddLayer(new gLineChart(POS_Inclination));
+    graphlist[schema::channel[POS_Orientation].code()]->AddLayer(new gLineChart(POS_Orientation));
+
+    graphlist[schema::channel[CPAP_MinuteVent].code()]->AddLayer(lc=new gLineChart(CPAP_MinuteVent, false));
+    lc->addPlot(CPAP_TgMV, square);
+
+    graphlist[schema::channel[CPAP_TidalVolume].code()]->AddLayer(lc=new gLineChart(CPAP_TidalVolume, false));
+    //lc->addPlot(CPAP_Test2,COLOR_DarkYellow,square);
+
+    //graphlist[schema::channel[CPAP_TidalVolume].code()]->AddLayer(AddCPAP(new gLineChart("TidalVolume2", square)));
+    graphlist[schema::channel[CPAP_FLG].code()]->AddLayer(new gLineChart(CPAP_FLG, true));
+    //graphlist[schema::channel[CPAP_RespiratoryEvent].code()]->AddLayer(AddCPAP(new gLineChart(CPAP_RespiratoryEvent, true)));
+    graphlist[schema::channel[CPAP_IE].code()]->AddLayer(lc=new gLineChart(CPAP_IE, false));
+    graphlist[schema::channel[CPAP_Te].code()]->AddLayer(lc=new gLineChart(CPAP_Te, false));
+    graphlist[schema::channel[CPAP_Ti].code()]->AddLayer(lc=new gLineChart(CPAP_Ti, false));
+    //lc->addPlot(CPAP_Test2,COLOR:DarkYellow,square);
+
+    graphlist[schema::channel[ZEO_SleepStage].code()]->AddLayer(new gLineChart(ZEO_SleepStage, true));
+
+//    gLineOverlaySummary *los1=new gLineOverlaySummary(STR_UNIT_EventsPerHour,5,-4);
+//    gLineOverlaySummary *los2=new gLineOverlaySummary(STR_UNIT_EventsPerHour,5,-4);
+//    graphlist[schema::channel[OXI_Pulse].code()]->AddLayer(AddOXI(los1->add(new gLineOverlayBar(OXI_PulseChange, COLOR_PulseChange, STR_TR_PC,FT_Span))));
+//    graphlist[schema::channel[OXI_Pulse].code()]->AddLayer(AddOXI(los1));
+//    graphlist[schema::channel[OXI_SPO2].code()]->AddLayer(AddOXI(los2->add(new gLineOverlayBar(OXI_SPO2Drop, COLOR_SPO2Drop, STR_TR_O2,FT_Span))));
+//    graphlist[schema::channel[OXI_SPO2].code()]->AddLayer(AddOXI(los2));
+
+    graphlist[schema::channel[OXI_Pulse].code()]->AddLayer(new gLineChart(OXI_Pulse, square));
+    graphlist[schema::channel[OXI_SPO2].code()]->AddLayer(new gLineChart(OXI_SPO2, true));
+    graphlist[schema::channel[OXI_Perf].code()]->AddLayer(new gLineChart(OXI_Perf, false));
+    graphlist[schema::channel[OXI_Plethy].code()]->AddLayer(new gLineChart(OXI_Plethy, false));
+
+
+    // Fix me
+//    gLineOverlaySummary *los3=new gLineOverlaySummary(STR_UNIT_EventsPerHour,5,-4);
+//    graphlist["INTPULSE"]->AddLayer(AddCPAP(los3->add(new gLineOverlayBar(OXI_PulseChange, COLOR_PulseChange, STR_TR_PC,FT_Span))));
+//    graphlist["INTPULSE"]->AddLayer(AddCPAP(los3));
+//    graphlist["INTPULSE"]->AddLayer(AddCPAP(new gLineChart(OXI_Pulse, square)));
+//    gLineOverlaySummary *los4=new gLineOverlaySummary(STR_UNIT_EventsPerHour,5,-4);
+//    graphlist["INTSPO2"]->AddLayer(AddCPAP(los4->add(new gLineOverlayBar(OXI_SPO2Drop, COLOR_SPO2Drop, STR_TR_O2,FT_Span))));
+//    graphlist["INTSPO2"]->AddLayer(AddCPAP(los4));
+//    graphlist["INTSPO2"]->AddLayer(AddCPAP(new gLineChart(OXI_SPO2, true)));
+
+    graphlist[schema::channel[CPAP_PTB].code()]->setForceMaxY(100);
+    graphlist[schema::channel[OXI_SPO2].code()]->setForceMaxY(100);
+
+    for (it = graphlist.begin(); it != graphlist.end(); ++it) {
+        if (skipgraph.contains(it.key())) continue;
+
+        it.value()->AddLayer(new gYAxis(),LayerLeft,gYAxis::Margin);
+        it.value()->AddLayer(new gXAxis(),LayerBottom,0,gXAxis::Margin);
+    }
+
+    if (p_profile->cpap->showLeakRedline()) {
+        schema::channel[CPAP_Leak].setUpperThreshold(p_profile->cpap->leakRedline());
+    } else {
+        schema::channel[CPAP_Leak].setUpperThreshold(0); // switch it off
+    }
+
+    layout->layout();
+
+    QTextCharFormat format = ui->calendar->weekdayTextFormat(Qt::Saturday);
+    format.setForeground(QBrush(COLOR_Black, Qt::SolidPattern));
+    ui->calendar->setWeekdayTextFormat(Qt::Saturday, format);
+    ui->calendar->setWeekdayTextFormat(Qt::Sunday, format);
+
+    Qt::DayOfWeek dow=firstDayOfWeekFromLocale();
+
+    ui->calendar->setFirstDayOfWeek(dow);
+
+    ui->tabWidget->setCurrentWidget(webView);
+
+    webView->settings()->setFontSize(QWebSettings::DefaultFontSize,QApplication::font().pointSize());
+    webView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+    connect(webView,SIGNAL(linkClicked(QUrl)),this,SLOT(Link_clicked(QUrl)));
+
+    int ews=p_profile->general->eventWindowSize();
+    ui->evViewSlider->setValue(ews);
+    ui->evViewLCD->display(ews);
+
+
+    icon_on=new QIcon(":/icons/session-on.png");
+    icon_off=new QIcon(":/icons/session-off.png");
+
+    ui->splitter->setVisible(false);
+
+    if (p_profile->general->unitSystem()==US_Archiac) {
+        ui->weightSpinBox->setSuffix(STR_UNIT_POUND);
+        ui->weightSpinBox->setDecimals(0);
+        ui->ouncesSpinBox->setVisible(true);
+        ui->ouncesSpinBox->setSuffix(STR_UNIT_OUNCE);
+    } else {
+        ui->ouncesSpinBox->setVisible(false);
+        ui->weightSpinBox->setDecimals(3);
+        ui->weightSpinBox->setSuffix(STR_UNIT_KG);
+    }
+    GraphView->setEmptyText(STR_Empty_NoData);
+    previous_date=QDate();
+
+    ui->calButton->setChecked(p_profile->appearance->calendarVisible() ? Qt::Checked : Qt::Unchecked);
+    on_calButton_toggled(p_profile->appearance->calendarVisible());
+
+    GraphView->resetLayout();
+    GraphView->LoadSettings("Daily");
+
+    connect(GraphView, SIGNAL(updateCurrentTime(double)), this, SLOT(on_LineCursorUpdate(double)));
+    connect(GraphView, SIGNAL(updateRange(double,double)), this, SLOT(on_RangeUpdate(double,double)));
+    connect(GraphView, SIGNAL(GraphsChanged()), this, SLOT(updateGraphCombo()));
+
+    GraphView->setEmptyImage(QPixmap(":/docs/sheep.png"));
+}
+
+
+//void Daily::populateSessionWidget()
+//{
+
+//    ui->sessionWidget->clearContents();
+//    ui->sessionWidget->setColumnCount(2);
+
+//    QMap<QDate, Day *>::iterator it;
+//    QMap<QDate, Day *>::iterator it_end = p_profile->daylist.end();
+
+//    int row = 0;
+//    for (it = p_profile->daylist.begin(); it != it_end; ++it) {
+//        const QDate & date = it.key();
+//        Day * day = it.value();
+//        QList<Session *> sessions = day->getSessions(MT_CPAP);
+//        int size = sessions.size();
+//        if (size > 0) {
+//            QTableWidgetItem * item = new QTableWidgetItem(date.toString(Qt::SystemLocaleShortDate));
+//            item->setData(Qt::UserRole, date);
+//            ui->sessionWidget->setItem(row, 0, item);
+//            SessionBar * sb = new SessionBar();
+
+//            for (int i=0; i < size; i++) {
+//                Session * sess = sessions[i];
+//                QColor col = Qt::blue;
+//                sb->add(sess, col);
+//            }
+//            ui->sessionWidget->setCellWidget(row, 1, sb);
+//            row++;
+//        }
+//    }
+//    ui->sessionWidget->setRowCount(row-1);
+//    ui->sessionWidget->setCurrentCell(row-1, 0);
+//    ui->sessionWidget->scrollToBottom();
+//}
+Daily::~Daily()
+{
+//    disconnect(sessbar, SIGNAL(toggledSession(Session*)), this, SLOT(doToggleSession(Session*)));
+
+    // Save any last minute changes..
+
+    delete ui;
+    delete icon_on;
+    delete icon_off;
+}
+
+void Daily::showEvent(QShowEvent *)
+{
+    RedrawGraphs();
+}
+
+void Daily::closeEvent(QCloseEvent *event)
+{
+
+    disconnect(webView,SIGNAL(linkClicked(QUrl)),this,SLOT(Link_clicked(QUrl)));
+
+    if (previous_date.isValid())
+        Unload(previous_date);
+
+    GraphView->SaveSettings("Daily");
+    QWidget::closeEvent(event);
+    event->accept();
+}
+
+
+void Daily::doToggleSession(Session * sess)
+{
+    sess->setEnabled(!sess->enabled());
+
+    LoadDate(previous_date);
+    mainwin->getOverview()->graphView()->dataChanged();
+}
+
+void Daily::Link_clicked(const QUrl &url)
+{
+    QString code=url.toString().section("=",0,0).toLower();
+    QString data=url.toString().section("=",1);
+    int sid=data.toInt();
+    Day *day=nullptr;
+
+    if (code=="togglecpapsession") { // Enable/Disable CPAP session
+        day=p_profile->GetDay(previous_date,MT_CPAP);
+        if (!day) return;
+        Session *sess=day->find(sid);
+        if (!sess)
+            return;
+        int i=webView->page()->mainFrame()->scrollBarMaximum(Qt::Vertical)-webView->page()->mainFrame()->scrollBarValue(Qt::Vertical);
+        sess->setEnabled(!sess->enabled());
+
+        // Reload day
+        LoadDate(previous_date);
+        webView->page()->mainFrame()->setScrollBarValue(Qt::Vertical, webView->page()->mainFrame()->scrollBarMaximum(Qt::Vertical)-i);
+    } else  if (code=="toggleoxisession") { // Enable/Disable Oximetry session
+        day=p_profile->GetDay(previous_date,MT_OXIMETER);
+        Session *sess=day->find(sid);
+        if (!sess)
+            return;
+        int i=webView->page()->mainFrame()->scrollBarMaximum(Qt::Vertical)-webView->page()->mainFrame()->scrollBarValue(Qt::Vertical);
+        sess->setEnabled(!sess->enabled());
+
+        // Reload day
+        LoadDate(previous_date);
+        webView->page()->mainFrame()->setScrollBarValue(Qt::Vertical, webView->page()->mainFrame()->scrollBarMaximum(Qt::Vertical)-i);
+    } else if (code=="cpap")  {
+        day=p_profile->GetDay(previous_date,MT_CPAP);
+        if (day) {
+            Session *sess=day->machine(MT_CPAP)->sessionlist[sid];
+            if (sess && sess->enabled()) {
+                GraphView->SetXBounds(sess->first(),sess->last());
+            }
+        }
+    } else if (code=="oxi") {
+        day=p_profile->GetDay(previous_date,MT_OXIMETER);
+        if (day) {
+            Session *sess=day->machine(MT_OXIMETER)->sessionlist[sid];
+            if (sess && sess->enabled()) {
+                GraphView->SetXBounds(sess->first(),sess->last());
+            }
+        }
+
+    } else if (code=="event")  {
+        QList<QTreeWidgetItem *> list=ui->treeWidget->findItems(schema::channel[sid].fullname(),Qt::MatchContains);
+        if (list.size()>0) {
+            ui->treeWidget->collapseAll();
+            ui->treeWidget->expandItem(list.at(0));
+            QTreeWidgetItem *wi=list.at(0)->child(0);
+            ui->treeWidget->setCurrentItem(wi);
+            ui->tabWidget->setCurrentIndex(1);
+        } else {
+            mainwin->Notify(tr("No %1 events are recorded this day").arg(schema::channel[sid].fullname()),"",1500);
+        }
+    } else if (code=="graph") {
+        qDebug() << "Select graph " << data;
+    } else {
+        qDebug() << "Clicked on" << code << data;
+    }
+}
+
+void Daily::ReloadGraphs()
+{
+    GraphView->setDay(nullptr);
+
+    ui->splitter->setVisible(true);
+    QDate d;
+
+    if (previous_date.isValid()) {
+        d=previous_date;
+        //Unload(d);
+    }
+    QDate lastcpap = p_profile->LastDay(MT_CPAP);
+    QDate lastoxi = p_profile->LastDay(MT_OXIMETER);
+
+    d = qMax(lastcpap, lastoxi);
+
+    if (!d.isValid()) {
+        d=ui->calendar->selectedDate();
+    }
+    on_calendar_currentPageChanged(d.year(),d.month());
+    // this fires a signal which unloads the old and loads the new
+    ui->calendar->blockSignals(true);
+    ui->calendar->setSelectedDate(d);
+    ui->calendar->blockSignals(false);
+    Load(d);
+    ui->calButton->setText(ui->calendar->selectedDate().toString(Qt::TextDate));
+    graphView()->redraw();
+}
+
+void Daily::hideSpaceHogs()
+{
+    if (p_profile->appearance->calendarVisible()) {
+        ui->calendarFrame->setVisible(false);
+    }
+}
+void Daily::showSpaceHogs()
+{
+    if (p_profile->appearance->calendarVisible()) {
+        ui->calendarFrame->setVisible(true);
+    }
+}
+
+void Daily::on_calendar_currentPageChanged(int year, int month)
+{
+    QDate d(year,month,1);
+    int dom=d.daysInMonth();
+
+    for (int i=1;i<=dom;i++) {
+        d=QDate(year,month,i);
+        this->UpdateCalendarDay(d);
+    }
+}
+
+void Daily::UpdateEventsTree(QTreeWidget *tree,Day *day)
+{
+    tree->clear();
+    if (!day) return;
+
+    tree->setColumnCount(1); // 1 visible common.. (1 hidden)
+
+    QTreeWidgetItem *root=nullptr;
+    QHash<ChannelID,QTreeWidgetItem *> mcroot;
+    QHash<ChannelID,int> mccnt;
+    int total_events=0;
+
+    qint64 drift=0, clockdrift=p_profile->cpap->clockDrift()*1000L;
+
+    quint32 chantype = schema::FLAG | schema::SPAN | schema::MINOR_FLAG;
+    if (p_profile->general->showUnknownFlags()) chantype |= schema::UNKNOWN;
+    QList<ChannelID> chans = day->getSortedMachineChannels(chantype);
+
+    for (QList<Session *>::iterator s=day->begin();s!=day->end();++s) {
+        Session * sess = *s;
+        if (!sess->enabled()) continue;
+
+        QHash<ChannelID,QVector<EventList *> >::iterator m;
+        for (int c=0; c < chans.size(); ++c) {
+            ChannelID code = chans.at(c);
+            m = sess->eventlist.find(code);
+            if (m == sess->eventlist.end()) continue;
+
+            drift=(sess->type() == MT_CPAP) ? clockdrift : 0;
+
+            QTreeWidgetItem *mcr;
+            if (mcroot.find(code)==mcroot.end()) {
+                int cnt=day->count(code);
+                if (!cnt) continue; // If no events than don't bother showing..
+                total_events+=cnt;
+                QString st=schema::channel[code].fullname();
+                if (st.isEmpty())  {
+                    st=QString("Fixme %1").arg(code);
+                }
+                st+=" ";
+                if (cnt==1) st+=tr("%1 event").arg(cnt);
+                else st+=tr("%1 events").arg(cnt);
+
+                QStringList l(st);
+                l.append("");
+                mcroot[code]=mcr=new QTreeWidgetItem(root,l);
+                mccnt[code]=0;
+            } else {
+                mcr=mcroot[code];
+            }
+
+            for (int z=0;z<m.value().size();z++) {
+                EventList & ev=*(m.value()[z]);
+
+                for (quint32 o=0;o<ev.count();o++) {
+                    qint64 t=ev.time(o)+drift;
+
+                    if (code==CPAP_CSR) { // center it in the middle of span
+                        t-=float(ev.raw(o)/2.0)*1000.0;
+                    }
+                    QStringList a;
+                    QDateTime d=QDateTime::fromMSecsSinceEpoch(t);
+                    QString s=QString("#%1: %2 (%3)").arg((int)(++mccnt[code]),(int)3,(int)10,QChar('0')).arg(d.toString("HH:mm:ss")).arg(m.value()[z]->raw(o));
+                    a.append(s);
+                    QTreeWidgetItem *item=new QTreeWidgetItem(a);
+                    item->setData(0,Qt::UserRole,t);
+                    //a.append(d.toString("yyyy-MM-dd HH:mm:ss"));
+                    mcr->addChild(item);
+                }
+            }
+        }
+    }
+    int cnt=0;
+    for (QHash<ChannelID,QTreeWidgetItem *>::iterator m=mcroot.begin();m!=mcroot.end();m++) {
+        tree->insertTopLevelItem(cnt++,m.value());
+    }
+
+    if (day->hasMachine(MT_CPAP) || day->hasMachine(MT_OXIMETER) || day->hasMachine(MT_POSITION)) {
+        QTreeWidgetItem * start = new QTreeWidgetItem(QStringList(tr("Session Start Times")));
+        QTreeWidgetItem * end = new QTreeWidgetItem(QStringList(tr("Session End Times")));
+        tree->insertTopLevelItem(cnt++ , start);
+        tree->insertTopLevelItem(cnt++ , end);
+        for (QList<Session *>::iterator s=day->begin(); s!=day->end(); ++s) {
+            QDateTime st = QDateTime::fromMSecsSinceEpoch((*s)->first());
+            QDateTime et = QDateTime::fromMSecsSinceEpoch((*s)->last());
+
+            QTreeWidgetItem * item = new QTreeWidgetItem(QStringList(st.toString("HH:mm:ss")));
+            item->setData(0,Qt::UserRole, (*s)->first());
+            start->addChild(item);
+
+
+            item = new QTreeWidgetItem(QStringList(et.toString("HH:mm:ss")));
+            item->setData(0,Qt::UserRole, (*s)->last());
+            end->addChild(item);
+        }
+    }
+    //tree->insertTopLevelItem(cnt++,new QTreeWidgetItem(QStringList("[Total Events ("+QString::number(total_events)+")]")));
+    tree->sortByColumn(0,Qt::AscendingOrder);
+    //tree->expandAll();
+}
+
+void Daily::UpdateCalendarDay(QDate date)
+{
+    QTextCharFormat nodata;
+    QTextCharFormat cpaponly;
+    QTextCharFormat cpapjour;
+    QTextCharFormat oxiday;
+    QTextCharFormat oxicpap;
+    QTextCharFormat jourday;
+    QTextCharFormat stageday;
+
+    cpaponly.setForeground(QBrush(COLOR_Blue, Qt::SolidPattern));
+    cpaponly.setFontWeight(QFont::Normal);
+    cpapjour.setForeground(QBrush(COLOR_Blue, Qt::SolidPattern));
+    cpapjour.setFontWeight(QFont::Bold);
+    oxiday.setForeground(QBrush(COLOR_Red, Qt::SolidPattern));
+    oxiday.setFontWeight(QFont::Normal);
+    oxicpap.setForeground(QBrush(COLOR_Red, Qt::SolidPattern));
+    oxicpap.setFontWeight(QFont::Bold);
+    stageday.setForeground(QBrush(COLOR_Magenta, Qt::SolidPattern));
+    stageday.setFontWeight(QFont::Bold);
+    jourday.setForeground(QBrush(COLOR_DarkYellow, Qt::SolidPattern));
+    jourday.setFontWeight(QFont::Bold);
+    nodata.setForeground(QBrush(COLOR_Black, Qt::SolidPattern));
+    nodata.setFontWeight(QFont::Normal);
+
+    bool hascpap = p_profile->FindDay(date, MT_CPAP)!=nullptr;
+    bool hasoxi = p_profile->FindDay(date, MT_OXIMETER)!=nullptr;
+    bool hasjournal = p_profile->FindDay(date, MT_JOURNAL)!=nullptr;
+    bool hasstage = p_profile->FindDay(date, MT_SLEEPSTAGE)!=nullptr;
+    bool haspos = p_profile->FindDay(date, MT_POSITION)!=nullptr;
+    if (hascpap) {
+        if (hasoxi) {
+            ui->calendar->setDateTextFormat(date, oxicpap);
+        } else if (hasjournal) {
+            ui->calendar->setDateTextFormat(date, cpapjour);
+        } else if (hasstage || haspos) {
+            ui->calendar->setDateTextFormat(date, stageday);
+        } else {
+            ui->calendar->setDateTextFormat(date, cpaponly);
+        }
+    } else if (hasoxi) {
+        ui->calendar->setDateTextFormat(date, oxiday);
+    } else if (hasjournal) {
+        ui->calendar->setDateTextFormat(date, jourday);
+    } else if (hasstage) {
+        ui->calendar->setDateTextFormat(date, oxiday);
+    } else if (haspos) {
+        ui->calendar->setDateTextFormat(date, oxiday);
+    } else {
+        ui->calendar->setDateTextFormat(date, nodata);
+    }
+    ui->calendar->setHorizontalHeaderFormat(QCalendarWidget::ShortDayNames);
+}
+void Daily::LoadDate(QDate date)
+{
+    if (!date.isValid()) {
+        qDebug() << "LoadDate called with invalid date";
+        return;
+    }
+    ui->calendar->blockSignals(true);
+    if (date.month()!=previous_date.month()) {
+        on_calendar_currentPageChanged(date.year(),date.month());
+    }
+    ui->calendar->setSelectedDate(date);
+    ui->calendar->blockSignals(false);
+    on_calendar_selectionChanged();
+}
+void Daily::on_calendar_selectionChanged()
+{
+    QTimer::singleShot(0, this, SLOT(on_ReloadDay()));
+}
+
+void Daily::on_ReloadDay()
+{
+    graphView()->releaseKeyboard();
+    QTime time;
+    time_t unload_time, load_time, other_time;
+    time.start();
+
+    this->setCursor(Qt::BusyCursor);
+    if (previous_date.isValid()) {
+       // GraphView->fadeOut();
+        Unload(previous_date);
+    }
+    unload_time=time.restart();
+    //bool fadedir=previous_date < ui->calendar->selectedDate();
+    ZombieMeterMoved=false;
+    Load(ui->calendar->selectedDate());
+    load_time=time.restart();
+
+    //GraphView->fadeIn(fadedir);
+    GraphView->redraw();
+    ui->calButton->setText(ui->calendar->selectedDate().toString(Qt::TextDate));
+    ui->calendar->setFocus(Qt::ActiveWindowFocusReason);
+
+    if (p_profile->general->unitSystem()==US_Archiac) {
+        ui->weightSpinBox->setSuffix(STR_UNIT_POUND);
+        ui->weightSpinBox->setDecimals(0);
+        ui->ouncesSpinBox->setVisible(true);
+        ui->ouncesSpinBox->setSuffix(STR_UNIT_OUNCE);
+    } else {
+        ui->ouncesSpinBox->setVisible(false);
+        ui->weightSpinBox->setDecimals(3);
+        ui->weightSpinBox->setSuffix(STR_UNIT_KG);
+    }
+    this->setCursor(Qt::ArrowCursor);
+    other_time=time.restart();
+
+    qDebug() << "Page change time (in ms): Unload ="<<unload_time<<"Load =" << load_time << "Other =" << other_time;
+}
+void Daily::ResetGraphLayout()
+{
+    GraphView->resetLayout();
+}
+void Daily::graphtogglebutton_toggled(bool b)
+{
+    Q_UNUSED(b)
+    for (int i=0;i<GraphView->size();i++) {
+        QString title=(*GraphView)[i]->title();
+        (*GraphView)[i]->setVisible(GraphToggles[title]->isChecked());
+    }
+    GraphView->updateScale();
+    GraphView->redraw();
+}
+
+MyWebPage::MyWebPage(QObject *parent):
+   QWebPage(parent)
+{
+   // Enable plugin support
+   settings()->setAttribute(QWebSettings::PluginsEnabled, true);
+}
+
+QObject *MyWebPage::createPlugin(const QString &classid, const QUrl &url, const QStringList & paramNames, const QStringList & paramValues)
+{
+    Q_UNUSED(paramNames)
+    Q_UNUSED(paramValues)
+    Q_UNUSED(url)
+
+    if (classid=="SessionBar") {
+        return mainwin->getDaily()->sessionBar();
+    }
+    qDebug() << "Request for unknown MyWebPage plugin";
+    return new QWidget();
+}
+
+MyWebView::MyWebView(QWidget *parent):
+   QWebView(parent),
+   m_page(this)
+{
+   // Set the page of our own PageView class, MyPageView,
+   // because only objects of this class will handle
+   // object-tags correctly.
+   setPage(&m_page);
+}
+
+
+QString Daily::getSessionInformation(Day * day)
+{
+    QString html;
+    if (!day) return html;
+
+    html="<table cellpadding=0 cellspacing=0 border=0 width=100%>";
+    html+=QString("<tr><td colspan=5 align=center><b>"+tr("Session Information")+"</b></td></tr>");
+    html+="<tr><td colspan=5 align=center> </td></tr>";
+    QFontMetrics FM(*defaultfont);
+    QRect r=FM.boundingRect('@');
+
+    Machine * cpap = day->machine(MT_CPAP);
+
+    if (cpap) {
+        html+=QString("<tr><td colspan=5 align=center>"
+        "<object type=\"application/x-qt-plugin\" classid=\"SessionBar\" name=\"sessbar\" height=%1 width=100%></object>"
+//        "<script>"
+//        "sessbar.show();"
+//        "</script>"
+        "</td></tr>").arg(r.height()*3,0,10);
+        html+="<tr><td colspan=5 align=center>  </td></tr>";
+    }
+
+
+    QDateTime fd,ld;
+    bool corrupted_waveform=false;
+    QString tooltip;
+
+    QString type;
+
+    QHash<MachineType, Machine *>::iterator mach_end = day->machines.end();
+    QHash<MachineType, Machine *>::iterator mi;
+
+    for (mi = day->machines.begin(); mi != mach_end; ++mi) {
+        if (mi.key() == MT_JOURNAL) continue;
+        html += "<tr><td colspan=5 align=center><i>";
+        switch (mi.key()) {
+            case MT_CPAP: type="cpap";
+                html+=tr("CPAP Sessions");
+                break;
+            case MT_OXIMETER: type="oxi";
+                html+=tr("Oximetery Sessions");
+                break;
+            case MT_SLEEPSTAGE: type="stage";
+                html+=tr("Sleep Stage Sessions");
+                break;
+            case MT_POSITION: type="stage";
+                html+=tr("Position Sensor Sessions");
+                break;
+
+            default:
+                type="unknown";
+                html+=tr("Unknown Session");
+                break;
+        }
+        html+="</i></td></tr>\n";
+        html+=QString("<tr>"
+                      "<td>"+STR_TR_On+"</td>"
+                      "<td>"+STR_TR_Date+"</td>"
+                      "<td>"+STR_TR_Start+"</td>"
+                      "<td>"+STR_TR_End+"</td>"
+                      "<td>"+tr("Duration")+"</td></tr>");
+
+        QList<Session *> sesslist = day->getSessions(mi.key(), true);
+
+        for (QList<Session *>::iterator s=sesslist.begin(); s != sesslist.end(); ++s) {
+            if (((*s)->type() == MT_CPAP) &&
+                ((*s)->settings.find(CPAP_BrokenWaveform) != (*s)->settings.end()))
+                    corrupted_waveform=true;
+
+            fd=QDateTime::fromTime_t((*s)->first()/1000L);
+            ld=QDateTime::fromTime_t((*s)->last()/1000L);
+            int len=(*s)->length()/1000L;
+            int h=len/3600;
+            int m=(len/60) % 60;
+            int s1=len % 60;
+
+            Session *sess=*s;
+            bool b=sess->enabled();
+
+            html+=QString("<tr class='datarow2'><td colspan=5 align=center>%2</td></tr>"
+                          "<tr class='datarow2'>"
+                          "<td width=26><a href='toggle"+type+"session=%1'>"
+                          "<img src='qrc:/icons/session-%4.png' width=24px></a></td>"
+                          "<td align=left>%5</td>"
+                          "<td align=left>%6</td>"
+                          "<td align=left>%7</td>"
+                          "<td align=left>%3</td></tr>"
+                          )
+                    .arg((*s)->session())
+                    .arg(QObject::tr("%1 Session #%2").arg((*s)->machine()->loaderName()).arg((*s)->session(),8,10,QChar('0')))
+                    .arg(QString("%1h %2m %3s").arg(h,2,10,QChar('0')).arg(m,2,10,QChar('0')).arg(s1,2,10,QChar('0')))
+                    .arg((b ? "on" : "off"))
+                    .arg(fd.date().toString(Qt::SystemLocaleShortDate))
+                    .arg(fd.toString("HH:mm:ss"))
+                    .arg(ld.toString("HH:mm:ss"));
+#ifdef SESSION_DEBUG
+            for (int i=0; i< sess->session_files.size(); ++i) {
+                html+=QString("<tr><td colspan=5 align=center>%1</td></tr>").arg(sess->session_files[i].section("/",-1));
+            }
+#endif
+        }
+    }
+
+    if (corrupted_waveform) {
+        html+=QString("<tr><td colspan=5 align=center><i>%1</i></td></tr>").arg(tr("One or more waveform record for this session had faulty source data. Some waveform overlay points may not match up correctly."));
+    }
+    html+="</table>";
+    return html;
+}
+
+QString Daily::getMachineSettings(Day * day) {
+    QString html;
+
+    Machine * cpap = day->machine(MT_CPAP);
+    if (cpap && day->hasEnabledSessions(MT_CPAP)) {
+        html="<table cellpadding=0 cellspacing=0 border=0 width=100%>";
+        html+=QString("<tr><td colspan=5 align=center><b>%1</b></td></tr>").arg(tr("Machine Settings"));
+        html+="<tr><td colspan=5> </td></tr>";
+
+        if ((day->settingExists(CPAP_BrokenSummary))) {
+            html+="<tr><td colspan=5 align=center><i>"+tr("Machine Settings Unavailable")+"</i></td></tr></table><hr/>\n";
+            return html;
+        }
+
+        QMap<QString, QString> other;
+        Session * sess = day->firstSession(MT_CPAP);
+
+        QHash<ChannelID, QVariant>::iterator it;
+        QHash<ChannelID, QVariant>::iterator it_end;
+        if (sess) {
+            it_end = sess->settings.end();
+            it = sess->settings.begin();
+        }
+        QMap<int, QString> first;
+
+        CPAPLoader * loader = qobject_cast<CPAPLoader *>(cpap->loader());
+
+        ChannelID cpapmode = loader->CPAPModeChannel();
+        schema::Channel & chan = schema::channel[cpapmode];
+        first[cpapmode] = QString("<tr class='datarow'><td><a class='info' href='#'>%1<span>%2</span></a></td><td colspan=4>%3</td></tr>")
+                .arg(chan.label())
+                .arg(chan.description())
+                .arg(day->getCPAPMode());
+
+
+        if (sess) for (; it != it_end; ++it) {
+            ChannelID code = it.key();
+
+            if ((code <= 1) || (code == RMS9_MaskOnTime) || (code == CPAP_Mode) || (code == cpapmode) || (code == CPAP_SummaryOnly)) continue;
+
+            schema::Channel & chan = schema::channel[code];
+
+            QString data;
+
+            if (chan.datatype() == schema::LOOKUP) {
+                data = chan.option(it.value().toInt());
+            } else if (chan.datatype() == schema::BOOL) {
+                data = (it.value().toBool() ? STR_TR_Yes : STR_TR_No);
+            } else if (chan.datatype() == schema::DOUBLE) {
+                data = QString().number(it.value().toDouble(),'f',1) + " "+chan.units();
+            } else {
+                data = it.value().toString() + " "+ chan.units();
+            }
+            QString tmp = QString("<tr class='datarow'><td><a class='info' href='#'>%1<span>%2</span></a></td><td colspan=4>%3</td></tr>")
+                    .arg(schema::channel[code].label())
+                    .arg(schema::channel[code].description())
+                    .arg(data);
+
+
+            if ((code == CPAP_IPAP)
+            || (code == CPAP_EPAP)
+            || (code == CPAP_IPAPHi)
+            || (code == CPAP_EPAPHi)
+            || (code == CPAP_IPAPLo)
+            || (code == CPAP_EPAPLo)
+            || (code == CPAP_PressureMin)
+            || (code == CPAP_PressureMax)
+            || (code == CPAP_Pressure)
+            || (code == CPAP_PSMin)
+            || (code == CPAP_PSMax)
+            || (code == CPAP_PS)) {
+                first[code] = tmp;
+            } else {
+                other[schema::channel[code].label()] = tmp;
+            }
+        }
+
+        ChannelID order[] = { cpapmode, CPAP_Pressure, CPAP_PressureMin, CPAP_PressureMax, CPAP_EPAP, CPAP_EPAPLo, CPAP_EPAPHi, CPAP_IPAP, CPAP_IPAPLo, CPAP_IPAPHi, CPAP_PS, CPAP_PSMin, CPAP_PSMax };
+        int os = sizeof(order) / sizeof(ChannelID);
+        for (int i=0 ;i < os; ++i) {
+            if (first.contains(order[i])) html += first[order[i]];
+        }
+
+        for (QMap<QString,QString>::iterator it = other.begin(); it != other.end(); ++it) {
+            html += it.value();
+        }
+
+  /*      ChannelID pr_level_chan = NoChannel;
+        ChannelID pr_mode_chan = NoChannel;
+        ChannelID hum_stat_chan = NoChannel;
+        ChannelID hum_level_chan = NoChannel;
+        CPAPLoader * loader = dynamic_cast<CPAPLoader *>(cpap->machine->loader());
+        if (loader) {
+            pr_level_chan = loader->PresReliefLevel();
+            pr_mode_chan = loader->PresReliefMode();
+            hum_stat_chan = loader->HumidifierConnected();
+            hum_level_chan = loader->HumidifierLevel();
+        }
+
+        if ((pr_level_chan != NoChannel) && (cpap->settingExists(pr_level_chan))) {
+            QString flexstr = cpap->getPressureRelief();
+
+            html+=QString("<tr><td><a class='info' href='#'>%1<span>%2</span></a></td><td colspan=4>%3</td></tr>")
+                    .arg(schema::channel[pr_mode_chan].label())
+                    .arg(schema::channel[pr_mode_chan].description())
+                    .arg(flexstr);
+        }
+
+
+        if (cpap->settingExists(hum_level_chan)) {
+            int humid=round(cpap->settings_wavg(hum_level_chan));
+            html+=QString("<tr><td><a class='info' href='#'>"+schema::channel[hum_level_chan].label()+"<span>%1</span></a></td><td colspan=4>%2</td></tr>")
+                .arg(schema::channel[hum_level_chan].description())
+                .arg(humid == 0 ? STR_GEN_Off : "x"+QString::number(humid));
+        } */
+        html+="</table>";
+        html+="<hr/>\n";
+    }
+    return html;
+}
+
+QString Daily::getOximeterInformation(Day * day)
+{
+    QString html;
+    Machine * oxi = day->machine(MT_OXIMETER);
+    if (oxi && day->hasEnabledSessions(MT_OXIMETER)) {
+        html="<table cellpadding=0 cellspacing=0 border=0 width=100%>";
+        html+=QString("<tr><td colspan=5 align=center><b>%1</b></td></tr>\n").arg(tr("Oximeter Information"));
+        html+="<tr><td colspan=5 align=center> </td></tr>";
+        html+="<tr><td colspan=5 align=center>"+oxi->brand()+" "+oxi->model()+"</td></tr>\n";
+        html+="<tr><td colspan=5 align=center> </td></tr>";
+        html+=QString("<tr><td colspan=5 align=center>%1: %2 (%3%)</td></tr>").arg(tr("SpO2 Desaturations")).arg(day->count(OXI_SPO2Drop)).arg((100.0/day->hours(MT_OXIMETER)) * (day->sum(OXI_SPO2Drop)/3600.0),0,'f',2);
+        html+=QString("<tr><td colspan=5 align=center>%1: %2 (%3%)</td></tr>").arg(tr("Pulse Change events")).arg(day->count(OXI_PulseChange)).arg((100.0/day->hours(MT_OXIMETER)) * (day->sum(OXI_PulseChange)/3600.0),0,'f',2);
+        html+=QString("<tr><td colspan=5 align=center>%1: %2%</td></tr>").arg(tr("SpO2 Baseline Used")).arg(day->settings_wavg(OXI_SPO2Drop),0,'f',2); // CHECKME: Should this value be wavg OXI_SPO2 isntead?
+        html+="</table>\n";
+        html+="<hr/>\n";
+    }
+    return html;
+}
+
+QString Daily::getCPAPInformation(Day * day)
+{
+    QString html;
+    if (!day)
+        return html;
+
+    Machine * cpap = day->machine(MT_CPAP);
+    if (!cpap) return html;
+
+
+    MachineInfo info = cpap->getInfo();
+
+    html="<table cellspacing=0 cellpadding=0 border=0 width='100%'>\n";
+
+    html+="<tr><td align=center><a class=info2 href='#'>"+info.brand + " "+ info.series+"<br/> "+info.model+"<span>";
+    QString tooltip=("Model "+info.modelnumber+" - "+info.serial);
+    tooltip=tooltip.replace(" "," ");
+
+    html+=tooltip;
+    html+="</span></td></tr>\n";
+    //CPAPMode mode=(CPAPMode)(int)cpap->settings_max(CPAP_Mode);
+    html+="<tr><td align=center>";
+
+    html+=tr("PAP Mode: %1<br/>").arg(day->getCPAPMode());
+    html+= day->getPressureSettings();
+    html+="</td></tr>\n";
+    if ((day->settingExists(CPAP_BrokenSummary))) {
+        html+="<tr><td> </td></tr>\n";
+        html+=QString("<tr><td colspan=2><i>%1</i></td></tr>").arg("<b>"+STR_MessageBox_PleaseNote+":</b> "+ tr("This day has missing pressure, mode and settings data."));
+    }
+
+    html+="</table>\n";
+    html+="<hr/>\n";
+    return html;
+}
+
+
+QString Daily::getStatisticsInfo(Day * day)
+{
+    if (!day) return QString();
+
+    Machine *cpap = day->machine(MT_CPAP),
+            *oxi = day->machine(MT_OXIMETER),
+            *pos = day->machine(MT_POSITION);
+
+
+    int mididx=p_profile->general->prefCalcMiddle();
+    SummaryType ST_mid;
+    if (mididx==0) ST_mid=ST_PERC;
+    if (mididx==1) ST_mid=ST_WAVG;
+    if (mididx==2) ST_mid=ST_AVG;
+
+    float percentile=p_profile->general->prefCalcPercentile()/100.0;
+
+    SummaryType ST_max=p_profile->general->prefCalcMax() ? ST_PERC : ST_MAX;
+    const EventDataType maxperc=0.995F;
+
+    QString midname;
+    if (ST_mid==ST_WAVG) midname=STR_TR_WAvg;
+    else if (ST_mid==ST_AVG) midname=STR_TR_Avg;
+    else if (ST_mid==ST_PERC) midname=STR_TR_Med;
+
+    QString html;
+
+    html+="<table cellspacing=0 cellpadding=0 border=0 width='100%'>\n";
+    html+=QString("<tr><td colspan=5 align=center><b>%1</b></td></tr>\n").arg(tr("Statistics"));
+    html+=QString("<tr><td><b>%1</b></td><td><b>%2</b></td><td><b>%3</b></td><td><b>%4</b></td><td><b>%5</b></td></tr>")
+            .arg(STR_TR_Channel)
+            .arg(STR_TR_Min)
+            .arg(midname)
+            .arg(tr("%1%2").arg(percentile*100,0,'f',0).arg(STR_UNIT_Percentage))
+            .arg(STR_TR_Max);
+
+    ChannelID chans[]={
+        CPAP_Pressure,CPAP_EPAP,CPAP_IPAP,CPAP_PS,CPAP_PTB,
+        CPAP_MinuteVent, CPAP_RespRate, CPAP_RespEvent,CPAP_FLG,
+        CPAP_Leak, CPAP_LeakTotal, CPAP_Snore,CPAP_IE,CPAP_Ti,CPAP_Te, CPAP_TgMV,
+        CPAP_TidalVolume, OXI_Pulse, OXI_SPO2, POS_Inclination, POS_Orientation
+    };
+    int numchans=sizeof(chans)/sizeof(ChannelID);
+    int ccnt=0;
+    EventDataType tmp,med,perc,mx,mn;
+
+    for (int i=0;i<numchans;i++) {
+
+        ChannelID code=chans[i];
+
+        if (!day->channelHasData(code))
+            continue;
+
+        QString tooltip=schema::channel[code].description();
+
+        if (!schema::channel[code].units().isEmpty()) tooltip+=" ("+schema::channel[code].units()+")";
+
+        if (ST_max == ST_MAX) {
+            mx=day->Max(code);
+        } else {
+            mx=day->percentile(code,maxperc);
+        }
+
+        mn=day->Min(code);
+        perc=day->percentile(code,percentile);
+
+        if (ST_mid == ST_PERC) {
+            med=day->percentile(code,0.5);
+            tmp=day->wavg(code);
+            if (tmp>0 || mx==0) {
+                tooltip+=QString("<br/>"+STR_TR_WAvg+": %1").arg(tmp,0,'f',2);
+            }
+        } else if (ST_mid == ST_WAVG) {
+            med=day->wavg(code);
+            tmp=day->percentile(code,0.5);
+            if (tmp>0 || mx==0) {
+                tooltip+=QString("<br/>"+STR_TR_Median+": %1").arg(tmp,0,'f',2);
+            }
+        } else if (ST_mid == ST_AVG) {
+            med=day->avg(code);
+            tmp=day->percentile(code,0.5);
+            if (tmp>0 || mx==0) {
+                tooltip+=QString("<br/>"+STR_TR_Median+": %1").arg(tmp,0,'f',2);
+            }
+        }
+
+        html+=QString("<tr class='datarow'><td align=left class='info' onmouseover=\"style.color='blue';\" onmouseout=\"style.color='"+COLOR_Text.name()+"';\">%1<span>%6</span></td><td>%2</td><td>%3</td><td>%4</td><td>%5</td></tr>")
+            .arg(schema::channel[code].label())
+            .arg(mn,0,'f',2)
+            .arg(med,0,'f',2)
+            .arg(perc,0,'f',2)
+            .arg(mx,0,'f',2)
+            .arg(tooltip);
+        ccnt++;
+
+    }
+
+    if (GraphView->isEmpty() && ((ccnt>0) || (cpap && day->summaryOnly()))) {
+        html+="<tr><td colspan=5> </td></tr>\n";
+        html+=QString("<tr><td colspan=5 align=center><i>%1</i></td></tr>").arg("<b>"+STR_MessageBox_PleaseNote+"</b> "+ tr("This day just contains summary data, only limited information is available ."));
+    } else if (cpap) {
+        html+="<tr><td colspan=5> </td></tr>";
+
+        if ((cpap->loaderName() == STR_MACH_ResMed) || ((cpap->loaderName() == STR_MACH_PRS1) && (p_profile->cpap->resyncFromUserFlagging()))) {
+            int ttia = day->sum(CPAP_Obstructive) + day->sum(CPAP_ClearAirway) + day->sum(CPAP_Apnea) + day->sum(CPAP_Hypopnea);
+            int h = ttia / 3600;
+            int m = ttia / 60 % 60;
+            int s = ttia % 60;
+            if (ttia > 0) {
+                html+="<tr><td colspan=3 align='left' bgcolor='white'><b>"+tr("Total time in apnea")+
+                    QString("</b></td><td colspan=2 bgcolor='white'>%1</td></tr>").arg(QString().sprintf("%02i:%02i:%02i",h,m,s));
+            }
+
+        }
+        float hours = day->hours(MT_CPAP);
+
+        if (p_profile->cpap->showLeakRedline()) {
+            float rlt = day->timeAboveThreshold(CPAP_Leak, p_profile->cpap->leakRedline()) / 60.0;
+            float pc = 100.0 / hours * rlt;
+            html+="<tr><td colspan=3 align='left' bgcolor='white'><b>"+tr("Time over leak redline")+
+                    QString("</b></td><td colspan=2 bgcolor='white'>%1%</td></tr>").arg(pc, 0, 'f', 3);
+        }
+        int l = day->sum(CPAP_Ramp);
+
+        if (l > 0) {
+            html+="<tr><td colspan=3 align='left' bgcolor='white'>"+tr("Total ramp time")+
+                    QString("</td><td colspan=2 bgcolor='white'>%1:%2:%3</td></tr>").arg(l / 3600, 2, 10, QChar('0')).arg((l / 60) % 60, 2, 10, QChar('0')).arg(l % 60, 2, 10, QChar('0'));
+            float v = (hours - (float(l) / 3600.0));
+            int q = v * 3600.0;
+            html+="<tr><td colspan=3 align='left' bgcolor='white'>"+tr("Time outside of ramp")+
+                    QString("</td><td colspan=2 bgcolor='white'>%1:%2:%3</td></tr>").arg(q / 3600, 2, 10, QChar('0')).arg((q / 60) % 60, 2, 10, QChar('0')).arg(q % 60, 2, 10, QChar('0'));
+
+//            EventDataType hc = day->count(CPAP_Hypopnea) - day->countInsideSpan(CPAP_Ramp, CPAP_Hypopnea);
+//            EventDataType oc = day->count(CPAP_Obstructive) - day->countInsideSpan(CPAP_Ramp, CPAP_Obstructive);
+
+            //EventDataType tc = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive);
+//            EventDataType ahi = (hc+oc) / v;
+            // Not sure if i was trying to be funny, and left on my replication of Devilbiss's bug here...  :P
+
+//            html+="<tr><td colspan=3 align='left' bgcolor='white'>"+tr("AHI excluding ramp")+
+//                    QString("</td><td colspan=2 bgcolor='white'>%1</td></tr>").arg(ahi, 0, 'f', 2);
+        }
+
+    }
+
+
+    html+="</table>\n";
+    html+="<hr/>\n";
+    return html;
+}
+
+QString Daily::getEventBreakdown(Day * cpap)
+{
+    Q_UNUSED(cpap)
+    QString html;
+    html+="<table cellspacing=0 cellpadding=0 border=0 width='100%'>\n";
+
+    html+="</table>";
+    return html;
+}
+
+QString Daily::getSleepTime(Day * day)
+{
+    //cpap, Day * oxi
+    QString html;
+
+    if (!day || (day->hours() < 0.0000001))
+        return html;
+
+    html+="<table cellspacing=0 cellpadding=0 border=0 width='100%'>\n";
+    html+="<tr><td align='center'><b>"+STR_TR_Date+"</b></td><td align='center'><b>"+tr("Sleep")+"</b></td><td align='center'><b>"+tr("Wake")+"</b></td><td align='center'><b>"+STR_UNIT_Hours+"</b></td></tr>";
+    int tt=qint64(day->total_time())/1000L;
+    QDateTime date=QDateTime::fromTime_t(day->first()/1000L);
+    QDateTime date2=QDateTime::fromTime_t(day->last()/1000L);
+
+    int h=tt/3600;
+    int m=(tt/60)%60;
+    int s=tt % 60;
+    html+=QString("<tr><td align='center'>%1</td><td align='center'>%2</td><td align='center'>%3</td><td align='center'>%4</td></tr>\n")
+            .arg(date.date().toString(Qt::SystemLocaleShortDate))
+            .arg(date.toString("HH:mm:ss"))
+            .arg(date2.toString("HH:mm:ss"))
+            .arg(QString().sprintf("%02i:%02i:%02i",h,m,s));
+    html+="</table>\n";
+//    html+="<hr/>";
+
+    return html;
+}
+
+
+
+void Daily::Load(QDate date)
+{
+    dateDisplay->setText("<i>"+date.toString(Qt::SystemLocaleLongDate)+"</i>");
+    previous_date=date;
+
+    Day * day = p_profile->GetDay(date);
+    Machine *cpap = nullptr,
+            *oxi = nullptr,
+            *stage = nullptr,
+            *posit = nullptr;
+
+    if (day) {
+        cpap = day->machine(MT_CPAP);
+        oxi = day->machine(MT_OXIMETER);
+        stage = day->machine(MT_SLEEPSTAGE);
+        posit = day->machine(MT_POSITION);
+    }
+
+    if (!p_profile->session->cacheSessions()) {
+        // Getting trashed on purge last day...
+
+        // lastcpapday can get purged and be invalid
+        if (lastcpapday && (lastcpapday!=day)) {
+            for (QMap<QDate, Day *>::iterator di = p_profile->daylist.begin(); di!= p_profile->daylist.end(); ++di) {
+                Day * d = di.value();
+                if (d->eventsLoaded()) {
+                    if (d->useCounter() == 0) {
+                        d->CloseEvents();
+                    }
+                }
+            }
+        }
+    }
+
+    // Don't really see a point in unlinked oximetery sessions anymore... All I can say is BLEH...
+//    if ((cpap && oxi) && day->hasEnabledSessions(MT_OXIMETER)) {
+//        int gr;
+
+//        if (qAbs(day->first(MT_CPAP) - day->first(MT_OXIMETER)) > 30000) {
+//            mainwin->Notify(tr("Oximetry data exists for this day, but its timestamps are too different, so the Graphs will not be linked."),"",3000);
+//            gr=1;
+//        } else
+//            gr=0;
+
+//        (*GraphView)[schema::channel[OXI_Pulse].code()]->setGroup(gr);
+//        (*GraphView)[schema::channel[OXI_SPO2].code()]->setGroup(gr);
+//        (*GraphView)[schema::channel[OXI_Plethy].code()]->setGroup(gr);
+//    }
+    lastcpapday=day;
+
+    QString html="<html><head><style type='text/css'>"
+    "p,a,td,body { font-family: '"+QApplication::font().family()+"'; }"
+    "p,a,td,body { font-size: "+QString::number(QApplication::font().pointSize() + 2)+"px; }"
+    "tr.datarow:nth-child(even) {"
+    "background-color: #f8f8f8;"
+    "}"
+    "tr.datarow2:nth-child(4n-1) {"
+    "background-color: #f8f8f8;"
+    "}"
+    "tr.datarow2:nth-child(4n+0) {"
+    "background-color: #f8f8f8;"
+    "}"
+    "table.curved {"
+    "border: 1px solid gray;"
+    "border-radius:10px;"
+    "-moz-border-radius:10px;"
+    "-webkit-border-radius:10px;"
+    "page-break-after:auto;"
+    "-fs-table-paginate: paginate;"
+    "}"
+
+    "</style>"
+    "<link rel='stylesheet' type='text/css' href='qrc:/docs/tooltips.css' />"
+    "<script language='javascript'><!--"
+            "func dosession(sessid) {"
+            ""
+            "}"
+    "--></script>"
+    "</head>"
+    "<body leftmargin=0 rightmargin=0 topmargin=0 marginwidth=0 marginheight=0>";
+    QString tmp;
+
+    if (day) {
+        day->OpenEvents();
+    }
+    GraphView->setDay(day);
+
+
+//    UpdateOXIGraphs(oxi);
+//    UpdateCPAPGraphs(cpap);
+//    UpdateSTAGEGraphs(stage);
+//    UpdatePOSGraphs(posit);
+    UpdateEventsTree(ui->treeWidget, day);
+
+    // FIXME:
+    // Generating entire statistics because bookmarks may have changed.. (This updates the side panel too)
+    mainwin->GenerateStatistics();
+
+    snapGV->setDay(day);
+
+   // GraphView->ResetBounds(false);
+
+    // wtf is hiding the scrollbars for???
+//    if (!cpap && !oxi) {
+//        scrollbar->hide();
+//    } else {
+//        scrollbar->show();
+//    }
+
+    QString modestr;
+    CPAPMode mode=MODE_UNKNOWN;
+    QString a;
+    bool isBrick=false;
+
+    updateGraphCombo();
+    ui->eventsCombo->clear();
+
+    quint32 chans = schema::SPAN | schema::FLAG | schema::MINOR_FLAG;
+    if (p_profile->general->showUnknownFlags()) chans |= schema::UNKNOWN;
+
+    QList<ChannelID> available;
+    if (day) available.append(day->getSortedMachineChannels(chans));
+
+    for (int i=0; i < available.size(); ++i) {
+        ChannelID code = available.at(i);
+        schema::Channel & chan = schema::channel[code];
+        ui->eventsCombo->addItem(chan.enabled() ? *icon_on : * icon_off, chan.label(), code);
+        ui->eventsCombo->setItemData(i, chan.fullname(), Qt::ToolTipRole);
+
+    }
+
+    if (!cpap) {
+        GraphView->setEmptyImage(QPixmap(":/docs/sheep.png"));
+    }
+    if (cpap) {
+        //QHash<schema::ChanType, QList<schema::Channel *> > list;
+
+
+        float hours=day->hours(MT_CPAP);
+        if (GraphView->isEmpty() && (hours>0)) {
+            if (!p_profile->hasChannel(CPAP_Obstructive) && !p_profile->hasChannel(CPAP_Hypopnea)) {
+                GraphView->setEmptyText(STR_Empty_Brick);
+
+                GraphView->setEmptyImage(QPixmap(":/icons/sadface.png"));
+                isBrick=true;
+            } else {
+                GraphView->setEmptyImage(QPixmap(":/docs/sheep.png"));
+            }
+        }
+
+        mode=(CPAPMode)(int)day->settings_max(CPAP_Mode);
+
+        modestr=schema::channel[CPAP_Mode].m_options[mode];
+
+        EventDataType ahi=(day->count(CPAP_Obstructive)+day->count(CPAP_Hypopnea)+day->count(CPAP_ClearAirway)+day->count(CPAP_Apnea));
+        if (p_profile->general->calculateRDI()) ahi+=day->count(CPAP_RERA);
+        ahi/=hours;
+
+        if (hours>0) {
+            html+="<table cellspacing=0 cellpadding=0 border=0 width='100%'>\n";
+            html+="<tr>";
+            if (!isBrick) {
+                ChannelID ahichan=CPAP_AHI;
+                QString ahiname=STR_TR_AHI;
+                if (p_profile->general->calculateRDI()) {
+                    ahichan=CPAP_RDI;
+                    ahiname=STR_TR_RDI;
+                }
+                html+=QString("<td colspan=4 bgcolor='%1' align=center><a class=info2 href='#'><font size=+4 color='%2'><b>%3</b></font><span>%4</span></a>   <font size=+4 color='%2'><b>%5</b></font></td>\n")
+                        .arg("#F88017").arg(COLOR_Text.name()).arg(ahiname).arg(schema::channel[ahichan].fullname()).arg(ahi,0,'f',2);
+            } else {
+                html+=QString("<td colspan=5 bgcolor='%1' align=center><font size=+4 color='yellow'>%2</font></td>\n")
+                        .arg("#F88017").arg(tr("BRICK! :("));
+            }
+            html+="</tr>\n";
+            html+="</table>\n";
+            html+=getCPAPInformation(day);
+            html+=getSleepTime(day);
+
+            html+="<table cellspacing=0 cellpadding=0 border=0 width='100%'>\n";
+
+
+            quint32 zchans = schema::SPAN | schema::FLAG;
+            bool show_minors = true;
+            if (p_profile->general->showUnknownFlags()) zchans |= schema::UNKNOWN;
+
+            if (show_minors) zchans |= schema::MINOR_FLAG;
+            QList<ChannelID> available = day->getSortedMachineChannels(zchans);
+
+            EventDataType val;
+            QHash<ChannelID, EventDataType> values;
+            for (int i=0; i < available.size(); ++i) {
+                ChannelID code = available.at(i);
+                schema::Channel & chan = schema::channel[code];
+                if (!chan.enabled()) continue;
+                QString data;
+                if (chan.type() == schema::SPAN) {
+                    val = (100.0 / hours)*(day->sum(code)/3600.0);
+                    data = QString("%1%").arg(val,0,'f',2);
+                } else {
+                    val = day->count(code) / hours;
+                    data = QString("%1").arg(val,0,'f',2);
+                }
+                values[code] = val;
+                QColor altcolor = (brightness(chan.defaultColor()) < 0.3) ? Qt::white : Qt::black; // pick a contrasting color
+                html+=QString("<tr><td align='left' bgcolor='%1'><b><font color='%2'><a href='event=%5'>%3</a></font></b></td><td width=20% bgcolor='%1'><b><font color='%2'>%4</font></b></td></tr>\n")
+                        .arg(chan.defaultColor().name()).arg(altcolor.name()).arg(chan.fullname()).arg(data).arg(code);
+            }
+
+
+//            for (int i=0;i<numchans;i++) {
+//                if (!cpap->channelHasData(chans[i].id))
+//                    continue;
+//                if ((cpap->machine->loaderName() == STR_MACH_PRS1) && (chans[i].id == CPAP_VSnore))
+//                    continue;
+//                html+=QString("<tr><td align='left' bgcolor='%1'><b><font color='%2'><a href='event=%5'>%3</a></font></b></td><td width=20% bgcolor='%1'><b><font color='%2'>%4</font></b></td></tr>\n")
+//                        .arg(schema::channel[chans[i].id].defaultColor().name()).arg(chans[i].color2.name()).arg(schema::channel[chans[i].id].fullname()).arg(chans[i].value,0,'f',2).arg(chans[i].id);
+
+//                // keep in case tooltips are needed
+//                //html+=QString("<tr><td align='left' bgcolor='%1'><b><font color='%2'><a class=info href='event=%6'>%3<span>%4</span></a></font></b></td><td width=20% bgcolor='%1'><b><font color='%2'>%5</font></b></td></tr>\n")
+//                // .arg(chans[i].color.name()).arg(chans[i].color2.name()).arg(chans[i].name).arg(schema::channel[chans[i].id].description()).arg(chans[i].value,0,'f',2).arg(chans[i].id);
+//            }
+            html+="</table>";
+
+            html+="<table cellspacing=0 cellpadding=0 border=0 width='100%'>\n";
+            // Show Event Breakdown pie chart
+            if ((hours > 0) && p_profile->appearance->graphSnapshots()) {  // AHI Pie Chart
+                if ((values[CPAP_Obstructive] + values[CPAP_Hypopnea] + values[CPAP_ClearAirway] + values[CPAP_Apnea] + values[CPAP_RERA] + values[CPAP_FlowLimit] + values[CPAP_SensAwake])>0) {
+                    html+="<tr><td align=center> </td></tr>";
+                    html+=QString("<tr><td align=center><b>%1</b></td></tr>").arg(tr("Event Breakdown"));
+                    eventBreakdownPie()->setShowTitle(false);
+
+                    int w=155;
+                    int h=155;
+                    QPixmap pixmap=eventBreakdownPie()->renderPixmap(w,h,false);
+                    if (!pixmap.isNull()) {
+                        QByteArray byteArray;
+                        QBuffer buffer(&byteArray); // use buffer to store pixmap into byteArray
+                        buffer.open(QIODevice::WriteOnly);
+                        pixmap.save(&buffer, "PNG");
+                        html += "<tr><td align=center><img src=\"data:image/png;base64," + byteArray.toBase64() + QString("\" width='%1' height='%2px'></td></tr>\n").arg(w).arg(h);
+                    } else {
+                        html += "<tr><td align=center>Unable to display Pie Chart on this system</td></tr>\n";
+                    }
+                } else if (day->channelHasData(CPAP_Obstructive)
+                           || day->channelHasData(CPAP_Hypopnea)
+                           || day->channelHasData(CPAP_ClearAirway)
+                           || day->channelHasData(CPAP_RERA)
+                           || day->channelHasData(CPAP_Apnea)
+                           || day->channelHasData(CPAP_FlowLimit)
+                           || day->channelHasData(CPAP_SensAwake)
+                           ) {
+                        html += "<tr><td align=center><img src=\"qrc:/docs/0.0.gif\"></td></tr>\n";
+                }
+            }
+
+            html+="</table>\n";
+            html+="<hr/>\n";
+
+        } else {
+            html+="<table cellspacing=0 cellpadding=0 border=0 width='100%'>\n";
+            if (!isBrick) {
+                html+="<tr><td colspan='5'> </td></tr>\n";
+                if (day->size()>0) {
+                    html+="<tr><td colspan=5 align='center'><font size='+3'>"+tr("Sessions all off!")+"</font></td></tr>";
+                    html+="<tr><td align=center><img src='qrc:/docs/sheep.png' width=120px></td></tr>";
+                    html+="<tr bgcolor='#89abcd'><td colspan=5 align='center'><i><font color=white size=+1>"+tr("Sessions exist for this day but are switched off.")+"</font></i></td></tr>\n";
+                    GraphView->setEmptyText(STR_Empty_NoSessions);
+                } else {
+                    html+="<tr><td colspan=5 align='center'><b><h2>"+tr("Impossibly short session")+"</h2></b></td></tr>";
+                    html+="<tr><td colspan=5 align='center'><i>"+tr("Zero hours??")+"</i></td></tr>\n";
+                }
+            } else { // machine is a brick
+                html+="<tr><td colspan=5 align='center'><b><h2>"+tr("BRICK :(")+"</h2></b></td></tr>";
+                html+="<tr><td colspan=5 align='center'><i>"+tr("Sorry, your machine only provides compliance data.")+"</i></td></tr>\n";
+                html+="<tr><td colspan=5 align='center'><i>"+tr("Complain to your Equipment Provider!")+"</i></td></tr>\n";
+            }
+            html+="<tr><td colspan='5'> </td></tr>\n";
+            html+="</table>\n";
+        }
+
+    } // if (!CPAP)
+    else html+=getSleepTime(day);
+
+    if ((cpap && !isBrick && (day->hours()>0)) || oxi || posit) {
+
+        html+=getStatisticsInfo(day);
+
+    } else {
+        if (cpap && day->hours(MT_CPAP)<0.0000001) {
+        } else if (!isBrick) {
+            html+="<table cellspacing=0 cellpadding=0 border=0 height=100% width=100%>";
+            html+="<tr height=25%><td align=center></td></tr>";
+            html+="<tr><td align=center><font size='+3'>"+tr("\"Nothing's here!\"")+"</font></td></tr>";
+            html+="<tr><td align=center><img src='qrc:/docs/sheep.png' width=120px></td></tr>";
+            html+="<tr height=5px><td align=center></td></tr>";
+            html+="<tr bgcolor='#89abcd'><td align=center><i><font size=+1 color=white>"+tr("Bob is bored with this days lack of data.")+"</font></i></td></tr>";
+            html+="<tr height=25%><td align=center></td></tr>";
+            html+="</table>\n";
+        }
+
+    }
+    if (day) {
+        html+=getOximeterInformation(day);
+        html+=getMachineSettings(day);
+        html+=getSessionInformation(day);
+    }
+
+    html+="</body></html>";
+
+    QColor cols[]={
+        COLOR_Gold,
+        QColor("light blue"),
+    };
+    const int maxcolors=sizeof(cols)/sizeof(QColor);
+    QList<Session *>::iterator i;
+
+    // WebView trashes it without asking.. :(
+    if (cpap) {
+        sessbar=new SessionBar(this);
+        sessbar->setMouseTracking(true);
+        connect(sessbar, SIGNAL(sessionClicked(Session*)), this, SLOT(doToggleSession(Session*)));
+        int c=0;
+
+        for (i=day->begin();i!=day->end();++i) {
+            Session * s=*i;
+            if ((*s).type() == MT_CPAP)
+                sessbar->add(s, cols[c % maxcolors]);
+            c++;
+        }
+    } else sessbar=nullptr;
+    //sessbar->update();
+
+    webView->setHtml(html);
+
+    ui->JournalNotes->clear();
+
+    ui->bookmarkTable->clearContents();
+    ui->bookmarkTable->setRowCount(0);
+    QStringList sl;
+    //sl.append(tr("Starts"));
+    //sl.append(tr("Notes"));
+    ui->bookmarkTable->setHorizontalHeaderLabels(sl);
+    ui->ZombieMeter->blockSignals(true);
+    ui->weightSpinBox->blockSignals(true);
+    ui->ouncesSpinBox->blockSignals(true);
+
+    ui->weightSpinBox->setValue(0);
+    ui->ouncesSpinBox->setValue(0);
+    ui->ZombieMeter->setValue(5);
+    ui->ouncesSpinBox->blockSignals(false);
+    ui->weightSpinBox->blockSignals(false);
+    ui->ZombieMeter->blockSignals(false);
+    ui->BMI->display(0);
+    ui->BMI->setVisible(false);
+    ui->BMIlabel->setVisible(false);
+
+    BookmarksChanged=false;
+    Session *journal=GetJournalSession(date);
+    if (journal) {
+        bool ok;
+        if (journal->settings.contains(Journal_Notes))
+            ui->JournalNotes->setHtml(journal->settings[Journal_Notes].toString());
+
+        if (journal->settings.contains(Journal_Weight)) {
+            double kg=journal->settings[Journal_Weight].toDouble(&ok);
+
+            if (p_profile->general->unitSystem()==US_Metric) {
+                ui->weightSpinBox->setDecimals(3);
+                ui->weightSpinBox->blockSignals(true);
+                ui->weightSpinBox->setValue(kg);
+                ui->weightSpinBox->blockSignals(false);
+                ui->ouncesSpinBox->setVisible(false);
+                ui->weightSpinBox->setSuffix(STR_UNIT_KG);
+            } else {
+                float ounces=(kg*1000.0)/ounce_convert;
+                int pounds=ounces/16.0;
+                double oz;
+                double frac=modf(ounces,&oz);
+                ounces=(int(ounces) % 16)+frac;
+                ui->weightSpinBox->blockSignals(true);
+                ui->ouncesSpinBox->blockSignals(true);
+                ui->weightSpinBox->setValue(pounds);
+                ui->ouncesSpinBox->setValue(ounces);
+                ui->ouncesSpinBox->blockSignals(false);
+                ui->weightSpinBox->blockSignals(false);
+
+                ui->weightSpinBox->setSuffix(STR_UNIT_POUND);
+                ui->weightSpinBox->setDecimals(0);
+                ui->ouncesSpinBox->setVisible(true);
+                ui->ouncesSpinBox->setSuffix(STR_UNIT_OUNCE);
+            }
+            double height=p_profile->user->height()/100.0;
+            if (height>0 && kg>0) {
+                double bmi=kg/(height*height);
+                ui->BMI->setVisible(true);
+                ui->BMIlabel->setVisible(true);
+                ui->BMI->display(bmi);
+            }
+        }
+
+        if (journal->settings.contains(Journal_ZombieMeter)) {
+            ui->ZombieMeter->blockSignals(true);
+            ui->ZombieMeter->setValue(journal->settings[Journal_ZombieMeter].toDouble(&ok));
+            ui->ZombieMeter->blockSignals(false);
+        }
+
+        if (journal->settings.contains(Bookmark_Start)) {
+            QVariantList start=journal->settings[Bookmark_Start].toList();
+            QVariantList end=journal->settings[Bookmark_End].toList();
+            QStringList notes=journal->settings[Bookmark_Notes].toStringList();
+
+            ui->bookmarkTable->blockSignals(true);
+
+
+            qint64 clockdrift=p_profile->cpap->clockDrift()*1000L,drift;
+            Day * dday=p_profile->GetDay(previous_date,MT_CPAP);
+            drift=(dday!=nullptr) ? clockdrift : 0;
+
+            bool ok;
+            for (int i=0;i<start.size();i++) {
+                qint64 st=start.at(i).toLongLong(&ok)+drift;
+                qint64 et=end.at(i).toLongLong(&ok)+drift;
+
+                QDateTime d=QDateTime::fromTime_t(st/1000L);
+                //int row=ui->bookmarkTable->rowCount();
+                ui->bookmarkTable->insertRow(i);
+                QTableWidgetItem *tw=new QTableWidgetItem(notes.at(i));
+                QTableWidgetItem *dw=new QTableWidgetItem(d.time().toString("HH:mm:ss"));
+                dw->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
+                ui->bookmarkTable->setItem(i,0,dw);
+                ui->bookmarkTable->setItem(i,1,tw);
+                tw->setData(Qt::UserRole,st);
+                tw->setData(Qt::UserRole+1,et);
+            } // for (int i
+            ui->bookmarkTable->blockSignals(false);
+        } // if (journal->settings.contains(Bookmark_Start))
+    } // if (journal)
+}
+
+void Daily::UnitsChanged()
+{
+    double kg;
+    if (p_profile->general->unitSystem()==US_Archiac) {
+        kg=ui->weightSpinBox->value();
+        float ounces=(kg*1000.0)/ounce_convert;
+        int pounds=ounces/16;
+        float oz=fmodf(ounces,16);
+        ui->weightSpinBox->setValue(pounds);
+        ui->ouncesSpinBox->setValue(oz);
+
+        ui->weightSpinBox->setDecimals(0);
+        ui->weightSpinBox->setSuffix(STR_UNIT_POUND);
+        ui->ouncesSpinBox->setVisible(true);
+        ui->ouncesSpinBox->setSuffix(STR_UNIT_OUNCE);
+    } else {
+        kg=(ui->weightSpinBox->value()*(ounce_convert*16.0))+(ui->ouncesSpinBox->value()*ounce_convert);
+        kg/=1000.0;
+        ui->weightSpinBox->setDecimals(3);
+        ui->weightSpinBox->setValue(kg);
+        ui->ouncesSpinBox->setVisible(false);
+        ui->weightSpinBox->setSuffix(STR_UNIT_KG);
+    }
+}
+
+void Daily::clearLastDay()
+{
+    lastcpapday=nullptr;
+}
+
+
+void Daily::Unload(QDate date)
+{
+    if (!date.isValid()) {
+        date = getDate();
+        if (!date.isValid()) {
+            graphView()->setDay(nullptr);
+            return;
+        }
+    }
+
+    webView->setHtml("");
+    Session *journal=GetJournalSession(date);
+
+    bool nonotes=ui->JournalNotes->toPlainText().isEmpty();
+    if (journal) {
+        QString jhtml=ui->JournalNotes->toHtml();
+        if ((!journal->settings.contains(Journal_Notes) && !nonotes) || (journal->settings[Journal_Notes]!=jhtml)) {
+            journal->settings[Journal_Notes]=jhtml;
+            journal->SetChanged(true);
+        }
+    } else {
+        if (!nonotes) {
+            journal=CreateJournalSession(date);
+            if (!nonotes) {
+                journal->settings[Journal_Notes]=ui->JournalNotes->toHtml();
+                journal->SetChanged(true);
+            }
+        }
+    }
+
+    if (journal) {
+        if (nonotes) {
+            QHash<ChannelID,QVariant>::iterator it=journal->settings.find(Journal_Notes);
+            if (it!=journal->settings.end()) {
+                journal->settings.erase(it);
+            }
+        }
+        if (journal->IsChanged()) {
+            journal->settings[LastUpdated]=QDateTime::currentDateTime();
+            // blah.. was updating overview graphs here.. Was too slow.
+        }
+        Machine *jm=p_profile->GetMachine(MT_JOURNAL);
+        if (jm) jm->SaveSummary(); //(journal);
+    }
+    UpdateCalendarDay(date);
+}
+
+void Daily::on_JournalNotesItalic_clicked()
+{
+    QTextCursor cursor = ui->JournalNotes->textCursor();
+    if (!cursor.hasSelection())
+        cursor.select(QTextCursor::WordUnderCursor);
+
+    QTextCharFormat format=cursor.charFormat();
+
+    format.setFontItalic(!format.fontItalic());
+
+
+    cursor.mergeCharFormat(format);
+   //ui->JournalNotes->mergeCurrentCharFormat(format);
+
+}
+
+void Daily::on_JournalNotesBold_clicked()
+{
+    QTextCursor cursor = ui->JournalNotes->textCursor();
+    if (!cursor.hasSelection())
+        cursor.select(QTextCursor::WordUnderCursor);
+
+    QTextCharFormat format=cursor.charFormat();
+
+    int fw=format.fontWeight();
+    if (fw!=QFont::Bold)
+        format.setFontWeight(QFont::Bold);
+    else
+        format.setFontWeight(QFont::Normal);
+
+    cursor.mergeCharFormat(format);
+    //ui->JournalNotes->mergeCurrentCharFormat(format);
+
+}
+
+void Daily::on_JournalNotesFontsize_activated(int index)
+{
+    QTextCursor cursor = ui->JournalNotes->textCursor();
+    if (!cursor.hasSelection())
+        cursor.select(QTextCursor::WordUnderCursor);
+
+    QTextCharFormat format=cursor.charFormat();
+
+    QFont font=format.font();
+    int fontsize=10;
+
+    if (index==1) fontsize=15;
+    else if (index==2) fontsize=25;
+
+    font.setPointSize(fontsize);
+    format.setFont(font);
+
+    cursor.mergeCharFormat(format);
+}
+
+void Daily::on_JournalNotesColour_clicked()
+{
+    QColor col=QColorDialog::getColor(COLOR_Black,this,tr("Pick a Colour")); //,QColorDialog::NoButtons);
+    if (!col.isValid()) return;
+
+    QTextCursor cursor = ui->JournalNotes->textCursor();
+    if (!cursor.hasSelection())
+        cursor.select(QTextCursor::WordUnderCursor);
+
+    QBrush b(col);
+    QPalette newPalette = palette();
+    newPalette.setColor(QPalette::ButtonText, col);
+    ui->JournalNotesColour->setPalette(newPalette);
+
+    QTextCharFormat format=cursor.charFormat();
+
+    format.setForeground(b);
+
+    cursor.setCharFormat(format);
+}
+Session * Daily::CreateJournalSession(QDate date)
+{
+    Machine *m = p_profile->GetMachine(MT_JOURNAL);
+    if (!m) {
+        m=new Machine(0);
+        MachineInfo info;
+        info.loadername = "Journal";
+        info.serial = m->hexid();
+        info.brand = "Journal";
+        info.type = MT_JOURNAL;
+        m->setInfo(info);
+        m->setType(MT_JOURNAL);
+        p_profile->AddMachine(m);
+    }
+
+    Session *sess=new Session(m,0);
+    qint64 st,et;
+
+    Day *cday=p_profile->GetDay(date);
+    if (cday) {
+        st=cday->first();
+        et=cday->last();
+    } else {
+        QDateTime dt(date,QTime(20,0));
+        st=qint64(dt.toTime_t())*1000L;
+        et=st+3600000L;
+    }
+    sess->SetSessionID(st / 1000L);
+    sess->set_first(st);
+    sess->set_last(et);
+    m->AddSession(sess);
+    return sess;
+}
+Session * Daily::GetJournalSession(QDate date) // Get the first journal session
+{
+    Day *day=p_profile->GetDay(date, MT_JOURNAL);
+    if (day) {
+        Session * session = day->firstSession(MT_JOURNAL);
+        if (!session) {
+            session = CreateJournalSession(date);
+        }
+        return session;
+    }
+    return nullptr;
+}
+
+
+void Daily::RedrawGraphs()
+{
+    // setting this here, because it needs to be done when preferences change
+    if (p_profile->cpap->showLeakRedline()) {
+        schema::channel[CPAP_Leak].setUpperThreshold(p_profile->cpap->leakRedline());
+    } else {
+        schema::channel[CPAP_Leak].setUpperThreshold(0); // switch it off
+    }
+
+    GraphView->redraw();
+}
+
+void Daily::on_LineCursorUpdate(double time)
+{
+    if (time > 1) {
+        QDateTime dt = QDateTime::fromMSecsSinceEpoch(time);
+        QString txt = dt.toString("MMM dd HH:mm:ss.zzz");
+        dateDisplay->setText(txt);
+    } else dateDisplay->setText(QString(GraphView->emptyText()));
+}
+
+void Daily::on_RangeUpdate(double minx, double maxx)
+{
+    if (minx > 1) {
+        dateDisplay->setText(GraphView->getRangeString());
+    } else {
+        dateDisplay->setText(QString(GraphView->emptyText()));
+    }
+
+/*    // Delay render some stats...
+    Day * day = GraphView->day();
+    if (day) {
+        QTime time;
+        time.start();
+        QList<ChannelID> list = day->getSortedMachineChannels(schema::WAVEFORM);
+        for (int i=0; i< list.size();i++) {
+            schema::Channel & chan = schema::channel[list.at(i)];
+            ChannelID code = chan.id();
+            if (!day->channelExists(code)) continue;
+             float avg = day->rangeAvg(code, minx, maxx);
+            float wavg = day->rangeWavg(code, minx, maxx);
+            float median = day->rangePercentile(code, 0.5, minx, maxx);
+           float p90 = day->rangePercentile(code, 0.9, minx, maxx);
+//            qDebug() << chan.label()
+//                     << "AVG=" << avg
+//                     << "WAVG=" << wavg;
+                  //   << "MED" << median
+                   //  << "90%" << p90;
+        }
+
+        qDebug() << time.elapsed() << "ms";
+    }*/
+}
+
+
+void Daily::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
+{
+    Q_UNUSED(column);
+    QDateTime d;
+    if (!item->data(0,Qt::UserRole).isNull()) {
+        qint64 winsize=qint64(p_profile->general->eventWindowSize())*60000L;
+        qint64 t=item->data(0,Qt::UserRole).toLongLong();
+
+        double st=t-(winsize/2);
+        double et=t+(winsize/2);
+
+        gGraph *g=GraphView->findGraph(STR_GRAPH_SleepFlags);
+        if (!g) return;
+        if (st<g->rmin_x) {
+            st=g->rmin_x;
+            et=st+winsize;
+        }
+        if (et>g->rmax_x) {
+            et=g->rmax_x;
+            st=et-winsize;
+        }
+        GraphView->SetXBounds(st,et);
+    }
+}
+
+void Daily::on_treeWidget_itemSelectionChanged()
+{
+    if (ui->treeWidget->selectedItems().size()==0) return;
+    QTreeWidgetItem *item=ui->treeWidget->selectedItems().at(0);
+    if (!item) return;
+    on_treeWidget_itemClicked(item, 0);
+}
+
+void Daily::on_JournalNotesUnderline_clicked()
+{
+    QTextCursor cursor = ui->JournalNotes->textCursor();
+    if (!cursor.hasSelection())
+        cursor.select(QTextCursor::WordUnderCursor);
+
+    QTextCharFormat format=cursor.charFormat();
+
+    format.setFontUnderline(!format.fontUnderline());
+
+    cursor.mergeCharFormat(format);
+   //ui->JournalNotes->mergeCurrentCharFormat(format);
+}
+
+void Daily::on_prevDayButton_clicked()
+{
+    if (!p_profile->ExistsAndTrue("SkipEmptyDays")) {
+        LoadDate(previous_date.addDays(-1));
+    } else {
+        QDate d=previous_date;
+        for (int i=0;i<90;i++) {
+            d=d.addDays(-1);
+            if (p_profile->GetDay(d)) {
+                LoadDate(d);
+                break;
+            }
+        }
+    }
+}
+
+void Daily::on_nextDayButton_clicked()
+{
+    if (!p_profile->ExistsAndTrue("SkipEmptyDays")) {
+        LoadDate(previous_date.addDays(1));
+    } else {
+        QDate d=previous_date;
+        for (int i=0;i<90;i++) {
+            d=d.addDays(1);
+            if (p_profile->GetDay(d)) {
+                LoadDate(d);
+                break;
+            }
+        }
+    }
+}
+
+void Daily::on_calButton_toggled(bool checked)
+{
+    bool b=checked;
+    ui->calendarFrame->setVisible(b);
+    p_profile->appearance->setCalendarVisible(b);
+
+    if (!b) {
+        ui->calButton->setArrowType(Qt::DownArrow);
+    } else {
+        ui->calButton->setArrowType(Qt::UpArrow);
+    }
+}
+
+
+void Daily::on_todayButton_clicked()
+{
+//    QDate d=QDate::currentDate();
+//    if (d > p_profile->LastDay()) {
+        QDate lastcpap = p_profile->LastDay(MT_CPAP);
+        QDate lastoxi = p_profile->LastDay(MT_OXIMETER);
+
+        QDate d = qMax(lastcpap, lastoxi);
+//    }
+    LoadDate(d);
+}
+
+void Daily::on_evViewSlider_valueChanged(int value)
+{
+    ui->evViewLCD->display(value);
+    p_profile->general->setEventWindowSize(value);
+
+    int winsize=value*60;
+
+    gGraph *g=GraphView->findGraph(STR_GRAPH_SleepFlags);
+    if (!g) return;
+    qint64 st=g->min_x;
+    qint64 et=g->max_x;
+    qint64 len=et-st;
+    qint64 d=st+len/2.0;
+
+    st=d-(winsize/2)*1000;
+    et=d+(winsize/2)*1000;
+    if (st<g->rmin_x) {
+        st=g->rmin_x;
+        et=st+winsize*1000;
+    }
+    if (et>g->rmax_x) {
+        et=g->rmax_x;
+        st=et-winsize*1000;
+    }
+    GraphView->SetXBounds(st,et);
+}
+
+void Daily::on_bookmarkTable_itemClicked(QTableWidgetItem *item)
+{
+    int row=item->row();
+    qint64 st,et;
+
+//    qint64 clockdrift=p_profile->cpap->clockDrift()*1000L,drift;
+//    Day * dday=p_profile->GetDay(previous_date,MT_CPAP);
+//    drift=(dday!=nullptr) ? clockdrift : 0;
+
+    QTableWidgetItem *it=ui->bookmarkTable->item(row,1);
+    bool ok;
+    st=it->data(Qt::UserRole).toLongLong(&ok);
+    et=it->data(Qt::UserRole+1).toLongLong(&ok);
+    qint64 st2=0,et2=0,st3,et3;
+    Day * day=p_profile->GetGoodDay(previous_date,MT_CPAP);
+    if (day) {
+        st2=day->first();
+        et2=day->last();
+    }
+    Day * oxi=p_profile->GetGoodDay(previous_date,MT_OXIMETER);
+    if (oxi) {
+        st3=oxi->first();
+        et3=oxi->last();
+    }
+    if (oxi && day) {
+        st2=qMin(st2,st3);
+        et2=qMax(et2,et3);
+    } else if (oxi) {
+        st2=st3;
+        et2=et3;
+    } else if (!day) return;
+    if ((et<st2) || (st>et2)) {
+        mainwin->Notify(tr("This bookmarked is in a currently disabled area.."));
+        return;
+    }
+
+    if (st<st2) st=st2;
+    if (et>et2) et=et2;
+    GraphView->SetXBounds(st,et);
+    GraphView->redraw();
+}
+
+void Daily::addBookmark(qint64 st, qint64 et, QString text)
+{
+    ui->bookmarkTable->blockSignals(true);
+    QDateTime d=QDateTime::fromTime_t(st/1000L);
+    int row=ui->bookmarkTable->rowCount();
+    ui->bookmarkTable->insertRow(row);
+    QTableWidgetItem *tw=new QTableWidgetItem(text);
+    QTableWidgetItem *dw=new QTableWidgetItem(d.time().toString("HH:mm:ss"));
+    dw->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled);
+    ui->bookmarkTable->setItem(row,0,dw);
+    ui->bookmarkTable->setItem(row,1,tw);
+    qint64 clockdrift=p_profile->cpap->clockDrift()*1000L,drift;
+    Day * day=p_profile->GetDay(previous_date,MT_CPAP);
+    drift=(day!=nullptr) ? clockdrift : 0;
+
+    // Counter CPAP clock drift for storage, in case user changes it later on
+    // This won't fix the text string names..
+
+    tw->setData(Qt::UserRole,st-drift);
+    tw->setData(Qt::UserRole+1,et-drift);
+
+    ui->bookmarkTable->blockSignals(false);
+    update_Bookmarks();
+    mainwin->updateFavourites();
+
+}
+
+void Daily::on_addBookmarkButton_clicked()
+{
+    qint64 st,et;
+    GraphView->GetXBounds(st,et);
+    QDateTime d=QDateTime::fromTime_t(st/1000L);
+
+    addBookmark(st,et, tr("Bookmark at %1").arg(d.time().toString("HH:mm:ss")));
+}
+void Daily::update_Bookmarks()
+{
+    QVariantList start;
+    QVariantList end;
+    QStringList notes;
+    QTableWidgetItem *item;
+    for (int row=0;row<ui->bookmarkTable->rowCount();row++) {
+        item=ui->bookmarkTable->item(row,1);
+
+        start.push_back(item->data(Qt::UserRole));
+        end.push_back(item->data(Qt::UserRole+1));
+        notes.push_back(item->text());
+    }
+    Session *journal=GetJournalSession(previous_date);
+    if (!journal) {
+        journal=CreateJournalSession(previous_date);
+    }
+
+    journal->settings[Bookmark_Start]=start;
+    journal->settings[Bookmark_End]=end;
+    journal->settings[Bookmark_Notes]=notes;
+    journal->settings[LastUpdated]=QDateTime::currentDateTime();
+    journal->SetChanged(true);
+    BookmarksChanged=true;
+    mainwin->updateFavourites();
+}
+
+void Daily::on_removeBookmarkButton_clicked()
+{
+    int row=ui->bookmarkTable->currentRow();
+    if (row>=0) {
+        ui->bookmarkTable->blockSignals(true);
+        ui->bookmarkTable->removeRow(row);
+        ui->bookmarkTable->blockSignals(false);
+        update_Bookmarks();
+    }
+    mainwin->updateFavourites();
+}
+void Daily::on_ZombieMeter_valueChanged(int action)
+{
+    Q_UNUSED(action);
+    ZombieMeterMoved=true;
+    Session *journal=GetJournalSession(previous_date);
+    if (!journal) {
+        journal=CreateJournalSession(previous_date);
+    }
+    journal->settings[Journal_ZombieMeter]=ui->ZombieMeter->value();
+    journal->SetChanged(true);
+
+    // shouldn't be needed anymore with new overview model..
+    //if (mainwin->getOverview()) mainwin->getOverview()->ResetGraph("Zombie");
+}
+
+void Daily::on_bookmarkTable_itemChanged(QTableWidgetItem *item)
+{
+    Q_UNUSED(item);
+    update_Bookmarks();
+}
+
+void Daily::on_weightSpinBox_valueChanged(double arg1)
+{
+    // Update the BMI display
+    double kg;
+    if (p_profile->general->unitSystem()==US_Archiac) {
+         kg=((arg1*pound_convert) + (ui->ouncesSpinBox->value()*ounce_convert)) / 1000.0;
+    } else kg=arg1;
+    double height=p_profile->user->height()/100.0;
+    if ((height>0) && (kg>0)) {
+        double bmi=kg/(height * height);
+        ui->BMI->display(bmi);
+        ui->BMI->setVisible(true);
+    }
+}
+
+void Daily::on_weightSpinBox_editingFinished()
+{
+    double arg1=ui->weightSpinBox->value();
+
+    double height=p_profile->user->height()/100.0;
+    Session *journal=GetJournalSession(previous_date);
+    if (!journal) {
+        journal=CreateJournalSession(previous_date);
+    }
+
+    double kg;
+    if (p_profile->general->unitSystem()==US_Archiac) {
+            kg=((arg1*pound_convert) + (ui->ouncesSpinBox->value()*ounce_convert)) / 1000.0;
+    } else {
+            kg=arg1;
+    }
+    journal->settings[Journal_Weight]=kg;
+    gGraphView *gv=mainwin->getOverview()->graphView();
+    gGraph *g;
+    if (gv) {
+        g=gv->findGraph(STR_GRAPH_Weight);
+        if (g) g->setDay(nullptr);
+    }
+    if ((height>0) && (kg>0)) {
+        double bmi=kg/(height * height);
+        ui->BMI->display(bmi);
+        ui->BMI->setVisible(true);
+        journal->settings[Journal_BMI]=bmi;
+        if (gv) {
+            g=gv->findGraph(STR_GRAPH_BMI);
+            if (g) g->setDay(nullptr);
+        }
+    }
+    journal->SetChanged(true);
+}
+
+void Daily::on_ouncesSpinBox_valueChanged(int arg1)
+{
+    // just update for BMI display
+    double height=p_profile->user->height()/100.0;
+    double kg=((ui->weightSpinBox->value()*pound_convert) + (arg1*ounce_convert)) / 1000.0;
+    if ((height>0) && (kg>0)) {
+        double bmi=kg/(height * height);
+        ui->BMI->display(bmi);
+        ui->BMI->setVisible(true);
+    }
+}
+
+void Daily::on_ouncesSpinBox_editingFinished()
+{
+    double arg1=ui->ouncesSpinBox->value();
+    Session *journal=GetJournalSession(previous_date);
+    if (!journal) {
+        journal=CreateJournalSession(previous_date);
+    }
+    double height=p_profile->user->height()/100.0;
+    double kg=((ui->weightSpinBox->value()*pound_convert) + (arg1*ounce_convert)) / 1000.0;
+    journal->settings[Journal_Weight]=kg;
+
+    gGraph *g;
+    if (mainwin->getOverview()) {
+        g=mainwin->getOverview()->graphView()->findGraph(STR_GRAPH_Weight);
+        if (g) g->setDay(nullptr);
+    }
+
+    if ((height>0) && (kg>0)) {
+        double bmi=kg/(height * height);
+        ui->BMI->display(bmi);
+        ui->BMI->setVisible(true);
+
+        journal->settings[Journal_BMI]=bmi;
+        if (mainwin->getOverview()) {
+            g=mainwin->getOverview()->graphView()->findGraph(STR_GRAPH_BMI);
+            if (g) g->setDay(nullptr);
+        }
+    }
+    journal->SetChanged(true);
+
+    // shouldn't be needed anymore with new overview model
+    //if (mainwin->getOverview()) mainwin->getOverview()->ResetGraph(STR_GRAPH_Weight);
+}
+
+QString Daily::GetDetailsText()
+{
+    webView->triggerPageAction(QWebPage::SelectAll);
+    QString text=webView->page()->selectedText();
+    webView->triggerPageAction(QWebPage::MoveToEndOfDocument);
+    webView->triggerPageAction(QWebPage::SelectEndOfDocument);
+    return text;
+}
+
+void Daily::on_graphCombo_activated(int index)
+{
+    if (index<0)
+        return;
+
+    gGraph *g;
+    QString s;
+    s=ui->graphCombo->currentText();
+    bool b=!ui->graphCombo->itemData(index,Qt::UserRole).toBool();
+    ui->graphCombo->setItemData(index,b,Qt::UserRole);
+    if (b) {
+        ui->graphCombo->setItemIcon(index,*icon_on);
+    } else {
+        ui->graphCombo->setItemIcon(index,*icon_off);
+    }
+    g=GraphView->findGraphTitle(s);
+    g->setVisible(b);
+
+    updateCube();
+    GraphView->updateScale();
+    GraphView->redraw();
+}
+void Daily::updateCube()
+{
+    //brick..
+    if ((GraphView->visibleGraphs()==0)) {
+        ui->toggleGraphs->setArrowType(Qt::UpArrow);
+        ui->toggleGraphs->setToolTip(tr("Show all graphs"));
+        ui->toggleGraphs->blockSignals(true);
+        ui->toggleGraphs->setChecked(true);
+        ui->toggleGraphs->blockSignals(false);
+
+
+        if (ui->graphCombo->count() > 0) {
+            GraphView->setEmptyText(STR_Empty_NoGraphs);
+        } else {
+            if (!p_profile->GetGoodDay(getDate(), MT_CPAP)
+              && !p_profile->GetGoodDay(getDate(), MT_OXIMETER)
+              && !p_profile->GetGoodDay(getDate(), MT_SLEEPSTAGE)
+              && !p_profile->GetGoodDay(getDate(), MT_POSITION)) {
+                GraphView->setEmptyText(STR_Empty_NoData);
+
+            } else {
+                if (GraphView->emptyText() != STR_Empty_Brick)
+                    GraphView->setEmptyText(STR_Empty_SummaryOnly);
+            }
+        }
+    } else {
+        ui->toggleGraphs->setArrowType(Qt::DownArrow);
+        ui->toggleGraphs->setToolTip(tr("Hide all graphs"));
+        ui->toggleGraphs->blockSignals(true);
+        ui->toggleGraphs->setChecked(false);
+        ui->toggleGraphs->blockSignals(false);
+    }
+}
+
+
+void Daily::on_toggleGraphs_clicked(bool checked)
+{
+    QString s;
+    QIcon *icon=checked ? icon_off : icon_on;
+    for (int i=0;i<ui->graphCombo->count();i++) {
+        s=ui->graphCombo->itemText(i);
+        ui->graphCombo->setItemIcon(i,*icon);
+        ui->graphCombo->setItemData(i,!checked,Qt::UserRole);
+    }
+    for (int i=0;i<GraphView->size();i++) {
+        (*GraphView)[i]->setVisible(!checked);
+    }
+
+    updateCube();
+    GraphView->updateScale();
+    GraphView->redraw();
+
+}
+
+void Daily::updateGraphCombo()
+{
+    ui->graphCombo->clear();
+    gGraph *g;
+
+    for (int i=0;i<GraphView->size();i++) {
+        g=(*GraphView)[i];
+        if (g->isEmpty()) continue;
+
+
+        if (g->visible()) {
+            ui->graphCombo->addItem(*icon_on,g->title(),true);
+        } else {
+            ui->graphCombo->addItem(*icon_off,g->title(),false);
+        }
+    }
+    ui->graphCombo->setCurrentIndex(0);
+
+
+    updateCube();
+}
+
+void Daily::on_eventsCombo_activated(int index)
+{
+    if (index<0)
+        return;
+
+
+    ChannelID code = ui->eventsCombo->itemData(index, Qt::UserRole).toUInt();
+    schema::Channel * chan = &schema::channel[code];
+
+    bool b = !chan->enabled();
+    chan->setEnabled(b);
+
+    ui->eventsCombo->setItemIcon(index,b ? *icon_on : *icon_off);
+
+    GraphView->redraw();
+}
+
+void Daily::on_toggleEvents_clicked(bool checked)
+{
+    QString s;
+    QIcon *icon=checked ? icon_on : icon_off;
+
+    ui->toggleEvents->setArrowType(checked ? Qt::DownArrow : Qt::UpArrow);
+    ui->toggleEvents->setToolTip(checked ? tr("Hide all events") : tr("Show all events"));
+//    ui->toggleEvents->blockSignals(true);
+//    ui->toggleEvents->setChecked(false);
+//    ui->toggleEvents->blockSignals(false);
+
+    for (int i=0;i<ui->eventsCombo->count();i++) {
+//        s=ui->eventsCombo->itemText(i);
+        ui->eventsCombo->setItemIcon(i,*icon);
+        ChannelID code = ui->eventsCombo->itemData(i).toUInt();
+        schema::channel[code].setEnabled(checked);
+    }
+
+    updateCube();
+    GraphView->redraw();
+}
+
+//void Daily::on_sessionWidget_itemSelectionChanged()
+//{
+//    int row = ui->sessionWidget->currentRow();
+//    QTableWidgetItem *item = ui->sessionWidget->item(row, 0);
+//    if (item) {
+//        QDate date = item->data(Qt::UserRole).toDate();
+//        LoadDate(date);
+//        qDebug() << "Clicked.. changing date to" << date;
+
+//       // ui->sessionWidget->setCurrentItem(item);
+//    }
+//}
diff --git a/sleepyhead/daily.h b/sleepyhead/daily.h
new file mode 100644
index 0000000..d270135
--- /dev/null
+++ b/sleepyhead/daily.h
@@ -0,0 +1,374 @@
+/* Daily GUI Headers
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef DAILY_H
+#define DAILY_H
+
+
+#include <QMenu>
+#include <QAction>
+#include <QWidget>
+#include <QTreeWidget>
+#include <QHBoxLayout>
+#include <QPushButton>
+#include <QLabel>
+#include <QtOpenGL/QGLContext>
+#include <QScrollBar>
+#include <QTableWidgetItem>
+#include <QWebView>
+#include <QWebPage>
+#include "Graphs/gSummaryChart.h"
+
+#include <SleepLib/profiles.h>
+#include "mainwindow.h"
+#include "Graphs/gGraphView.h"
+
+#include "Graphs/gLineChart.h"
+#include "sessionbar.h"
+
+namespace Ui {
+    class Daily;
+}
+
+class MyWebPage:public QWebPage
+{
+Q_OBJECT
+public:
+    MyWebPage(QObject *parent = 0);
+protected:
+    QObject *createPlugin(const QString & classid, const QUrl & url, const QStringList & paramNames, const QStringList & paramValues);
+};
+
+class MyWebView:public QWebView
+{
+   Q_OBJECT
+   private:
+      MyWebPage m_page;
+   public:
+      MyWebView(QWidget *parent = 0);
+};
+
+
+
+class MainWindow;
+
+/*! \class Daily
+    \brief SleepyHead's Daily view which displays the calendar and all the graphs relative to a selected Day
+    */
+class Daily : public QWidget
+{
+    Q_OBJECT
+
+public:
+    /*! \fn Daily()
+        \brief Constructs a Daily object
+        \param parent * (QObject parent)
+        \param shared *
+
+        Creates all the graph objects and adds them to the main gGraphView area for this tab.
+
+        shared is not used for daily object, as it contains the default Context..
+        */
+    explicit Daily(QWidget *parent, gGraphView *shared);
+    ~Daily();
+
+    /*! \fn ReloadGraphs()
+        \brief Reload all graph information from disk and updates the view.
+        */
+    void ReloadGraphs();
+    /*! \fn ResetGraphLayout()
+        \brief Resets all graphs in the main gGraphView back to constant heights.
+        */
+    void ResetGraphLayout();
+
+    /*! \fn graphView()
+        \returns the main graphView area for the Daily View
+        */
+    gGraphView *graphView() { return GraphView; }
+
+    /*! \fn RedrawGraphs()
+        \brief Calls updateGL on the main graphView area, redrawing the OpenGL area
+        */
+    void RedrawGraphs();
+
+    /*! \fn LoadDate()
+        \brief Selects a new day object, unloading the previous one, and loads the graph data for the supplied date.
+        \param QDate date
+        */
+    void LoadDate(QDate date);
+
+    /*! \fn getDate()
+        \brief Returns the most recently loaded Date
+        \return QDate
+        */
+    QDate getDate() { return previous_date; }
+
+    /*! \fn UnitsChanged()
+        \brief Called by Profile editor when measurement units are changed
+        */
+    void UnitsChanged();
+
+    /*! \fn GetJournalSession(QDate date)
+        \brief Looks up if there is a journal object for a supplied date
+        \param QDate date
+        \returns Session * containing valid Journal Session object or nullptr if none found.
+    */
+    Session * GetJournalSession(QDate date);
+
+    QString GetDetailsText();
+    /*! \fn eventBreakdownPie()
+        \brief Returns a pointer to the Event Breakdown Piechart for the Report Printing module
+        \returns gGraph * object containing this chart
+        */
+    gGraph * eventBreakdownPie() { return graphlist["EventBreakdown"]; }
+    QWidget * sessionBar() { return sessbar; }
+
+    void clearLastDay();
+
+    /*! \fn Unload(QDate date)
+        \brief Saves any journal changes for the provided date.
+        \param QDate date
+        */
+    void Unload(QDate date=QDate());
+
+    void setSidebarVisible(bool visible);
+    void setCalendarVisible(bool visible);
+
+    void addBookmark(qint64 st, qint64 et, QString text);
+    void hideSpaceHogs();
+    void showSpaceHogs();
+
+    QLabel * getDateDisplay();
+
+    //void populateSessionWidget();
+
+
+public slots:
+    void on_LineCursorUpdate(double time);
+    void on_RangeUpdate(double minx, double maxx);
+
+private slots:
+    void on_ReloadDay();
+
+    /*! \fn on_calendar_currentPageChanged(int year, int month);
+        \brief Scans through all days for this month, updating the day colors for the calendar object
+        \param int year
+        \param int month
+        */
+    void on_calendar_currentPageChanged(int year, int month);
+
+    /*! \fn on_calendar_selectionChanged();
+        \brief Called when the calendar object is clicked. Selects and loads a new date, unloading the previous one.
+        */
+    void on_calendar_selectionChanged();
+
+    /* Journal Notes edit buttons I don't want to document */
+    void on_JournalNotesItalic_clicked();
+    void on_JournalNotesBold_clicked();
+    void on_JournalNotesFontsize_activated(int index);
+    void on_JournalNotesColour_clicked();
+    void on_JournalNotesUnderline_clicked();
+
+    void on_treeWidget_itemSelectionChanged();
+
+
+    /*! \fn on_nextDayButton_clicked();
+        \brief Step backwards one day (if possible)
+        */
+    void on_prevDayButton_clicked();
+
+    /*! \fn on_nextDayButton_clicked();
+        \brief Step forward one day (if possible)
+        */
+    void on_nextDayButton_clicked();
+
+    /*! \fn on_calButton_toggled();
+        \brief Hides the calendar and put it out of the way, giving more room for the Details area.
+        */
+    void on_calButton_toggled(bool checked);
+
+    /*! \fn on_todayButton_clicked();
+        \brief Select the most recent day.
+        */
+    void on_todayButton_clicked();
+
+    /*! \fn Link_clicked(const QUrl &url);
+        \brief Called when a link is clicked on in the HTML Details tab
+        \param const QUrl & url
+        */
+    void Link_clicked(const QUrl &url);
+
+    void on_evViewSlider_valueChanged(int value);
+
+    /*! \fn on_treeWidget_itemClicked(QTreeWidgetItem *item, int column);
+        \brief Called when an event is selected in the Event tab.. Zooms into the graph area.
+        \param QTreeWidgetItem *item
+        \param int column
+        */
+    void on_treeWidget_itemClicked(QTreeWidgetItem *item, int column);
+
+    /*! \fn graphtogglebutton_toggled(bool)
+        \brief Called to hide/show a graph when on of the toggle bottoms underneath the graph area is clicked
+        \param bool button status
+        */
+    void graphtogglebutton_toggled(bool);
+
+    /*! \fn on_addBookmarkButton_clicked()
+        \brief Current selected graph Area is added to Bookmark's list for this day's journal object.
+        */
+    void on_addBookmarkButton_clicked();
+
+    /*! \fn on_removeBookmarkButton_clicked()
+        \brief Currently selected bookmark is removed from this day's Bookmark list.
+        */
+    void on_removeBookmarkButton_clicked();
+
+    /*! \fn on_bookmarkTable_itemClicked(QTableWidgetItem *item);
+        \brief Called when a bookmark has been selected.. Zooms in on the area
+        \param QTableWidgetItem *item
+        */
+    void on_bookmarkTable_itemClicked(QTableWidgetItem *item);
+
+    /*! \fn on_bookmarkTable_itemChanged(QTableWidgetItem *item);
+        \brief Called when bookmarks have been altered.. Saves the bookmark list to Journal object.
+        */
+    void on_bookmarkTable_itemChanged(QTableWidgetItem *item);
+
+
+    /*! \fn on_ouncesSpinBox_valueChanged(int arg1);
+        \brief Called when the zombie slider has been moved.. Updates the BMI dislpay and journal objects.
+
+        Also Refreshes the Overview charts
+        */
+    void on_ZombieMeter_valueChanged(int value);
+
+    void on_graphCombo_activated(int index);
+
+    void on_toggleGraphs_clicked(bool checked);
+
+    /*! \fn on_weightSpinBox_editingFinished();
+        \brief Called when weight has changed.. Updates the BMI dislpay and journal objects.
+
+        Also Refreshes the Overview charts
+        */
+
+    void on_weightSpinBox_editingFinished();
+
+    /*! \fn on_ouncesSpinBox_editingFinished();
+        \brief Called when weights ounces component has changed.. Updates the BMI dislpay and journal objects.
+
+        Also Refreshes the Overview charts
+        */
+    void on_ouncesSpinBox_editingFinished();
+
+    void on_ouncesSpinBox_valueChanged(int arg1);
+
+    void on_weightSpinBox_valueChanged(double arg1);
+
+    void doToggleSession(Session *);
+
+    void on_eventsCombo_activated(int index);
+
+    void on_toggleEvents_clicked(bool checked);
+
+    void updateGraphCombo();
+
+
+    //void on_sessionWidget_itemSelectionChanged();
+
+protected:
+    virtual void closeEvent(QCloseEvent *);
+    virtual void showEvent(QShowEvent *);
+
+private:
+    /*! \fn CreateJournalSession()
+        \brief Create a new journal session for this date, if one doesn't exist.
+        \param QDate date
+
+        Creates a new journal Machine record if necessary.
+        */
+    Session * CreateJournalSession(QDate date);
+
+    /*! \fn update_Bookmarks()
+        \brief Saves the current bookmark list to the Journal object
+        */
+    void update_Bookmarks();
+
+    /*! \fn Load(QDate date)
+        \brief Selects a new day object, loads it's content and generates the HTML for the Details tab
+        \param QDate date
+        */
+    void Load(QDate date);
+    /*! \fn UpdateCalendarDay(QDate date)
+        \brief Updates the calendar visual information, changing a dates color depending on what data is available.
+        \param QDate date
+        */
+    void UpdateCalendarDay(QDate date);
+    /*! \fn UpdateEventsTree(QDate date)
+        \brief Populates the Events tree from the supplied Day object.
+        \param QTreeWidget * tree
+        \param Day *
+        */
+    void UpdateEventsTree(QTreeWidget * tree,Day *day);
+
+    void updateCube();
+
+
+    QString getSessionInformation(Day *);
+    QString getMachineSettings(Day *);
+    QString getStatisticsInfo(Day *);
+    QString getCPAPInformation(Day *);
+    QString getOximeterInformation(Day *);
+    QString getEventBreakdown(Day *);
+    QString getSleepTime(Day *);
+
+    QHash<QString, gGraph *> graphlist;
+
+//    QList<Layer *> OXIData;
+//    QList<Layer *> CPAPData;
+//    QList<Layer *> STAGEData;
+//    QList<Layer *> POSData;
+    QHash<QString,QPushButton *> GraphToggles;
+    QVector<QAction *> GraphAction;
+    QGLContext *offscreen_context;
+
+    QList<int> splitter_sizes;
+//    Layer * AddCPAP(Layer *d) { CPAPData.push_back(d); return d; }
+//    Layer * AddSTAGE(Layer *d) { STAGEData.push_back(d); return d; }
+//    Layer * AddPOS(Layer *d) { POSData.push_back(d); return d; }
+//    Layer * AddOXI(Layer *d) { OXIData.push_back(d); return d; }
+
+//    void UpdateCPAPGraphs(Day *day);
+//    void UpdateOXIGraphs(Day *day);
+//    void UpdateSTAGEGraphs(Day *day);
+//    void UpdatePOSGraphs(Day *day);
+
+    Ui::Daily *ui;
+    QDate previous_date;
+    QMenu *show_graph_menu;
+
+    gGraphView *GraphView,*snapGV;
+    MyScrollBar *scrollbar;
+    QHBoxLayout *layout;
+    QLabel *emptyToggleArea;
+    QIcon * icon_on;
+    QIcon * icon_off;
+
+    SessionBar * sessbar;
+    MyLabel * dateDisplay;
+
+    MyWebView * webView;
+    Day * lastcpapday;
+
+    gLineChart *leakchart;
+
+    bool ZombieMeterMoved;
+    bool BookmarksChanged;
+};
+
+#endif // DAILY_H
diff --git a/sleepyhead/daily.ui b/sleepyhead/daily.ui
new file mode 100644
index 0000000..8031582
--- /dev/null
+++ b/sleepyhead/daily.ui
@@ -0,0 +1,1584 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Daily</class>
+ <widget class="QWidget" name="Daily">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>1211</width>
+    <height>674</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="palette">
+   <palette>
+    <active>
+     <colorrole role="WindowText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Button">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Light">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Midlight">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Dark">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Mid">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>170</red>
+        <green>170</green>
+        <blue>170</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Text">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="BrightText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ButtonText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Base">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Window">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Shadow">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="AlternateBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>220</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+    </active>
+    <inactive>
+     <colorrole role="WindowText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Button">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Light">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Midlight">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Dark">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Mid">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>170</red>
+        <green>170</green>
+        <blue>170</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Text">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="BrightText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ButtonText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Base">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Window">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Shadow">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="AlternateBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>220</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+    </inactive>
+    <disabled>
+     <colorrole role="WindowText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Button">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Light">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Midlight">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Dark">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Mid">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>170</red>
+        <green>170</green>
+        <blue>170</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Text">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="BrightText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ButtonText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Base">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Window">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Shadow">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="AlternateBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>220</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+    </disabled>
+   </palette>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_6">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QSplitter" name="splitter_2">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <widget class="QSplitter" name="splitter">
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+      <widget class="QWidget" name="calNavWidget" native="true">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <layout class="QHBoxLayout" name="horizontalLayout_6" stretch="0,0,0,0">
+        <property name="spacing">
+         <number>1</number>
+        </property>
+        <property name="leftMargin">
+         <number>0</number>
+        </property>
+        <property name="topMargin">
+         <number>4</number>
+        </property>
+        <property name="rightMargin">
+         <number>0</number>
+        </property>
+        <property name="bottomMargin">
+         <number>4</number>
+        </property>
+        <item>
+         <widget class="QToolButton" name="prevDayButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>0</width>
+            <height>25</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>16777215</width>
+            <height>25</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string>Go to the previous day</string>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">QToolButton {
+ background: transparent;
+ border-radius: 8px;
+ border: 2px solid transparent;
+}
+
+QToolButton:hover {
+ border: 2px solid #456789;
+}
+
+QToolButton:pressed {
+ border: 2px solid #456789;
+ background-color: #89abcd;
+}</string>
+          </property>
+          <property name="text">
+           <string>Prev</string>
+          </property>
+          <property name="icon">
+           <iconset resource="Resources.qrc">
+            <normaloff>:/icons/arrow-left.png</normaloff>:/icons/arrow-left.png</iconset>
+          </property>
+          <property name="toolButtonStyle">
+           <enum>Qt::ToolButtonIconOnly</enum>
+          </property>
+          <property name="autoRaise">
+           <bool>false</bool>
+          </property>
+          <property name="arrowType">
+           <enum>Qt::NoArrow</enum>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QToolButton" name="calButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="toolTip">
+           <string>Show or hide the calender</string>
+          </property>
+          <property name="layoutDirection">
+           <enum>Qt::LeftToRight</enum>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">QToolButton {
+border: 2px solid #aaaaaa;
+border-radius: 10px;
+background: white;
+}
+
+QToolButton:hover {
+border: 2px solid #456789;
+border-radius: 10px;
+}
+
+QToolButton:pressed {
+border: 2px solid #456789;
+border-radius: 10px;
+}</string>
+          </property>
+          <property name="text">
+           <string>...</string>
+          </property>
+          <property name="checkable">
+           <bool>true</bool>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
+          </property>
+          <property name="toolButtonStyle">
+           <enum>Qt::ToolButtonTextBesideIcon</enum>
+          </property>
+          <property name="autoRaise">
+           <bool>true</bool>
+          </property>
+          <property name="arrowType">
+           <enum>Qt::UpArrow</enum>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QToolButton" name="nextDayButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>0</width>
+            <height>25</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>16777215</width>
+            <height>25</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string>Go to the next day</string>
+          </property>
+          <property name="layoutDirection">
+           <enum>Qt::LeftToRight</enum>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">QToolButton {
+ background: transparent;
+ border-radius: 8px;
+ border: 2px solid transparent;
+}
+
+QToolButton:hover {
+ border: 2px solid #456789;
+}
+
+QToolButton:pressed {
+ border: 2px solid #456789;
+ background-color: #89abcd;
+}</string>
+          </property>
+          <property name="text">
+           <string>Next</string>
+          </property>
+          <property name="icon">
+           <iconset resource="Resources.qrc">
+            <normaloff>:/icons/arrow-right.png</normaloff>:/icons/arrow-right.png</iconset>
+          </property>
+          <property name="toolButtonStyle">
+           <enum>Qt::ToolButtonIconOnly</enum>
+          </property>
+          <property name="autoRaise">
+           <bool>false</bool>
+          </property>
+          <property name="arrowType">
+           <enum>Qt::NoArrow</enum>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QToolButton" name="todayButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>0</width>
+            <height>25</height>
+           </size>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>16777215</width>
+            <height>25</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string>Go to the most recent day with data records</string>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">QToolButton {
+ background: transparent;
+ border-radius: 8px;
+ border: 2px solid transparent;
+}
+
+QToolButton:hover {
+ border: 2px solid #456789;
+}
+
+QToolButton:pressed {
+ border: 2px solid #456789;
+ background-color: #89abcd;
+}</string>
+          </property>
+          <property name="icon">
+           <iconset resource="Resources.qrc">
+            <normaloff>:/icons/arrow-end.png</normaloff>:/icons/arrow-end.png</iconset>
+          </property>
+          <property name="toolButtonStyle">
+           <enum>Qt::ToolButtonIconOnly</enum>
+          </property>
+          <property name="autoRaise">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QFrame" name="calendarFrame">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Raised</enum>
+       </property>
+       <layout class="QVBoxLayout" name="verticalLayout_5">
+        <property name="spacing">
+         <number>0</number>
+        </property>
+        <property name="leftMargin">
+         <number>0</number>
+        </property>
+        <property name="topMargin">
+         <number>0</number>
+        </property>
+        <property name="rightMargin">
+         <number>0</number>
+        </property>
+        <property name="bottomMargin">
+         <number>0</number>
+        </property>
+        <item>
+         <widget class="QCalendarWidget" name="calendar">
+          <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="baseSize">
+           <size>
+            <width>0</width>
+            <height>0</height>
+           </size>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">#qt_calendar_nextmonth {
+ background: transparent;
+ border-radius: 8px;
+}
+
+#qt_calendar_nextmonth:hover {
+	border: 2px solid #456789;
+}
+
+#qt_calendar_nextmonth:pressed {
+	border: 2px solid #456789;
+    background: #89abcd;
+}
+
+#qt_calendar_prevmonth {
+ background: transparent;
+  border-radius: 8px;
+}
+
+#qt_calendar_prevmonth:hover {
+	border: 2px solid #456789;
+}
+
+#qt_calendar_prevmonth:pressed {
+	border: 2px solid #456789;
+    background: #89abcd;
+}
+
+#qt_calendar_monthbutton {
+  background: transparent;
+  border: 2px solid transparent;
+  border-radius: 8px;
+  width: 6em;
+}
+
+#qt_calendar_monthbutton:hover {
+	border: 2px solid #456789;
+}
+
+#qt_calendar_monthbutton:pressed {
+	border: 2px solid #456789;
+    background: #89abcd;
+}
+
+#qt_calendar_yearbutton {
+  background: transparent;
+ border-radius: 8px;
+}
+
+#qt_calendar_yearbutton:hover {
+	border: 2px solid #456789;
+}
+
+#qt_calendar_yearbutton:pressed {
+	border: 2px solid #456789;
+    background: #89abcd;
+}
+</string>
+          </property>
+          <property name="firstDayOfWeek">
+           <enum>Qt::Monday</enum>
+          </property>
+          <property name="gridVisible">
+           <bool>false</bool>
+          </property>
+          <property name="horizontalHeaderFormat">
+           <enum>QCalendarWidget::ShortDayNames</enum>
+          </property>
+          <property name="verticalHeaderFormat">
+           <enum>QCalendarWidget::NoVerticalHeader</enum>
+          </property>
+          <property name="navigationBarVisible">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QTabWidget" name="tabWidget">
+       <property name="minimumSize">
+        <size>
+         <width>0</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="mouseTracking">
+        <bool>true</bool>
+       </property>
+       <property name="currentIndex">
+        <number>0</number>
+       </property>
+       <property name="movable">
+        <bool>true</bool>
+       </property>
+       <widget class="QWidget" name="events">
+        <attribute name="title">
+         <string>Events</string>
+        </attribute>
+        <layout class="QVBoxLayout" name="verticalLayout">
+         <property name="spacing">
+          <number>0</number>
+         </property>
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QTreeWidget" name="treeWidget">
+           <property name="editTriggers">
+            <set>QAbstractItemView::NoEditTriggers</set>
+           </property>
+           <property name="alternatingRowColors">
+            <bool>true</bool>
+           </property>
+           <property name="sortingEnabled">
+            <bool>true</bool>
+           </property>
+           <property name="animated">
+            <bool>false</bool>
+           </property>
+           <attribute name="headerVisible">
+            <bool>false</bool>
+           </attribute>
+           <attribute name="headerHighlightSections">
+            <bool>false</bool>
+           </attribute>
+           <column>
+            <property name="text">
+             <string notr="true">1</string>
+            </property>
+           </column>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_9">
+           <property name="leftMargin">
+            <number>4</number>
+           </property>
+           <property name="topMargin">
+            <number>4</number>
+           </property>
+           <property name="rightMargin">
+            <number>4</number>
+           </property>
+           <property name="bottomMargin">
+            <number>4</number>
+           </property>
+           <item>
+            <widget class="QLabel" name="label_7">
+             <property name="text">
+              <string>View Size</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QSlider" name="evViewSlider">
+             <property name="minimum">
+              <number>1</number>
+             </property>
+             <property name="maximum">
+              <number>30</number>
+             </property>
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="tickPosition">
+              <enum>QSlider::TicksAbove</enum>
+             </property>
+             <property name="tickInterval">
+              <number>2</number>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QLCDNumber" name="evViewLCD">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="digitCount">
+              <number>3</number>
+             </property>
+             <property name="segmentStyle">
+              <enum>QLCDNumber::Flat</enum>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="notes">
+        <attribute name="title">
+         <string>Notes</string>
+        </attribute>
+        <layout class="QVBoxLayout" name="verticalLayout_4">
+         <property name="spacing">
+          <number>0</number>
+         </property>
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QFrame" name="frame_3">
+           <property name="styleSheet">
+            <string notr="true"/>
+           </property>
+           <property name="frameShape">
+            <enum>QFrame::StyledPanel</enum>
+           </property>
+           <property name="frameShadow">
+            <enum>QFrame::Raised</enum>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_3">
+            <property name="spacing">
+             <number>2</number>
+            </property>
+            <property name="leftMargin">
+             <number>4</number>
+            </property>
+            <property name="topMargin">
+             <number>0</number>
+            </property>
+            <property name="rightMargin">
+             <number>0</number>
+            </property>
+            <property name="bottomMargin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QLabel" name="label_5">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Journal</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>342</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QToolButton" name="JournalNotesItalic">
+              <property name="font">
+               <font>
+                <italic>true</italic>
+               </font>
+              </property>
+              <property name="text">
+               <string> i </string>
+              </property>
+              <property name="shortcut">
+               <string>Ctrl+I</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QToolButton" name="JournalNotesBold">
+              <property name="font">
+               <font>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>B</string>
+              </property>
+              <property name="shortcut">
+               <string>Ctrl+B</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QToolButton" name="JournalNotesUnderline">
+              <property name="font">
+               <font>
+                <underline>true</underline>
+               </font>
+              </property>
+              <property name="text">
+               <string>u</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QToolButton" name="JournalNotesColour">
+              <property name="styleSheet">
+               <string notr="true">color: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 0, 0, 255), stop:0.166 rgba(255, 255, 0, 255), stop:0.333 rgba(0, 255, 0, 255), stop:0.5 rgba(0, 255, 255, 255), stop:0.666 rgba(0, 0, 255, 255), stop:0.833 rgba(255, 0, 255, 255), stop:1 rgba(255, 0, 0, 255))</string>
+              </property>
+              <property name="text">
+               <string>Color</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QComboBox" name="JournalNotesFontsize">
+              <property name="maximumSize">
+               <size>
+                <width>85</width>
+                <height>16777215</height>
+               </size>
+              </property>
+              <property name="maxVisibleItems">
+               <number>3</number>
+              </property>
+              <property name="sizeAdjustPolicy">
+               <enum>QComboBox::AdjustToContents</enum>
+              </property>
+              <item>
+               <property name="text">
+                <string>Small</string>
+               </property>
+              </item>
+              <item>
+               <property name="text">
+                <string>Medium</string>
+               </property>
+              </item>
+              <item>
+               <property name="text">
+                <string>Big</string>
+               </property>
+              </item>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QTextEdit" name="JournalNotes">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QWidget" name="widget" native="true">
+           <layout class="QFormLayout" name="formLayout">
+            <property name="fieldGrowthPolicy">
+             <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+            </property>
+            <property name="horizontalSpacing">
+             <number>4</number>
+            </property>
+            <property name="verticalSpacing">
+             <number>4</number>
+            </property>
+            <property name="leftMargin">
+             <number>2</number>
+            </property>
+            <property name="topMargin">
+             <number>0</number>
+            </property>
+            <property name="rightMargin">
+             <number>2</number>
+            </property>
+            <property name="bottomMargin">
+             <number>2</number>
+            </property>
+            <item row="0" column="0" colspan="2">
+             <layout class="QGridLayout" name="gridLayout">
+              <item row="0" column="0">
+               <widget class="QLabel" name="label">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="font">
+                 <font>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Zombie</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1" colspan="6">
+               <widget class="QLabel" name="label_9">
+                <property name="font">
+                 <font>
+                  <weight>50</weight>
+                  <bold>false</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>I'm feeling...</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0">
+               <widget class="QLabel" name="label_8">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Weight</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="1" colspan="2">
+               <widget class="QDoubleSpinBox" name="weightSpinBox">
+                <property name="maximum">
+                 <double>1499.000000000000000</double>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0" colspan="8">
+               <widget class="QSlider" name="ZombieMeter">
+                <property name="styleSheet">
+                 <string notr="true">QSlider::groove:horizontal  {
+    border: 1px solid #999999;
+    border-radius: 4px;
+    height: 8px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */
+    background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #ff6060, stop:1 #60ff60);
+    margin: 2px 0; 
+  
+}
+
+QSlider::handle:horizontal  {
+    background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f);
+    border: 1px solid #5c5c5c;
+    width: 18px;
+    margin: -2px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */
+    border-radius: 3px;
+}
+</string>
+                </property>
+                <property name="maximum">
+                 <number>10</number>
+                </property>
+                <property name="pageStep">
+                 <number>5</number>
+                </property>
+                <property name="value">
+                 <number>5</number>
+                </property>
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+                <property name="tickPosition">
+                 <enum>QSlider::TicksAbove</enum>
+                </property>
+                <property name="tickInterval">
+                 <number>1</number>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="3">
+               <widget class="QSpinBox" name="ouncesSpinBox">
+                <property name="suffix">
+                 <string/>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="7">
+               <widget class="QLabel" name="label_10">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="font">
+                 <font>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Awesome</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="7">
+               <widget class="QLCDNumber" name="BMI">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="frameShape">
+                 <enum>QFrame::NoFrame</enum>
+                </property>
+                <property name="smallDecimalPoint">
+                 <bool>true</bool>
+                </property>
+                <property name="digitCount">
+                 <number>5</number>
+                </property>
+                <property name="segmentStyle">
+                 <enum>QLCDNumber::Flat</enum>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="4" colspan="3">
+               <widget class="QLabel" name="BMIlabel">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>B.M.I.</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="bookmarkTab">
+        <attribute name="title">
+         <string>Bookmarks</string>
+        </attribute>
+        <layout class="QVBoxLayout" name="verticalLayout_2">
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
+         <item>
+          <widget class="QPushButton" name="addBookmarkButton">
+           <property name="styleSheet">
+            <string notr="true"/>
+           </property>
+           <property name="text">
+            <string>Add Bookmark</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QTableWidget" name="bookmarkTable">
+           <property name="alternatingRowColors">
+            <bool>true</bool>
+           </property>
+           <property name="selectionMode">
+            <enum>QAbstractItemView::SingleSelection</enum>
+           </property>
+           <property name="selectionBehavior">
+            <enum>QAbstractItemView::SelectRows</enum>
+           </property>
+           <property name="sortingEnabled">
+            <bool>true</bool>
+           </property>
+           <attribute name="horizontalHeaderStretchLastSection">
+            <bool>true</bool>
+           </attribute>
+           <column>
+            <property name="text">
+             <string>Starts</string>
+            </property>
+           </column>
+           <column>
+            <property name="text">
+             <string>Notes</string>
+            </property>
+           </column>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPushButton" name="removeBookmarkButton">
+           <property name="text">
+            <string>Remove Bookmark</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </widget>
+     </widget>
+     <widget class="QWidget" name="layoutWidget">
+      <layout class="QVBoxLayout" name="verticalLayout_3">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QWidget" name="graphMainArea" native="true">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>1</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <layout class="QHBoxLayout" name="horizontalLayout_2">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="QFrame" name="graphFrame">
+            <property name="frameShape">
+             <enum>QFrame::StyledPanel</enum>
+            </property>
+            <property name="frameShadow">
+             <enum>QFrame::Raised</enum>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QFrame" name="frame">
+         <property name="frameShape">
+          <enum>QFrame::StyledPanel</enum>
+         </property>
+         <property name="frameShadow">
+          <enum>QFrame::Sunken</enum>
+         </property>
+         <layout class="QHBoxLayout" name="horizontalLayout">
+          <property name="spacing">
+           <number>2</number>
+          </property>
+          <property name="leftMargin">
+           <number>2</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>2</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="QToolButton" name="toggleEvents">
+            <property name="styleSheet">
+             <string notr="true">QToolButton {
+ background: transparent;
+ border-radius: 8px;
+ border: 2px solid transparent;
+}
+
+QToolButton:hover {
+ border: 2px solid #456789;
+}
+
+QToolButton:pressed {
+ border: 2px solid #456789;
+ background-color: #89abcd;
+}</string>
+            </property>
+            <property name="text">
+             <string>Flags</string>
+            </property>
+            <property name="checkable">
+             <bool>true</bool>
+            </property>
+            <property name="checked">
+             <bool>true</bool>
+            </property>
+            <property name="toolButtonStyle">
+             <enum>Qt::ToolButtonTextBesideIcon</enum>
+            </property>
+            <property name="autoRaise">
+             <bool>false</bool>
+            </property>
+            <property name="arrowType">
+             <enum>Qt::DownArrow</enum>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QComboBox" name="eventsCombo">
+            <property name="maxVisibleItems">
+             <number>12</number>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="sessionBarLayout">
+            <property name="sizeConstraint">
+             <enum>QLayout::SetMaximumSize</enum>
+            </property>
+           </layout>
+          </item>
+          <item>
+           <widget class="QToolButton" name="toggleGraphs">
+            <property name="styleSheet">
+             <string notr="true">QToolButton {
+ background: transparent;
+ border-radius: 8px;
+ border: 2px solid transparent;
+}
+
+QToolButton:hover {
+ border: 2px solid #456789;
+}
+
+QToolButton:pressed {
+ border: 2px solid #456789;
+ background-color: #89abcd;
+}</string>
+            </property>
+            <property name="text">
+             <string>Graphs</string>
+            </property>
+            <property name="checkable">
+             <bool>true</bool>
+            </property>
+            <property name="toolButtonStyle">
+             <enum>Qt::ToolButtonTextBesideIcon</enum>
+            </property>
+            <property name="autoRaise">
+             <bool>false</bool>
+            </property>
+            <property name="arrowType">
+             <enum>Qt::DownArrow</enum>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QComboBox" name="graphCombo">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="toolTip">
+             <string>Drop down this list to show/hide available graphs.</string>
+            </property>
+            <property name="styleSheet">
+             <string notr="true"/>
+            </property>
+            <property name="sizeAdjustPolicy">
+             <enum>QComboBox::AdjustToContentsOnFirstShow</enum>
+            </property>
+            <property name="iconSize">
+             <size>
+              <width>20</width>
+              <height>20</height>
+             </size>
+            </property>
+            <property name="frame">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/sleepyhead/docs/0.0.gif b/sleepyhead/docs/0.0.gif
new file mode 100644
index 0000000..9e022bd
Binary files /dev/null and b/sleepyhead/docs/0.0.gif differ
diff --git a/sleepyhead/docs/PRS1 Data Format.odt b/sleepyhead/docs/PRS1 Data Format.odt
new file mode 100644
index 0000000..9766895
Binary files /dev/null and b/sleepyhead/docs/PRS1 Data Format.odt differ
diff --git a/sleepyhead/docs/changelog.txt b/sleepyhead/docs/changelog.txt
new file mode 100644
index 0000000..1f08b80
--- /dev/null
+++ b/sleepyhead/docs/changelog.txt
@@ -0,0 +1 @@
+ghttp://mobile-phones.smh.com.au/MobilePhones?utm_source=Widget_Fairfax_SMH_CompareAndSave&utm_medium=Widget&utm_campaign=New_BYO_Phone_Prices
diff --git a/sleepyhead/docs/channels.xml b/sleepyhead/docs/channels.xml
new file mode 100644
index 0000000..90eb464
--- /dev/null
+++ b/sleepyhead/docs/channels.xml
@@ -0,0 +1,98 @@
+<!DOCTYPE Channels>
+<!-- Copy this to SleepHeadData folder on app start once completed.
+Metric units please.. A conversion system will deal with the other measurement systems
+English only.. A different translation table will be used..
+It's only details & label that will be translated. name is used internally.
+Important: One id code per item, DO NOT CHANGE ID NUMBERS!!!
+-->
+<channels language="en" version="1.0">
+ <group name="CPAP">
+  <!-- Channel List -->
+
+
+
+  <channel id="0x111e" class="data" name="TestChan1" details="Debugging Channel #2" label="Test #1" unit="" color="pink"/>
+  <channel id="0x111f" class="data" name="TestChan2" details="Debugging Channel #2" label="Test #2" unit="" color="blue"/>
+
+  <channel id="0x1160" class="data" name="RMS9_E01" details="RMS9 Empty 1" label="E01" unit="" color="black"/>
+  <channel id="0x1161" class="data" name="RMS9_E02" details="RMS9 Empty 2" label="E02" unit="" color="black"/>
+  <channel id="0x1162" class="data" name="SetPressure" details="Set Pressure" label="Pressure" unit="" color="black"/>
+  <channel id="0x1163" class="data" name="BrokenSummary" details="Broken Summary" label="Broken Summary" unit="" color="black"/>
+  <channel id="0x1164" class="data" name="BrokenWaveform" details="Broken Waveform" label="Broken Waveform" unit="" color="black"/>
+
+  <channel id="0x1166" class="data" name="PRS1_0F" details="Unknown 0F" label="U0F" unit="?" color="dark green"/>
+  <channel id="0x1167" class="data" name="IntUnk1" details="Unknown 1" label="Unknown 1" unit="?" color="dark green"/>
+  <channel id="0x1168" class="data" name="IntUnk2" details="Unknown 2" label="Unknown 2" unit="?" color="dark green"/>
+
+  <channel id="0x1201" class="setting" scope="!session" name="PresRelType" details="Pressure Relief" label="Pres. Relief" type="integer">
+    <Option id="0" value=""/>
+    <Option id="1" value="None"/>
+    <Option id="2" value="C-Flex"/>
+    <Option id="3" value="C-Flex+"/>
+    <Option id="4" value="A-Flex"/>
+    <Option id="5" value="Bi-Flex"/>
+    <Option id="6" value="EPR"/>
+    <Option id="7" value="SmartFlex"/>
+    <Option id="8" value="Easy-Breathe"/>
+  </channel>
+  <channel id="0x1202" class="setting" scope="!session" name="PresRelMode" details="Pressure Relief Mode" label="Pres. Rel. Mode" type="integer">
+    <Option id="0" value=""/>
+    <Option id="1" value="Ramp"/>
+    <Option id="2" value="Full Time"/>
+  </channel>
+  <channel id="0x1203" class="setting" scope="!session" name="PresRelSet" details="Pressure Relief Setting" label="Pressure Relief" type="integer"/>
+
+ </group>
+ <group name="OXI">
+  </group>
+ <group name="SLEEP">
+  <channel id="0x2000" class="data" name="SleepStage" details="Sleep Stage" label="Sleep Stage" unit="1=Awake 2=REM 3=Light Sleep 4=Deep Sleep" color="dark grey"/>
+  <channel id="0x2001" class="data" name="ZeoBW" details="Zeo Brainwave" label="ZeoWave" color="black"/>
+  <channel id="0x2002" class="data" name="Awakenings" details="Awakenings" label="Awakenings" color="black"/>
+  <channel id="0x2003" class="data" name="MorningFeel" details="ZEO Morning Feel" label="Morning Feel" color="black"/>
+  <channel id="0x2004" class="data" name="TimeInWake" details="Time In Wake" label="Time In Wake" color="red"/>
+  <channel id="0x2005" class="data" name="TimeInREM" details="Time In REM Sleep" label="Time In REM" color="green"/>
+  <channel id="0x2006" class="data" name="TimeInLight" details="Time In Light Sleep" label="Time In Light" color="blue"/>
+  <channel id="0x2007" class="data" name="TimeInDeep" details="Time In Deep Sleep" label="Time In Deep" color="magenta"/>
+  <channel id="0x2008" class="data" name="TimeToZ" details="Time To Sleep" label="Time To Z" color="magenta"/>
+  <channel id="0x2009" class="data" name="ZeoZQ" details="ZEO ZQ" label="ZEO ZQ" color="magenta"/>
+ </group>
+ <group name="GENERAL">
+  <channel id="0x0800" class="data" name="BPSys" details="Blood Pressure Systolic" label="BPS" unit="mmHg" color="red"/>
+  <channel id="0x0801" class="data" name="BPDia" details="Blood Pressure Diastolic" label="BPD" unit="mmHg" color="blue"/>
+  <channel id="0x0802" class="data" name="Glucose" details="Blood Glucose" label="BGL" unit="mmol/L" color="black"/>
+  <channel id="0x0803" class="data" scope="!day" name="Weight" details="Weight" label="Weight" unit="Kg" color="black"/>
+  <channel id="0x0804" class="data" scope="!day" name="Height" details="Height" label="Height" unit="cm" color="blue"/>
+  <channel id="0x0805" class="data" name="BookmarkNotes" details="Session Bookmark Notes" label="Bookmark Notes" unit="text" color="orange"/>
+  <channel id="0x0806" class="data" name="BMI" details="Body Mass Index" label="BMI" unit="kg/m2" color="orange"/>
+  <channel id="0x0807" class="data" name="ZombieMeter" details="How good you feel." label="Alive" unit="0-10" color="orange"/>
+  <channel id="0x0808" class="data" name="BookmarkStart" details="Session Bookmark Start" label="Bookmark Start" unit="duration" color="orange"/>
+  <channel id="0x0809" class="data" name="BookmarkEnd" details="Session Bookmark End" label="Bookmark End" unit="duration" color="orange"/>
+  <channel id="0x080a" class="data" scope="!day" name="LastUpdated" details="Last Updated" label="Last Updated" unit="timestamp" color="orange"/>
+  <channel id="0xd000" class="data" scope="!day" unique="true" name="Journal" details="Journal Notes" label="Journal" type="richtext"/>
+ </group>
+ <group name="PRS1">
+  <!-- PRS1 Settings -->
+ </group>
+ <group name="RMS9">
+  <!-- RESMED Settings -->
+  <channel id="0xe200" class="setting" scope="!session" name="RMS9Mode" details="PAP Mode" label="PAP Mode" type="integer" link="0x1200">
+   <Option id="0" value="CPAP"/>
+   <Option id="1" value="Auto"/>
+   <Option id="2" value="VPAP"/>
+   <Option id="3" value="ASV"/>
+  </channel>
+ </group>
+ <group name="MACHINE">
+  <!-- General Per Machine Settings -->
+  <channel id="0xf000" class="setting" scope="!machine" name="Type" details="Type" label="Type" type="integer">
+   <option id="0" value="Unknown"/>
+   <option id="1" value="CPAP"/>
+   <option id="2" value="Oximeter"/>
+   <option id="3" value="Sleep"/>
+   <option id="4" value="Journal"/>
+   <option id="5" value="EEG"/>
+  </channel>
+  <channel id="0xf006" class="setting" scope="!machine" name="Notes" details="Machine Notes" label="Notes" type="richtext"/>
+ </group>
+</channels>
diff --git a/sleepyhead/docs/countries.txt b/sleepyhead/docs/countries.txt
new file mode 100644
index 0000000..3fd93c5
--- /dev/null
+++ b/sleepyhead/docs/countries.txt
@@ -0,0 +1,195 @@
+Afghanistan
+Albania
+Algeria
+Andorra
+Angola
+Antigua & Deps
+Argentina
+Armenia
+Australia
+Austria
+Azerbaijan
+Bahamas
+Bahrain
+Bangladesh
+Barbados
+Belarus
+Belgium
+Belize
+Benin
+Bhutan
+Bolivia
+Bosnia Herzegovina
+Botswana
+Brazil
+Brunei
+Bulgaria
+Burkina
+Burundi
+Cambodia
+Cameroon
+Canada
+Cape Verde
+Central African Rep
+Chad
+Chile
+China
+Colombia
+Comoros
+Congo
+Congo {Democratic Rep}
+Costa Rica
+Croatia
+Cuba
+Cyprus
+Czech Republic
+Denmark
+Djibouti
+Dominica
+Dominican Republic
+East Timor
+Ecuador
+Egypt
+El Salvador
+Equatorial Guinea
+Eritrea
+Estonia
+Ethiopia
+Fiji
+Finland
+France
+Gabon
+Gambia
+Georgia
+Germany
+Ghana
+Greece
+Grenada
+Guatemala
+Guinea
+Guinea-Bissau
+Guyana
+Haiti
+Honduras
+Hungary
+Iceland
+India
+Indonesia
+Iran
+Iraq
+Ireland {Republic}
+Israel
+Italy
+Ivory Coast
+Jamaica
+Japan
+Jordan
+Kazakhstan
+Kenya
+Kiribati
+Korea North
+Korea South
+Kosovo
+Kuwait
+Kyrgyzstan
+Laos
+Latvia
+Lebanon
+Lesotho
+Liberia
+Libya
+Liechtenstein
+Lithuania
+Luxembourg
+Macedonia
+Madagascar
+Malawi
+Malaysia
+Maldives
+Mali
+Malta
+Marshall Islands
+Mauritania
+Mauritius
+Mexico
+Micronesia
+Moldova
+Monaco
+Mongolia
+Montenegro
+Morocco
+Mozambique
+Myanmar, {Burma}
+Namibia
+Nauru
+Nepal
+Netherlands
+New Zealand
+Nicaragua
+Niger
+Nigeria
+Norway
+Oman
+Pakistan
+Palau
+Panama
+Papua New Guinea
+Paraguay
+Peru
+Philippines
+Poland
+Portugal
+Qatar
+Romania
+Russian Federation
+Rwanda
+St Kitts & Nevis
+St Lucia
+Saint Vincent & the Grenadines
+Samoa
+San Marino
+Sao Tome & Principe
+Saudi Arabia
+Senegal
+Serbia
+Seychelles
+Sierra Leone
+Singapore
+Slovakia
+Slovenia
+Solomon Islands
+Somalia
+South Africa
+Spain
+Sri Lanka
+Sudan
+Suriname
+Swaziland
+Sweden
+Switzerland
+Syria
+Taiwan
+Tajikistan
+Tanzania
+Thailand
+Togo
+Tonga
+Trinidad & Tobago
+Tunisia
+Turkey
+Turkmenistan
+Tuvalu
+Uganda
+Ukraine
+United Arab Emirates
+United Kingdom
+United States
+Uruguay
+Uzbekistan
+Vanuatu
+Vatican City
+Venezuela
+Vietnam
+Yemen
+Zambia
+Zimbabwe
diff --git a/sleepyhead/docs/graphs.xml b/sleepyhead/docs/graphs.xml
new file mode 100644
index 0000000..3961e88
--- /dev/null
+++ b/sleepyhead/docs/graphs.xml
@@ -0,0 +1,48 @@
+<!DOCTYPE Graphs>
+<Schema language="en" version="1.0">
+ <Graph name="Event Flags" group="Daily" master="true">
+  <property name="visible" type="bool" value="true"/>
+  <group type="flags">
+   <layer name="CSR" func="data" type="span">
+   <layer name="ClearAirway" func="data" type="bar">
+   <layer name="Obstructive" func="data" type="bar">
+   <layer name="Apnea" func="data" type="bar">
+   <layer name="Hypopnea" func="data" type="bar">
+   <layer name="FlowLimit" func="data" type="bar">
+   <layer name="RERA" func="data" type="bar">
+   <layer name="VSnore" func="data" type="bar">
+   <layer name="VSnore2" func="data" type="bar">
+  </group>
+ </Graph>
+ <Graph name="Flow Rate" group="Daily">
+  <layer type="overlay" data="CSR" visual="span"/>
+  <layer type="waveform" data="FlowRate"/>
+  <layer type="overlay" data="Obstructive" visual="bar"/>
+  <layer type="overlay" data="Hypopnea" visual="bar"/>
+  <layer type="overlay" data="Apnea" visual="bar"/>
+  <layer type="overlay" data="ClearAirway" visual="bar"/>
+  <layer type="overlay" data="FlowLimit" visual="bar"/>
+  <layer type="overlay" data="RERA" visual="bar"/>
+  <layer type="overlay" data="VSnore" visual="bar"/>
+  <layer type="overlay" data="PressurePulse" visual="dot"/>
+ </Graph>
+ <Graph name="AHI" group="Overview">
+  <layer type="barchart">
+   <slice name="Hypopnea" func="cph">
+   <slice name="Apnea" func="cph">
+   <slice name="Obstructive" func="cph">
+   <slice name="ClearAirway" func="cph">
+  </layer>
+ </Graph>
+<Graph name="Pressure" visual="linechart">
+ <layer name="Pressure" func="wavg" color="dark green">
+ <layer name="Pressure" func="min" color="dark red">
+ <layer name="Pressure" func="max" color="dark blue">
+ <layer name="IPAP" func="wavg" color="red">
+ <layer name="EPAP" func="wavg" color="blue">
+</Graph>
+
+
+
+</Graphs>
+</Schema>
diff --git a/sleepyhead/docs/release_notes.html b/sleepyhead/docs/release_notes.html
new file mode 100644
index 0000000..5926572
--- /dev/null
+++ b/sleepyhead/docs/release_notes.html
@@ -0,0 +1,150 @@
+<html>
+<head><meta charset="UTF-8"></head>
+<body>
+<h1><image src="qrc:/docs/sheep.png" width=64 height=64>SleepyHead v0.9.8 <b>Testing</b></h1>
+
+<p><h2><b>Release Notes</b></h2></p>
+<p>Greetings!</p>
+<p>Here is a definitely new and improved SleepyHead build :)</p>
+
+<p><b>Warning: This is a test build, not all features are complete or will work 100% as intended yet!</b></p>
+
+<p>This is the first public test build in a while, so there is a lot of new stuff to take in.</p>
+
+<p>First up, a warning: Some new stuff is going down that might break on you.. Overview overhead figures aren't completely finished yet. I know about these and am working on them.
+You will likely have to Rebuild CPAP data to get this to behave properly.. If you have to do it more than once, somethings not right, and I need to know.</p>
+
+<p>Right clicky menu has tons of new stuff for you to play with... some of this you're hopefully going to love! :)</p>
+<p>New Graph Clone ability allows you to make a temporary copy of a graph, and operate it completely independently...
+You can even take these graph clones with you to another day! They aren't saved though. they are gone when you close SleepyHead.</li>
+<p>Y-Axis menu allows for better control of Y-Axis scaling, all of this has been improved greatly... no more having to go into preferences
+to set minimum/maximum values (that SleepyHead wasn't honouring properly anyway). Now you can adjust these settings live for each graph!</p>
+<p>Line Cursor mode (F3 to toggles) is a very powerful new feature.. Play with it and see what it does. It's off by default because it takes a lot more CPU power to work.</p>
+
+<p><b>Sleep Well, and good luck!</b></p>
+<p><b><i>JediMark</i></b></p>
+
+<br/>
+<b>New features & bug fixes in v0.9.8</b><br/>
+<list>
+<li>Rework of Records box</li>
+<li>Initial support for Philips Respironics System One Oximetery attachment</li>
+<li>Removed old unused Mask Preferences and other junk</li>
+<li>Complete Overview SummaryChart overhaul</li>
+<li>Prescription changes now caches to disk to save having to reload all data every time</li>
+<li>Implemented Demand loading for SleepyHead Summary data files</li>
+</list>
+<br/>
+<b>New features & bug fixes in v0.9.7</b><br/>
+<list>
+<li>Experimental ResMed AirSense S10 import support</li>
+<li>F&P Icon timestamp fix, thanks to Roy Stone for the patch!</li>
+<li>New Feature: Create independant temporary Graph Clones, which you can explore seperately, even carry over to another day</li>
+<li>Split events and waveforms up in preferences, and sorted by machine type</li>
+<li>Removed the old graph tab in preferences, as it's no longer needed</li>
+<li>Graph YAxis scaling can now be adjusted easily in the right click menu</li>
+<li>New Feature: Added toggle-able linechart Event-flag overlays</li>
+<li>New Feature: Added toggle-able Graph Plots when multiple plots present</li>
+<li>New Feature: Added toggle-able Dotted lines for each graph for various purposes</li>
+<li>New Feature: Added right-click popup menu in Y-Axis and title graph area</li>
+<li>Support for importing from CMS50F and CMS50I via cable. Thanks François Revol and Michael Masterson for their amazing help!</i>
+<li>Fix duplicate Ti/Te graphs on VPAP Adapt</li>
+<li>New Graph: Time at Pressure</li>
+<li>Less ugly code hardwiring and more automatic smarts, plus better channel color and name consistencies underneath.</li>
+<li>Daily panel (left) Sidebar can be toggled on/off with F9</li>
+<li>Calendar can now be toggled on/off with f10, your preferences will be kept</li>
+<li>Fixed screenshot in non fullscreen on Windows & Linux.. now autohides the calendar and right sidebar.</li>
+<li>Press Alt-B while selecting in daily view to quickly add a bookmark without having to zoom in</li>
+<li>New Feature: Can now edit channel information, including names, colors, etc. in preferences</li>
+<li>Tooltips showing relevenat information when hovering over events on daily charts</li>
+<li>New Feature: Large Leak flagging where not present, using redline threshold</li>
+<li>New Feature: Can switch off individual daily view linechart event overlays in a combo box down the bottom left</li>
+<li>New Feature: Events are now visible on all daily charts in line cursor mode</li>
+<li>Fix an issue that caused some burried PRS1 session data to not be imported</li>
+<li>Fix a lot of pressure and pressure relief strings</li>
+<li>New Feature: Added (very experimental) Weinmann SOMNOsoft2 Import importer</li>
+<li>Fixed inverted CMS50 .spoR file pulse and spo2</l>
+<li>Added CMS50i .spo2 file import support</li>
+<li>New Feature: Added a Welcome page to make things a little friendlier</li>
+<li>Fixes another issue that caused session dupplicates on ResMed machines</li>
+<li>Improved support for Intellipap BiLevel machines</li>
+<li>New Feature: Press Ctrl-L (Cmd-L on Mac) to switch on/off a "line cursor", and display current graph information above graphs while hovering over graphs</li>
+<li>New Feature: Preference option to Realign machine detected codes and fix dodgy PRS1 durations using user event flagging.</li>
+<li>New Feature: Added second set of User Flags detection and preferences.</li>
+<li>New Feature: Hit Escape key to go back through previous graph selection history</li>
+<li>New Feature: Hold Alt while selecting a graph area with the mouse, pauses till you release the key, to allow you to take another attempt.</li>
+<li>Fixed changing languages clobbering graph settings</li>
+<li>Import now remembers last place you imported from</li>
+<li>Lock files are now used to help protect the same profiles being open multiple times</li>
+<li>Fixed a rare PRS1 duplicate session issue affecting multi-chunk files</li>
+<li>Fixed ResMed STR.edf DST crossover bug causing duplicate sessions</li>
+<li>Added PRS1 SD Card automatic backup functionality</li>
+<li>Stopped faulty statistics calculations where only summary data was present (For now it should show zero where calculations are impossible)</li>
+<li>Added .spo2 file import support for firmware 3.7 CMS50F oximeters.</li>
+<li>Some pre-v3.7 firmware CMS50 oximeter serial importer improvements</li>
+<li>Fixed ResMed AutoSet minimum pressure not displaying correctly</li>
+<li>Fix ResMed EPR setting display</li>
+<li>Restore display of MaskPressureHi plots when available</li>
+<li>Fix wiki URL's thanks to sourceForge forcing move of SleepyHead's wiki</li>
+<li>Fix ResMed importer crashes, finished rewriting stage2 multithreading code</li>
+<li>Made database upgrade/purge process a bit more friendly (Keep your backups switched on!)</li>
+<li>Fixed a SleepyHead summary error that prevented count indexes from being stored properly</li>
+<li>Some other minor fixed and stuff</li>
+</list>
+<br/>
+<b>New features & bugs fixes in v0.9.6</b><br/>
+<list>
+<li>Threadsafety improvements to debug/logger</li>
+<li>Multithreaded PRS1 and ResMed loader improvements</li>
+<li>Minor user interface tweaks</li>
+<li>Added ChoiceMMed MD300W1 Oximeter file import support</li>
+<li>Graph Preferences min/max settings are now honoured correctly</li>
+<li>Complete Rewrite of CMS50 Importer</li>
+<li>Completely redesigned Oximetery with new Import Wizard</li>
+<li>Improved data Purge and Reimport from backup abilities</li>
+<li>Improved ResMed STR.edf summary import support</li>
+<li>Several Fisher & Paykel Icon improvements (including automatic backup)</li>
+<li>Switched from raw OpenGL to Qt QPainter wrapped backend</li>
+<li>Switched to Qt's pixmap caching engine</li>
+<li>Fix ResMed session grouping bug that caused session double-ups</li>
+<li>Fix EDF importer glitch on windows builds that led to faulty graph displays</li>
+<li>Fixed CPAP card autoscanner on Windows platform</li>
+<li>Added timeout dialog to CPAP card autoscanner</li>
+<li>Microsoft compiler fixes</li>
+</list>
+<br/>
+<b>New features & bugs fixes since v0.9.5</b><br/>
+<list>
+<li>Added ability to pin graphs to keep them on screen</li>
+<li>Fixed tranlation loading on Mac</li>
+<li>Updated Dutch Tranlsations (Thanks Arie)</li>
+<li>Fixed overview graph legends showing wrong details</li>
+<li>F12 to Screenshot restored on Apple Mac platform</li>
+<li>Added CSV importer for Somnopose iOS Sleep Position application data</li>
+<li>Added user information to Statistics page</li>
+<li>Datacard autodetection ability</li>
+<li>Philips Respironics 60 series fixes</li>
+</list>
+
+<br/>
+<b>New features & bugs fixes since v0.9.3</b><br/>
+<list>
+<li>Retina display fixes for Mac platform</li>
+<li>Introduced yAxis Scaling modes</li>
+<li>Cleaned up mouse handling underneath</li>
+<li>Better ResMed SD card backups</li>
+<li>New Profile selection screen</li>
+<li>Fixed inconsistency with graph legend markers</li>
+<li>Improved CMS50 Oximetry serial importing, including support for CMS50E & F models</li>
+<li>The foundations of loadable translations for non-English speakers</li>
+<li>Better Fisher & Paykel ICON support</li>
+<li>Printing works on Mac OSX 10.8.x again</li>
+<li>Support for the PRS1 Series 60, in large part due to a patch from Keary Griffin.</li>
+<li>A bunch of small PRS1 fixes, especially for the AutoSV.</li>
+<li>Added Flow Limit to the summary and overview screens.  This can be a useful indicator in certain types of apnea.</li>
+<li>Some 64-bit fixes, and some other bugfixes mainly useful to those building from source, especially on linux.</li>
+<li>Fixed some issues with the prescription changes table with certain machines.</li>
+</list>
+
+</body>
+</html>
diff --git a/sleepyhead/docs/schema.xml b/sleepyhead/docs/schema.xml
new file mode 100644
index 0000000..1a824e4
--- /dev/null
+++ b/sleepyhead/docs/schema.xml
@@ -0,0 +1,68 @@
+<!DOCTYPE Schema>
+<!-- Schema List Notes: -->
+<Schema language="en" version="1.0">
+ <enum name="class"/>
+  <item id="0" value="event"/>
+  <item id="1" value="waveform"/>
+  <item id="2" value="setting"/>
+  <default id="0">
+ </enum>
+ <enum name="function">
+  <item id="0" value="data"/>
+  <item id="1" value="avg"/>
+  <item id="2" value="wavg"/>
+  <item id="3" value="min"/>
+  <item id="4" value="max"/>
+  <item id="5" value="sum"/>
+  <item id="6" value="cnt"/>
+  <item id="7" value="p90"/>
+  <item id="8" value="cph"/>
+  <item id="9" value="sph"/>
+  <item id="10" value="hours"/>
+  <item id="11" value="set"/>
+  <default id="0">
+ </enum>
+ <enum name="scope">
+  <item id="0" value="preference">
+  <item id="1" value="machine">
+  <item id="2" value="day">
+  <item id="3" value="session">
+  <default id="3">
+ </enum>
+ <enum name="datatype">
+  <item id="0" value=""/>
+  <item id="1" value=""/>
+  <item id="2" value=""/>
+  <item id="3" value=""/>
+  <item id="4" value=""/>
+  <item id="5" value=""/>
+  <item id="6" value=""/>
+  <item id="7" value=""/>
+  <item id="8" value=""/>
+  <item id="9" value=""/>
+  <item id="10" value=""/>
+  <item id="11" value=""/>
+  <default id="0">
+ </enum>
+ <object name="color">
+  <property name="func" type="function"/>
+  <property name="color" type="qcolor"/>
+ </object>
+ <object name="option">
+  <property name="id" type="integer"/>
+  <property name="type" type="datatype"/>
+  <property name="value" type="variant"/>
+ </object>
+ <object name="channel">
+  <property name="id" type="number"/>
+  <property name="class" type="class"/>
+  <property name="scope" type="scope"/>
+  <property name="name" type="string"/>
+  <property name="details" type="string"/>
+  <property name="label" type="string"/>
+  <property name="unit" type="string"/>
+  <property name="type" type="datatype"/>
+  <array name="colors" type="color" index="func"/>
+  <array name="options" type="option" index="id"/>
+ </object>
+</Schema>
diff --git a/sleepyhead/docs/script.js b/sleepyhead/docs/script.js
new file mode 100644
index 0000000..43b3177
--- /dev/null
+++ b/sleepyhead/docs/script.js
@@ -0,0 +1,77 @@
+/* Borrowed from Michael Leigeber
+http://sixrevisions.com/tutorials/javascript_tutorial/create_lightweight_javascript_tooltip/
+*/
+var tooltip=function(){
+	var id = 'tt';
+	var top = 3;
+	var left = 3;
+	var maxw = 300;
+	var speed = 10;
+	var timer = 20;
+	var endalpha = 95;
+	var alpha = 0;
+	var tt,t,c,b,h;
+	var ie = document.all ? true : false;
+	return{
+		show:function(v,w){
+			if(tt == null){
+				tt = document.createElement('div');
+				tt.setAttribute('id',id);
+				t = document.createElement('div');
+				t.setAttribute('id',id + 'top');
+				c = document.createElement('div');
+				c.setAttribute('id',id + 'cont');
+				b = document.createElement('div');
+				b.setAttribute('id',id + 'bot');
+				tt.appendChild(t);
+				tt.appendChild(c);
+				tt.appendChild(b);
+				document.body.appendChild(tt);
+				tt.style.opacity = 0;
+				tt.style.filter = 'alpha(opacity=0)';
+				document.onmousemove = this.pos;
+			}
+			tt.style.display = 'block';
+			c.innerHTML = v;
+			tt.style.width = w ? w + 'px' : 'auto';
+			if(!w && ie){
+				t.style.display = 'none';
+				b.style.display = 'none';
+				tt.style.width = tt.offsetWidth;
+				t.style.display = 'block';
+				b.style.display = 'block';
+			}
+			if(tt.offsetWidth > maxw){tt.style.width = maxw + 'px'}
+			h = parseInt(tt.offsetHeight) + top;
+			clearInterval(tt.timer);
+			tt.timer = setInterval(function(){tooltip.fade(1)},timer);
+		},
+		pos:function(e){
+			var u = ie ? event.clientY + document.documentElement.scrollTop : e.pageY;
+			var l = ie ? event.clientX + document.documentElement.scrollLeft : e.pageX;
+			tt.style.top = (u - h) + 'px';
+			tt.style.left = (l + left) + 'px';
+		},
+		fade:function(d){
+			var a = alpha;
+			if((a != endalpha && d == 1) || (a != 0 && d == -1)){
+				var i = speed;
+				if(endalpha - a < speed && d == 1){
+					i = endalpha - a;
+				}else if(alpha < speed && d == -1){
+					i = a;
+				}
+				alpha = a + (i * d);
+				tt.style.opacity = alpha * .01;
+				tt.style.filter = 'alpha(opacity=' + alpha + ')';
+			}else{
+				clearInterval(tt.timer);
+				if(d == -1){tt.style.display = 'none'}
+			}
+		},
+		hide:function(){
+			clearInterval(tt.timer);
+			tt.timer = setInterval(function(){tooltip.fade(-1)},timer);
+		}
+	};
+}();
diff --git a/sleepyhead/docs/sheep.png b/sleepyhead/docs/sheep.png
new file mode 100644
index 0000000..17dc402
Binary files /dev/null and b/sleepyhead/docs/sheep.png differ
diff --git a/sleepyhead/docs/sheep.svg b/sleepyhead/docs/sheep.svg
new file mode 100644
index 0000000..abed547
--- /dev/null
+++ b/sleepyhead/docs/sheep.svg
@@ -0,0 +1,347 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="500.00000px"
+   height="500.00000px"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.42"
+   sodipodi:docbase="/home/the_structorr/Grafika/svg"
+   sodipodi:docname="sheep.svg">
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient2388">
+      <stop
+         style="stop-color:#ff0f0f;stop-opacity:1;"
+         offset="0"
+         id="stop2390" />
+      <stop
+         style="stop-color:#790000;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2392" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2352">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop2354" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop2356" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2342">
+      <stop
+         style="stop-color:#c98b2b;stop-opacity:0.0000000;"
+         offset="0.0000000"
+         id="stop2344" />
+      <stop
+         style="stop-color:#c98b2b;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2346" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2331">
+      <stop
+         style="stop-color:#fdfdfd;stop-opacity:1;"
+         offset="0"
+         id="stop2333" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop2335" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2331"
+       id="radialGradient1390"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.297868,5.787679e-16,-3.926420e-16,0.880487,-101.9489,50.30802)"
+       spreadMethod="reflect"
+       cx="337.75723"
+       cy="307.01065"
+       fx="337.75723"
+       fy="307.01065"
+       r="196.42906" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2352"
+       id="radialGradient1392"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.391637,3.929376e-16,-2.651947e-16,0.962287,-237.8279,-81.51627)"
+       spreadMethod="reflect"
+       cx="455.35910"
+       cy="387.82999"
+       fx="455.35910"
+       fy="387.82999"
+       r="196.42906" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2342"
+       id="radialGradient1394"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.262588,-9.281897e-16,9.656487e-16,1.313543,-56.57130,-74.94638)"
+       cx="215.43732"
+       cy="234.51016"
+       fx="215.43732"
+       fy="234.51016"
+       r="122.48233" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2388"
+       id="linearGradient1396"
+       gradientUnits="userSpaceOnUse"
+       x1="318.66293"
+       y1="450.35132"
+       x2="318.66293"
+       y2="252.35132" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2331"
+       id="radialGradient1398"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.288843,0.155644,-0.104765,0.194421,235.7517,94.33565)"
+       spreadMethod="reflect"
+       cx="366.73050"
+       cy="622.25092"
+       fx="366.73050"
+       fy="622.25092"
+       r="196.42906" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2331"
+       id="radialGradient1400"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.960358e-3,0.437112,-0.332240,3.770389e-3,477.5884,192.0540)"
+       spreadMethod="reflect"
+       cx="209.01430"
+       cy="388.04880"
+       fx="209.01430"
+       fy="388.04880"
+       r="196.42906" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2352"
+       id="linearGradient1402"
+       gradientUnits="userSpaceOnUse"
+       x1="229.47342"
+       y1="173.93208"
+       x2="236.78149"
+       y2="173.93208" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2352"
+       id="linearGradient1404"
+       gradientUnits="userSpaceOnUse"
+       x1="229.47342"
+       y1="173.93208"
+       x2="236.78149"
+       y2="173.93208" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2352"
+       id="linearGradient1406"
+       gradientUnits="userSpaceOnUse"
+       x1="379.02084"
+       y1="365.81250"
+       x2="383.99304"
+       y2="288.24133" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.68800000"
+     inkscape:cx="250.00000"
+     inkscape:cy="250.00000"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     inkscape:window-width="750"
+     inkscape:window-height="513"
+     inkscape:window-x="36"
+     inkscape:window-y="54" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <g
+       id="g1358"
+       transform="matrix(0.924795,0.000000,0.000000,0.924795,-81.16829,-78.79786)"
+       style="stroke:none">
+      <rect
+         style="opacity:1.0000000;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         id="rect2323"
+         width="24.805840"
+         height="100.82373"
+         x="440.75931"
+         y="460.30414" />
+      <rect
+         y="479.50854"
+         x="488.77057"
+         height="100.82373"
+         width="24.805840"
+         id="rect2325"
+         style="opacity:1.0000000;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         id="path2327"
+         d="M 450.34282,533.35597 C 434.66233,533.35597 425.27760,535.00171 421.94917,559.24313 C 420.48829,569.88312 423.42718,576.42098 428.33285,580.27398 C 429.32075,575.83902 431.87825,566.28034 433.58078,563.23780 C 435.16903,574.79547 431.96588,577.18413 433.61994,583.17209 C 439.43071,585.22028 446.44145,585.10615 452.84928,583.48542 C 469.36526,579.30794 478.73644,581.95648 478.73644,559.24313 C 478.73644,536.57591 466.02328,533.35600 450.34282,533.35597 z "
+         style="color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         d="M 496.36214,554.96106 C 480.13186,554.96106 470.41808,556.66451 466.97296,581.75587 C 465.46084,592.76893 468.50279,599.53602 473.58047,603.52411 C 474.60298,598.93365 477.25017,589.03981 479.01239,585.89060 C 480.65632,597.85350 477.34086,600.32593 479.05293,606.52384 C 485.06743,608.64384 492.32399,608.52571 498.95648,606.84813 C 516.05156,602.52420 525.75129,605.26561 525.75129,581.75587 C 525.75129,558.29389 512.59239,554.96108 496.36214,554.96106 z "
+         id="path2329" />
+      <rect
+         y="460.30414"
+         x="255.31567"
+         height="100.82373"
+         width="24.805840"
+         id="rect2291"
+         style="opacity:1.0000000;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <rect
+         style="opacity:1.0000000;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         id="rect2293"
+         width="24.805840"
+         height="100.82373"
+         x="303.32697"
+         y="479.50854" />
+      <path
+         style="color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         d="M 264.89916,533.35597 C 249.21867,533.35597 239.83393,535.00171 236.50551,559.24313 C 235.04463,569.88312 237.98351,576.42098 242.88919,580.27398 C 243.87708,575.83902 246.43458,566.28034 248.13712,563.23780 C 249.72536,574.79547 246.52222,577.18413 248.17628,583.17209 C 253.98705,585.22028 260.99779,585.10615 267.40562,583.48542 C 283.92160,579.30794 293.29278,581.95648 293.29278,559.24313 C 293.29278,536.57591 280.57961,533.35600 264.89916,533.35597 z "
+         id="path2315" />
+      <path
+         id="path2299"
+         d="M 310.91847,554.96106 C 294.68819,554.96106 284.97441,556.66451 281.52929,581.75587 C 280.01718,592.76893 283.05912,599.53602 288.13680,603.52411 C 289.15932,598.93365 291.80651,589.03981 293.56873,585.89060 C 295.21266,597.85350 291.89720,600.32593 293.60926,606.52384 C 299.62377,608.64384 306.88032,608.52571 313.51281,606.84813 C 330.60789,602.52420 340.30763,605.26561 340.30763,581.75587 C 340.30763,558.29389 327.14873,554.96108 310.91847,554.96106 z "
+         style="color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         id="path2224"
+         d="M 295.09375,95.968750 C 288.98605,99.638423 282.53785,102.50265 275.36137,102.59569 C 266.48947,104.59320 258.81961,112.34730 257.84375,121.53125 C 244.86817,122.79234 235.51252,137.75453 239.43750,150.03125 C 204.36926,159.61628 175.73224,183.77543 151.28257,209.72187 C 127.73378,232.16213 114.53135,265.30324 117.97793,297.82138 C 121.35583,340.04661 151.42265,377.91064 190.21875,393.87500 C 187.65100,399.69184 188.19811,407.13697 192.28125,412.12500 C 184.92133,420.01822 18 [...]
+         style="color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         id="path2051"
+         d="M 195.21371,180.36113 C 232.50708,156.07667 257.48818,145.83866 275.15682,172.97222 C 287.58817,192.06291 264.51105,224.57243 227.21767,248.85690 C 189.92432,273.14134 156.90027,288.61669 144.46895,269.52603 C 132.03763,250.43537 157.92033,204.64558 195.21371,180.36113 z "
+         style="color:#000000;fill:#dedede;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.2754596;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 423.09375,245.21875 C 416.54409,245.30874 416.13237,255.94799 409.25130,253.41770 C 381.02671,252.53738 352.72624,249.11197 324.51088,251.05333 C 276.82684,256.85269 236.30967,292.16163 217.69826,335.53179 C 210.63109,351.41972 206.37187,368.47267 204.75000,385.78125 C 192.72688,386.94687 187.87470,404.97205 197.65625,411.90625 C 192.96049,416.59661 189.37174,423.32460 192.56018,429.94604 C 193.35186,434.49832 199.87752,437.13224 201.15625,439.31250 C 195.66525,447.20425 20 [...]
+         style="color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         id="path2126" />
+      <path
+         id="rect2101"
+         d="M 427.75632,248.42742 C 422.02771,248.42742 417.47360,252.52261 416.53181,257.79525 L 339.47929,253.99748 C 268.17535,253.99748 212.68971,318.49374 208.32967,389.36685 C 208.12269,389.35623 207.94861,389.28245 207.73890,389.28245 C 201.33418,389.28245 196.09241,394.32313 196.09241,400.50697 C 196.09241,404.71745 198.60913,408.21421 202.16884,410.12798 C 201.99001,410.90920 201.66247,411.65814 201.66247,412.49104 C 201.66247,413.17565 201.96246,413.78130 202.08445,414.43212 C  [...]
+         style="color:#000000;fill:url(#radialGradient1390);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         id="path2280"
+         d="M 424.87500,253.03125 C 420.50003,255.64394 419.02204,264.63264 412.03125,261.56250 C 383.48569,260.63214 354.89792,257.38071 326.34375,258.87500 C 283.20610,263.65765 246.57455,294.76535 227.68750,332.81250 C 219.00020,350.64723 214.03654,370.11272 212.31250,389.84375 C 209.19093,394.77257 199.61662,393.58027 200.00000,401.09375 C 202.18396,405.66718 207.70925,409.25698 205.56250,415.15625 C 203.40282,419.51517 196.45870,422.74737 200.53125,428.34375 C 203.97535,432.36305 21 [...]
+         style="color:#000000;fill:url(#radialGradient1392);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 242.06250,153.37500 C 218.80954,159.13923 198.23938,172.61766 179.72060,187.34197 C 159.59559,204.77416 141.41937,227.37509 137.43327,254.39795 C 135.74995,267.63517 145.46254,282.34571 159.75716,281.70899 C 178.40380,282.31316 195.17307,272.08634 210.96119,263.39655 C 238.86822,247.29412 267.46855,227.28642 280.50000,196.65625 C 285.20025,183.88331 280.84858,169.06394 270.03194,160.83761 C 262.50539,154.20681 251.87349,151.59163 242.06250,153.37500 z M 195.21371,180.36113  [...]
+         style="color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.2754596;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         id="path2194" />
+      <path
+         sodipodi:nodetypes="ccccccscc"
+         id="path1316"
+         d="M 300.68682,142.46824 C 270.53087,144.98138 241.67847,159.63359 221.27125,181.88065 C 175.03318,189.48561 132.91247,226.38845 126.29610,273.89185 C 119.37624,316.20001 143.44665,359.42603 180.25710,379.97817 C 230.09590,409.61546 300.43409,400.19159 338.43725,355.53323 C 356.84595,334.91377 365.44933,306.95365 364.04030,279.54514 C 364.46903,244.79223 379.10564,225.47153 361.17704,175.18150 C 353.45451,153.51971 331.15447,142.32219 310.12373,142.24136 C 306.97692,142.15489 30 [...]
+         style="opacity:1.0000000;color:#000000;fill:#eed6b1;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:5.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1394);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.3503178;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         d="M 300.68682,142.46824 C 270.53087,144.98138 241.67847,159.63359 221.27125,181.88065 C 175.03318,189.48561 132.91247,226.38845 126.29610,273.89185 C 119.37624,316.20001 143.44665,359.42603 180.25710,379.97817 C 230.09590,409.61546 300.43409,400.19159 338.43725,355.53323 C 356.84595,334.91377 365.44933,306.95365 364.04030,279.54514 C 364.46903,244.79223 379.10564,225.47153 361.17704,175.18150 C 353.45451,153.51971 331.15447,142.32219 310.12373,142.24136 C 306.97692,142.15489 30 [...]
+         id="path2340"
+         sodipodi:nodetypes="ccccccscc" />
+      <path
+         id="path2104"
+         d="M 364.82692,240.28527 C 364.60212,253.71521 364.23229,267.17310 364.06736,280.54162 C 365.47639,307.95013 356.82002,335.96186 338.41132,356.58140 C 311.00884,388.78267 266.87842,402.37206 225.65978,396.50017 C 245.12596,408.86376 269.13429,416.41739 295.36994,416.41736 C 359.57559,416.41736 411.66607,372.54135 411.66607,318.43492 C 411.66607,286.37718 393.09015,258.17261 364.82692,240.28527 z "
+         style="opacity:1.0000000;color:#000000;fill:url(#linearGradient1396);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         id="path2109"
+         d="M 241.15133,165.68358 C 238.34586,165.95816 234.89153,167.24280 231.53032,169.39696 C 225.03720,173.55831 221.19244,179.53452 222.58446,183.06893 C 227.77136,182.69057 234.15590,180.45231 240.47617,176.40173 C 243.07872,174.73379 245.30350,172.83006 247.39655,170.91607 C 247.61573,169.76876 247.51735,168.74559 247.05897,167.87785 C 246.14224,166.14240 243.95681,165.40901 241.15133,165.68358 z "
+         style="opacity:1.0000000;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.3503178;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         id="path2117"
+         d="M 270.42625,173.61036 C 264.06452,173.40389 257.73272,178.37395 256.49380,185.12886 C 256.42191,186.66091 257.56731,187.84630 258.47440,188.88677 C 259.86587,190.27171 261.42074,191.65282 263.30173,192.16278 C 269.43017,192.63879 275.72611,193.29707 281.33860,196.17671 C 282.95466,195.60625 282.43533,193.42565 281.86509,192.19948 C 280.92708,189.02035 281.58938,185.50698 283.10600,182.65792 C 283.71170,180.98134 281.99124,179.79635 281.22947,178.56343 C 278.48719,175.40101 27 [...]
+         style="opacity:1.0000000;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.50000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 300.65625,138.46875 C 269.87788,141.25877 240.54248,155.78639 219.31250,178.18750 C 170.94650,186.55985 127.46776,226.60867 121.93750,276.46875 C 115.73172,324.94252 148.06326,373.19455 192.83838,390.64601 C 245.28565,413.34147 313.24454,397.94190 347.11224,350.83452 C 363.69703,329.21529 369.04641,301.26082 368.38558,274.54003 C 370.23768,248.22151 378.22507,221.47325 370.83129,195.24192 C 367.45265,175.69134 358.88520,154.87551 339.97326,145.78455 C 327.98542,139.17167 31 [...]
+         style="color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.3503178;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         id="path2177" />
+      <path
+         id="path2055"
+         d="M 300.94000,103.48119 C 293.21737,101.65805 289.66655,112.27100 283.11632,109.71310 C 273.12764,108.21319 262.26269,118.24611 266.08411,128.44533 C 265.58414,130.41666 256.34910,127.51847 253.21639,131.41265 C 244.51532,136.02828 243.65928,149.54410 251.96956,154.99196 C 258.84582,161.55593 269.34670,156.45284 275.17915,154.77769 C 282.13969,162.42481 292.10171,153.52019 298.37759,160.11490 C 304.75830,164.07236 312.10138,156.93309 315.66900,164.77396 C 320.53096,168.75615 32 [...]
+         style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1398);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         d="M 296.87500,99.562500 C 290.97641,101.23077 286.63400,107.58435 280.00357,105.77194 C 270.17824,106.01775 260.78259,115.03822 261.56250,125.09375 C 247.12029,123.99206 236.40045,142.74114 245.71423,154.31547 C 251.66635,162.91287 264.01915,164.10828 272.78125,159.50000 C 279.23702,162.29107 286.10897,161.86940 292.94549,161.99161 C 297.74127,164.51067 302.95897,166.21458 308.53125,165.03125 C 313.19913,165.94499 316.15677,170.88596 321.30509,171.88889 C 326.04865,174.92102 32 [...]
+         style="color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         id="path2143" />
+      <path
+         sodipodi:nodetypes="csssc"
+         id="path2048"
+         d="M 428.95659,295.54892 C 428.95659,342.66402 423.60779,370.74124 389.32822,370.74124 C 365.20979,370.74124 349.69985,331.48679 349.69985,284.37169 C 349.69985,237.25662 355.04867,199.01826 379.16711,199.01826 C 403.28554,199.01826 428.95659,248.43385 428.95659,295.54892 z "
+         style="opacity:1.0000000;color:#000000;fill:url(#radialGradient1400);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         transform="matrix(0.501496,0.724922,-0.700555,0.484638,241.5286,-81.74322)"
+         d="M 236.78149 173.93208 A 3.6540353 4.3848424 0 1 1  229.47342,173.93208 A 3.6540353 4.3848424 0 1 1  236.78149 173.93208 z"
+         sodipodi:ry="4.3848424"
+         sodipodi:rx="3.6540353"
+         sodipodi:cy="173.93208"
+         sodipodi:cx="233.12746"
+         id="path2350"
+         style="opacity:1.0000000;color:#000000;fill:url(#linearGradient1402);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         sodipodi:type="arc" />
+      <path
+         sodipodi:type="arc"
+         style="opacity:1.0000000;color:#000000;fill:url(#linearGradient1404);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         id="path2360"
+         sodipodi:cx="233.12746"
+         sodipodi:cy="173.93208"
+         sodipodi:rx="3.6540353"
+         sodipodi:ry="4.3848424"
+         d="M 236.78149 173.93208 A 3.6540353 4.3848424 0 1 1  229.47342,173.93208 A 3.6540353 4.3848424 0 1 1  236.78149 173.93208 z"
+         transform="matrix(0.653287,0.863606,-0.912597,0.577354,273.1211,-121.3226)" />
+      <path
+         d="M 374.46875,195.46875 C 357.37291,199.69928 351.86245,218.68376 349.15625,233.93750 C 344.47861,270.52800 342.92902,309.01934 355.79916,344.20083 C 361.46157,359.53322 374.14298,375.82279 392.17973,374.68016 C 409.07444,374.63958 424.78879,362.19777 427.90555,345.42653 C 433.77275,323.98504 433.47514,301.28718 431.85714,279.29160 C 428.28819,251.56418 418.79017,222.88102 398.18750,203.12500 C 391.54256,197.76389 383.21551,193.69688 374.46875,195.46875 z M 428.95659,295.54892  [...]
+         style="opacity:1.0000000;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.4335296;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+         id="path2160" />
+      <path
+         id="rect2203"
+         d="M 369.12500,206.90625 C 355.89465,222.06812 355.93054,243.44784 354.32341,262.40462 C 353.00096,293.55042 353.10128,327.29685 370.46387,354.44879 C 372.52778,359.83878 378.45881,363.21376 381.71261,356.64896 C 387.03685,347.29424 383.31474,335.89563 384.44022,325.65625 C 384.31349,288.91840 384.85611,252.00538 383.73661,215.37845 C 381.58863,210.01367 375.15117,204.80430 369.12500,206.90625 z "
+         style="opacity:1.0000000;color:#000000;fill:url(#linearGradient1406);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:5.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+      <path
+         id="path2127"
+         d="M 168.79145,260.73637 C 171.01729,263.83128 171.30523,267.76043 172.36782,271.31633 C 173.13399,274.32935 174.50913,277.16999 176.38253,279.64874 C 178.28418,282.50509 179.87000,285.92323 179.20715,289.43754 C 178.79612,292.17539 177.51515,294.98092 175.17929,296.57098 C 173.15973,297.20881 171.73909,295.13634 170.92706,293.59984 C 169.14072,290.34542 169.58981,286.52872 169.18490,282.96903 C 168.90958,279.47579 168.79877,275.96823 168.62593,272.47272 C 168.09045,269.23230 16 [...]
+         style="opacity:1.0000000;fill:#8a6223;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+      <path
+         sodipodi:nodetypes="cccccscccc"
+         id="path2129"
+         d="M 178.54323,311.14831 C 178.88086,319.11796 177.45919,327.29338 179.83035,335.07170 C 181.58660,341.86285 183.56133,348.65806 184.21618,355.66532 C 184.59562,356.64789 183.50746,358.57800 182.80481,356.93191 C 180.60535,349.28609 178.01515,341.68353 177.00632,333.76065 C 176.45364,327.85282 177.63306,321.80307 176.85266,316.00424 C 176.56839,313.89191 178.30811,311.93616 178.49119,310.46113 L 178.50299,310.83214 L 178.54323,311.14831 L 178.54323,311.14831 z "
+         style="opacity:1.0000000;fill:#8a6223;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+      <path
+         id="path2131"
+         d="M 221.35992,274.03577 C 216.28316,275.02415 212.30876,278.58672 207.73286,280.74504 C 204.73408,282.25867 201.46023,283.08063 198.18233,283.72001 C 194.34838,284.67331 190.30593,286.32631 188.14334,289.83695 C 186.66653,292.01885 185.77191,294.82384 186.56063,297.42703 C 187.83987,299.13124 190.27312,298.74891 192.06647,298.26760 C 195.96943,297.35655 198.90438,294.48323 201.84086,291.95217 C 205.39254,289.14318 208.72621,286.07013 212.17473,283.14129 C 215.12329,281.11228 21 [...]
+         style="opacity:1.0000000;fill:#8a6223;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+    </g>
+  </g>
+</svg>
diff --git a/sleepyhead/docs/sheep2.svg b/sleepyhead/docs/sheep2.svg
new file mode 100644
index 0000000..05a3113
--- /dev/null
+++ b/sleepyhead/docs/sheep2.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.0"
+   width="244.0735"
+   height="254.0336"
+   id="svg2">
+  <defs
+     id="defs4" />
+  <g
+     transform="translate(-229.23628,-428.6334)"
+     id="layer1">
+    <path
+       d="M 471.30978,550.70588 C 471.32954,617.01429 417.58148,670.77836 351.27303,670.77836 C 284.96459,670.77836 231.21653,617.01429 231.23629,550.70588 C 231.21653,484.39747 284.96459,430.6334 351.27303,430.6334 C 417.58148,430.6334 471.32954,484.39747 471.30978,550.70588 z"
+       id="path2383"
+       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 111.6875,107.53125 C 56.369221,108.65231 32.500002,144.87514 32.5,189.34375 C 32.5,209.19487 43.324503,227.41849 57.65625,241.59375 C 27.132065,228.65938 3.0579226,203.45455 -8.375,172.1875 C -5.4671302,235.8702 47.13438,286.6875 111.53125,286.6875 C 177.79154,286.68751 231.5625,232.91649 231.5625,166.65625 C 231.5625,152.18853 229.01028,138.31628 224.3125,125.46875 C 224.39665,127.31156 224.46875,129.16779 224.46875,131.03125 C 224.46875,163.56861 211.48124,193.09286 190.437 [...]
+       transform="translate(239.73628,384.06586)"
+       id="path3221"
+       style="opacity:1;fill:#000000;fill-opacity:0.31372549;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 359.45331,671.27549 C 359.45331,680.36627 374.11864,680.65684 392.18842,680.65684 C 410.2582,680.65684 424.92354,681.35033 424.92354,671.27549 C 424.92354,653.55955 410.2582,639.18139 392.18842,639.18139 C 374.11864,639.18139 359.45331,653.55955 359.45331,671.27549 z"
+       id="path3172"
+       style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+    <path
+       d="M 344.4555,671.27549 C 344.4555,680.36627 329.79017,680.65684 311.72039,680.65684 C 293.65061,680.65684 278.98527,681.35033 278.98527,671.27549 C 278.98527,653.55955 293.65061,639.18139 311.72039,639.18139 C 329.79017,639.18139 344.4555,653.55955 344.4555,671.27549 z"
+       id="path3329"
+       style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.99999976;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+    <path
+       d="M 299.12996,680.0559 C 299.12996,663.68834 308.57279,653.61599 308.57279,653.61599 C 308.57279,653.61599 304.79566,667.46547 305.42518,680.0559 L 299.12996,680.0559 z"
+       id="path3331"
+       style="fill:#000000;fill-opacity:0.31372549;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 353.05276,623.66426 C 306.64933,620.31439 274.55157,635.1015 274.55157,635.1015 C 274.55157,635.1015 284.79285,634.85391 290.56871,635.7729 C 279.73804,643.18546 276.18705,657.89569 276.18705,657.89569 C 276.18705,657.89569 288.26491,644.95139 300.64722,640.34716 C 290.13429,654.32853 288.73404,677.30764 288.73404,677.30764 C 288.73404,677.30764 300.8237,641.58254 323.41268,634.18407 C 340.6339,628.54369 358.84717,631.86099 358.84717,631.86099 C 358.84717,631.86099 394.96362, [...]
+       id="path2399"
+       style="fill:#44aa00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 348.61128,478.40961 C 318.48203,479.0202 297.67961,490.06288 284.98628,507.15961 C 260.92184,504.57182 240.92378,530.78461 240.92378,530.78461 C 240.92378,530.78461 259.81491,540.23093 272.98628,532.31586 C 270.58705,541.02758 269.42378,550.42181 269.42378,560.22211 C 269.42378,605.39659 325.54928,642.06586 351.26753,642.06586 C 377.98414,642.06586 433.11128,605.39659 433.11128,560.22211 C 433.11128,550.42181 431.94739,541.02758 429.54878,532.31586 C 442.72015,540.23093 461.5 [...]
+       id="path3155"
+       style="fill:#333333;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+    <path
+       d="M 404.77885,680.0559 C 404.77885,663.68834 395.33602,653.61599 395.33602,653.61599 C 395.33602,653.61599 399.11315,667.46547 398.48363,680.0559 L 404.77885,680.0559 z"
+       id="path3174"
+       style="fill:#000000;fill-opacity:0.31372549;fill-rule:evenodd;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 347.6435,548.23558 C 347.64723,560.75453 337.49967,570.90511 324.98073,570.90511 C 312.46178,570.90511 302.31422,560.75453 302.31795,548.23558 C 302.31422,535.71664 312.46178,525.56606 324.98073,525.56606 C 337.49967,525.56606 347.64723,535.71664 347.6435,548.23558 z"
+       id="path3157"
+       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 400.3757,548.23558 C 400.37943,560.75453 390.23187,570.90511 377.71293,570.90511 C 365.19398,570.90511 355.04642,560.75453 355.05015,548.23558 C 355.04642,535.71664 365.19398,525.56606 377.71293,525.56606 C 390.23187,525.56606 400.37943,535.71664 400.3757,548.23558 z"
+       id="path3159"
+       style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3.99999952;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 380.23101,552.23558 C 380.23226,556.40856 376.84974,559.79209 372.67676,559.79209 C 368.50378,559.79209 365.12126,556.40856 365.12251,552.23558 C 365.12126,548.0626 368.50378,544.67908 372.67676,544.67908 C 376.84974,544.67908 380.23226,548.0626 380.23101,552.23558 z"
+       id="path3161"
+       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:47.66669083;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 338.20067,552.23558 C 338.20192,556.40856 334.8194,559.79209 330.64642,559.79209 C 326.47344,559.79209 323.09092,556.40856 323.09217,552.23558 C 323.09092,548.0626 326.47344,544.67908 330.64642,544.67908 C 334.8194,544.67908 338.20192,548.0626 338.20067,552.23558 z"
+       id="path3163"
+       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:47.66669083;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 429.83003,533.40961 L 427.95503,536.06586 C 428.20391,539.14134 428.29878,542.2685 428.29878,545.44086 C 428.29878,590.61535 373.17164,627.28461 346.45503,627.28461 C 325.74922,627.28463 285.3583,603.52896 270.39253,570.69086 C 278.00834,610.93714 327.56443,642.06587 351.26753,642.06586 C 377.98414,642.06586 433.11128,605.39656 433.11128,560.22211 C 433.11128,550.83056 432.0359,541.81185 429.83003,533.40961 z"
+       id="path3231"
+       style="fill:#000000;fill-opacity:0.31372549;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+    <path
+       d="M 367.86847,612.86692 C 365.57575,616.84001 361.36822,618.70552 358.4717,617.03321 C 355.57516,615.3609 355.08698,610.78431 357.38141,606.81222 C 359.67414,602.83912 363.88167,600.97361 366.7782,602.64592 C 369.67473,604.31823 370.16291,608.89482 367.86847,612.86692 z"
+       id="path2398"
+       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:47.66669083;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 335.13142,612.86692 C 337.42414,616.84001 341.63167,618.70552 344.52819,617.03321 C 347.42473,615.3609 347.91291,610.78431 345.61848,606.81222 C 343.32575,602.83912 339.11822,600.97361 336.22169,602.64592 C 333.32516,604.31823 332.83698,608.89482 335.13142,612.86692 z"
+       id="path2412"
+       style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:47.66669083;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+    <path
+       d="M 276.13784,641.01688 C 272.83815,640.67142 269.8601,643.05656 269.51464,646.35627 C 269.4594,646.88397 269.49524,647.40103 269.57277,647.90197 C 266.79125,648.17459 264.47372,650.38779 264.17145,653.27503 C 263.82599,656.57474 266.24548,659.52496 269.54517,659.87041 C 270.29776,659.9492 271.01081,659.87238 271.70092,659.68762 C 271.53103,662.86109 273.87653,665.66541 277.07286,666.00004 C 280.37258,666.34548 283.32278,663.92603 283.66824,660.6263 C 283.75461,659.80137 283.6738 [...]
+       id="path3181"
+       style="opacity:1;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/sleepyhead/docs/startup_tips.txt b/sleepyhead/docs/startup_tips.txt
new file mode 100644
index 0000000..4729f26
--- /dev/null
+++ b/sleepyhead/docs/startup_tips.txt
@@ -0,0 +1,2 @@
+You can reorder graphs by clicking and dragging on the title bar.
+SleepyHead project started out in March 2011, initially written in Python script.
diff --git a/sleepyhead/docs/tooltips.css b/sleepyhead/docs/tooltips.css
new file mode 100644
index 0000000..1d9d2f0
--- /dev/null
+++ b/sleepyhead/docs/tooltips.css
@@ -0,0 +1,53 @@
+<style type='text/css'>
+
+.info {
+position:relative;
+}
+.info span {
+position:absolute;
+left:-999em;
+}
+.info:hover span {
+left:90px;
+top:evt.page;
+padding:1px 1px;
+border:2px solid #000;
+background:#ffc;
+z-index:25;
+color:#000;
+border-radius: 5px 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
+}
+
+.info2 {
+position:relative;
+}
+.info2 span {
+position:absolute;
+left:-999em;
+}
+.info2:hover span {
+left:0px;
+top:+20px;
+/*padding:5px 10px; */
+padding:1px 1px;
+z-index:24;
+border:2px solid #000;
+background:#ffc;
+color:#000;
+border-radius: 5px 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1);
+}
+
+a:link, a:visited { color: inherit; text-decoration: none; font-weight: normal;}
+a:hover { background-color: inherit; color: #ff8888; text-decoration:none; font-weight: bold; }
+
+#text {margin:50px auto; width:500px}
+.hotspot {color:#900; padding-bottom:1px; border-bottom:1px dotted #900; cursor:pointer}
+
+#tt {position:absolute; display:block; background:url(images/tt_left.gif) top left no-repeat}
+#tttop {display:block; height:5px; margin-left:5px; background:url(images/tt_top.gif) top right no-repeat; overflow:hidden}
+#ttcont {display:block; padding:2px 12px 3px 7px; margin-left:5px; background:#666; color:#FFF}
+#ttbot {display:block; height:5px; margin-left:5px; background:url(images/tt_bottom.gif) top right no-repeat; overflow:hidden}
+
+</style>
diff --git a/sleepyhead/docs/tz.txt b/sleepyhead/docs/tz.txt
new file mode 100644
index 0000000..3460717
--- /dev/null
+++ b/sleepyhead/docs/tz.txt
@@ -0,0 +1,92 @@
+Pacific/Midway=(GMT-11:00) Midway Island, Samoa
+America/Adak=(GMT-10:00) Hawaii-Aleutian
+Etc/GMT+10=(GMT-10:00) Hawaii
+Pacific/Marquesas=(GMT-09:30) Marquesas Islands
+Pacific/Gambier=(GMT-09:00) Gambier Islands
+America/Anchorage=(GMT-09:00) Alaska
+America/Ensenada=(GMT-08:00) Tijuana, Baja California
+Etc/GMT+8=(GMT-08:00) Pitcairn Islands
+America/Los_Angeles=(GMT-08:00) Pacific Time (US & Canada)
+America/Denver=(GMT-07:00) Mountain Time (US & Canada)
+America/Chihuahua=(GMT-07:00) Chihuahua, La Paz, Mazatlan
+America/Dawson_Creek=(GMT-07:00) Arizona
+America/Belize=(GMT-06:00) Saskatchewan, Central America
+America/Cancun=(GMT-06:00) Guadalajara, Mexico City, Monterrey
+Chile/EasterIsland=(GMT-06:00) Easter Island
+America/Chicago=(GMT-06:00) Central Time (US & Canada)
+America/New_York=(GMT-05:00) Eastern Time (US & Canada)
+America/Havana=(GMT-05:00) Cuba
+America/Bogota=(GMT-05:00) Bogota, Lima, Quito, Rio Branco
+America/Caracas=(GMT-04:30) Caracas
+America/Santiago=(GMT-04:00) Santiago
+America/La_Paz=(GMT-04:00) La Paz
+Atlantic/Stanley=(GMT-04:00) Faukland Islands
+America/Campo_Grande=(GMT-04:00) Brazil
+America/Goose_Bay=(GMT-04:00) Atlantic Time (Goose Bay)
+America/Glace_Bay=(GMT-04:00) Atlantic Time (Canada)
+America/St_Johns=(GMT-03:30) Newfoundland
+America/Araguaina=(GMT-03:00) UTC-3,
+America/Montevideo=(GMT-03:00) Montevideo
+America/Miquelon=(GMT-03:00) Miquelon, St. Pierre
+America/Godthab=(GMT-03:00) Greenland
+America/Argentina/Buenos_Aires=(GMT-03:00) Buenos Aires
+America/Sao_Paulo=(GMT-03:00) Brasilia
+America/Noronha=(GMT-02:00) Mid-Atlantic
+Atlantic/Cape_Verde=(GMT-01:00) Cape Verde Is.
+Atlantic/Azores=(GMT-01:00) Azores
+Europe/Belfast=(GMT) Greenwich Mean Time : Belfast
+Europe/Dublin=(GMT) Greenwich Mean Time : Dublin
+Europe/Lisbon=(GMT) Greenwich Mean Time : Lisbon
+Europe/London=(GMT) Greenwich Mean Time : London
+Africa/Abidjan=(GMT) Monrovia, Reykjavik
+Europe/Amsterdam=(GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
+Europe/Belgrade=(GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague
+Europe/Brussels=(GMT+01:00) Brussels, Copenhagen, Madrid, Paris
+Africa/Algiers=(GMT+01:00) West Central Africa
+Africa/Windhoek=(GMT+01:00) Windhoek
+Asia/Beirut=(GMT+02:00) Beirut
+Africa/Cairo=(GMT+02:00) Cairo
+Asia/Gaza=(GMT+02:00) Gaza
+Africa/Blantyre=(GMT+02:00) Harare, Pretoria
+Asia/Jerusalem=(GMT+02:00) Jerusalem
+Europe/Minsk=(GMT+02:00) Minsk
+Asia/Damascus=(GMT+02:00) Syria
+Europe/Moscow=(GMT+03:00) Moscow, St. Petersburg, Volgograd
+Africa/Addis_Ababa=(GMT+03:00) Nairobi
+Asia/Tehran=(GMT+03:30) Tehran
+Asia/Dubai=(GMT+04:00) Abu Dhabi, Muscat
+Asia/Yerevan=(GMT+04:00) Yerevan
+Asia/Kabul=(GMT+04:30) Kabul
+Asia/Yekaterinburg=(GMT+05:00) Ekaterinburg
+Asia/Tashkent=(GMT+05:00) Tashkent
+Asia/Kolkata=(GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
+Asia/Katmandu=(GMT+05:45) Kathmandu
+Asia/Dhaka=(GMT+06:00) Astana, Dhaka
+Asia/Novosibirsk=(GMT+06:00) Novosibirsk
+Asia/Rangoon=(GMT+06:30) Yangon (Rangoon)
+Asia/Bangkok=(GMT+07:00) Bangkok, Hanoi, Jakarta
+Asia/Krasnoyarsk=(GMT+07:00) Krasnoyarsk
+Asia/Hong_Kong=(GMT+08:00) Beijing, Chongqing, Hong Kong, Urumqi
+Asia/Irkutsk=(GMT+08:00) Irkutsk, Ulaan Bataar
+Australia/Perth=(GMT+08:00) Perth
+Australia/Eucla=(GMT+08:45) Eucla
+Asia/Tokyo=(GMT+09:00) Osaka, Sapporo, Tokyo
+Asia/Seoul=(GMT+09:00) Seoul
+Asia/Yakutsk=(GMT+09:00) Yakutsk
+Australia/Adelaide=(GMT+09:30) Adelaide
+Australia/Darwin=(GMT+09:30) Darwin
+Australia/Brisbane=(GMT+10:00) Brisbane
+Australia/Melbourne=(GMT+10:00) Melbourne
+Australia/Hobart=(GMT+10:00) Hobart
+Asia/Vladivostok=(GMT+10:00) Vladivostok
+Australia/Lord_Howe=(GMT+10:30) Lord Howe Island
+Etc/GMT-11=(GMT+11:00) Solomon Is., New Caledonia
+Asia/Magadan=(GMT+11:00) Magadan
+Pacific/Norfolk=(GMT+11:30) Norfolk Island
+Asia/Anadyr=(GMT+12:00) Anadyr, Kamchatka
+Pacific/Auckland=(GMT+12:00) Auckland, Wellington
+Etc/GMT-12=(GMT+12:00) Fiji, Kamchatka, Marshall Is.
+Pacific/Chatham=(GMT+12:45) Chatham Islands
+Pacific/Tongatapu=(GMT+13:00) Nuku Alofa
+Pacific/Kiritimati=(GMT+14:00) Kiritimati
+
diff --git a/sleepyhead/docs/usage.html b/sleepyhead/docs/usage.html
new file mode 100644
index 0000000..1743d2c
--- /dev/null
+++ b/sleepyhead/docs/usage.html
@@ -0,0 +1,21 @@
+<html>
+<head>
+<style type='text/css'>
+<!--h1,p,a,td,body { font-family: 'FreeSans', 'Sans Serif' } --/>
+p,a,td,body { font-size: 14px }
+</style>
+</head>
+<body leftmargin=0 topmargin=0 rightmargin=0>
+<div align='center'><font size="+3">Usage Notes</font></div>
+<p>To import your PRS1 or S9 CPAP data, select either the root or drive letter of the SD card, or any folder containing a copy of it.
+On the PRS1 this folder should either contain or be the P-Series folder.. For the S9, the folder you select must contain the DATALOG folder, and Journal.dat, etc..</p>
+<p><b>ResMed S9 Users Please Note:</b> It's a good idea to keep a running backup of your DATALOG folder as your machine automatically deletes Flow waveform data past 7 days, and other waveforms after 30 days.</p>
+<p><b>CMS50 users:</b> To import data recorded by the SpO2Review software, look for the "Application Data" folder in your Home directory, point at the folder containing the Spo2.ini, Spo2Review.ini and Data folder.
+Serial importing is still a work in progress and may or may not behave how you would expect.</p>
+<p><b>*** Attention Mac Users ***</b><br/><i> Please set your SD card to read-only before inserting it into your computer,
+as Mac OSX automatically writes a hidden index file, which can lead to data corruption on your SD card.</i></p>
+
+<hr>
+<p><i>Do NOT rely on this softwares accuracy when making medical decisions. Talk to your doctor.</i></p>
+</body>
+</html>
diff --git a/sleepyhead/exportcsv.cpp b/sleepyhead/exportcsv.cpp
new file mode 100644
index 0000000..3a9afb6
--- /dev/null
+++ b/sleepyhead/exportcsv.cpp
@@ -0,0 +1,399 @@
+/* ExportCSV module implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QFileDialog>
+#include <QLocale>
+#include <QMessageBox>
+#include <QCalendarWidget>
+#include <QTextCharFormat>
+#include "SleepLib/profiles.h"
+#include "SleepLib/day.h"
+#include "common_gui.h"
+#include "exportcsv.h"
+#include "ui_exportcsv.h"
+#include "mainwindow.h"
+
+extern MainWindow *mainwin;
+
+ExportCSV::ExportCSV(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::ExportCSV)
+{
+    ui->setupUi(this);
+    ui->rb1_Summary->setChecked(true);
+    ui->quickRangeCombo->setCurrentIndex(0);
+
+    // Set Date controls locale to 4 digit years
+    QLocale locale = QLocale::system();
+    QString shortformat = locale.dateFormat(QLocale::ShortFormat);
+
+    if (!shortformat.toLower().contains("yyyy")) {
+        shortformat.replace("yy", "yyyy");
+    }
+
+    ui->startDate->setDisplayFormat(shortformat);
+    ui->endDate->setDisplayFormat(shortformat);
+    // Stop both calendar drop downs highlighting weekends in red
+    QTextCharFormat format = ui->startDate->calendarWidget()->weekdayTextFormat(Qt::Saturday);
+    format.setForeground(QBrush(Qt::black, Qt::SolidPattern));
+    ui->startDate->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format);
+    ui->startDate->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format);
+    ui->endDate->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format);
+    ui->endDate->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format);
+
+    Qt::DayOfWeek dow = firstDayOfWeekFromLocale();
+
+    ui->startDate->calendarWidget()->setFirstDayOfWeek(dow);
+    ui->endDate->calendarWidget()->setFirstDayOfWeek(dow);
+
+    // Connect the signals to update which days have CPAP data when the month is changed
+    connect(ui->startDate->calendarWidget(), SIGNAL(currentPageChanged(int, int)),
+            SLOT(startDate_currentPageChanged(int, int)));
+    connect(ui->endDate->calendarWidget(), SIGNAL(currentPageChanged(int, int)),
+            SLOT(endDate_currentPageChanged(int, int)));
+
+    on_quickRangeCombo_activated(tr("Most Recent Day"));
+    ui->rb1_details->clearFocus();
+    ui->quickRangeCombo->setFocus();
+    ui->exportButton->setEnabled(false);
+}
+
+ExportCSV::~ExportCSV()
+{
+    delete ui;
+}
+
+void ExportCSV::on_filenameBrowseButton_clicked()
+{
+    QString timestamp = tr("SleepyHead_");
+    timestamp += p_profile->Get("Username") + "_";
+
+    if (ui->rb1_details->isChecked()) { timestamp += tr("Details_"); }
+
+    if (ui->rb1_Sessions->isChecked()) { timestamp += tr("Sessions_"); }
+
+    if (ui->rb1_Summary->isChecked()) { timestamp += tr("Summary_"); }
+
+    timestamp += ui->startDate->date().toString(Qt::ISODate);
+
+    if (ui->startDate->date() != ui->endDate->date()) { timestamp += "_" + ui->endDate->date().toString(Qt::ISODate); }
+
+    timestamp += ".csv";
+    QString name = QFileDialog::getSaveFileName(this, tr("Select file to export to"),
+                   PREF.Get("{home}/") + timestamp, tr("CSV Files (*.csv)"));
+
+    if (name.isEmpty()) {
+        ui->exportButton->setEnabled(false);
+        return;
+    }
+
+    if (!name.toLower().endsWith(".csv")) {
+        name += ".csv";
+    }
+
+    ui->filenameEdit->setText(name);
+    ui->exportButton->setEnabled(true);
+}
+
+void ExportCSV::on_quickRangeCombo_activated(const QString &arg1)
+{
+    QDate first = p_profile->FirstDay();
+    QDate last = p_profile->LastDay();
+
+    if (arg1 == tr("Custom")) {
+        ui->startDate->setEnabled(true);
+        ui->endDate->setEnabled(true);
+        ui->startLabel->setEnabled(true);
+        ui->endLabel->setEnabled(true);
+    } else {
+        ui->startDate->setEnabled(false);
+        ui->endDate->setEnabled(false);
+        ui->startLabel->setEnabled(false);
+        ui->endLabel->setEnabled(false);
+
+        if (arg1 == tr("Everything")) {
+            ui->startDate->setDate(first);
+            ui->endDate->setDate(last);
+        } else if (arg1 == tr("Most Recent Day")) {
+            ui->startDate->setDate(last);
+            ui->endDate->setDate(last);
+        } else if (arg1 == tr("Last Week")) {
+            ui->startDate->setDate(last.addDays(-7));
+            ui->endDate->setDate(last);
+        } else if (arg1 == tr("Last Fortnight")) {
+            ui->startDate->setDate(last.addDays(-14));
+            ui->endDate->setDate(last);
+        } else if (arg1 == tr("Last Month")) {
+            ui->startDate->setDate(last.addMonths(-1));
+            ui->endDate->setDate(last);
+        } else if (arg1 == tr("Last 6 Months")) {
+            ui->startDate->setDate(last.addMonths(-6));
+            ui->endDate->setDate(last);
+        } else if (arg1 == tr("Last Year")) {
+            ui->startDate->setDate(last.addYears(-1));
+            ui->endDate->setDate(last);
+        }
+    }
+}
+
+void ExportCSV::on_exportButton_clicked()
+{
+    QFile file(ui->filenameEdit->text());
+    file.open(QFile::WriteOnly);
+    QString header;
+    const QString sep = ",";
+    const QString newline = "\n";
+
+    //    if (ui->rb1_details->isChecked()) {
+    //        fields.append(DumpField(NoChannel,MT_CPAP,ST_DATE));
+    //    } else {
+    //        header=tr("DateTime")+sep+tr("Session")+sep+tr("Event")+sep+tr("Data/Duration");
+    //    } else {
+    //        if (ui->rb1_Summary->isChecked()) {
+    //            header=tr("Date")+sep+tr("Session Count")+sep+tr("Start")+sep+tr("End")+sep+tr("Total Time")+sep+tr("AHI");
+    //        } else if (ui->rb1_Sessions->isChecked()) {
+    //            header=tr("Date")+sep+tr("Session")+sep+tr("Start")+sep+tr("End")+sep+tr("Total Time")+sep+tr("AHI");
+    //        }
+    //    }
+    //    fields.append(DumpField(NoChannel,MT_CPAP,ST_SESSIONS));
+
+
+    QList<ChannelID> countlist, avglist, p90list;
+    countlist.append(CPAP_Hypopnea);
+    countlist.append(CPAP_Obstructive);
+    countlist.append(CPAP_Apnea);
+    countlist.append(CPAP_ClearAirway);
+    countlist.append(CPAP_VSnore);
+    countlist.append(CPAP_VSnore2);
+    countlist.append(CPAP_RERA);
+    countlist.append(CPAP_FlowLimit);
+    countlist.append(CPAP_SensAwake);
+    countlist.append(CPAP_NRI);
+    countlist.append(CPAP_ExP);
+    countlist.append(CPAP_LeakFlag);
+    countlist.append(CPAP_UserFlag1);
+    countlist.append(CPAP_UserFlag2);
+    countlist.append(CPAP_PressurePulse);
+
+
+
+    avglist.append(CPAP_Pressure);
+    avglist.append(CPAP_IPAP);
+    avglist.append(CPAP_EPAP);
+
+    p90list.append(CPAP_Pressure);
+    p90list.append(CPAP_IPAP);
+    p90list.append(CPAP_EPAP);
+    EventDataType percent = 0.90F;
+
+    // Not sure this section should be translateable.. :-/
+    if (ui->rb1_details->isChecked()) {
+        header = tr("DateTime") + sep + tr("Session") + sep + tr("Event") + sep + tr("Data/Duration");
+    } else {
+        if (ui->rb1_Summary->isChecked()) {
+            header = tr("Date") + sep + tr("Session Count") + sep + tr("Start") + sep + tr("End") + sep +
+                     tr("Total Time") + sep + tr("AHI");
+        } else if (ui->rb1_Sessions->isChecked()) {
+            header = tr("Date") + sep + tr("Session") + sep + tr("Start") + sep + tr("End") + sep +
+                     tr("Total Time") + sep + tr("AHI");
+        }
+
+        for (int i = 0; i < countlist.size(); i++) {
+            header += sep + schema::channel[countlist[i]].label() + tr(" Count");
+        }
+
+        for (int i = 0; i < avglist.size(); i++) {
+            header += sep + schema::channel[avglist[i]].label() + " " + tr(" Avg");
+        }
+
+        for (int i = 0; i < p90list.size(); i++) {
+            header += sep + schema::channel[p90list[i]].label() + tr(" %1%").arg(percent, 0, 'f', 0);
+        }
+    }
+
+    header += newline;
+    file.write(header.toLatin1());
+    QDate date = ui->startDate->date();
+    Daily *daily = mainwin->getDaily();
+    QDate daily_date = daily->getDate();
+
+    ui->progressBar->setValue(0);
+    ui->progressBar->setMaximum(p_profile->daylist.count());
+
+    do {
+        ui->progressBar->setValue(ui->progressBar->value() + 1);
+        QApplication::processEvents();
+
+        Day *day = p_profile->GetDay(date, MT_CPAP);
+
+        if (day) {
+            QString data;
+
+            if (ui->rb1_Summary->isChecked()) {
+                QDateTime start = QDateTime::fromTime_t(day->first() / 1000L);
+                QDateTime end = QDateTime::fromTime_t(day->last() / 1000L);
+                data = date.toString(Qt::ISODate);
+                data += sep + QString::number(day->size(), 10);
+                data += sep + start.toString(Qt::ISODate);
+                data += sep + end.toString(Qt::ISODate);
+                int time = day->total_time() / 1000L;
+                int h = time / 3600;
+                int m = int(time / 60) % 60;
+                int s = int(time) % 60;
+                data += sep + QString().sprintf("%02i:%02i:%02i", h, m, s);
+                float ahi = day->count(CPAP_Obstructive) + day->count(CPAP_Hypopnea) + day->count(
+                                CPAP_Apnea) + day->count(CPAP_ClearAirway);
+                ahi /= day->hours();
+                data += sep + QString::number(ahi, 'f', 3);
+
+                for (int i = 0; i < countlist.size(); i++) {
+                    data += sep + QString::number(day->count(countlist.at(i)));
+                }
+
+                for (int i = 0; i < avglist.size(); i++) {
+                    data += sep + QString::number(day->wavg(avglist.at(i)));
+                }
+
+                for (int i = 0; i < p90list.size(); i++) {
+                    data += sep + QString::number(day->p90(p90list.at(i)));
+                }
+
+                data += newline;
+                file.write(data.toLatin1());
+
+            } else if (ui->rb1_Sessions->isChecked()) {
+                for (int i = 0; i < day->size(); i++) {
+                    Session *sess = (*day)[i];
+                    QDateTime start = QDateTime::fromTime_t(sess->first() / 1000L);
+                    QDateTime end = QDateTime::fromTime_t(sess->last() / 1000L);
+
+                    data = date.toString(Qt::ISODate);
+                    data += sep + QString::number(sess->session(), 10);
+                    data += sep + start.toString(Qt::ISODate);
+                    data += sep + end.toString(Qt::ISODate);
+                    int time = sess->length() / 1000L;
+                    int h = time / 3600;
+                    int m = int(time / 60) % 60;
+                    int s = int(time) % 60;
+                    data += sep + QString().sprintf("%02i:%02i:%02i", h, m, s);
+
+                    float ahi = sess->count(CPAP_Obstructive) + sess->count(CPAP_Hypopnea) + sess->count(
+                                    CPAP_Apnea) + sess->count(CPAP_ClearAirway);
+                    ahi /= sess->hours();
+                    data += sep + QString::number(ahi, 'f', 3);
+
+                    for (int j = 0; j < countlist.size(); j++) {
+                        data += sep + QString::number(sess->count(countlist.at(j)));
+                    }
+
+                    for (int j = 0; j < avglist.size(); j++) {
+                        data += sep + QString::number(day->wavg(avglist.at(j)));
+                    }
+
+                    for (int j = 0; j < p90list.size(); j++) {
+                        data += sep + QString::number(day->p90(p90list.at(j)));
+                    }
+
+                    data += newline;
+                    file.write(data.toLatin1());
+                }
+            } else if (ui->rb1_details->isChecked()) {
+                QList<ChannelID> all = countlist;
+                all.append(avglist);
+
+                for (int i = 0; i < day->size(); i++) {
+                    Session *sess = (*day)[i];
+                    sess->OpenEvents();
+                    QHash<ChannelID, QVector<EventList *> >::iterator fnd;
+
+                    for (int j = 0; j < all.size(); j++) {
+                        ChannelID key = all.at(j);
+                        fnd = sess->eventlist.find(key);
+
+                        if (fnd != sess->eventlist.end()) {
+                            //header="DateTime"+sep+"Session"+sep+"Event"+sep+"Data/Duration";
+                            for (int e = 0; e < fnd.value().size(); e++) {
+                                EventList *ev = fnd.value()[e];
+
+                                for (quint32 q = 0; q < ev->count(); q++) {
+                                    data = QDateTime::fromTime_t(ev->time(q) / 1000L).toString(Qt::ISODate);
+                                    data += sep + QString::number(sess->session());
+                                    data += sep + schema::channel[key].code();
+                                    data += sep + QString::number(ev->data(q), 'f', 2);
+                                    data += newline;
+                                    file.write(data.toLatin1());
+                                }
+                            }
+                        }
+                    }
+
+                    if (daily_date != date) {
+                        sess->TrashEvents();
+                    }
+                }
+            }
+        }
+
+        date = date.addDays(1);
+    } while (date <= ui->endDate->date());
+
+    file.close();
+    ExportCSV::accept();
+}
+
+
+void ExportCSV::UpdateCalendarDay(QDateEdit *dateedit, QDate date)
+{
+    QCalendarWidget *calendar = dateedit->calendarWidget();
+    QTextCharFormat bold;
+    QTextCharFormat cpapcol;
+    QTextCharFormat normal;
+    QTextCharFormat oxiday;
+    bold.setFontWeight(QFont::Bold);
+    cpapcol.setForeground(QBrush(Qt::blue, Qt::SolidPattern));
+    cpapcol.setFontWeight(QFont::Bold);
+    oxiday.setForeground(QBrush(Qt::red, Qt::SolidPattern));
+    oxiday.setFontWeight(QFont::Bold);
+    bool hascpap = p_profile->GetDay(date, MT_CPAP) != nullptr;
+    bool hasoxi = p_profile->GetDay(date, MT_OXIMETER) != nullptr;
+    //bool hasjournal=p_profile->GetDay(date,MT_JOURNAL)!=nullptr;
+
+    if (hascpap) {
+        if (hasoxi) {
+            calendar->setDateTextFormat(date, oxiday);
+        } else {
+            calendar->setDateTextFormat(date, cpapcol);
+        }
+    } else if (p_profile->GetDay(date)) {
+        calendar->setDateTextFormat(date, bold);
+    } else {
+        calendar->setDateTextFormat(date, normal);
+    }
+
+    calendar->setHorizontalHeaderFormat(QCalendarWidget::ShortDayNames);
+}
+void ExportCSV::startDate_currentPageChanged(int year, int month)
+{
+    QDate d(year, month, 1);
+    int dom = d.daysInMonth();
+
+    for (int i = 1; i <= dom; i++) {
+        d = QDate(year, month, i);
+        UpdateCalendarDay(ui->startDate, d);
+    }
+}
+void ExportCSV::endDate_currentPageChanged(int year, int month)
+{
+    QDate d(year, month, 1);
+    int dom = d.daysInMonth();
+
+    for (int i = 1; i <= dom; i++) {
+        d = QDate(year, month, i);
+        UpdateCalendarDay(ui->endDate, d);
+    }
+}
diff --git a/sleepyhead/exportcsv.h b/sleepyhead/exportcsv.h
new file mode 100644
index 0000000..dc9737f
--- /dev/null
+++ b/sleepyhead/exportcsv.h
@@ -0,0 +1,61 @@
+/* ExportCSV Module Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef EXPORTCSV_H
+#define EXPORTCSV_H
+
+#include <QDateEdit>
+#include <QDialog>
+#include "SleepLib/machine_common.h"
+
+namespace Ui {
+class ExportCSV;
+}
+
+
+struct DumpField {
+    DumpField() { code = NoChannel; mtype = MT_UNKNOWN; type = ST_CNT; }
+    DumpField(ChannelID c, MachineType mt, SummaryType t) { code = c; mtype = mt; type = t; }
+    DumpField(const DumpField &copy) {code = copy.code; mtype = copy.mtype; type = copy.type; }
+    ChannelID code;
+    MachineType mtype;
+    SummaryType type;
+};
+
+
+/*! \class ExportCSV
+    \brief Dialog for exporting SleepLib data in CSV Format
+    This module still needs a lot of work
+    */
+class ExportCSV : public QDialog
+{
+    Q_OBJECT
+
+  public:
+    explicit ExportCSV(QWidget *parent = 0);
+    ~ExportCSV();
+
+  private slots:
+    void on_filenameBrowseButton_clicked();
+
+    void on_quickRangeCombo_activated(const QString &arg1);
+
+    void on_exportButton_clicked();
+
+    void startDate_currentPageChanged(int year, int month);
+    void endDate_currentPageChanged(int year, int month);
+
+
+  private:
+    void UpdateCalendarDay(QDateEdit *dateedit, QDate date);
+
+    Ui::ExportCSV *ui;
+    QList<DumpField> fields;
+};
+
+#endif // EXPORTCSV_H
diff --git a/sleepyhead/exportcsv.ui b/sleepyhead/exportcsv.ui
new file mode 100644
index 0000000..6969e36
--- /dev/null
+++ b/sleepyhead/exportcsv.ui
@@ -0,0 +1,297 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ExportCSV</class>
+ <widget class="QDialog" name="ExportCSV">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>521</width>
+    <height>254</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Export as CSV</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="Resources.qrc">
+    <normaloff>:/icons/save.png</normaloff>:/icons/save.png</iconset>
+  </property>
+  <layout class="QFormLayout" name="formLayout">
+   <item row="3" column="0">
+    <widget class="QLabel" name="label_6">
+     <property name="text">
+      <string>Dates:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="6" column="0">
+    <widget class="QLabel" name="label_4">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Resolution:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="6" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_4">
+     <item>
+      <widget class="QRadioButton" name="rb1_details">
+       <property name="text">
+        <string>Details</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QRadioButton" name="rb1_Sessions">
+       <property name="text">
+        <string>Sessions</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QRadioButton" name="rb1_Summary">
+       <property name="text">
+        <string>Daily</string>
+       </property>
+       <property name="checked">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer_3">
+       <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="8" column="0">
+    <widget class="QLabel" name="label_5">
+     <property name="text">
+      <string>Filename:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="12" column="0" colspan="2">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <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="QPushButton" name="cancelButton">
+       <property name="text">
+        <string>Cancel</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="exportButton">
+       <property name="text">
+        <string>Export</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="3" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <item>
+      <widget class="QLabel" name="startLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>Start:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QDateEdit" name="startDate">
+       <property name="currentSection">
+        <enum>QDateTimeEdit::DaySection</enum>
+       </property>
+       <property name="calendarPopup">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QLabel" name="endLabel">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>End:</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QDateEdit" name="endDate">
+       <property name="currentSection">
+        <enum>QDateTimeEdit::DaySection</enum>
+       </property>
+       <property name="calendarPopup">
+        <bool>true</bool>
+       </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>
+    </layout>
+   </item>
+   <item row="0" column="0">
+    <widget class="QLabel" name="label_3">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Quick Range:</string>
+     </property>
+    </widget>
+   </item>
+   <item row="0" column="1">
+    <widget class="QComboBox" name="quickRangeCombo">
+     <item>
+      <property name="text">
+       <string>Most Recent Day</string>
+      </property>
+     </item>
+     <item>
+      <property name="text">
+       <string>Last Week</string>
+      </property>
+     </item>
+     <item>
+      <property name="text">
+       <string>Last Fortnight</string>
+      </property>
+     </item>
+     <item>
+      <property name="text">
+       <string>Last Month</string>
+      </property>
+     </item>
+     <item>
+      <property name="text">
+       <string>Last 6 Months</string>
+      </property>
+     </item>
+     <item>
+      <property name="text">
+       <string>Last Year</string>
+      </property>
+     </item>
+     <item>
+      <property name="text">
+       <string>Everything</string>
+      </property>
+     </item>
+     <item>
+      <property name="text">
+       <string>Custom</string>
+      </property>
+     </item>
+    </widget>
+   </item>
+   <item row="8" column="1">
+    <layout class="QHBoxLayout" name="horizontalLayout_5">
+     <item>
+      <widget class="QLineEdit" name="filenameEdit"/>
+     </item>
+     <item>
+      <widget class="QToolButton" name="filenameBrowseButton">
+       <property name="text">
+        <string>...</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="10" 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="11" column="0" colspan="2">
+    <widget class="QProgressBar" name="progressBar">
+     <property name="value">
+      <number>0</number>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>cancelButton</sender>
+   <signal>clicked()</signal>
+   <receiver>ExportCSV</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>377</x>
+     <y>230</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>260</x>
+     <y>126</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/sleepyhead/fonts/FreeSans.ttf b/sleepyhead/fonts/FreeSans.ttf
new file mode 100644
index 0000000..a231246
Binary files /dev/null and b/sleepyhead/fonts/FreeSans.ttf differ
diff --git a/sleepyhead/icons/Jedimark.png b/sleepyhead/icons/Jedimark.png
new file mode 100644
index 0000000..c56c089
Binary files /dev/null and b/sleepyhead/icons/Jedimark.png differ
diff --git a/sleepyhead/icons/README.txt b/sleepyhead/icons/README.txt
new file mode 100644
index 0000000..6f74722
--- /dev/null
+++ b/sleepyhead/icons/README.txt
@@ -0,0 +1,6 @@
+These icons are pinched from my ubuntu box.. They need replacing..
+
+Appologies to anyone if these are used in error, contact me and I will correct immediately..
+
+jedimark(at)users.sourceforge.net
+
diff --git a/sleepyhead/icons/arrow-end.png b/sleepyhead/icons/arrow-end.png
new file mode 100644
index 0000000..3dae415
Binary files /dev/null and b/sleepyhead/icons/arrow-end.png differ
diff --git a/sleepyhead/icons/arrow-left.png b/sleepyhead/icons/arrow-left.png
new file mode 100644
index 0000000..fb8a7b6
Binary files /dev/null and b/sleepyhead/icons/arrow-left.png differ
diff --git a/sleepyhead/icons/arrow-right.png b/sleepyhead/icons/arrow-right.png
new file mode 100644
index 0000000..fb6e71f
Binary files /dev/null and b/sleepyhead/icons/arrow-right.png differ
diff --git a/sleepyhead/icons/back.png b/sleepyhead/icons/back.png
new file mode 100644
index 0000000..3b18c04
Binary files /dev/null and b/sleepyhead/icons/back.png differ
diff --git a/sleepyhead/icons/bob-v3.0.ico b/sleepyhead/icons/bob-v3.0.ico
new file mode 100644
index 0000000..67429eb
Binary files /dev/null and b/sleepyhead/icons/bob-v3.0.ico differ
diff --git a/sleepyhead/icons/bob-v3.0.png b/sleepyhead/icons/bob-v3.0.png
new file mode 100644
index 0000000..17dc402
Binary files /dev/null and b/sleepyhead/icons/bob-v3.0.png differ
diff --git a/sleepyhead/icons/bookmark.png b/sleepyhead/icons/bookmark.png
new file mode 100644
index 0000000..8233f82
Binary files /dev/null and b/sleepyhead/icons/bookmark.png differ
diff --git a/sleepyhead/icons/cms50f.png b/sleepyhead/icons/cms50f.png
new file mode 100644
index 0000000..5cc622b
Binary files /dev/null and b/sleepyhead/icons/cms50f.png differ
diff --git a/sleepyhead/icons/cubeoximeter.png b/sleepyhead/icons/cubeoximeter.png
new file mode 100644
index 0000000..c83018d
Binary files /dev/null and b/sleepyhead/icons/cubeoximeter.png differ
diff --git a/sleepyhead/icons/edit-find.png b/sleepyhead/icons/edit-find.png
new file mode 100644
index 0000000..385c673
Binary files /dev/null and b/sleepyhead/icons/edit-find.png differ
diff --git a/sleepyhead/icons/eye.png b/sleepyhead/icons/eye.png
new file mode 100644
index 0000000..6871a2d
Binary files /dev/null and b/sleepyhead/icons/eye.png differ
diff --git a/sleepyhead/icons/forward.png b/sleepyhead/icons/forward.png
new file mode 100644
index 0000000..9ed8737
Binary files /dev/null and b/sleepyhead/icons/forward.png differ
diff --git a/sleepyhead/icons/go-home.png b/sleepyhead/icons/go-home.png
new file mode 100644
index 0000000..a14a2e6
Binary files /dev/null and b/sleepyhead/icons/go-home.png differ
diff --git a/sleepyhead/icons/help.png b/sleepyhead/icons/help.png
new file mode 100644
index 0000000..4ce1ae1
Binary files /dev/null and b/sleepyhead/icons/help.png differ
diff --git a/sleepyhead/icons/iconfile.icns b/sleepyhead/icons/iconfile.icns
new file mode 100644
index 0000000..4addd96
Binary files /dev/null and b/sleepyhead/icons/iconfile.icns differ
diff --git a/sleepyhead/icons/intellipap.png b/sleepyhead/icons/intellipap.png
new file mode 100644
index 0000000..c613b20
Binary files /dev/null and b/sleepyhead/icons/intellipap.png differ
diff --git a/sleepyhead/icons/last.png b/sleepyhead/icons/last.png
new file mode 100644
index 0000000..45cfca2
Binary files /dev/null and b/sleepyhead/icons/last.png differ
diff --git a/sleepyhead/icons/mask.png b/sleepyhead/icons/mask.png
new file mode 100644
index 0000000..276fcd2
Binary files /dev/null and b/sleepyhead/icons/mask.png differ
diff --git a/sleepyhead/icons/moon.png b/sleepyhead/icons/moon.png
new file mode 100644
index 0000000..c391d07
Binary files /dev/null and b/sleepyhead/icons/moon.png differ
diff --git a/sleepyhead/icons/overview.png b/sleepyhead/icons/overview.png
new file mode 100644
index 0000000..aeda72a
Binary files /dev/null and b/sleepyhead/icons/overview.png differ
diff --git a/sleepyhead/icons/oximeter.png b/sleepyhead/icons/oximeter.png
new file mode 100644
index 0000000..a11a255
Binary files /dev/null and b/sleepyhead/icons/oximeter.png differ
diff --git a/sleepyhead/icons/preferences.png b/sleepyhead/icons/preferences.png
new file mode 100644
index 0000000..586a52b
Binary files /dev/null and b/sleepyhead/icons/preferences.png differ
diff --git a/sleepyhead/icons/prs1.png b/sleepyhead/icons/prs1.png
new file mode 100644
index 0000000..11c741a
Binary files /dev/null and b/sleepyhead/icons/prs1.png differ
diff --git a/sleepyhead/icons/prs1_60s.png b/sleepyhead/icons/prs1_60s.png
new file mode 100644
index 0000000..88274ae
Binary files /dev/null and b/sleepyhead/icons/prs1_60s.png differ
diff --git a/sleepyhead/icons/pushpin.png b/sleepyhead/icons/pushpin.png
new file mode 100644
index 0000000..623ab1a
Binary files /dev/null and b/sleepyhead/icons/pushpin.png differ
diff --git a/sleepyhead/icons/refresh.png b/sleepyhead/icons/refresh.png
new file mode 100644
index 0000000..e12dd6f
Binary files /dev/null and b/sleepyhead/icons/refresh.png differ
diff --git a/sleepyhead/icons/rms9.png b/sleepyhead/icons/rms9.png
new file mode 100644
index 0000000..bfd31f5
Binary files /dev/null and b/sleepyhead/icons/rms9.png differ
diff --git a/sleepyhead/icons/sadface.png b/sleepyhead/icons/sadface.png
new file mode 100644
index 0000000..1989bc7
Binary files /dev/null and b/sleepyhead/icons/sadface.png differ
diff --git a/sleepyhead/icons/save.png b/sleepyhead/icons/save.png
new file mode 100644
index 0000000..6aa6b13
Binary files /dev/null and b/sleepyhead/icons/save.png differ
diff --git a/sleepyhead/icons/sdcard-lock.png b/sleepyhead/icons/sdcard-lock.png
new file mode 100644
index 0000000..cb6f906
Binary files /dev/null and b/sleepyhead/icons/sdcard-lock.png differ
diff --git a/sleepyhead/icons/sdcard.png b/sleepyhead/icons/sdcard.png
new file mode 100644
index 0000000..bc99f11
Binary files /dev/null and b/sleepyhead/icons/sdcard.png differ
diff --git a/sleepyhead/icons/session-off.png b/sleepyhead/icons/session-off.png
new file mode 100644
index 0000000..106c76e
Binary files /dev/null and b/sleepyhead/icons/session-off.png differ
diff --git a/sleepyhead/icons/session-on.png b/sleepyhead/icons/session-on.png
new file mode 100644
index 0000000..9e34a13
Binary files /dev/null and b/sleepyhead/icons/session-on.png differ
diff --git a/sleepyhead/icons/smileyface.png b/sleepyhead/icons/smileyface.png
new file mode 100644
index 0000000..b07a867
Binary files /dev/null and b/sleepyhead/icons/smileyface.png differ
diff --git a/sleepyhead/icons/statistics.png b/sleepyhead/icons/statistics.png
new file mode 100644
index 0000000..fc6cfa1
Binary files /dev/null and b/sleepyhead/icons/statistics.png differ
diff --git a/sleepyhead/icons/svg/applications-viewers.svg b/sleepyhead/icons/svg/applications-viewers.svg
new file mode 100644
index 0000000..1e80301
--- /dev/null
+++ b/sleepyhead/icons/svg/applications-viewers.svg
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg4456" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs id="defs4458">
+  <linearGradient id="linearGradient3167" y2="24.628" gradientUnits="userSpaceOnUse" x2="20.055" gradientTransform="matrix(.95782 0 0 1.0183 1.0122 1.9221)" y1="15.298" x1="16.626">
+   <stop id="stop2687-1-9-0-2" style="stop-color:#fff" offset="0"/>
+   <stop id="stop2689-5-4-3-1" style="stop-color:#fff;stop-opacity:0" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient3164" y2="44" gradientUnits="userSpaceOnUse" x2="16.143" gradientTransform="matrix(.89749 0 0 .69236 2.4796 9.3834)" y1="4" x1="16.143">
+   <stop id="stop2225-6-4-7-2" style="stop-color:#fff" offset="0"/>
+   <stop id="stop2229-2-5-5-8" style="stop-color:#fff;stop-opacity:0" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient3178" y2="47.279" gradientUnits="userSpaceOnUse" x2="12.213" gradientTransform="matrix(.95464 0 0 .89653 1.0875 5.3852)" y1="2.9165" x1="12.579">
+   <stop id="stop2240-1-6-7-0" style="stop-color:#fff" offset="0"/>
+   <stop id="stop2242-7-3-7-2" style="stop-color:#fff;stop-opacity:0" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient3181" y2="33.296" gradientUnits="userSpaceOnUse" x2="23.071" gradientTransform="matrix(.99105 0 0 1.0115 .22050 5.8121)" y1="36.047" x1="23.071">
+   <stop id="stop2225-6-4-7" style="stop-color:#fff" offset="0"/>
+   <stop id="stop2229-2-5-5" style="stop-color:#fff;stop-opacity:0" offset="1"/>
+  </linearGradient>
+  <radialGradient id="radialGradient3528" gradientUnits="userSpaceOnUse" cy="8.4498" cx="7.4957" gradientTransform="matrix(0 1.7102 -2.9205 -7.2164e-8 48.678 -.88704)" r="20">
+   <stop id="stop3790-0-0-9" style="stop-color:#4a5653" offset="0"/>
+   <stop id="stop3792-0-2-3" style="stop-color:#141414" offset="1"/>
+  </radialGradient>
+  <linearGradient id="linearGradient3530" y2="44" gradientUnits="userSpaceOnUse" x2="16.143" gradientTransform="matrix(.94877 0 0 .74364 1.2295 8.1525)" y1="4" x1="16.143">
+   <stop id="stop3796-3-0-0" style="stop-color:#323232" offset="0"/>
+   <stop id="stop3798-8-6-5" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient3189" y2="43.865" gradientUnits="userSpaceOnUse" x2="24" gradientTransform="translate(-3.5243988e-6,-6.6e-6)" y1="7.96" x1="24">
+   <stop id="stop4324-9-7" style="stop-color:#f0f0f0" offset="0"/>
+   <stop id="stop2860-4-4" style="stop-color:#d7d7d8" offset=".085525"/>
+   <stop id="stop2862-5-9" style="stop-color:#b2b2b3" offset=".92166"/>
+   <stop id="stop4326-1-1" style="stop-color:#979798" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient3191" y2="2.8765" gradientUnits="userSpaceOnUse" x2="10.014" gradientTransform="matrix(.95745 0 0 .90347 1.0212 4.3056)" y1="44.96" x1="10.014">
+   <stop id="stop4334-7-6" style="stop-color:#595959" offset="0"/>
+   <stop id="stop4336-8-0" style="stop-color:#b3b3b3" offset="1"/>
+  </linearGradient>
+  <radialGradient id="radialGradient3194" xlink:href="#linearGradient5060-6-6-5" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(-.065587 0 0 .024706 47.692 31.942)" r="117.14"/>
+  <linearGradient id="linearGradient5060-6-6-5">
+   <stop id="stop5062-3-0-3" offset="0"/>
+   <stop id="stop5064-1-4-9" style="stop-opacity:0" offset="1"/>
+  </linearGradient>
+  <radialGradient id="radialGradient3197" xlink:href="#linearGradient5060-6-6-5" gradientUnits="userSpaceOnUse" cy="486.65" cx="605.71" gradientTransform="matrix(.065587 0 0 .024706 .30779 31.942)" r="117.14"/>
+  <linearGradient id="linearGradient4454" y2="609.51" gradientUnits="userSpaceOnUse" x2="302.86" gradientTransform="matrix(.065587 0 0 .024706 .29488 31.942)" y1="366.65" x1="302.86">
+   <stop id="stop5050-5-6-4" style="stop-opacity:0" offset="0"/>
+   <stop id="stop5056-9-0-1" offset=".5"/>
+   <stop id="stop5052-6-9-5" style="stop-opacity:0" offset="1"/>
+  </linearGradient>
+ </defs>
+ <g id="layer1">
+  <rect id="rect2512-9-5" style="opacity:.40206;fill:url(#linearGradient4454)" height="6" width="31.669" y="41" x="8.1654"/>
+  <path id="path2514-7-4" style="opacity:.40206;fill:url(#radialGradient3197)" d="m39.835 41v5.9997c3.377 0.011 8.165-1.344 8.165-3s-3.769-3-8.165-3z"/>
+  <path id="path2516-8-9" style="opacity:.40206;fill:url(#radialGradient3194)" d="m8.1654 41v5.9997c-3.3776 0.011-8.1654-1.344-8.1654-3s3.7691-3 8.1654-3z"/>
+  <rect id="rect2551-5-8" style="stroke-linejoin:round;fill-rule:evenodd;stroke:url(#linearGradient3191);stroke-linecap:round;stroke-width:1.0021;fill:url(#linearGradient3189)" rx="1.4989" ry="1.4989" height="36.998" width="44.998" y="7.5011" x="1.5011"/>
+  <rect id="rect1314-3-3-1" style="stroke-linejoin:round;color:#000000;stroke:url(#linearGradient3530);stroke-linecap:round;fill:url(#radialGradient3528)" rx="0" ry="0" height="29" width="37" y="11.5" x="5.5"/>
+  <rect id="rect2221-3-8" style="opacity:.4;stroke-linejoin:round;stroke:url(#linearGradient3181);stroke-linecap:round;stroke-width:1.0021;fill:none" rx="0" ry="0" height="30.998" width="38.998" y="10.501" x="4.5011"/>
+  <rect id="rect2556-8-5" style="opacity:.8;stroke-linejoin:round;stroke:url(#linearGradient3178);stroke-linecap:round;stroke-width:1.0037;fill:none" rx=".49813" ry=".49813" height="34.996" width="42.996" y="8.5019" x="2.5019"/>
+  <rect id="rect1314-3-3-9" style="opacity:.1;stroke-linejoin:round;color:#000000;stroke:url(#linearGradient3164);stroke-linecap:round;fill:none" rx="0" ry="0" height="27" width="35" y="12.5" x="6.5193"/>
+  <path id="path2233" style="opacity:.1;stroke-width:1px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m6.5 13.5h35"/>
+  <path id="path2235" style="opacity:.1;stroke-width:1px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m6.5 17.5h35"/>
+  <path id="path2237" style="opacity:.1;stroke-width:1px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m6.5 21.5h35"/>
+  <path id="path2239" style="opacity:.1;stroke-width:1px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m6.5 25.5h35"/>
+  <path id="path2241" style="opacity:.1;stroke-width:1px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m6.5 29.5h35"/>
+  <path id="path2243" style="opacity:.1;stroke-width:1px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m6.5 33.5h35"/>
+  <path id="path2245" style="opacity:.1;stroke-width:1px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m6.5 37.5h35"/>
+  <path id="path2239-3" style="opacity:.1;stroke-width:.87930px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m9.5118 39.535v-27.061"/>
+  <path id="path2239-3-7" style="opacity:.1;stroke-width:.87930px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m14.512 39.517v-27.061"/>
+  <path id="path2239-3-7-3" style="opacity:.1;stroke-width:.87930px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m19.509 39.542v-27.061"/>
+  <path id="path2239-3-2" style="opacity:.1;stroke-width:.87930px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m24.483 39.517v-27.061"/>
+  <path id="path2239-3-7-6" style="opacity:.1;stroke-width:.87930px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m29.483 39.499v-27.061"/>
+  <path id="path2239-3-7-3-5" style="opacity:.1;stroke-width:.87930px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m34.48 39.524v-27.061"/>
+  <path id="path2239-3-7-3-5-2" style="opacity:.1;stroke-width:.87930px;stroke:#b9ffeb;stroke-linecap:square;fill:none" d="m39.485 39.509v-27.061"/>
+  <path id="rect4271" style="fill:#91ffe0" d="m23.907 18c-9.519 0-13.907 7.969-13.907 7.969 0.1272 0 2.8116 8.0733 13.784 8.0313 11.169-0.043 14.216-8.031 14.216-8.031s-4.573-7.969-14.093-7.969zm2.3744 1.8823c6.4058 0.91353 9.0352 6.0235 9.0352 6.0235s-1.3565 5.0038-8.3568 6.0862c2.1125-1.0445 3.5976-3.1723 3.7004-5.647l-1.5418-0.09412c-0.12326 2.7716-2.3663 4.9882-5.1498 4.9882-2.8627 0-5.1806-2.3264-5.1806-5.2078 0-2.7013 2.0118-4.9406 4.6256-5.2078 0.17425-0.01782 0.37614 0 0.55507 0  [...]
+  <path id="path3333-3-0" style="opacity:.2;fill:url(#linearGradient3167);fill-rule:evenodd" d="m4.0952 8c-1.1573 0-2.0952 0.99713-2.0952 2.2275v16.293c0.003 0.13706 0.0592 0.26668 0.15589 0.35738 0.0967 0.0907 0.2247 0.1342 0.35295 0.11994l43.102-7.256c0.22172-0.03717 0.38602-0.23872 0.38912-0.47732v-9.0373c0-1.2304-0.93792-2.2275-2.0952-2.2275h-39.81z"/>
+  <path id="path3568" style="opacity:0.16;fill:#91ffe0" d="m23.906 17c-10.07 0-14.781 8.5-14.781 8.5a0.98787 0.98787 0 0 0 0.03125 1c0.00303 0.0061 0.027224 0.02295 0.03125 0.03125 0.022816 0.04703 0.045926 0.12005 0.09375 0.21875 0.11253 0.23223 0.29409 0.56182 0.53125 0.96875 0.47432 0.81385 1.2058 1.9173 2.3125 3 2.2135 2.1653 5.9274 4.3032 11.656 4.2812 5.8198-0.02215 9.6552-2.1662 11.969-4.3125 2.3136-2.1463 3.1875-4.375 3.1875-4.375a0.98787 0.98787 0 0 0 -0.09375 -0.84375s-4.8672-8 [...]
+  <path id="path3568-1" style="opacity:0.07;fill:#91ffe0" d="m23.906 15.938c-10.668 0-15.719 9.0312-15.719 9.0312a2.059 2.059 0 0 0 0.0318 2.031c0.0005428 0.0021-0.00402 0.0035 0.03125 0.0625 0.021114 0.04406 0.025134 0.07914 0.0625 0.15625 0.1186 0.24476 0.30713 0.62433 0.5625 1.0625 0.51074 0.87634 1.3089 2.0223 2.5 3.1875 2.3822 2.3304 6.4144 4.6167 12.406 4.5938 6.0747-0.02313 10.206-2.2914 12.688-4.5938 2.4817-2.3023 3.4688-4.7812 3.4688-4.7812a2.059 2.059 0 0 0 -0.15625 -1.75s-5.20 [...]
+ </g>
+</svg>
diff --git a/sleepyhead/icons/svg/back.svg b/sleepyhead/icons/svg/back.svg
new file mode 100644
index 0000000..d5381de
--- /dev/null
+++ b/sleepyhead/icons/svg/back.svg
@@ -0,0 +1,854 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="go-previous.svg"
+   sodipodi:docbase="/home/andreas/projekt/tango/scalable"
+   inkscape:version="0.46"
+   sodipodi:version="0.32"
+   id="svg11300"
+   height="48px"
+   width="48px"
+   inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-ydpi="90.000000"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective128" />
+    <linearGradient
+       id="linearGradient2591">
+      <stop
+         style="stop-color:#73d216"
+         offset="0"
+         id="stop2593" />
+      <stop
+         style="stop-color:#4e9a06"
+         offset="1.0000000"
+         id="stop2595" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient10314">
+      <stop
+         style="stop-color:#7ea5d6;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop10316" />
+      <stop
+         style="stop-color:#467ec5;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop10318" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8938">
+      <stop
+         id="stop8940"
+         offset="0.0000000"
+         style="stop-color:#fdc674;stop-opacity:1.0000000;" />
+      <stop
+         id="stop8942"
+         offset="1.0000000"
+         style="stop-color:#d88103;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8662"
+       inkscape:collect="always">
+      <stop
+         id="stop8664"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop8666"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8650"
+       inkscape:collect="always">
+      <stop
+         id="stop8652"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop8654"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7636"
+       inkscape:collect="always">
+      <stop
+         id="stop7638"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop7640"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7614">
+      <stop
+         id="stop7616"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.21590909"
+         id="stop7649" />
+      <stop
+         style="stop-color:#838383;stop-opacity:1.0000000;"
+         offset="0.50000000"
+         id="stop7632" />
+      <stop
+         id="stop7618"
+         offset="1"
+         style="stop-color:#838383;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7608">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop7610" />
+      <stop
+         id="stop7622"
+         offset="0.46022728"
+         style="stop-color:#e3e3e3;stop-opacity:1.0000000;" />
+      <stop
+         style="stop-color:#dadada;stop-opacity:0.67058824;"
+         offset="0.61970556"
+         id="stop7624" />
+      <stop
+         style="stop-color:#d1d1d1;stop-opacity:0.34285715;"
+         offset="1.0000000"
+         id="stop7612" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7602">
+      <stop
+         id="stop7604"
+         offset="0.0000000"
+         style="stop-color:#f6f6f6;stop-opacity:1.0000000;" />
+      <stop
+         id="stop7606"
+         offset="1.0000000"
+         style="stop-color:#e0e0e0;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7586">
+      <stop
+         id="stop7588"
+         offset="0.0000000"
+         style="stop-color:#525252;stop-opacity:1.0000000;" />
+      <stop
+         id="stop7590"
+         offset="1.0000000"
+         style="stop-color:#000000;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12836">
+      <stop
+         style="stop-color:#515152;stop-opacity:1;"
+         offset="0"
+         id="stop12838" />
+      <stop
+         style="stop-color:#515152;stop-opacity:0;"
+         offset="1"
+         id="stop12840" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient12828">
+      <stop
+         style="stop-color:#cccccd;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop12830" />
+      <stop
+         id="stop12862"
+         offset="0.0000000"
+         style="stop-color:#adadae;stop-opacity:1.0000000;" />
+      <stop
+         style="stop-color:#8f8f90;stop-opacity:0.0000000;"
+         offset="1.0000000"
+         id="stop12832" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient12810">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop12812" />
+      <stop
+         style="stop-color:#e5e5e5;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop12814" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient11625">
+      <stop
+         style="stop-color:#fce94f;stop-opacity:1;"
+         offset="0"
+         id="stop11627" />
+      <stop
+         style="stop-color:#fce94f;stop-opacity:0;"
+         offset="1"
+         id="stop11629" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient11615">
+      <stop
+         style="stop-color:#636363;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop11617" />
+      <stop
+         style="stop-color:#000000;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop11619" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient11602">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop11604" />
+      <stop
+         style="stop-color:#c5c5c5;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop11606" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient11594">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop11596" />
+      <stop
+         style="stop-color:#d1d1d1;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop11598" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient11520">
+      <stop
+         style="stop-color:#fbfbfb;stop-opacity:1.0000000;"
+         offset="0.0000000"
+         id="stop11522" />
+      <stop
+         style="stop-color:#dcdcdc;stop-opacity:1.0000000;"
+         offset="1.0000000"
+         id="stop11524" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient11508">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop11510" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop11512" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient11494">
+      <stop
+         style="stop-color:#ef2929;stop-opacity:1;"
+         offset="0"
+         id="stop11496" />
+      <stop
+         style="stop-color:#ef2929;stop-opacity:0;"
+         offset="1"
+         id="stop11498" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient11415">
+      <stop
+         style="stop-color:#204a87;stop-opacity:0.0000000;"
+         offset="0.0000000"
+         id="stop11417" />
+      <stop
+         id="stop11423"
+         offset="0.50000000"
+         style="stop-color:#204a87;stop-opacity:1.0000000;" />
+      <stop
+         style="stop-color:#204a87;stop-opacity:0;"
+         offset="1"
+         id="stop11419" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient11399">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop11401" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop11403" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11415"
+       id="linearGradient11425"
+       gradientUnits="userSpaceOnUse"
+       x1="15.828360"
+       y1="3.7744560"
+       x2="43.615788"
+       y2="34.462429"
+       gradientTransform="translate(-60.28571,-0.285714)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11415"
+       id="linearGradient11427"
+       gradientUnits="userSpaceOnUse"
+       x1="9.6957054"
+       y1="9.3458843"
+       x2="35.679932"
+       y2="39.033859"
+       gradientTransform="translate(-60.57143,0.000000)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11415"
+       id="linearGradient11439"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(-60.85714,0.428571)"
+       x1="13.267134"
+       y1="19.774456"
+       x2="26.758644"
+       y2="33.462429" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11399"
+       id="radialGradient11441"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.487395,0.000000,20.06483)"
+       cx="12.071428"
+       cy="39.142857"
+       fx="12.071428"
+       fy="39.142857"
+       r="8.5000000" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11494"
+       id="radialGradient11500"
+       cx="27.577173"
+       cy="15.048258"
+       fx="27.577173"
+       fy="15.048258"
+       r="3.8335034"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.243453,2.106784e-16,-2.106784e-16,1.243453,-6.713754,-3.742847)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11494"
+       id="radialGradient11504"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.243453,2.106784e-16,-2.106784e-16,1.243453,-6.713754,-3.742847)"
+       cx="27.577173"
+       cy="16.049133"
+       fx="27.577173"
+       fy="16.049133"
+       r="3.8335034" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11508"
+       id="radialGradient11514"
+       cx="30.203562"
+       cy="44.565483"
+       fx="30.203562"
+       fy="44.565483"
+       r="6.5659914"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,2.166583e-14,29.48178)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11520"
+       id="radialGradient11526"
+       cx="24.445690"
+       cy="35.878170"
+       fx="24.445690"
+       fy="35.878170"
+       r="20.530962"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.995058,-1.535926e-32,0.000000,1.855412,24.94925,-30.20430)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11508"
+       id="radialGradient11532"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.338462,-5.348412e-14,29.48178)"
+       cx="30.203562"
+       cy="44.565483"
+       fx="30.203562"
+       fy="44.565483"
+       r="6.5659914" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11594"
+       id="linearGradient11600"
+       x1="20.092352"
+       y1="8.9471626"
+       x2="31.799011"
+       y2="38.947163"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.045319,0.000000,0.000000,0.957884,48.16627,1.415543)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11520"
+       id="linearGradient11608"
+       x1="24.445671"
+       y1="0.49847093"
+       x2="24.445671"
+       y2="39.447163"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.984324,0.000000,0.000000,0.957884,49.65734,1.415543)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11615"
+       id="radialGradient11621"
+       cx="25.000000"
+       cy="27.749998"
+       fx="25.000000"
+       fy="27.749998"
+       r="4.7500000"
+       gradientTransform="matrix(3.570338,3.171097e-15,-4.005596e-15,4.509900,-64.25843,-94.25499)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient11631"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient11635"
+       gradientUnits="userSpaceOnUse"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000"
+       gradientTransform="translate(2.000000,0.000000)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient11639"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4.000000,0.000000)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient11643"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(6.000000,0.000000)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient11647"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(8.000000,0.000000)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient11655"
+       gradientUnits="userSpaceOnUse"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient11657"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(2.000000,0.000000)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient11659"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4.000000,0.000000)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient11661"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(6.000000,0.000000)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12810"
+       id="linearGradient12816"
+       x1="65.623963"
+       y1="21.459777"
+       x2="87.528968"
+       y2="21.459777"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12810"
+       id="linearGradient12818"
+       gradientUnits="userSpaceOnUse"
+       x1="84.998962"
+       y1="25.209778"
+       x2="62.591469"
+       y2="12.022278" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12828"
+       id="radialGradient12834"
+       cx="88.593018"
+       cy="33.398670"
+       fx="88.593018"
+       fy="33.398670"
+       r="7.0056136"
+       gradientTransform="matrix(0.969219,0.227988,-0.194668,0.827570,9.443870,-15.99848)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12836"
+       id="linearGradient12842"
+       x1="88.750000"
+       y1="31.656250"
+       x2="92.062500"
+       y2="36.656250"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12810"
+       id="linearGradient12878"
+       gradientUnits="userSpaceOnUse"
+       x1="65.623963"
+       y1="21.459777"
+       x2="87.528968"
+       y2="21.459777" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12836"
+       id="linearGradient12880"
+       gradientUnits="userSpaceOnUse"
+       x1="88.750000"
+       y1="31.656250"
+       x2="92.062500"
+       y2="36.656250" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12828"
+       id="radialGradient12882"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.969219,0.227988,-0.194668,0.827570,9.443870,-15.99848)"
+       cx="88.593018"
+       cy="33.398670"
+       fx="88.593018"
+       fy="33.398670"
+       r="7.0056136" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12810"
+       id="linearGradient12884"
+       gradientUnits="userSpaceOnUse"
+       x1="84.998962"
+       y1="25.209778"
+       x2="62.591469"
+       y2="12.022278" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11615"
+       id="radialGradient12894"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.570338,3.171097e-15,-4.005596e-15,4.509900,-64.25843,-94.25499)"
+       cx="25.000000"
+       cy="27.749998"
+       fx="25.000000"
+       fy="27.749998"
+       r="4.7500000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient12896"
+       gradientUnits="userSpaceOnUse"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000"
+       gradientTransform="translate(7.267442e-2,-0.181686)" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient12898"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(2.072674,-0.181686)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient12900"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4.072674,-0.181686)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient12902"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(6.000000,0.000000)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient12911"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(7.267442e-2,-0.181686)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient12913"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(2.072674,-0.181686)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient11625"
+       id="linearGradient12915"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(4.072674,-0.181686)"
+       x1="21.500000"
+       y1="30.000000"
+       x2="21.500000"
+       y2="27.375000" />
+    <linearGradient
+       y2="21.067410"
+       x2="24.445690"
+       y1="33.447811"
+       x1="31.597168"
+       gradientTransform="matrix(0.476329,0.000000,0.000000,0.627721,62.07560,9.156933)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7584"
+       xlink:href="#linearGradient11594"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.407878,2.776254e-16,-5.900875e-16,1.861050,14.96976,-20.55775)"
+       r="6.0270013"
+       fy="29.099535"
+       fx="24.399090"
+       cy="29.099535"
+       cx="24.399090"
+       id="radialGradient7592"
+       xlink:href="#linearGradient7586"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="11.042997"
+       x2="22.585604"
+       y1="34.149513"
+       x1="22.585604"
+       gradientTransform="matrix(1.059222,0.000000,0.000000,0.808101,48.08657,4.001391)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7596"
+       xlink:href="#linearGradient7608"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="translate(49.32070,0.000000)"
+       gradientUnits="userSpaceOnUse"
+       y2="38.454056"
+       x2="28.284273"
+       y1="28.554562"
+       x1="25.279068"
+       id="linearGradient7642"
+       xlink:href="#linearGradient7636"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.777122,-8.126449e-2,6.891211e-2,2.223012,4.035118,-33.24798)"
+       r="4.4774761"
+       fy="29.609560"
+       fx="24.483574"
+       cy="29.609560"
+       cx="24.483574"
+       id="radialGradient7647"
+       xlink:href="#linearGradient7614"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.046729,-3.749427e-16,-2.853404e-16,1.557610,67.59375,3.275309)"
+       r="17.171415"
+       fy="5.7859797"
+       fx="25.075571"
+       cy="5.7859797"
+       cx="25.075571"
+       id="radialGradient8656"
+       xlink:href="#linearGradient8650"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,6.772795e-15,16.87306)"
+       r="15.644737"
+       fy="36.421127"
+       fx="24.837126"
+       cy="36.421127"
+       cx="24.837126"
+       id="radialGradient8668"
+       xlink:href="#linearGradient8662"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2591"
+       id="radialGradient2597"
+       cx="22.291636"
+       cy="32.797512"
+       fx="22.291636"
+       fy="32.797512"
+       r="16.956199"
+       gradientTransform="matrix(-0.843022,1.871885e-16,2.265228e-16,1.020168,43.57646,1.205215)"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-y="30"
+     inkscape:window-x="0"
+     inkscape:window-height="818"
+     inkscape:window-width="1280"
+     inkscape:showpageshadow="false"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     showgrid="false"
+     inkscape:current-layer="layer1"
+     inkscape:cy="25.461494"
+     inkscape:cx="15.433072"
+     inkscape:zoom="16"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="0.25490196"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     fill="#4e9a06"
+     stroke="#4e9a06" />
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>http://jimmac.musichall.cz</dc:source>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+        <dc:title>Go Previous</dc:title>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>go</rdf:li>
+            <rdf:li>previous</rdf:li>
+            <rdf:li>left</rdf:li>
+            <rdf:li>arrow</rdf:li>
+            <rdf:li>pointer</rdf:li>
+            <rdf:li><</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1"
+     id="layer1">
+    <path
+       transform="matrix(-1.271186,0.000000,0.000000,1.271186,56.19514,-15.27857)"
+       d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1  9.1923885,36.421127 A 15.644737 8.3968935 0 1 1  40.481863 36.421127 z"
+       sodipodi:ry="8.3968935"
+       sodipodi:rx="15.644737"
+       sodipodi:cy="36.421127"
+       sodipodi:cx="24.837126"
+       id="path8660"
+       style="opacity:0.29946521;color:#000000;fill:url(#radialGradient8668);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path8643"
+       d="M 39.490316,15.496821 L 39.490316,32.491241 L 26.537753,32.491241 L 26.537753,40.973779 L 6.577917,23.973588 L 26.531563,6.7295901 L 26.531563,15.502125 L 39.490316,15.496821 z "
+       style="opacity:1.0000000;color:#000000;fill:url(#radialGradient2597);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.0000004;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    <path
+       sodipodi:nodetypes="cccccc"
+       id="path8645"
+       d="M 25.988368,7.9779766 L 25.988368,16.034451 L 38.930538,16.034451 L 38.930538,24.918914 C 22.180538,18.668914 22.797001,30.213626 7.547,23.963626 L 25.988368,7.9779766 z "
+       style="opacity:0.50802141;color:#000000;fill:url(#radialGradient8656);fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:1.0000000;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+    <path
+       style="opacity:0.48128340;color:#000000;fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000004;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10.000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+       d="M 38.475551,16.541365 L 38.475551,31.463305 L 25.490184,31.463305 L 25.490184,38.764721 L 8.168419,23.96903 L 25.506145,9.0636299 L 25.506145,16.546262 L 38.475551,16.541365 z "
+       id="path8658"
+       sodipodi:nodetypes="cccccccc" />
+  </g>
+</svg>
diff --git a/sleepyhead/icons/svg/calendar.svg b/sleepyhead/icons/svg/calendar.svg
new file mode 100644
index 0000000..d9f9281
--- /dev/null
+++ b/sleepyhead/icons/svg/calendar.svg
@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="office-calendar.svg"
+   sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme/scalable/apps"
+   inkscape:version="0.46"
+   sodipodi:version="0.32"
+   id="svg1288"
+   height="48px"
+   width="48px"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective48" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6719"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5060">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop5062" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5064" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5060"
+       id="radialGradient6717"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
+       cx="605.71429"
+       cy="486.64789"
+       fx="605.71429"
+       fy="486.64789"
+       r="117.14286" />
+    <linearGradient
+       id="linearGradient5048">
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="0"
+         id="stop5050" />
+      <stop
+         id="stop5056"
+         offset="0.5"
+         style="stop-color:black;stop-opacity:1;" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop5052" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5048"
+       id="linearGradient6715"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)"
+       x1="302.85715"
+       y1="366.64789"
+       x2="302.85715"
+       y2="609.50507" />
+    <linearGradient
+       id="linearGradient2563">
+      <stop
+         id="stop2565"
+         offset="0"
+         style="stop-color:#e2e2e2;stop-opacity:1;" />
+      <stop
+         id="stop2567"
+         offset="1.0000000"
+         style="stop-color:#9f9f9f;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2551"
+       inkscape:collect="always">
+      <stop
+         id="stop2553"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop2555"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2526">
+      <stop
+         id="stop2528"
+         offset="0.0000000"
+         style="stop-color:#e7ebeb;stop-opacity:1.0000000;" />
+      <stop
+         style="stop-color:#e6ebeb;stop-opacity:1.0000000;"
+         offset="0.50000000"
+         id="stop2534" />
+      <stop
+         id="stop2530"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientTransform="translate(0.000000,0.785718)"
+       gradientUnits="userSpaceOnUse"
+       y2="28.428572"
+       x2="42.214283"
+       y1="14.428571"
+       x1="13.357142"
+       id="linearGradient2532"
+       xlink:href="#linearGradient2526"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.751938,1.196962e-16,7.193799)"
+       r="18.428572"
+       fy="29.000000"
+       fx="26.000000"
+       cy="29.000000"
+       cx="26.000000"
+       id="radialGradient2557"
+       xlink:href="#linearGradient2551"
+       inkscape:collect="always" />
+    <linearGradient
+       gradientTransform="translate(0.000000,0.785718)"
+       gradientUnits="userSpaceOnUse"
+       y2="30.785713"
+       x2="42.214284"
+       y1="30.785713"
+       x1="6.7857148"
+       id="linearGradient2569"
+       xlink:href="#linearGradient2563"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="28.428572"
+       x2="42.214283"
+       y1="14.428571"
+       x1="13.357142"
+       gradientTransform="translate(2.045771e-15,0.785718)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient2582"
+       xlink:href="#linearGradient2526"
+       inkscape:collect="always" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-y="147"
+     inkscape:window-x="562"
+     inkscape:window-height="701"
+     inkscape:window-width="872"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     showgrid="false"
+     inkscape:current-layer="layer1"
+     inkscape:cy="24.165113"
+     inkscape:cx="-136.63043"
+     inkscape:zoom="1"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="1.0"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base" />
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>Calendar</dc:title>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>http://jimmac.musichall.cz</dc:source>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>calendar</rdf:li>
+            <rdf:li>date</rdf:li>
+            <rdf:li>time</rdf:li>
+            <rdf:li>cal</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1"
+     id="layer1">
+    <g
+       transform="matrix(2.294847e-2,0,0,2.276812e-2,44.75587,36.74254)"
+       id="g6707">
+      <rect
+         style="opacity:0.40206185;color:black;fill:url(#linearGradient6715);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         id="rect6709"
+         width="1339.6335"
+         height="478.35718"
+         x="-1559.2523"
+         y="-150.69685" />
+      <path
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6717);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+         d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
+         id="path6711"
+         sodipodi:nodetypes="cccc" />
+      <path
+         sodipodi:nodetypes="cccc"
+         id="path6713"
+         d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
+         style="opacity:0.40206185;color:black;fill:url(#radialGradient6719);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    </g>
+    <path
+       sodipodi:nodetypes="ccccccc"
+       id="path1316"
+       d="M 4.8571430,38.428571 C 4.6428572,39.428571 5.4642859,40.464285 6.8214287,40.428571 L 43.000000,40.428571 C 44.285714,40.392857 44.714286,39.214285 44.428572,38.249999 L 36.571429,9.4285713 L 10.571429,9.4285713 L 4.8571430,38.428571 z "
+       style="fill:#a7a7a7;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#656565;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       id="path2575"
+       d="M 9.1625040,30.806458 L 39.395095,30.806458 C 40.252297,30.806458 40.942392,31.478744 40.942392,32.313825 L 42.269580,37.114760 C 42.269580,37.949841 41.579486,38.622127 40.722283,38.622127 L 8.2777114,38.622127 C 7.4205088,38.622127 6.7304142,37.949841 6.7304142,37.114760 L 7.6152068,32.313825 C 7.6152068,31.478744 8.3053014,30.806458 9.1625040,30.806458 z "
+       style="opacity:0.10857142;color:#000000;fill:#000000;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans" />
+    <path
+       style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999970px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:0.34463277"
+       d="M 6.0478436,37.805569 C 5.8479823,38.738255 5.6491963,39.385227 6.5227626,39.385227 L 42.837439,39.385227 C 43.753496,39.385227 43.579187,38.645537 43.312705,37.746161 L 35.770172,10.471961 L 11.520336,10.471961 L 6.0478436,37.805569 z "
+       id="path2520"
+       sodipodi:nodetypes="ccccccc" />
+    <path
+       style="opacity:1.0000000;color:#000000;fill:#c5c5c5;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible;font-family:Bitstream Vera Sans"
+       d="M 9.6418018,29.928574 L 38.929626,29.928574 C 39.760041,29.928574 40.428570,30.579851 40.428570,31.388835 L 41.714284,36.039742 C 41.714284,36.848726 41.045755,37.500003 40.215340,37.500003 L 8.7846589,37.500003 C 7.9542438,37.500003 7.2857146,36.848726 7.2857146,36.039742 L 8.1428575,31.388835 C 8.1428575,30.579851 8.8113867,29.928574 9.6418018,29.928574 z "
+       id="path2518"
+       sodipodi:nodetypes="ccccccccc" />
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       id="rect2225"
+       d="M 9.6418018,27.785717 L 38.929626,27.785717 C 39.760041,27.785717 40.428570,28.436994 40.428570,29.245978 L 41.714284,33.896885 C 41.714284,34.705869 41.045755,35.357146 40.215340,35.357146 L 8.7846589,35.357146 C 7.9542438,35.357146 7.2857146,34.705869 7.2857146,33.896885 L 8.1428575,29.245978 C 8.1428575,28.436994 8.8113867,27.785717 9.6418018,27.785717 z "
+       style="color:#000000;fill:url(#linearGradient2569);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible" />
+    <g
+       transform="matrix(0.942549,0.000000,0.000000,0.942549,-0.222619,1.855860)"
+       id="g2578">
+      <path
+         style="fill:url(#linearGradient2582);fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:1.0609524px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000"
+         d="M 10.891973,11.500004 L 6.5714281,33.214290 C 6.5714281,33.214290 32.857143,33.214291 32.857143,33.214291 C 45.441975,33.214291 48.085306,29.214290 48.085306,29.214290 C 48.085306,29.214290 44.728164,28.035719 43.299593,23.071433 C 43.299593,23.071433 40.238640,11.500004 40.238640,11.500004 L 10.891973,11.500004 z "
+         id="path2524"
+         sodipodi:nodetypes="cczczcc" />
+      <path
+         sodipodi:nodetypes="cccczcc"
+         id="path2571"
+         d="M 11.803734,12.474609 L 7.8122567,32.239668 C 7.8122567,32.239668 24.956518,32.239669 32.238382,32.239669 C 43.465021,32.239669 46.348811,29.388804 46.348811,29.388804 C 46.348811,29.388804 43.355751,27.525962 42.055419,23.007305 C 42.055419,23.007305 39.316856,12.546038 39.316856,12.546038 L 11.803734,12.474609 z "
+         style="fill:none;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0609519px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+    </g>
+    <path
+       sodipodi:nodetypes="ccccccccc"
+       id="rect2522"
+       d="M 11.315699,7.4285707 L 36.494515,7.4285707 C 37.367632,7.4285707 38.070539,8.0973414 38.070539,8.9280566 L 38.427682,11.071942 C 38.427682,11.902657 37.724775,12.571428 36.851658,12.571428 L 10.958556,12.571428 C 10.085439,12.571428 9.3825323,11.902657 9.3825323,11.071942 L 9.7396752,8.9280566 C 9.7396752,8.0973414 10.442582,7.4285707 11.315699,7.4285707 z "
+       style="color:#000000;fill:#9b9b9b;fill-opacity:1.0000000;fill-rule:evenodd;stroke:#696969;stroke-width:0.99999952;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;marker:none;marker-start:none;marker-mid:none;marker-end:none;visibility:visible;display:inline;overflow:visible" />
+    <path
+       id="text2541"
+       d="M 20.969159,22.393020 C 21.957574,22.486777 22.691543,22.765423 23.171063,23.228961 C 23.651181,23.687301 23.849054,24.273239 23.764680,24.986779 C 23.640870,26.033659 23.075908,26.877412 22.069796,27.518037 C 21.063667,28.158665 19.762256,28.478977 18.165559,28.478978 C 16.939741,28.478977 15.906445,28.286269 15.065668,27.900851 L 15.305880,25.869594 C 16.189321,26.478973 17.193659,26.783661 18.318897,26.783660 C 19.217824,26.783661 19.926554,26.637828 20.445092,26.346159 C 20 [...]
+       style="font-size:17.577877;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100.00000%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Segoe" />
+    <path
+       id="text2545"
+       d="M 33.007379,28.455540 L 30.499173,28.455540 L 29.387875,19.096134 L 26.295373,19.893012 L 26.086657,18.135194 L 31.627997,16.838314 L 33.007379,28.455540"
+       style="font-size:17.577877;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:100.00000%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Segoe" />
+    <path
+       transform="matrix(0.684211,0.000000,0.000000,0.684211,3.560154,2.278197)"
+       d="M 12.857143 9.9285717 A 1.3571428 1.3571428 0 1 1  10.142857,9.9285717 A 1.3571428 1.3571428 0 1 1  12.857143 9.9285717 z"
+       sodipodi:ry="1.3571428"
+       sodipodi:rx="1.3571428"
+       sodipodi:cy="9.9285717"
+       sodipodi:cx="11.500000"
+       id="path2559"
+       style="opacity:0.52571428;color:#000000;fill:#fefefe;fill-opacity:1.0000000;fill-rule:evenodd;stroke:none;stroke-width:0.99999964;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4.0000000;stroke-dasharray:none;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;visibility:visible;display:inline;overflow:visible"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:nodetypes="cc"
+       id="path2561"
+       d="M 13.042053,8.6010151 L 36.371309,8.6010151"
+       style="opacity:0.30285713;fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.0000001px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1.0000000" />
+  </g>
+</svg>
diff --git a/sleepyhead/icons/svg/close-window.svg b/sleepyhead/icons/svg/close-window.svg
new file mode 100644
index 0000000..10bbef9
--- /dev/null
+++ b/sleepyhead/icons/svg/close-window.svg
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.0"
+   id="Foreground"
+   x="0px"
+   y="0px"
+   width="32"
+   height="32"
+   viewBox="0 0 23.272727 23.272727"
+   enable-background="new 0 0 16 16"
+   xml:space="preserve"
+   sodipodi:version="0.32"
+   inkscape:version="0.48+devel r10081 custom"
+   sodipodi:docname="close-window.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
+   id="metadata2399"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+   id="defs2397"><linearGradient
+     id="linearGradient3173"><stop
+       style="stop-color:#c4c4c4;stop-opacity:1;"
+       offset="0"
+       id="stop3175" /><stop
+       style="stop-color:#ffffff;stop-opacity:1;"
+       offset="1"
+       id="stop3177" /></linearGradient><inkscape:perspective
+     sodipodi:type="inkscape:persp3d"
+     inkscape:vp_x="0 : 8 : 1"
+     inkscape:vp_y="0 : 1000 : 0"
+     inkscape:vp_z="16 : 8 : 1"
+     inkscape:persp3d-origin="8 : 5.3333333 : 1"
+     id="perspective2401" /><filter
+     color-interpolation-filters="sRGB"
+     inkscape:collect="always"
+     id="filter16494-4"
+     x="-0.20989846"
+     width="1.4197969"
+     y="-0.20903821"
+     height="1.4180764"><feGaussianBlur
+       inkscape:collect="always"
+       stdDeviation="1.3282637"
+       id="feGaussianBlur16496-8" /></filter><radialGradient
+     inkscape:collect="always"
+     xlink:href="#linearGradient16498-6"
+     id="radialGradient16504-1"
+     cx="7.6582627"
+     cy="5.8191104"
+     fx="7.6582627"
+     fy="5.8191104"
+     r="8.6928644"
+     gradientTransform="matrix(1.0474339,0,0,1.0517402,-0.3632615,-0.42032492)"
+     gradientUnits="userSpaceOnUse" /><linearGradient
+     inkscape:collect="always"
+     id="linearGradient16498-6"><stop
+       style="stop-color:#7b7b7b;stop-opacity:1"
+       offset="0"
+       id="stop16500-8" /><stop
+       style="stop-color:#101010;stop-opacity:1"
+       offset="1"
+       id="stop16502-0" /></linearGradient><filter
+     color-interpolation-filters="sRGB"
+     inkscape:collect="always"
+     id="filter16524-9"
+     x="-0.212979"
+     width="1.425958"
+     y="-0.21305652"
+     height="1.426113"><feGaussianBlur
+       inkscape:collect="always"
+       stdDeviation="0.71020915"
+       id="feGaussianBlur16526-0" /></filter></defs><sodipodi:namedview
+   inkscape:window-height="1114"
+   inkscape:window-width="1463"
+   inkscape:pageshadow="2"
+   inkscape:pageopacity="0"
+   guidetolerance="10.0"
+   gridtolerance="10.0"
+   objecttolerance="10.0"
+   borderopacity="1.0"
+   bordercolor="#666666"
+   pagecolor="#000000"
+   id="base"
+   showgrid="false"
+   inkscape:zoom="1"
+   inkscape:cx="10.720189"
+   inkscape:cy="13.739577"
+   inkscape:window-x="0"
+   inkscape:window-y="26"
+   inkscape:current-layer="Foreground"
+   showguides="true"
+   inkscape:guide-bbox="true"
+   borderlayer="true"
+   inkscape:showpageshadow="false"
+   inkscape:window-maximized="0"><inkscape:grid
+     type="xygrid"
+     id="grid11246"
+     empspacing="5"
+     visible="true"
+     enabled="true"
+     snapvisiblegridlinesonly="true" /></sodipodi:namedview>
+
+<g
+   style="display:inline"
+   id="g16402-8"
+   transform="translate(4.7533483,2.8238929)"><g
+     id="g3175-4"><path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="0"
+       inkscape:original="M 7.65625 0.125 C 3.2589349 0.125 -0.3125 3.7070002 -0.3125 8.125 C -0.3125 12.543001 3.2589349 16.125 7.65625 16.125 C 12.053566 16.125 15.625 12.543001 15.625 8.125 C 15.625 3.7070002 12.053566 0.125 7.65625 0.125 z "
+       xlink:href="#path2394-32"
+       style="opacity:0.52994014;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.18181825;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter16494-4);enable-background:accumulate"
+       id="path16480-5"
+       inkscape:href="#path2394-32"
+       d="m 7.65625,0.125 c -4.3973151,0 -7.96875,3.5820002 -7.96875,8 0,4.418001 3.5714349,8 7.96875,8 4.397316,0 7.96875,-3.581999 7.96875,-8 0,-4.4179998 -3.571434,-8 -7.96875,-8 z"
+       transform="translate(0,1.028519)" /><path
+       clip-rule="evenodd"
+       d="m -0.30428257,8.1237596 c 0,-4.4179998 3.56522987,-7.9999996 7.96254497,-7.9999996 4.3973156,0 7.9625456,3.5819998 7.9625456,7.9999996 0,4.4180014 -3.56523,8.0000004 -7.9625456,8.0000004 -4.3973151,0 -7.96254497,-3.581999 -7.96254497,-8.0000004 z"
+       id="path2394-32"
+       style="color:#000000;fill:url(#radialGradient16504-1);fill-opacity:1;fill-rule:nonzero;stroke:#eeeeec;stroke-width:1.4545455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       sodipodi:nodetypes="csssc"
+       inkscape:connector-curvature="0" /><g
+       id="g3172-6" /></g><g
+     transform="matrix(0.72727273,0,0,0.72727273,2.368236,2.1803254)"
+     style="fill:#ffffff;fill-opacity:1;display:inline"
+     id="g27275-6-6"
+     inkscape:label="window-close"><g
+       style="fill:#ffffff;fill-opacity:1;display:inline"
+       id="g27277-1-1"
+       transform="translate(-41,-760)"><path
+         sodipodi:type="inkscape:offset"
+         inkscape:radius="0"
+         inkscape:original="M 44.21875 764.1875 L 44.21875 765.1875 C 44.19684 765.46825 44.289258 765.74287 44.5 765.9375 L 46.78125 768.21875 L 44.5 770.46875 C 44.31181 770.65692 44.218747 770.92221 44.21875 771.1875 L 44.21875 772.1875 L 45.21875 772.1875 C 45.48404 772.1875 45.749336 772.09444 45.9375 771.90625 L 48.21875 769.625 L 50.5 771.90625 C 50.688164 772.0944 50.953449 772.18749 51.21875 772.1875 L 52.21875 772.1875 L 52.21875 771.1875 C 52.218742 770.9222 52.125688 770.6569 [...]
+         xlink:href="#path27279-0-5"
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter [...]
+         id="path16506-5"
+         inkscape:href="#path27279-0-5"
+         d="m 44.21875,764.1875 0,1 c -0.02191,0.28075 0.07051,0.55537 0.28125,0.75 l 2.28125,2.28125 -2.28125,2.25 c -0.18819,0.18817 -0.281253,0.45346 -0.28125,0.71875 l 0,1 1,0 c 0.26529,0 0.530586,-0.0931 0.71875,-0.28125 L 48.21875,769.625 50.5,771.90625 c 0.188164,0.18815 0.453449,0.28124 0.71875,0.28125 l 1,0 0,-1 c -8e-6,-0.2653 -0.09306,-0.53058 -0.28125,-0.71875 l -2.25,-2.25 2.28125,-2.28125 c 0.21566,-0.19935 0.25,-0.46353 0.25,-0.75 l 0,-1 -1,0 c -0.240828,0.007 -0.421875,0. [...]
+         transform="translate(0,1.3535534)" /><path
+         sodipodi:nodetypes="ccsccccccccccccccccccccccc"
+         style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background: [...]
+         id="path27279-0-5"
+         inkscape:connector-curvature="0"
+         d="m 44.226475,764.17222 1,0 c 0.01037,-1.2e-4 0.02079,-4.6e-4 0.03125,0 0.254951,0.0112 0.50987,0.12858 0.6875,0.3125 l 2.28125,2.28125 2.3125,-2.28125 c 0.265625,-0.2305 0.446672,-0.3055 0.6875,-0.3125 l 1,0 0,1 c 0,0.28647 -0.03434,0.55065 -0.25,0.75 l -2.28125,2.28125 2.25,2.25 c 0.188188,0.18817 0.281242,0.45345 0.28125,0.71875 l 0,1 -1,0 c -0.265301,-1e-5 -0.530586,-0.0931 -0.71875,-0.28125 l -2.28125,-2.28125 -2.28125,2.28125 c -0.188164,0.18819 -0.45346,0.28125 -0.71875, [...]
\ No newline at end of file
diff --git a/sleepyhead/icons/svg/edit-find.svg b/sleepyhead/icons/svg/edit-find.svg
new file mode 100644
index 0000000..525fc82
--- /dev/null
+++ b/sleepyhead/icons/svg/edit-find.svg
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg3294" xmlns="http://www.w3.org/2000/svg" height="48" width="48" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs id="defs3296">
+  <radialGradient id="radialGradient2759" gradientUnits="userSpaceOnUse" cy="4.625" cx="62.625" gradientTransform="matrix(1 0 0 .34118 0 3.0471)" r="10.625">
+   <stop id="stop8840" style="stop-color:#7f7f7f" offset="0"/>
+   <stop id="stop8842" style="stop-color:gray;stop-opacity:0" offset="1"/>
+  </radialGradient>
+  <linearGradient id="linearGradient2782" y2="29.484" gradientUnits="userSpaceOnUse" x2="31.364" gradientTransform="matrix(1.0113 0 0 1.0013 -.14757 1.8143)" y1="27.988" x1="32.893">
+   <stop id="stop3378" style="stop-color:#575757" offset="0"/>
+   <stop id="stop3380" style="stop-color:#333" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient2780" y2="91.973" gradientUnits="userSpaceOnUse" x2="-164.72" gradientTransform="matrix(.39366 0 0 .38976 101.38 -4.2393)" y1="99.667" x1="-172.65">
+   <stop id="stop3372" style="stop-color:#242424;stop-opacity:.99216" offset="0"/>
+   <stop id="stop3374" style="stop-color:#656565" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient2778" y2="67.35" gradientUnits="userSpaceOnUse" x2="201.87" gradientTransform="matrix(.39366 0 0 .38976 -50.209 -.47265)" y1="146.15" x1="277.57">
+   <stop id="stop3384" style="stop-color:#fff" offset="0"/>
+   <stop id="stop3386" style="stop-color:#fff;stop-opacity:0" offset="1"/>
+  </linearGradient>
+  <radialGradient id="radialGradient2776" gradientUnits="userSpaceOnUse" cy="21.818" cx="18.241" r="8.3085">
+   <stop id="stop3408" style="stop-color:#a1a1a1;stop-opacity:.20784" offset="0"/>
+   <stop id="stop3410" style="stop-color:#a1a1a1;stop-opacity:.67843" offset="1"/>
+  </radialGradient>
+  <radialGradient id="radialGradient2774" gradientUnits="userSpaceOnUse" cy="13.078" cx="15.414" gradientTransform="matrix(3.071 0 0 2.3629 -33.011 -21.345)" r="6.6562">
+   <stop id="stop3390" style="stop-color:#fff" offset="0"/>
+   <stop id="stop3392" style="stop-color:#fff;stop-opacity:.24762" offset="1"/>
+  </radialGradient>
+  <linearGradient id="linearGradient2772" y2="4.5363" gradientUnits="userSpaceOnUse" x2="41.485" gradientTransform="matrix(.40377 0 0 .39977 .53992 2.6759)" y1="68.292" x1="41.542">
+   <stop id="stop3402" style="stop-color:#333" offset="0"/>
+   <stop id="stop3404" style="stop-color:#333;stop-opacity:.61224" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient2770" y2="11.949" gradientUnits="userSpaceOnUse" x2="173.1" gradientTransform="matrix(.40377 0 0 .39977 -51.834 -.33274)" y1="75.319" x1="173.1">
+   <stop id="stop3396" style="stop-color:#343434;stop-opacity:.97647" offset="0"/>
+   <stop id="stop3398" style="stop-color:#929292" offset="1"/>
+  </linearGradient>
+  <linearGradient id="linearGradient2768" y2="11.949" gradientUnits="userSpaceOnUse" x2="173.1" gradientTransform="matrix(.38453 0 0 .38072 -48.397 .25848)" y1="75.319" x1="173.1">
+   <stop id="stop3366" style="stop-color:#979797" offset="0"/>
+   <stop id="stop3368" style="stop-opacity:.34118" offset="1"/>
+  </linearGradient>
+ </defs>
+ <g id="layer1">
+  <path id="path8836" style="opacity:.3;fill-rule:evenodd;fill:url(#radialGradient2759)" d="m73.25 4.625a10.625 3.625 0 1 1 -21.25 0 10.625 3.625 0 1 1 21.25 0z" transform="matrix(2.1499 0 0 1.6619 -110.64 34.289)"/>
+  <path id="path11112" style="stroke-linejoin:round;fill-rule:evenodd;stroke:url(#linearGradient2782);stroke-linecap:round;stroke-width:1.2579;fill:url(#linearGradient2780)" d="m28.184 24.772 17.601 16.219-2.4398 3.2784-17.538-17.545 2.3761-1.9527z"/>
+  <path id="path11122" style="fill:url(#linearGradient2778);fill-rule:evenodd" d="m43.375 43.205-14.116-17.427 17.079 14.839-2.963 2.588z"/>
+  <path id="path13082" style="fill:#3e3e3e" d="m247.91 110.29a4.8668 2.6562 0 1 1 -9.7337 0 4.8668 2.6562 0 1 1 9.7337 0z" transform="matrix(.37019 -.41504 .47451 .30929 -97.503 109.58)"/>
+  <path id="path4452" style="fill-rule:evenodd;fill:url(#radialGradient2776)" d="m25.898 18.478a8.3085 8.3085 0 1 1 -16.617 0 8.3085 8.3085 0 1 1 16.617 0z" transform="matrix(1.489 0 0 1.4384 -7.5065 -10.003)"/>
+  <path id="path4462" style="opacity:.83422;fill-rule:evenodd;fill:url(#radialGradient2774)" d="m18.174 6.2875c-6.1677 0-11.162 4.4243-11.162 9.888 0 1.5779 0.13829 3.2078 0.88072 4.532 1.4833 0.48432 3.4184 0.63586 5.0908 0.63586 7.3086 0 13.595-5.3677 14.046-11.742-2.051-2.1462-5.437-3.314-8.856-3.314z"/>
+  <path id="path2298" style="stroke-linejoin:round;stroke:url(#linearGradient2772);stroke-linecap:round;stroke-width:1.2902;fill:url(#linearGradient2770)" d="m18.411 4.6415c-7.5976 0-13.766 5.6317-13.766 12.568 0 6.9362 6.1685 12.568 13.766 12.568 7.5976 0 13.766-5.6317 13.766-12.568 0-6.9362-6.1685-12.568-13.766-12.568zm0.16403 0.82453c6.7999 0 12.328 5.0357 12.328 11.244 0 6.2079-5.5278 11.244-12.328 11.244-6.7999 0.000001-12.315-5.0357-12.315-11.244 0-6.2079 5.5151-11.244 12.315-11.244z"/>
+  <path id="path4267" style="fill:url(#linearGradient2768)" d="m18.5 5.0038c-7.2355 0-13.097 5.3625-13.097 11.968 0 6.6057 5.8618 11.968 13.097 11.968 7.2355 0 13.11-5.3625 13.11-11.968 0-6.6057-5.8744-11.968-13.11-11.968zm0.07571 0.46224c6.7999 0 11.788 5.0357 11.788 11.244 0 6.2079-4.9885 10.71-11.788 10.71-6.7999 0.000001-11.866-4.5018-11.866-10.71 0-6.2079 5.0658-11.244 11.866-11.244z"/>
+ </g>
+</svg>
diff --git a/sleepyhead/icons/svg/emblem-marketing.svg b/sleepyhead/icons/svg/emblem-marketing.svg
new file mode 100644
index 0000000..7e6ae2a
--- /dev/null
+++ b/sleepyhead/icons/svg/emblem-marketing.svg
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   width="48"
+   height="48"
+   id="svg8332">
+  <defs
+     id="defs8334">
+    <linearGradient
+       id="linearGradient2491">
+      <stop
+         id="stop2493"
+         style="stop-color:#232d37;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3442"
+         style="stop-color:#69737e;stop-opacity:1"
+         offset="0.74771565" />
+      <stop
+         id="stop2495"
+         style="stop-color:#b0bac5;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3444">
+      <stop
+         id="stop3446"
+         style="stop-color:#232d37;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3448"
+         style="stop-color:#69737e;stop-opacity:1"
+         offset="0.75238955" />
+      <stop
+         id="stop3450"
+         style="stop-color:#b0bac5;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8284">
+      <stop
+         id="stop8286"
+         style="stop-color:#6a97b2;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop8288"
+         style="stop-color:#79a2ba;stop-opacity:1"
+         offset="0.70313555" />
+      <stop
+         id="stop8290"
+         style="stop-color:#c0d4df;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3434-533-916">
+      <stop
+         id="stop7411"
+         style="stop-color:#6a97b2;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop7413"
+         style="stop-color:#7fa6bd;stop-opacity:1"
+         offset="0.70313555" />
+      <stop
+         id="stop7415"
+         style="stop-color:#c0d4df;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3412">
+      <stop
+         id="stop3414"
+         style="stop-color:#77818a;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3416"
+         style="stop-color:#909aa4;stop-opacity:1"
+         offset="0.67084974" />
+      <stop
+         id="stop3418"
+         style="stop-color:#d0d8dc;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3306">
+      <stop
+         id="stop3308"
+         style="stop-color:white;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3310"
+         style="stop-color:white;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="24.574112"
+       y1="35.224419"
+       x2="24.574112"
+       y2="27.119747"
+       id="linearGradient2884"
+       xlink:href="#linearGradient3306"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1,-2.874364)" />
+    <linearGradient
+       x1="30.354689"
+       y1="20.887074"
+       x2="30.354689"
+       y2="40.907139"
+       id="linearGradient2887"
+       xlink:href="#linearGradient3412"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1,-2.874364)" />
+    <linearGradient
+       x1="23.085281"
+       y1="22.87435"
+       x2="23.085281"
+       y2="40.878265"
+       id="linearGradient2890"
+       xlink:href="#linearGradient3434-533-916"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1,-2.874364)" />
+    <linearGradient
+       x1="30.354689"
+       y1="21.152042"
+       x2="30.354689"
+       y2="40.907139"
+       id="linearGradient2893"
+       xlink:href="#linearGradient3412"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1,-2.874364)" />
+    <linearGradient
+       x1="23.085281"
+       y1="18.922369"
+       x2="23.085281"
+       y2="40.878265"
+       id="linearGradient2896"
+       xlink:href="#linearGradient8284"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1,-2.874364)" />
+    <linearGradient
+       x1="16.11058"
+       y1="15.091194"
+       x2="16.11058"
+       y2="40.88158"
+       id="linearGradient2899"
+       xlink:href="#linearGradient3444"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1,-2.874364)" />
+    <linearGradient
+       x1="16.11058"
+       y1="15.091194"
+       x2="16.11058"
+       y2="40.88158"
+       id="linearGradient2902"
+       xlink:href="#linearGradient2491"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(1,-2.874364)" />
+    <linearGradient
+       id="linearGradient4542">
+      <stop
+         id="stop4544"
+         style="stop-color:black;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop4546"
+         style="stop-color:black;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3678">
+      <stop
+         id="stop3680"
+         style="stop-color:#fafafa;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3682"
+         style="stop-color:#c1c1c1;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3686">
+      <stop
+         id="stop3688"
+         style="stop-color:#aaa;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3690"
+         style="stop-color:#787878;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <radialGradient
+       cx="9.5926991"
+       cy="9.3275347"
+       r="21"
+       fx="9.5926991"
+       fy="9.3275347"
+       id="radialGradient3283"
+       xlink:href="#linearGradient3678"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(4.6589503,-0.03415135,0.01976147,2.6958736,-35.283534,-15.490384)" />
+    <linearGradient
+       x1="13.871766"
+       y1="5.7400389"
+       x2="13.622137"
+       y2="34.835339"
+       id="linearGradient3285"
+       xlink:href="#linearGradient3686"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="translate(2.1e-7,3.3291193e-4)" />
+    <radialGradient
+       cx="24.306795"
+       cy="42.07798"
+       r="15.821514"
+       fx="24.306795"
+       fy="42.07798"
+       id="radialGradient3288"
+       xlink:href="#linearGradient4542"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.3905117,0,0,0.22121761,-9.7988818,34.191935)" />
+  </defs>
+  <path
+     d="m 46,43.500334 a 22,3.5000002 0 0 1 -43.9999998,0 22,3.5000002 0 1 1 43.9999998,0 z"
+     id="path3667"
+     style="opacity:0.56725147;fill:url(#radialGradient3288);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible" />
+  <rect
+     width="41"
+     height="41"
+     rx="1.149758"
+     ry="1.0923052"
+     x="3.5000005"
+     y="3.5003314"
+     id="rect4414"
+     style="fill:url(#radialGradient3283);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3285);stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:1;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  <path
+     d="m 13,23.999984 3,0 0,14 -3,0 0,-14 z"
+     id="path3316"
+     style="fill:url(#linearGradient2902);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  <path
+     d="m 17,11.999986 3,0 0,26 -3,0 0,-26 z"
+     id="rect2474"
+     style="fill:url(#linearGradient2899);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  <path
+     d="m 21,15.999986 3,0 0,22 -3,0 0,-22 z"
+     id="path3320"
+     style="fill:url(#linearGradient2896);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  <path
+     d="m 33,29.999984 3,0 0,8 -3,0 0,-8 z"
+     id="rect2484"
+     style="fill:url(#linearGradient2893);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  <path
+     d="m 25,19.999986 3,0 0,18 -3,0 0,-18 z"
+     id="rect2478"
+     style="fill:url(#linearGradient2890);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  <path
+     d="m 29,17.999986 3,0 0,20 -3,0 0,-20 z"
+     id="path3324"
+     style="fill:url(#linearGradient2887);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  <path
+     d="m 26.5,24.250636 c -0.530839,0.01118 -1.006012,0.03489 -1.5,0.0625 l 0,6.09375 c 0.997693,0.53188 1.953314,1.060284 3,1.4375 l 0,-7.5625 c -0.498578,-0.0041 -1.031082,-0.04112 -1.5,-0.03125 z m 2.5,0.03125 0,7.84375 c 0.879502,0.205917 1.84741,0.289564 3,0.15625 l 0,-7.84375 c -1.049065,-0.07939 -2.055159,-0.130705 -3,-0.15625 z m -5.09375,0.09375 c -1.066657,0.088 -2.01594,0.252256 -2.90625,0.40625 l 0,4.1875 c 0.882505,0.136148 1.714399,0.324591 2.40625,0.625 0.208867,0.09069 0 [...]
+     id="path2522"
+     style="opacity:0.4;fill:url(#linearGradient2884);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.60000002;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  <path
+     d="m 10.5,14.499985 2,-0.05566 m -2,4.055661 2,-0.05566 m -2,4.055661 2,-0.05566 m -2,4.055662 2,-0.05566 m -2,4.055662 2,-0.05566 m -2,4.055666 2,-0.05566 m 24,4.055663 -25,0 0,-27.5 m -1,-0.5 2,-0.05566"
+     id="path4570"
+     style="opacity:0.4;fill:none;stroke:#5b5b5b;stroke-width:1;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+</svg>
diff --git a/sleepyhead/icons/svg/forward.svg b/sleepyhead/icons/svg/forward.svg
new file mode 100644
index 0000000..41e5990
--- /dev/null
+++ b/sleepyhead/icons/svg/forward.svg
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="go-next.svg"
+   sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/actions"
+   inkscape:version="0.46"
+   sodipodi:version="0.32"
+   id="svg11300"
+   height="48"
+   width="48"
+   inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-ydpi="90.000000"
+   version="1.0"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective23" />
+    <linearGradient
+       id="linearGradient2591">
+      <stop
+         style="stop-color:#73d216"
+         offset="0"
+         id="stop2593" />
+      <stop
+         style="stop-color:#4e9a06"
+         offset="1.0000000"
+         id="stop2595" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8662"
+       inkscape:collect="always">
+      <stop
+         id="stop8664"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:1;" />
+      <stop
+         id="stop8666"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient8650"
+       inkscape:collect="always">
+      <stop
+         id="stop8652"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop8654"
+         offset="1"
+         style="stop-color:#ffffff;stop-opacity:0;" />
+    </linearGradient>
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.046729,-3.749427e-16,2.853404e-16,1.557610,-19.51799,3.452086)"
+       r="17.171415"
+       fy="2.8969381"
+       fx="19.701141"
+       cy="2.8969381"
+       cx="19.701141"
+       id="radialGradient8656"
+       xlink:href="#linearGradient8650"
+       inkscape:collect="always" />
+    <radialGradient
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.000000,0.000000,0.000000,0.536723,2.511012e-15,16.87306)"
+       r="15.644737"
+       fy="36.421127"
+       fx="24.837126"
+       cy="36.421127"
+       cx="24.837126"
+       id="radialGradient8668"
+       xlink:href="#linearGradient8662"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2591"
+       id="radialGradient2597"
+       cx="22.291636"
+       cy="32.797512"
+       fx="22.291636"
+       fy="32.797512"
+       r="16.9562"
+       gradientTransform="matrix(0.843022,1.871885e-16,-2.265228e-16,1.020168,4.499298,1.381992)"
+       gradientUnits="userSpaceOnUse" />
+  </defs>
+  <sodipodi:namedview
+     inkscape:window-y="30"
+     inkscape:window-x="0"
+     inkscape:window-height="818"
+     inkscape:window-width="1280"
+     inkscape:showpageshadow="false"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     showgrid="false"
+     inkscape:current-layer="layer1"
+     inkscape:cy="27.398876"
+     inkscape:cx="20.508639"
+     inkscape:zoom="11.313708"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     borderopacity="0.25490196"
+     bordercolor="#666666"
+     pagecolor="#ffffff"
+     id="base"
+     fill="#4e9a06"
+     stroke="#4e9a06" />
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>http://jimmac.musichall.cz</dc:source>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+        <dc:title>Go Next</dc:title>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>go</rdf:li>
+            <rdf:li>next</rdf:li>
+            <rdf:li>right</rdf:li>
+            <rdf:li>arrow</rdf:li>
+            <rdf:li>pointer</rdf:li>
+            <rdf:li>></rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     inkscape:label="Layer 1"
+     id="layer1">
+    <path
+       transform="matrix(1.271186,0.000000,0.000000,1.271186,-8.119376,-15.10179)"
+       d="M 40.481863 36.421127 A 15.644737 8.3968935 0 1 1  9.1923885,36.421127 A 15.644737 8.3968935 0 1 1  40.481863 36.421127 z"
+       sodipodi:ry="8.3968935"
+       sodipodi:rx="15.644737"
+       sodipodi:cy="36.421127"
+       sodipodi:cx="24.837126"
+       id="path8660"
+       style="opacity:0.29946522;color:#000000;fill:url(#radialGradient8668);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:nodetypes="cccccccc"
+       id="path8643"
+       d="M 8.5541875,15.517348 L 8.5541875,32.511768 L 21.538,32.511768 L 21.538,41.056806 L 41.497835,24.150365 L 21.41919,7.1251168 L 21.41919,15.522652 L 8.5541875,15.517348 z "
+       style="opacity:1;color:#000000;fill:url(#radialGradient2597);fill-opacity:1;fill-rule:evenodd;stroke:#3a7304;stroke-width:1.00000036;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    <path
+       sodipodi:nodetypes="cccccc"
+       id="path8645"
+       d="M 21.962385,8.2485033 L 21.962385,16.054978 L 9.1452151,16.054978 L 9.1452151,25.095691 C 26.895215,27.095691 25.778752,17.640403 40.528752,24.140403 L 21.962385,8.2485033 z "
+       style="opacity:0.5080214;color:#000000;fill:url(#radialGradient8656);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    <path
+       style="opacity:0.48128339;color:#000000;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:10;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 9.537702,16.561892 L 9.537702,31.546332 L 22.523069,31.546332 L 22.523069,38.941498 L 40.001083,24.145807 L 22.507108,9.3654066 L 22.507108,16.566789 L 9.537702,16.561892 z "
+       id="path8658"
+       sodipodi:nodetypes="cccccccc" />
+  </g>
+</svg>
diff --git a/sleepyhead/icons/svg/gnome-dev-media-sdmmc.svg b/sleepyhead/icons/svg/gnome-dev-media-sdmmc.svg
new file mode 100644
index 0000000..5939396
--- /dev/null
+++ b/sleepyhead/icons/svg/gnome-dev-media-sdmmc.svg
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="48"
+   height="48"
+   id="svg11300"
+   inkscape:version="0.47 r22583"
+   sodipodi:docname="gnome-dev-media-sdmmc.svg">
+  <metadata
+     id="metadata34">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="957"
+     inkscape:window-height="631"
+     id="namedview32"
+     showgrid="false"
+     inkscape:zoom="15.424059"
+     inkscape:cx="13.881487"
+     inkscape:cy="23.79661"
+     inkscape:window-x="0"
+     inkscape:window-y="24"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg11300" />
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective36" />
+    <linearGradient
+       id="linearGradient3659">
+      <stop
+         id="stop3661"
+         style="stop-color:#aa1e1e;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3663"
+         style="stop-color:#e35d5d;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6247">
+      <stop
+         id="stop6249"
+         style="stop-color:white;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop6251"
+         style="stop-color:white;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6235">
+      <stop
+         id="stop6237"
+         style="stop-color:#505050;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop6239"
+         style="stop-color:#1e1e1e;stop-opacity:1"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6125">
+      <stop
+         id="stop6127"
+         style="stop-color:black;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop6129"
+         style="stop-color:black;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="24"
+       y1="42"
+       x2="24"
+       y2="9"
+       id="linearGradient2854"
+       xlink:href="#linearGradient3659"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="10.388194"
+       cy="11.314219"
+       r="17.09375"
+       fx="10.388194"
+       fy="11.314219"
+       id="radialGradient2857"
+       xlink:href="#linearGradient6247"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.3432678,0.18293823,-0.12393839,1.5875349,-12.551861,-10.695793)" />
+    <radialGradient
+       cx="15.047399"
+       cy="18.977098"
+       r="18.094328"
+       fx="15.047399"
+       fy="18.977098"
+       id="radialGradient2860"
+       xlink:href="#linearGradient6235"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9506521,0.06859887,-0.02067481,0.8892882,-29.187534,1.2014053)" />
+    <radialGradient
+       cx="24.218407"
+       cy="45.25996"
+       r="21.38998"
+       fx="24.218407"
+       fy="45.25996"
+       id="radialGradient2863"
+       xlink:href="#linearGradient6125"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.028519,0,0,0.16362778,-0.90909011,36.094208)" />
+  </defs>
+  <path
+     d="m 46,43.5 a 22,3.5 0 0 1 -44,0 22,3.5 0 1 1 44,0 z"
+     id="path6302"
+     style="opacity:0.52808987;color:black;fill:url(#radialGradient2863);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible" />
+  <path
+     d="M 8,3.5236562 C 7.308355,3.5237751 6.5428997,4.3083556 6.542,5 l -0.011066,8.507098 1.0079636,0 -0.09375,11.999368 -0.9799885,0.02255 L 6.4026591,43 C 6.4000523,43.728686 7.2713091,44.492453 8,44.492453 l 32,0 c 0.706233,0 1.502919,-0.78622 1.50382,-1.492453 l 0.03125,-24.489537 -1.03507,0 0,-3.931981 1.064437,-0.02814 0.02687,-6.0817389 c 0,-0.53125 -0.433116,-0.9924377 -0.433116,-0.9924377 0,0 -3.051392,-3.5201423 -3.051392,-3.5201423 -0.25,-0.25 -0.481803,-0.4060958 -1.138053, [...]
+     id="path6230"
+     style="color:black;fill:url(#radialGradient2860);fill-opacity:1;fill-rule:evenodd;stroke:#141414;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.8015976;marker:none;visibility:visible;display:inline;overflow:visible" />
+  <path
+     d="M 8,4.53125 C 8.028576,4.5312451 7.8542926,4.58316 7.71875,4.71875 7.5832074,4.8543398 7.5312139,5.0277766 7.53125,5 l 0,7.5 a 1.0001,1.0001 0 0 1 1,1 l -0.09375,12 a 1.0001,1.0001 0 0 1 -0.96875,1 L 7.40625,43 c 1.21e-4,-0.03382 0.03071,0.136569 0.1875,0.28125 C 7.75054,43.425931 7.9884855,43.5 8,43.5 l 32,0 c -0.02153,0 0.170941,-0.04588 0.3125,-0.1875 C 40.454059,43.170885 40.500026,42.979372 40.5,43 L 40.53125,19.5 40.5,19.5 a 1.0001,1.0001 0 0 1 -1,-1 l 0,-3.90625 a 1.0001,1 [...]
+     id="path6243"
+     style="opacity:0.2;color:black;fill:none;stroke:url(#radialGradient2857);stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0.8015976;marker:none;visibility:visible;display:inline;overflow:visible" />
+  <rect
+     width="26"
+     height="33"
+     x="11"
+     y="9"
+     id="rect3657"
+     style="fill:url(#linearGradient2854);fill-opacity:1;stroke:none" />
+  <rect
+     width="26"
+     height="7"
+     x="11"
+     y="9"
+     id="rect3669"
+     style="opacity:0.2;fill:#141414;fill-opacity:1;stroke:none" />
+  <path
+     d="m 25.032706,32.724936 c -0.22676,-0.21415 -0.518602,-0.382117 -0.875527,-0.5039 -0.356934,-0.121769 -0.697066,-0.182656 -1.020399,-0.182664 -0.415721,8e-6 -0.745355,0.09659 -0.988904,0.289743 -0.243555,0.193169 -0.365331,0.449318 -0.365328,0.768448 -3e-6,0.340139 0.09448,0.617284 0.283444,0.831436 0.18896,0.209964 0.596279,0.474512 1.221959,0.793643 0.831431,0.42832 1.404617,0.818843 1.71956,1.171569 0.319131,0.352734 0.4787,0.818841 0.478706,1.398324 -6e-6,0.793645 -0.293948,1.4 [...]
+     id="text6275"
+     style="font-size:12.89985371px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:white;fill-opacity:1;stroke:none;font-family:Segoe" />
+  <path
+     d="m 27.613362,29.957075 -0.336536,0 0,-1.881855 c -3e-6,-0.02747 0.008,-0.112749 0.02404,-0.255836 l -0.0069,0 c -0.0229,0.113325 -0.04522,0.19517 -0.06696,0.245534 l -0.84134,1.892157 -0.164834,0 -0.839623,-1.874987 c -0.0206,-0.0435 -0.04407,-0.131064 -0.0704,-0.262704 l -0.0069,0 c 0.0092,0.08929 0.01373,0.183151 0.01374,0.281591 l 0,1.8561 -0.317649,0 0,-2.462208 0.448142,0 0.815585,1.804588 c 0.02404,0.05838 0.03892,0.107601 0.04464,0.147664 l 0.0103,0 c 0.0092,-0.03548 0.0280 [...]
+     id="text6280"
+     style="font-size:10px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:white;fill-opacity:1;stroke:none;font-family:Segoe" />
+</svg>
diff --git a/sleepyhead/icons/svg/media.svg b/sleepyhead/icons/svg/media.svg
new file mode 100644
index 0000000..13f910f
--- /dev/null
+++ b/sleepyhead/icons/svg/media.svg
@@ -0,0 +1,477 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:export-ydpi="90.000000"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+   width="48px"
+   height="48px"
+   id="svg11300"
+   sodipodi:version="0.32"
+   inkscape:version="0.46"
+   sodipodi:docbase="/home/jimmac/src/cvs/tango-icon-theme-extras/scalable/devices"
+   sodipodi:docname="media-flash.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs3">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 24 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="48 : 24 : 1"
+       inkscape:persp3d-origin="24 : 16 : 1"
+       id="perspective71" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6210">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop6212" />
+      <stop
+         style="stop-color:white;stop-opacity:0;"
+         offset="1"
+         id="stop6214" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6196">
+      <stop
+         style="stop-color:#edd400;stop-opacity:1;"
+         offset="0"
+         id="stop6198" />
+      <stop
+         id="stop6204"
+         offset="0.5"
+         style="stop-color:#c3af07;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffeb3e;stop-opacity:1;"
+         offset="1"
+         id="stop6200" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6151">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop6153" />
+      <stop
+         style="stop-color:#2e3436;stop-opacity:0;"
+         offset="1"
+         id="stop6155" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient6125">
+      <stop
+         style="stop-color:black;stop-opacity:1;"
+         offset="0"
+         id="stop6127" />
+      <stop
+         style="stop-color:black;stop-opacity:0;"
+         offset="1"
+         id="stop6129" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6115">
+      <stop
+         style="stop-color:#555753;stop-opacity:1;"
+         offset="0"
+         id="stop6117" />
+      <stop
+         style="stop-color:#3e3f3c;stop-opacity:1;"
+         offset="1"
+         id="stop6119" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6099">
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1;"
+         offset="0"
+         id="stop6101" />
+      <stop
+         id="stop6107"
+         offset="0.8918919"
+         style="stop-color:#dededa;stop-opacity:1;" />
+      <stop
+         style="stop-color:#838375;stop-opacity:1;"
+         offset="1"
+         id="stop6103" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6099"
+       id="linearGradient6105"
+       x1="22.797205"
+       y1="39.679859"
+       x2="22.797205"
+       y2="46.635937"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.934004,0,1.557982)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6125"
+       id="radialGradient6131"
+       cx="24.218407"
+       cy="45.25996"
+       fx="24.218407"
+       fy="45.25996"
+       r="21.38998"
+       gradientTransform="matrix(1,0,0,0.128099,9.432564e-16,39.4622)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6151"
+       id="radialGradient6157"
+       cx="33.45499"
+       cy="28.603338"
+       fx="33.45499"
+       fy="28.603338"
+       r="3.8890872"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(3.657239,1.232816e-15,-1.232816e-15,3.657239,-88.89792,-76.00592)" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6151"
+       id="radialGradient6161"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(8.342154,-3.746956e-16,3.746956e-16,8.342154,-227.6289,-207.0663)"
+       cx="29.61227"
+       cy="27.974968"
+       fx="29.61227"
+       fy="27.974968"
+       r="3.8890872" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6196"
+       id="linearGradient6202"
+       x1="29.374996"
+       y1="21.741114"
+       x2="22.101643"
+       y2="7.6786127"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6115"
+       id="linearGradient6208"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.982516,0,-7.076703e-2)"
+       x1="21.617008"
+       y1="4.6076145"
+       x2="26.443777"
+       y2="47.007381" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6210"
+       id="linearGradient6216"
+       x1="16.845879"
+       y1="8.6784801"
+       x2="30.507824"
+       y2="78.505272"
+       gradientUnits="userSpaceOnUse" />
+    <filter
+       inkscape:collect="always"
+       id="filter5339"
+       x="-0.068965518"
+       width="1.137931"
+       y="-0.62068962"
+       height="2.2413792">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.1886709"
+         id="feGaussianBlur5341" />
+    </filter>
+  </defs>
+  <sodipodi:namedview
+     stroke="#ef2929"
+     fill="#eeeeec"
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="0.25490196"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="200.83545"
+     inkscape:cy="-11.195251"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     inkscape:grid-bbox="true"
+     inkscape:document-units="px"
+     inkscape:showpageshadow="false"
+     inkscape:window-width="663"
+     inkscape:window-height="688"
+     inkscape:window-x="355"
+     inkscape:window-y="160">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4690" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata4">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:source>http://jimmac.musichall.cz</dc:source>
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/publicdomain/" />
+        <dc:title>Generic Flash Media</dc:title>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>flash</rdf:li>
+            <rdf:li>memory</rdf:li>
+            <rdf:li>removable</rdf:li>
+            <rdf:li>photo</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+        <dc:rights>
+          <cc:Agent>
+            <dc:title>Novell, Inc., Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:rights>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/publicdomain/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     id="layer1"
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer">
+    <rect
+       style="opacity:0.43373497;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50843191px;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;filter:url(#filter5339);enable-background:accumulate"
+       id="rect4692"
+       width="41.365746"
+       height="4.5961943"
+       x="3.3587573"
+       y="41.989594"
+       rx="2.3794458"
+       ry="2.2980971"
+       transform="matrix(0.965812,0,0,1,0.8219361,0)" />
+    <path
+       style="opacity:1;color:black;fill:url(#linearGradient6208);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 5.4999978,3.2368595 L 5.4999978,43.618858 C 5.569704,44.669066 6.4987349,45.72121 7.8834214,45.616246 L 39.735278,45.616246 C 40.628844,45.573136 41.513052,44.830044 41.499984,43.358328 L 41.499984,6.4283398 C 41.499984,5.7118028 41.268737,5.2304363 40.743728,4.7146061 C 40.743728,4.7146061 37.994733,1.8791213 37.994733,1.8791213 C 37.707471,1.6077368 37.530774,1.4999993 36.735279,1.4999993 L 6.7352914,1.4999993 C 5.7977914,1.5614066 5.4374978,2.4999722 5.4999978,3.2368595 z "
+       id="path4291"
+       sodipodi:nodetypes="cccccccsccc" />
+    <rect
+       ry="1.8974454"
+       rx="1.8974441"
+       y="5.616117"
+       x="9.4999952"
+       height="16.999992"
+       width="27.976646"
+       id="rect6089"
+       style="opacity:1;color:black;fill:#edd400;fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    <rect
+       style="opacity:1;color:black;fill:url(#linearGradient6202);fill-opacity:1.0;fill-rule:evenodd;stroke:#c4a000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect4293"
+       width="27.976646"
+       height="16.999992"
+       x="9.4999952"
+       y="5.616117"
+       rx="1.8974441"
+       ry="1.8974454" />
+    <rect
+       ry="1.1461133"
+       rx="1.1461439"
+       y="6.6162395"
+       x="10.578098"
+       height="15.00028"
+       width="26.000004"
+       id="rect4295"
+       style="opacity:0.44943824;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.0000087;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       transform="matrix(1,0,-5.5327e-3,0.999985,0,0)" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 12,6.116117 L 12,12.11612 C 19.204912,9.2558473 27.058025,16.094119 35,14.11612 L 35,6.1880393 L 36,6.1880393 L 36,22.11612 L 35,22.11612 L 35,16.11612 C 26.337016,18.056862 19.445696,11.070476 12,14.11612 L 12,22.11612 L 11,22.11612 L 11,6.116117 L 12,6.116117 z "
+       id="path6043"
+       sodipodi:nodetypes="ccccccccccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 13,6.116117 L 13,10.850955 L 14,10.611733 L 14,6.116117 L 13,6.116117 z "
+       id="path6045"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 15,10.611732 L 15,6.116117 L 16,6.116117 L 16,10.523344 L 15,10.611732 z "
+       id="path6047"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 17,10.523344 L 17,6.116117 L 18,6.116117 L 18,10.674178 L 17,10.523344 z "
+       id="path6049"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 19,10.895149 L 19,6.116117 L 20,6.116117 L 20,11.11612 L 19,10.895149 z "
+       id="path6051"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 21,11.274645 L 21,6.116117 L 22,6.116117 L 22,11.451422 L 21,11.274645 z "
+       id="path6053"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6055"
+       d="M 23,11.804975 L 23,6.116117 L 24,6.116117 L 24,11.937558 L 23,11.804975 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 25,12.335305 L 25,6.116117 L 26,6.116117 L 26,12.512082 L 25,12.335305 z "
+       id="path6057"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6059"
+       d="M 27,12.733053 L 27,6.116117 L 28,6.116117 L 28,12.90983 L 27,12.733053 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 29,13.219189 L 29,6.116117 L 30,6.116117 L 30,13.307577 L 29,13.219189 z "
+       id="path6061"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6063"
+       d="M 31,13.395965 L 31,6.116117 L 32,6.116117 L 32,13.395966 L 31,13.395965 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 33,13.395965 L 33,6.116117 L 34,6.116117 L 34,13.263383 L 33,13.395965 z "
+       id="path6065"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6067"
+       d="M 13,22.070139 L 13,14.639459 L 14,14.525128 L 14,22.070139 L 13,22.070139 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6069"
+       d="M 15,14.480935 L 15,22.070139 L 16,22.070139 L 16,14.348352 L 15,14.480935 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6071"
+       d="M 17,14.348352 L 17,22.070139 L 18,22.070139 L 18,14.462683 L 17,14.348352 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6073"
+       d="M 19,14.772042 L 19,22.070139 L 20,22.070139 L 20,14.993013 L 19,14.772042 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6075"
+       d="M 21,15.232235 L 21,22.070139 L 22,22.070139 L 22,15.4974 L 21,15.232235 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 23,15.850954 L 23,22.070139 L 24,22.070139 L 24,16.204507 L 23,15.850954 z "
+       id="path6077"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6079"
+       d="M 25,16.381284 L 25,22.070139 L 26,22.070139 L 26,16.646449 L 25,16.381284 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 27,16.823226 L 27,22.070139 L 28,22.070139 L 28,17.000002 L 27,16.823226 z "
+       id="path6081"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6083"
+       d="M 29,17.176779 L 29,22.070139 L 30,22.070139 L 30,17.220973 L 29,17.176779 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       d="M 31,17.39775 L 31,22.070139 L 32,22.070139 L 32,17.265167 L 31,17.39775 z "
+       id="path6085"
+       sodipodi:nodetypes="ccccc" />
+    <path
+       id="path6087"
+       d="M 33,17.353556 L 33,22.070139 L 34,22.070139 L 34,17.176779 L 33,17.353556 z "
+       style="opacity:0.44943824;color:black;fill:white;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       sodipodi:nodetypes="ccccc" />
+    <rect
+       style="opacity:1;color:black;fill:#2e3436;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect6095"
+       width="31"
+       height="11"
+       x="8"
+       y="35.116135"
+       rx="0.81717849"
+       ry="0.81717849" />
+    <rect
+       ry="0.12967849"
+       rx="0.12967849"
+       y="36.116135"
+       x="9"
+       height="9"
+       width="29"
+       id="rect6097"
+       style="opacity:1;color:black;fill:url(#linearGradient6105);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    <rect
+       style="opacity:1;color:black;fill:#8f5902;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.80000000000000004;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect6109"
+       width="29"
+       height="3.0000017"
+       x="9"
+       y="36.116135"
+       rx="0.12967849"
+       ry="0.12967849" />
+    <rect
+       style="opacity:1;color:black;fill:#e9b96e;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.80000000000000004;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="rect6111"
+       width="10.036427"
+       height="1.9999989"
+       x="11"
+       y="37.116135"
+       rx="0.12967849"
+       ry="0.12967849" />
+    <rect
+       ry="0.12967849"
+       rx="0.12967849"
+       y="37.116135"
+       x="22.963573"
+       height="1.9999989"
+       width="4.0364265"
+       id="rect6113"
+       style="opacity:1;color:black;fill:#e9b96e;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.80000000000000004;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
+    <path
+       sodipodi:type="inkscape:offset"
+       inkscape:radius="-1.000373"
+       inkscape:original="M 6.75 1.5 C 5.8124999 1.5614073 5.4375 2.5131127 5.5 3.25 L 5.5 43.625 C 5.5697064 44.675208 6.4903135 45.729964 7.875 45.625 L 39.75 45.625 C 40.643565 45.581891 41.513068 44.815466 41.5 43.34375 L 41.5 6.4375 C 41.499999 5.7209628 41.275009 5.2345802 40.75 4.71875 C 40.749999 4.7187498 38 1.875 38 1.875 C 37.712739 1.6036155 37.545495 1.5 36.75 1.5 L 6.75 1.5 z "
+       xlink:href="#path4291"
+       style="opacity:0.17977528;color:black;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient6216);stroke-width:0.99999976;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0.8;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
+       id="path6206"
+       inkscape:href="#path4291"
+       d="M 6.8125,2.5 C 6.6714126,2.5092414 6.665484,2.505736 6.59375,2.625 C 6.522016,2.744264 6.486054,2.9918242 6.5,3.15625 C 6.501465,3.1874828 6.501465,3.2187672 6.5,3.25 L 6.5,43.5625 C 6.5340897,44.076101 6.9647984,44.689259 7.8125,44.625 C 7.8333282,44.624349 7.8541718,44.624349 7.875,44.625 L 39.6875,44.625 C 40.042231,44.607886 40.509542,44.418409 40.5,43.34375 L 40.5,6.4375 C 40.499999,5.9303711 40.465181,5.8331404 40.0625,5.4375 C 40.051855,5.4273147 40.041435,5.4168955 40.0 [...]
+  </g>
+</svg>
diff --git a/sleepyhead/icons/svg/moon.svg b/sleepyhead/icons/svg/moon.svg
new file mode 100644
index 0000000..d64f5a8
--- /dev/null
+++ b/sleepyhead/icons/svg/moon.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg id="svg1306" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="48px" width="48px" xmlns:cc="http://web.resource.org/cc/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <defs id="defs1308">
+  <radialGradient id="radialGradient5144" gradientUnits="userSpaceOnUse" cy="11.012" cx="23.071" gradientTransform="matrix(3.373 -2.7442e-17 2.7441e-17 3.373 -54.749 -26.131)" r="22.856">
+   <stop id="stop5140" style="stop-color:#fff" offset="0"/>
+   <stop id="stop5142" style="stop-color:#fff;stop-opacity:0" offset="1"/>
+  </radialGradient>
+  <radialGradient id="radialGradient5160" gradientUnits="userSpaceOnUse" cy="6.8926" cx="23.071" gradientTransform="matrix(1.4406 4.1743e-16 -4.1742e-16 1.4406 -10.166 -3.037)" r="22.813">
+   <stop id="stop5156" style="stop-color:#d9d8d6" offset="0"/>
+   <stop id="stop5158" style="stop-color:#b5b4b0" offset="1"/>
+  </radialGradient>
+  <radialGradient id="radialGradient5170" gradientUnits="userSpaceOnUse" cy="23.428" cx="23.688" r="22.451">
+   <stop id="stop5166" style="stop-color:#fff" offset="0"/>
+   <stop id="stop5168" style="stop-color:#fff;stop-opacity:0" offset="1"/>
+  </radialGradient>
+  <radialGradient id="radialGradient5197" gradientUnits="userSpaceOnUse" cy="34.537" cx="22.288" gradientTransform="matrix(1.4981 2.6197e-16 -1.9772e-16 1.1307 -11.103 -5.2888)" r="9.9375">
+   <stop id="stop5193" style="stop-color:#dadad9" offset="0"/>
+   <stop id="stop5195" style="stop-color:#dadad9;stop-opacity:0" offset="1"/>
+  </radialGradient>
+  <radialGradient id="radialGradient5205" gradientUnits="userSpaceOnUse" cy="9.7349" cx="24.125" gradientTransform="matrix(1.652 3.9356e-16 -2.5925e-16 1.0882 -15.73 3.1561)" r="15.75">
+   <stop id="stop5201" style="stop-color:#7e7878;stop-opacity:.097087" offset="0"/>
+   <stop id="stop5203" style="stop-color:#7e7878" offset="1"/>
+  </radialGradient>
+ </defs>
+ <metadata id="metadata1311">
+  <rdf:RDF>
+   <cc:Work rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <cc:license rdf:resource="http://creativecommons.org/licenses/GPL/2.0/"/>
+    <dc:title>Weather Clear (Night, 220)</dc:title>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Frank Solensky</dc:title>
+     </cc:Agent>
+    </dc:creator>
+    <dc:subject>
+     <rdf:Bag>
+      <rdf:li>weather</rdf:li>
+      <rdf:li>clear</rdf:li>
+      <rdf:li>night</rdf:li>
+      <rdf:li>moon</rdf:li>
+      <rdf:li>220</rdf:li>
+     </rdf:Bag>
+    </dc:subject>
+   </cc:Work>
+   <cc:License rdf:about="http://creativecommons.org/licenses/GPL/2.0/">
+    <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+    <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+    <cc:requires rdf:resource="http://web.resource.org/cc/Notice"/>
+    <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+    <cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
+    <cc:requires rdf:resource="http://web.resource.org/cc/SourceCode"/>
+   </cc:License>
+  </rdf:RDF>
+ </metadata>
+ <g id="layer1">
+  <path id="path5162" style="color:black;fill-rule:evenodd;fill:url(#radialGradient5170)" d="m46.139 23.428a22.451 22.451 0 1 1 -44.902 0 22.451 22.451 0 1 1 44.902 0z" transform="translate(-.14645 .10355)"/>
+  <path id="path1314" style="stroke-linejoin:round;fill-rule:evenodd;color:black;stroke:#888a85;stroke-width:1.3402;fill:url(#radialGradient5160)" d="m45.214 23.143a22.143 22.143 0 1 1 -44.285 0 22.143 22.143 0 1 1 44.285 0z" transform="matrix(.74615 0 0 .74614 6.8505 6.7539)"/>
+  <path id="path5152" style="opacity:.33146;color:black;fill-rule:evenodd;fill:url(#radialGradient5205)" d="m10.875 25s2.594 1.219 2.625 2.125-2.312 0.313-2.5 1.5 0.281 3.219 1.75 3.25 1.844-2.437 4.125-3.125 4 1.469 5 0.375-1.156-2.625-1-4.75 0.531-1.719 1.625-2.437c1.094-0.719 1.503 1.722 2.75-0.438 1.205-2.087-2.531-1.344-2.375-2.75s1.094-2.969 3-2.875 4.625 3.25 4.625 3.25c1.211 1.165 0.039 3.426 0.625 5 0.689 1.848 2.583 1.742 3.875 1.75 0 0-1.906-2.156-1.625-3.5s1.375-2.687 2.75-1. [...]
+  <path id="path2044" style="opacity:.80899;stroke-linejoin:round;color:black;stroke:url(#radialGradient5144);stroke-width:1.4272;fill:none" d="m45.214 23.143a22.143 22.143 0 1 1 -44.285 0 22.143 22.143 0 1 1 44.285 0z" transform="matrix(.70070 0 0 .70068 7.9032 7.8098)"/>
+  <path id="path5150" style="opacity:.64607;color:black;fill-rule:evenodd;fill:url(#radialGradient5197)" d="m22.625 27c0.382 1.589 0.878 2.612 1.375 3.625 1.555-0.141 2.793-0.913 4-1.75-0.723 1.509-1.572 2.934-2.648 4.207 2.266 0.881 4.367 0.688 6.398 0.043-1.425 1.193-2.807 2.115-5.713 2.396 2.098 0.634 4.423 1.362 7.338 0.479-2.677 1.546-5.488 2.717-8.75 2.625l3.229-0.045-6.479 0.295-3.375-0.625 0.125-1.5c-1.411 0.157-2.98-0.631-4.5-1.125 1.365-0.606 2.833-1.084 3.75-2.25-1.775-0.35-2. [...]
+  <path id="path4263" style="opacity:.33146;stroke-linejoin:round;fill-rule:evenodd;color:black;stroke:#888984;stroke-linecap:round;stroke-width:1.1547;fill:#bbbbb8" d="m23.875 34.5a2.25 2.25 0 1 1 -4.5 0 2.25 2.25 0 1 1 4.5 0z" transform="matrix(1 0 0 .75 0 8.7696)"/>
+  <path id="path5207" style="opacity:.71910;color:black;fill-rule:evenodd;fill:#b2afad" d="m25 21.75a2.625 2.3125 0 1 1 -5.25 0 2.625 2.3125 0 1 1 5.25 0z"/>
+  <path id="path5209" style="opacity:.71910;color:black;fill-rule:evenodd;fill:#b2afad" d="m25 21.75a2.625 2.3125 0 1 1 -5.25 0 2.625 2.3125 0 1 1 5.25 0z" transform="matrix(1.2262 0 0 1.2262 -10.092 -10.318)"/>
+  <path id="path5211" style="opacity:.71910;color:black;fill-rule:evenodd;fill:#b2afad" d="m25 21.75a2.625 2.3125 0 1 1 -5.25 0 2.625 2.3125 0 1 1 5.25 0z" transform="matrix(1.0602 .61609 -.61609 1.0602 4.4597 -11.054)"/>
+  <path id="path5213" style="opacity:.71910;color:black;fill-rule:evenodd;fill:#dfdedc" d="m25 21.75a2.625 2.3125 0 1 1 -5.25 0 2.625 2.3125 0 1 1 5.25 0z" transform="matrix(.39844 .37537 -.21748 .38767 31.502 6.348)"/>
+  <path id="path5215" style="opacity:.71910;color:black;fill-rule:evenodd;fill:#dfdedc" d="m25 21.75a2.625 2.3125 0 1 1 -5.25 0 2.625 2.3125 0 1 1 5.25 0z" transform="matrix(-.094246 .26681 -.22873 -.021843 38.661 29.472)"/>
+  <path id="path5217" style="opacity:.71910;color:black;fill-rule:evenodd;fill:#dfdedc" d="m25 21.75a2.625 2.3125 0 1 1 -5.25 0 2.625 2.3125 0 1 1 5.25 0z" transform="matrix(.21148 .19923 -.11543 .20576 34.198 11.496)"/>
+  <path id="path5219" style="opacity:.71910;color:black;fill-rule:evenodd;fill:#f7f7f6" d="m25 21.75a2.625 2.3125 0 1 1 -5.25 0 2.625 2.3125 0 1 1 5.25 0z" transform="matrix(.50220 -.21785 .27029 .35288 2.6621 8.6221)"/>
+  <path id="path5221" style="opacity:.71910;color:black;fill-rule:evenodd;fill:#f7f7f6" d="m25 21.75a2.625 2.3125 0 1 1 -5.25 0 2.625 2.3125 0 1 1 5.25 0z" transform="matrix(.30173 -.13089 .16240 .21202 12.271 8.6353)"/>
+  <path id="path5223" style="opacity:.71910;color:black;fill-rule:evenodd;fill:#f7f7f6" d="m25 21.75a2.625 2.3125 0 1 1 -5.25 0 2.625 2.3125 0 1 1 5.25 0z" transform="matrix(.21263 -.092239 .11444 .14941 14.871 10.988)"/>
+  <path id="shadow" d="m24.1 39c8.295 0 15.02-6.725 15.02-15.02s-6.725-15.02-15.02-15.02c6.355 0 11.506 6.725 11.506 15.02s-5.151 15.02-11.506 15.02z" style="opacity:.25;stroke-width:0"/>
+ </g>
+</svg>
diff --git a/sleepyhead/icons/svg/preferences.svg b/sleepyhead/icons/svg/preferences.svg
new file mode 100644
index 0000000..150606c
--- /dev/null
+++ b/sleepyhead/icons/svg/preferences.svg
@@ -0,0 +1,642 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://web.resource.org/cc/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="128"
+   height="128"
+   viewBox="0 0 128 128"
+   overflow="visible"
+   enable-background="new 0 0 128 128"
+   xml:space="preserve"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.44"
+   sodipodi:docname="startup-manager-icon.svg"
+   sodipodi:docbase="/home/jimmy/Desktop/sum-0.9"><metadata
+   id="metadata261"><rdf:RDF><cc:Work
+       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+   id="defs259" /><sodipodi:namedview
+   inkscape:window-height="626"
+   inkscape:window-width="985"
+   inkscape:pageshadow="2"
+   inkscape:pageopacity="0.0"
+   guidetolerance="10.0"
+   gridtolerance="10.0"
+   objecttolerance="10.0"
+   borderopacity="1.0"
+   bordercolor="#666666"
+   pagecolor="#ffffff"
+   id="base"
+   inkscape:zoom="3.1796875"
+   inkscape:cx="64"
+   inkscape:cy="63.842752"
+   inkscape:window-x="186"
+   inkscape:window-y="217"
+   inkscape:current-layer="svg2" />
+		<path
+   opacity="0.2"
+   fill="#333333"
+   d="M20.517,15.235c-0.602,0.351-0.973,0.977-0.991,1.673c0,0.001,0,0.002,0,0.003    c0,0.727,0.335,1.35,0.896,1.721c0,0,10.384,6.859,12.474,8.24c0.082,0.749,0.778,7.137,0.847,7.772    c-0.428,0.584-6.61,9.018-6.727,9.177c-1.338-0.574-16.143-6.925-16.143-6.925c-0.658-0.284-1.424-0.19-1.996,0.244    c-0.496,0.375-0.792,0.971-0.792,1.594l0.018,0.264c0.814,18.418,17.739,22.44,19.98,23.052c0.061,1.025,0.228,3.87,0.228,3.87    c0.06,1.038,0.921,1.865,1.961,1.883l5.68,0.103c1.094,0.02,2.007-0. [...]
+   id="path4" />
+		<path
+   opacity="0.5"
+   fill="#333333"
+   d="M21.021,15.099c-0.299,0.174-0.486,0.49-0.496,0.836c0,0.009,0,0.019,0,0.028    c0,0.335,0.168,0.649,0.449,0.834c0,0,12.128,8.012,12.866,8.5c0.088,0.809,0.866,7.951,0.94,8.625    c-0.408,0.557-6.617,9.027-7.426,10.132c-1.343-0.576-16.874-7.238-16.874-7.238c-0.33-0.142-0.711-0.095-0.998,0.122    c-0.251,0.19-0.396,0.486-0.396,0.797c0,0.043,0.003,0.087,0.009,0.131c0.996,7.526,4.849,14.36,10.093,18.055    c0.067,0.211,0.164,0.417,0.349,0.544c2.908,1.99,7.716,3.345,9.504,3.805c0.064,1.09 [...]
+   id="path6" />
+		<path
+   opacity="0.2"
+   fill="#333333"
+   d="M21.021,16.099c-0.299,0.174-0.486,0.49-0.496,0.836c0,0.009,0,0.019,0,0.028    c0,0.335,0.168,0.649,0.449,0.834c0,0,12.128,8.012,12.866,8.5c0.088,0.809,0.866,7.951,0.94,8.625    c-0.408,0.557-6.617,9.027-7.426,10.132c-1.343-0.576-16.874-7.238-16.874-7.238c-0.33-0.142-0.711-0.095-0.998,0.122    c-0.251,0.19-0.396,0.486-0.396,0.797c0,0.043,0.005,0.087,0.009,0.131C10.083,50.833,18.5,59.333,29.04,61.271    c0.064,1.09,0.27,4.591,0.27,4.591c0.03,0.522,0.458,0.933,0.98,0.941l5.682,0.103c0 [...]
+   id="path8" />
+		<linearGradient
+   id="XMLID_23_"
+   gradientUnits="userSpaceOnUse"
+   x1="18.4175"
+   y1="40.625"
+   x2="18.4175"
+   y2="51.5">
+			<stop
+   offset="0"
+   style="stop-color:#FEFEFF"
+   id="stop11" />
+			<stop
+   offset="1"
+   style="stop-color:#B3B3B3"
+   id="stop13" />
+		</linearGradient>
+		<path
+   fill="url(#XMLID_23_)"
+   d="M19.417,55c-5.667-3.703-8.426-10.417-9.332-17.265l16.665,7.099L19.417,55z"
+   id="path15" />
+		<linearGradient
+   id="XMLID_24_"
+   gradientUnits="userSpaceOnUse"
+   x1="19.0073"
+   y1="54.437"
+   x2="17.9093"
+   y2="37.7466">
+			<stop
+   offset="0.0337"
+   style="stop-color:#E8E8E8"
+   id="stop18" />
+			<stop
+   offset="0.8258"
+   style="stop-color:#FFFFFF"
+   id="stop20" />
+		</linearGradient>
+		<path
+   fill="url(#XMLID_24_)"
+   d="M19.971,54.046c-5.667-3.703-8.857-8.671-9.763-15.519l15.959,6.89L19.971,54.046z"
+   id="path22" />
+		<linearGradient
+   id="XMLID_25_"
+   gradientUnits="userSpaceOnUse"
+   x1="35.75"
+   y1="62.2119"
+   x2="30.25"
+   y2="62.2119">
+			<stop
+   offset="0"
+   style="stop-color:#C7C7C7"
+   id="stop25" />
+			<stop
+   offset="0.6348"
+   style="stop-color:#E8E8E8"
+   id="stop27" />
+			<stop
+   offset="0.8258"
+   style="stop-color:#FFFFFF"
+   id="stop29" />
+		</linearGradient>
+		<polygon
+   fill="url(#XMLID_25_)"
+   points="30.175,59.519 30.308,64.803 35.989,64.905 36.126,59.561   "
+   id="polygon31" />
+		<linearGradient
+   id="XMLID_26_"
+   gradientUnits="userSpaceOnUse"
+   x1="39.376"
+   y1="43.8345"
+   x2="43.5152"
+   y2="54.7835">
+			<stop
+   offset="0"
+   style="stop-color:#FEFEFF"
+   id="stop34" />
+			<stop
+   offset="1"
+   style="stop-color:#B3B3B3"
+   id="stop36" />
+		</linearGradient>
+		<path
+   fill="url(#XMLID_26_)"
+   d="M56.575,39.814c0-0.018-0.016-0.017-0.021-0.028c1.083-7.133-1.096-14.666-6.588-20.159    c-7.713-7.712-19.443-8.915-28.441-3.665l13.258,8.759l1.033,9.479l-15.715,21.44c5.622,3.847,12.539,4.973,18.923,3.395    c0.008,0,0.008,0.008,0.018,0.006c2.896-0.438,18.348,7.76,18.348,7.76l10.201-11.128C67.591,55.674,56.575,42.188,56.575,39.814z    "
+   id="path38" />
+		<radialGradient
+   id="XMLID_27_"
+   cx="24.4756"
+   cy="46.2295"
+   r="38.5287"
+   gradientUnits="userSpaceOnUse">
+			<stop
+   offset="0"
+   style="stop-color:#C7C7C7"
+   id="stop41" />
+			<stop
+   offset="0.6742"
+   style="stop-color:#E8E8E8"
+   id="stop43" />
+			<stop
+   offset="0.7658"
+   style="stop-color:#EAEAEA"
+   id="stop45" />
+			<stop
+   offset="0.7988"
+   style="stop-color:#F1F1F1"
+   id="stop47" />
+			<stop
+   offset="0.8222"
+   style="stop-color:#FCFCFC"
+   id="stop49" />
+			<stop
+   offset="0.8258"
+   style="stop-color:#FFFFFF"
+   id="stop51" />
+		</radialGradient>
+		<path
+   fill="url(#XMLID_27_)"
+   d="M67.701,55.563c0,0-11.071-13.431-11.125-15.75c-0.002-0.096-0.094-0.093-0.251-0.015    c1.543-6.976-0.562-14.372-6.359-20.17c-7.713-7.712-19.443-8.915-28.441-3.665l13.258,8.759l1.842,9.479L21.756,55.113    c6.865,3.773,13.019,4.449,18.662,2.413c5.051,0.544,17.564,8.684,17.564,8.684L67.701,55.563z"
+   id="path53" />
+		<path
+   opacity="0.2"
+   fill="#333333"
+   d="M68.689,55.677l-12.122,12.56c-0.376,0.39-0.378,1.006-0.006,1.392l44.62,46.358    c4.885,5.078,13.039,5.044,18.156-0.063c2.52-2.515,3.922-5.847,3.953-9.381c0.029-3.399-1.229-6.59-3.54-8.985    c-4.472-4.631-47.792-40.355-49.716-41.956C69.637,55.27,69.051,55.303,68.689,55.677z M106.338,106.566    c0.004-1.058,0.402-2.114,1.194-2.918c1.584-1.604,4.149-1.598,5.722,0.014s1.567,4.229-0.013,5.838    c-1.583,1.61-4.153,1.607-5.729-0.008C106.725,108.684,106.334,107.624,106.338,106.566z"
+   id="path55" />
+		<path
+   opacity="0.2"
+   fill="#333333"
+   d="M117.988,97.491c-4.555-4.606-50.533-41.587-50.533-41.587L55.449,68.605    c0,0,40.721,41.137,45.274,45.743c4.553,4.608,12.107,4.569,16.876-0.085C122.365,109.609,122.541,102.1,117.988,97.491z     M112.838,109.352c-1.986,1.986-5.207,1.986-7.193,0c-1.984-1.985-1.984-5.206,0-7.191c1.986-1.986,5.207-1.986,7.193,0    C114.822,104.146,114.822,107.366,112.838,109.352z"
+   id="path57" />
+		<path
+   opacity="0.2"
+   fill="#333333"
+   d="M117.988,98.491c-4.555-4.606-50.533-41.587-50.533-41.587L55.449,69.605    c0,0,40.721,41.137,45.274,45.743c4.553,4.608,12.107,4.569,16.876-0.085C122.365,110.609,122.541,103.1,117.988,98.491z     M112.838,110.352c-1.986,1.986-5.207,1.986-7.193,0c-1.984-1.985-1.984-5.206,0-7.191c1.986-1.986,5.207-1.986,7.193,0    C114.822,105.146,114.822,108.366,112.838,110.352z"
+   id="path59" />
+		<linearGradient
+   id="XMLID_28_"
+   gradientUnits="userSpaceOnUse"
+   x1="98.1143"
+   y1="78.2949"
+   x2="81.3683"
+   y2="97.5403">
+			<stop
+   offset="0.0449"
+   style="stop-color:#DB5A5A"
+   id="stop62" />
+			<stop
+   offset="0.1685"
+   style="stop-color:#940E0E"
+   id="stop64" />
+			<stop
+   offset="1"
+   style="stop-color:#B01F1F"
+   id="stop66" />
+		</linearGradient>
+		<path
+   fill="url(#XMLID_28_)"
+   d="M118.988,96.491c-4.555-4.606-50.533-41.587-50.533-41.587L56.449,67.605    c0,0,40.721,41.137,45.274,45.743c4.553,4.608,12.107,4.569,16.876-0.085C123.365,108.609,123.541,101.1,118.988,96.491z     M114.256,108.77c-2.217,2.218-5.813,2.218-8.029,0c-2.217-2.216-2.217-5.812,0-8.027c2.217-2.218,5.813-2.218,8.029,0    C116.473,102.958,116.473,106.554,114.256,108.77z"
+   id="path68" />
+		<linearGradient
+   id="XMLID_29_"
+   gradientUnits="userSpaceOnUse"
+   x1="83.9434"
+   y1="90.335"
+   x2="93.1092"
+   y2="80.4455">
+			<stop
+   offset="0"
+   style="stop-color:#B01F1F"
+   id="stop71" />
+			<stop
+   offset="0.2135"
+   style="stop-color:#EA5454"
+   id="stop73" />
+			<stop
+   offset="0.3275"
+   style="stop-color:#E55151"
+   id="stop75" />
+			<stop
+   offset="0.4584"
+   style="stop-color:#D74A4A"
+   id="stop77" />
+			<stop
+   offset="0.5976"
+   style="stop-color:#C03D3D"
+   id="stop79" />
+			<stop
+   offset="0.7427"
+   style="stop-color:#A02B2B"
+   id="stop81" />
+			<stop
+   offset="0.8907"
+   style="stop-color:#771414"
+   id="stop83" />
+			<stop
+   offset="1"
+   style="stop-color:#540000"
+   id="stop85" />
+		</linearGradient>
+		<path
+   fill="url(#XMLID_29_)"
+   d="M112.466,98.228c-4.481-4.112-44.216-36.79-44.216-36.79l-9.045,2.971    c0,0,39.148,38.565,43.4,42.871c4.451,4.511,9.313,5.187,12.155,2.41C117.605,106.912,117.155,102.525,112.466,98.228z     M113.838,108.551c-1.986,1.986-5.207,1.986-7.193,0c-1.984-1.985-1.984-5.206,0-7.191c1.986-1.986,5.207-1.986,7.193,0    C115.822,103.345,115.822,106.565,113.838,108.551z"
+   id="path87" />
+		<linearGradient
+   id="XMLID_30_"
+   gradientUnits="userSpaceOnUse"
+   x1="52.001"
+   y1="51.5474"
+   x2="33.8745"
+   y2="43.5467">
+			<stop
+   offset="0.0056"
+   style="stop-color:#575757"
+   id="stop90" />
+			<stop
+   offset="1"
+   style="stop-color:#121212"
+   id="stop92" />
+		</linearGradient>
+		<path
+   fill="url(#XMLID_30_)"
+   d="M53.236,46.882c0.433,0.339,0.51,0.971,0.17,1.404l-6.004,7.665    c-0.339,0.433-0.971,0.51-1.404,0.17l-5.889-4.613c-0.433-0.339-0.51-0.971-0.17-1.404l6.004-7.664    c0.339-0.433,0.971-0.51,1.404-0.17L53.236,46.882z"
+   id="path94" />
+		<linearGradient
+   id="XMLID_31_"
+   gradientUnits="userSpaceOnUse"
+   x1="45.8618"
+   y1="43.4946"
+   x2="52.3567"
+   y2="48.5691">
+			<stop
+   offset="0.0056"
+   style="stop-color:#666666"
+   id="stop97" />
+			<stop
+   offset="0.4494"
+   style="stop-color:#CCCCCC"
+   id="stop99" />
+			<stop
+   offset="1"
+   style="stop-color:#666666"
+   id="stop101" />
+		</linearGradient>
+		<path
+   fill="url(#XMLID_31_)"
+   d="M47.999,43.606l-1.487,1.954l0.908,0.709l1.487-1.954L47.999,43.606z M47.405,43.142    c-0.434-0.339-1.065-0.261-1.403,0.172l-0.281,0.359c-0.338,0.434-0.261,1.065,0.173,1.404l0.066,0.052l1.488-1.954L47.405,43.142    z M49.458,44.746L47.971,46.7l0.917,0.716l1.487-1.954L49.458,44.746z M52.354,47.021l-1.472,1.934    c0.43,0.284,1.013,0.206,1.335-0.207l0.28-0.358C52.826,47.968,52.755,47.366,52.354,47.021z M50.927,45.894l-1.487,1.954    l0.882,0.689l1.487-1.954L50.927,45.894z"
+   id="path103" />
+		<linearGradient
+   id="XMLID_32_"
+   gradientUnits="userSpaceOnUse"
+   x1="40.8931"
+   y1="49.6196"
+   x2="47.3879"
+   y2="54.6941">
+			<stop
+   offset="0.0056"
+   style="stop-color:#666666"
+   id="stop106" />
+			<stop
+   offset="0.4494"
+   style="stop-color:#CCCCCC"
+   id="stop108" />
+			<stop
+   offset="1"
+   style="stop-color:#666666"
+   id="stop110" />
+		</linearGradient>
+		<path
+   fill="url(#XMLID_32_)"
+   d="M43.03,49.731l-1.487,1.954l0.908,0.709l1.487-1.954L43.03,49.731z M42.437,49.267    c-0.434-0.339-1.065-0.261-1.403,0.172l-0.281,0.359c-0.338,0.434-0.261,1.065,0.173,1.404l0.066,0.052l1.488-1.954L42.437,49.267    z M44.49,50.871l-1.487,1.954l0.917,0.716l1.487-1.954L44.49,50.871z M47.386,53.146l-1.472,1.934    c0.43,0.284,1.013,0.206,1.335-0.207l0.28-0.358C47.857,54.093,47.787,53.491,47.386,53.146z M45.958,52.019l-1.487,1.954    l0.882,0.689l1.487-1.954L45.958,52.019z"
+   id="path112" />
+		<linearGradient
+   id="XMLID_33_"
+   gradientUnits="userSpaceOnUse"
+   x1="43.2676"
+   y1="46.5566"
+   x2="49.7632"
+   y2="51.6317">
+			<stop
+   offset="0.0056"
+   style="stop-color:#666666"
+   id="stop115" />
+			<stop
+   offset="0.4494"
+   style="stop-color:#CCCCCC"
+   id="stop117" />
+			<stop
+   offset="1"
+   style="stop-color:#666666"
+   id="stop119" />
+		</linearGradient>
+		<path
+   fill="url(#XMLID_33_)"
+   d="M45.405,46.668l-1.487,1.954l0.908,0.709l1.487-1.954L45.405,46.668z M44.812,46.205    c-0.434-0.339-1.065-0.261-1.403,0.172l-0.281,0.359c-0.338,0.434-0.261,1.065,0.173,1.404l0.066,0.052l1.488-1.954L44.812,46.205    z M46.865,47.809l-1.487,1.954l0.917,0.716l1.487-1.954L46.865,47.809z M49.761,50.083l-1.472,1.934    c0.43,0.284,1.013,0.206,1.335-0.207l0.28-0.358C50.232,51.031,50.162,50.428,49.761,50.083z M48.333,48.956l-1.487,1.954    l0.882,0.689l1.487-1.954L48.333,48.956z"
+   id="path121" />
+		<polygon
+   fill="#808080"
+   points="31.195,59.635 31.492,64.825 31.924,59.691   "
+   id="polygon123" />
+		<polygon
+   fill="#808080"
+   points="32.959,59.731 33.216,64.855 33.823,59.73   "
+   id="polygon125" />
+		<polygon
+   fill="#808080"
+   points="35.504,59.577 34.812,64.884 34.636,59.701   "
+   id="polygon127" />
+		
+		
+		
+		
+		
+		
+		
+		<linearGradient
+   id="XMLID_34_"
+   gradientUnits="userSpaceOnUse"
+   x1="64.5864"
+   y1="53.1055"
+   x2="73.5038"
+   y2="62.0233">
+			<stop
+   offset="0"
+   style="stop-color:#F36600"
+   id="stop144" />
+			<stop
+   offset="0.1798"
+   style="stop-color:#E69C2E"
+   id="stop146" />
+			<stop
+   offset="0.5056"
+   style="stop-color:#D66628"
+   id="stop148" />
+			<stop
+   offset="1"
+   style="stop-color:#F36600"
+   id="stop150" />
+		</linearGradient>
+		
+		
+		
+		
+			<linearGradient
+   id="XMLID_35_"
+   gradientUnits="userSpaceOnUse"
+   x1="71.9912"
+   y1="115.9727"
+   x2="80.8662"
+   y2="124.8477"
+   gradientTransform="matrix(0.9027 -0.086 -0.086 0.9027 -18.4803 -14.1634)">
+			<stop
+   offset="0"
+   style="stop-color:#E0E0E0"
+   id="stop159" />
+			<stop
+   offset="0.2921"
+   style="stop-color:#FFFFFF"
+   id="stop161" />
+			<stop
+   offset="1"
+   style="stop-color:#636363"
+   id="stop163" />
+		</linearGradient>
+		
+		<linearGradient
+   id="XMLID_36_"
+   gradientUnits="userSpaceOnUse"
+   x1="9.0532"
+   y1="110.1631"
+   x2="17.5065"
+   y2="118.6163">
+			<stop
+   offset="0"
+   style="stop-color:#FFFFFF"
+   id="stop168" />
+			<stop
+   offset="1"
+   style="stop-color:#B1B1B1"
+   id="stop170" />
+		</linearGradient>
+		
+		
+			<linearGradient
+   id="XMLID_37_"
+   gradientUnits="userSpaceOnUse"
+   x1="41.2607"
+   y1="153.6055"
+   x2="41.9912"
+   y2="134.8568"
+   gradientTransform="matrix(0.9204 -0.0796 -0.0796 0.9204 -13.4588 -13.4578)">
+			<stop
+   offset="0"
+   style="stop-color:#B9B9B9"
+   id="stop175" />
+			<stop
+   offset="1"
+   style="stop-color:#F0F0F0"
+   id="stop177" />
+		</linearGradient>
+		
+		
+			<linearGradient
+   id="XMLID_38_"
+   gradientUnits="userSpaceOnUse"
+   x1="47.8774"
+   y1="-8.1499"
+   x2="52.3013"
+   y2="-3.7261"
+   gradientTransform="matrix(1.2065 0.1902 0.1902 1.2065 35.8319 31.1386)">
+			<stop
+   offset="0"
+   style="stop-color:#F36600"
+   id="stop182" />
+			<stop
+   offset="0.2697"
+   style="stop-color:#AD5220"
+   id="stop184" />
+			<stop
+   offset="0.6573"
+   style="stop-color:#D66628"
+   id="stop186" />
+			<stop
+   offset="1"
+   style="stop-color:#F36600"
+   id="stop188" />
+		</linearGradient>
+		
+		
+			<linearGradient
+   id="XMLID_39_"
+   gradientUnits="userSpaceOnUse"
+   x1="1180.4746"
+   y1="-1103.4536"
+   x2="1184.8984"
+   y2="-1099.0298"
+   gradientTransform="matrix(0.6541 0.5357 0.5357 0.6541 -119.4234 151.2162)">
+			<stop
+   offset="0"
+   style="stop-color:#F36600"
+   id="stop193" />
+			<stop
+   offset="0.2697"
+   style="stop-color:#AD5220"
+   id="stop195" />
+			<stop
+   offset="0.6573"
+   style="stop-color:#D66628"
+   id="stop197" />
+			<stop
+   offset="1"
+   style="stop-color:#F36600"
+   id="stop199" />
+		</linearGradient>
+		
+		
+			<linearGradient
+   id="XMLID_40_"
+   gradientUnits="userSpaceOnUse"
+   x1="-523.8857"
+   y1="23.8618"
+   x2="-527.3676"
+   y2="20.3791"
+   gradientTransform="matrix(-0.9814 -0.0021 -0.0021 -0.9814 -415.6453 58.6818)">
+			<stop
+   offset="0.2079"
+   style="stop-color:#F36600"
+   id="stop204" />
+			<stop
+   offset="0.27"
+   style="stop-color:#F77207"
+   id="stop206" />
+			<stop
+   offset="0.3726"
+   style="stop-color:#FC800E"
+   id="stop208" />
+			<stop
+   offset="0.5031"
+   style="stop-color:#FE8813"
+   id="stop210" />
+			<stop
+   offset="0.7528"
+   style="stop-color:#FF8A14"
+   id="stop212" />
+			<stop
+   offset="0.9719"
+   style="stop-color:#F36600"
+   id="stop214" />
+		</linearGradient>
+		
+		
+			<linearGradient
+   id="XMLID_41_"
+   gradientUnits="userSpaceOnUse"
+   x1="-492.0532"
+   y1="-8.2593"
+   x2="-495.402"
+   y2="-11.609"
+   gradientTransform="matrix(-0.9814 -0.0021 -0.0021 -0.9814 -415.6453 58.6818)">
+			<stop
+   offset="0.2079"
+   style="stop-color:#F36600"
+   id="stop219" />
+			<stop
+   offset="0.27"
+   style="stop-color:#F77207"
+   id="stop221" />
+			<stop
+   offset="0.3726"
+   style="stop-color:#FC800E"
+   id="stop223" />
+			<stop
+   offset="0.5031"
+   style="stop-color:#FE8813"
+   id="stop225" />
+			<stop
+   offset="0.7528"
+   style="stop-color:#FF8A14"
+   id="stop227" />
+			<stop
+   offset="0.9719"
+   style="stop-color:#F36600"
+   id="stop229" />
+		</linearGradient>
+		
+		
+			<linearGradient
+   id="XMLID_42_"
+   gradientUnits="userSpaceOnUse"
+   x1="69.6611"
+   y1="2.6816"
+   x2="73.6945"
+   y2="6.715"
+   gradientTransform="matrix(1.0759,9.66e-2,9.66e-2,1.0759,8.868544,28.60116)">
+			<stop
+   offset="0"
+   style="stop-color:#F36600"
+   id="stop234" />
+			<stop
+   offset="0.4775"
+   style="stop-color:#FFCC33"
+   id="stop236" />
+			<stop
+   offset="0.7865"
+   style="stop-color:#F36600"
+   id="stop238" />
+		</linearGradient>
+		
+		<linearGradient
+   id="XMLID_43_"
+   gradientUnits="userSpaceOnUse"
+   x1="56.7744"
+   y1="57.064"
+   x2="61.1525"
+   y2="61.442">
+			<stop
+   offset="0"
+   style="stop-color:#F36600"
+   id="stop243" />
+			<stop
+   offset="0.4775"
+   style="stop-color:#FFCC33"
+   id="stop245" />
+			<stop
+   offset="0.7865"
+   style="stop-color:#F36600"
+   id="stop247" />
+		</linearGradient>
+		
+		<linearGradient
+   id="XMLID_44_"
+   gradientUnits="userSpaceOnUse"
+   x1="56.4507"
+   y1="67.1641"
+   x2="60.4092"
+   y2="71.123">
+			<stop
+   offset="0"
+   style="stop-color:#CCCCCC"
+   id="stop252" />
+			<stop
+   offset="1"
+   style="stop-color:#999999"
+   id="stop254" />
+		</linearGradient>
+		
+</svg>
\ No newline at end of file
diff --git a/sleepyhead/icons/trophy.png b/sleepyhead/icons/trophy.png
new file mode 100644
index 0000000..3def81d
Binary files /dev/null and b/sleepyhead/icons/trophy.png differ
diff --git a/sleepyhead/logger.cpp b/sleepyhead/logger.cpp
new file mode 100644
index 0000000..a57ba8f
--- /dev/null
+++ b/sleepyhead/logger.cpp
@@ -0,0 +1,146 @@
+/* SleepyHead Logger module implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "logger.h"
+
+QThreadPool * otherThreadPool = NULL;
+
+#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
+void MyOutputHandler(QtMsgType type, const char *msgtxt)
+{
+
+#else
+void MyOutputHandler(QtMsgType type, const QMessageLogContext &context, const QString &msgtxt)
+{
+    Q_UNUSED(context)
+#endif
+
+    if (!logger) {
+#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+        fprintf(stderr, "Pre/Post: %s\n", msgtxt.toLocal8Bit().constData());
+#else
+        fprintf(stderr, "Pre/Post: %s\n", msgtxt);
+#endif
+        return;
+    }
+
+    QString msg, typestr;
+
+    switch (type) {
+    case QtWarningMsg:
+        typestr = QString("Warning: ");
+        break;
+
+    case QtFatalMsg:
+        typestr = QString("Fatal: ");
+        break;
+
+    case QtCriticalMsg:
+        typestr = QString("Critical: ");
+        break;
+
+    default:
+        typestr = QString("Debug: ");
+        break;
+    }
+
+#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+    msg = typestr +
+          msgtxt; //+QString(" (%1:%2, %3)").arg(context.file).arg(context.line).arg(context.function);
+#else
+    msg = typestr + msgtxt;
+#endif
+
+    if (logger && logger->isRunning()) {
+        logger->append(msg);
+    } else {
+        fprintf(stderr, "%s\n", msg.toLocal8Bit().data());
+    }
+
+    if (type == QtFatalMsg) {
+        abort();
+    }
+
+}
+
+void initializeLogger()
+{
+    logger = new LogThread();
+    otherThreadPool = new QThreadPool();
+    bool b = otherThreadPool->tryStart(logger);
+#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+    qInstallMessageHandler(MyOutputHandler);
+#else
+    qInstallMsgHandler(MyOutputHandler);
+#endif
+    if (b) {
+        qWarning() << "Started logging thread";
+    } else {
+        qWarning() << "Logging thread did not start correctly";
+    }
+
+}
+
+void shutdownLogger()
+{
+    if (logger) {
+        logger->quit();
+        otherThreadPool->waitForDone(-1);
+        logger = NULL;
+    }
+    delete otherThreadPool;
+}
+
+LogThread * logger = NULL;
+
+void LogThread::append(QString msg)
+{
+    QString tmp = QString("%1: %2").arg(logtime.elapsed(), 5, 10, QChar('0')).arg(msg);
+    //QStringList appears not to be threadsafe
+    strlock.lock();
+    buffer.append(tmp);
+    strlock.unlock();
+}
+
+void LogThread::appendClean(QString msg)
+{
+    strlock.lock();
+    buffer.append(msg);
+    strlock.unlock();
+}
+
+
+void LogThread::quit() {
+    qDebug() << "Shutting down logging thread";
+    running = false;
+    strlock.lock();
+    while (!buffer.isEmpty()) {
+        QString msg = buffer.takeFirst();
+        fprintf(stderr, "%s\n", msg.toLocal8Bit().constData());
+    }
+    strlock.unlock();
+}
+
+
+void LogThread::run()
+{
+    running = true;
+    do {
+        strlock.lock();
+        //int r = receivers(SIGNAL(outputLog(QString())));
+        while (!buffer.isEmpty()) {
+            QString msg = buffer.takeFirst();
+                fprintf(stderr, "%s\n", msg.toLocal8Bit().data());
+                emit outputLog(msg);
+        }
+        strlock.unlock();
+        QThread::msleep(1000);
+    } while (running);
+}
+
+
diff --git a/sleepyhead/logger.h b/sleepyhead/logger.h
new file mode 100644
index 0000000..0ae287b
--- /dev/null
+++ b/sleepyhead/logger.h
@@ -0,0 +1,46 @@
+#ifndef LOGGER_H
+#define LOGGER_H
+
+#include <QDebug>
+#include <QRunnable>
+#include <QThreadPool>
+#include <QMutex>
+#include <QTime>
+
+void initializeLogger();
+void shutdownLogger();
+
+#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
+void MyOutputHandler(QtMsgType type, const char *msgtxt);
+#else
+void MyOutputHandler(QtMsgType type, const QMessageLogContext &context, const QString &msgtxt);
+#endif
+
+class LogThread:public QObject, public QRunnable
+{
+    Q_OBJECT
+public:
+    explicit LogThread() : QRunnable() { running = false; logtime.start(); }
+    virtual ~LogThread() {}
+
+    void run();
+    void append(QString msg);
+    void appendClean(QString msg);
+    bool isRunning() { return running; }
+
+    void quit();
+
+    QStringList buffer;
+    QMutex strlock;
+    QThreadPool *threadpool;
+signals:
+    void outputLog(QString);
+protected:
+    volatile bool running;
+    QTime logtime;
+};
+
+extern LogThread * logger;
+extern QThreadPool * otherThreadPool;
+
+#endif // LOGGER_H
diff --git a/sleepyhead/main.cpp b/sleepyhead/main.cpp
new file mode 100644
index 0000000..ead4559
--- /dev/null
+++ b/sleepyhead/main.cpp
@@ -0,0 +1,408 @@
+/* SleepyHead Main
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+//#include <QtPlugin>
+#include <QApplication>
+#include <QMessageBox>
+#include <QFontDatabase>
+#include <QStringList>
+#include <QDebug>
+#include <QPushButton>
+#include <QWebFrame>
+#include <QWebView>
+#include <QTranslator>
+#include <QDir>
+#include <QComboBox>
+#include <QPushButton>
+#include <QSettings>
+#include <QFileDialog>
+#include <QSysInfo>
+
+#include "version.h"
+#include "logger.h"
+#include "SleepLib/schema.h"
+#include "mainwindow.h"
+#include "SleepLib/profiles.h"
+#include "profileselect.h"
+#include "newprofile.h"
+#include "translation.h"
+#include "common_gui.h"
+#include "SleepLib/machine_loader.h"
+
+
+// Gah! I must add the real darn plugin system one day.
+#include "SleepLib/loader_plugins/prs1_loader.h"
+#include "SleepLib/loader_plugins/cms50_loader.h"
+#include "SleepLib/loader_plugins/cms50f37_loader.h"
+#include "SleepLib/loader_plugins/md300w1_loader.h"
+#include "SleepLib/loader_plugins/zeo_loader.h"
+#include "SleepLib/loader_plugins/somnopose_loader.h"
+#include "SleepLib/loader_plugins/resmed_loader.h"
+#include "SleepLib/loader_plugins/intellipap_loader.h"
+#include "SleepLib/loader_plugins/icon_loader.h"
+#include "SleepLib/loader_plugins/weinmann_loader.h"
+
+
+#ifdef Q_WS_X11
+#include <X11/Xlib.h>
+#endif
+
+MainWindow *mainwin = nullptr;
+
+void initialize()
+{
+    schema::init();
+}
+
+void release_notes()
+{
+    QDialog relnotes;
+    relnotes.setWindowTitle(STR_TR_SleepyHead + " " + QObject::tr("Release Notes") +" "+FullVersionString);
+    QVBoxLayout layout(&relnotes);
+    QWebView web(&relnotes);
+
+    // Language???
+
+    web.load(QUrl("qrc:/docs/release_notes.html"));
+
+    //web.page()->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOn);
+    relnotes.setLayout(&layout);
+    layout.insertWidget(0, &web, 1);
+    QPushButton okbtn(QObject::tr("&Ok, get on with it.."), &relnotes);
+    relnotes.connect(&okbtn, SIGNAL(clicked()), SLOT(accept()));
+    layout.insertWidget(1, &okbtn, 1);
+    QApplication::processEvents(); // MW: Needed on Mac, as the html has to finish loading
+
+    relnotes.exec();
+}
+
+void sDelay(int s)
+{
+    // QThread::msleep() is exposed in Qt5
+#ifdef Q_OS_WIN32
+    Sleep(s * 1000);
+#else
+    sleep(s);
+#endif
+}
+
+int compareVersion(QString version);
+
+
+int main(int argc, char *argv[])
+{
+#ifdef Q_WS_X11
+    XInitThreads();
+#endif
+
+#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
+    QGL::setPreferredPaintEngine(QPaintEngine::OpenGL);
+#endif
+
+    bool force_login_screen = false;
+    bool force_data_dir = false;
+
+    QApplication a(argc, argv);
+    QStringList args = QCoreApplication::arguments();
+
+    QSettings settings(getDeveloperName(), getAppName());
+
+    for (int i = 1; i < args.size(); i++) {
+        if (args[i] == "-l") { force_login_screen = true; }
+        else if (args[i] == "-d") { force_data_dir = true; }
+        else if (args[i] == "-language") {
+            settings.setValue("Settings/Language","");
+        } else if (args[i] == "-p") {
+            sDelay(1);
+        }
+    }
+
+    initializeLogger();
+
+
+    ////////////////////////////////////////////////////////////////////////////////////////////
+    // Language Selection
+    ////////////////////////////////////////////////////////////////////////////////////////////
+    initTranslations(settings);
+    initializeStrings(); // Important, call this AFTER translator is installed.
+    a.setApplicationName(STR_TR_SleepyHead);
+
+    float glversion = getOpenGLVersion();
+
+    bool opengl2supported = glversion >= 2.0;
+    bool bad_graphics = !opengl2supported;
+    bool intel_graphics = getOpenGLVersionString().contains("INTEL", Qt::CaseInsensitive);
+
+#if defined(Q_OS_WIN)
+    bool angle_supported = getGraphicsEngine().contains(CSTR_GFX_ANGLE, Qt::CaseInsensitive) && (QSysInfo::windowsVersion() >= QSysInfo::WV_VISTA);
+    if (bad_graphics) {
+        bad_graphics = !angle_supported;
+    }
+#endif
+
+    QString lookfor = QObject::tr("Look for this build in <a href='%1'>SleepyHead's files hosted on Sourceforge</a>.").arg("http://sf.net/projects/sleepyhead/files");
+#ifdef BROKEN_OPENGL_BUILD
+    Q_UNUSED(bad_graphics)
+    Q_UNUSED(intel_graphics)
+
+    QString betterbuild = "Settings/BetterBuild";
+
+    QString fasterbuildavailable = QObject::tr("A faster build of SleepyHead may be available");
+    QString notbotheragain = QObject::tr("You will not be bothered with this message again.");
+    QString betterresults = QObject::tr("This version will run fine, but a \"<b>%1</b>\" tagged build of SleepyHead will likely run much smoother on your computer.");
+
+    if (opengl2supported) {
+        if (!settings.value(betterbuild, false).toBool()) {
+            QMessageBox::information(nullptr, fasterbuildavailable,
+                             QObject::tr("This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, but it looks like your computer has full support for it.") + "<br/><br/>"+
+                             betterresults.arg("-OpenGL")+"<br/><br/>"+
+                             lookfor + "<br/><br/>"+
+                             notbotheragain, QMessageBox::Ok, QMessageBox::Ok);
+            settings.setValue(betterbuild, true);
+        }
+    } else {
+#if defined(Q_OS_WIN)
+        if (angle_supported) {
+            if (!settings.value(betterbuild, false).toBool()) {
+                QMessageBox::information(nullptr, fasterbuildavailable,
+                             QObject::tr("This build of SleepyHead was designed to work with older computers lacking OpenGL 2.0 support, which yours doesn't have, but there may still be a better version available for your computer.") + "<br/><br/>"+
+                             betterresults.arg("-ANGLE")+"<br/><br/>"+
+                             QObject::tr("If you are running this in a virtual machine like VirtualBox or VMware, please disregard this message, as no better build is available.")+"<br/><br/>"+
+                             lookfor + "<br/><br/>"+
+                             notbotheragain, QMessageBox::Ok, QMessageBox::Ok);
+                settings.setValue(betterbuild, true);
+            }
+        }
+#endif
+    }
+#else
+    if (bad_graphics) {
+        QMessageBox::warning(nullptr, QObject::tr("Incompatible Graphics Hardware"),
+                             QObject::tr("This build of SleepyHead requires OpenGL 2.0 support to function correctly, and unfortunately your computer lacks this capability.") + "<br/><br/>"+
+                             QObject::tr("You may need to update your computers graphics drivers from the GPU makers website. %1").
+                                arg(intel_graphics ? QObject::tr("(<a href='http://intel.com/support'>Intel's support site</a>)") : "")+"<br/><br/>"+
+                             QObject::tr("Because graphs will not render correctly, and it may cause crashes, this build will now exit.")+"<br/><br/>"+
+                             QObject::tr("Don't be disheartened, there is another build available tagged \"<b>-BrokenGL</b>\" that should work on your computer.")+ "<br/><br/>"+
+                             lookfor+ "<br/><br/>"
+
+
+                             ,QMessageBox::Ok, QMessageBox::Ok);
+        exit(1);
+    }
+#endif
+
+    ////////////////////////////////////////////////////////////////////////////////////////////
+    // Datafolder location Selection
+    ////////////////////////////////////////////////////////////////////////////////////////////
+    bool change_data_dir = force_data_dir;
+
+    bool havefolder = false;
+
+    if (!settings.contains("Settings/AppRoot")) {
+        change_data_dir = true;
+    } else {
+        QDir dir(GetAppRoot());
+
+        if (!dir.exists()) {
+            change_data_dir = true;
+        } else { havefolder = true; }
+    }
+
+    if (!havefolder && !force_data_dir) {
+        if (QMessageBox::question(nullptr, STR_MessageBox_Question,
+                                  QObject::tr("No SleepyHead data folder was found.")+"\n\n"+QObject::tr("Would you like SleepyHead to use the default location for storing its data?")+"\n\n"+
+                                  QDir::toNativeSeparators(GetAppRoot()), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) {
+            settings.setValue("Settings/AppRoot", GetAppRoot());
+            change_data_dir = false;
+        }
+    }
+
+retry_directory:
+
+    if (change_data_dir) {
+        QString datadir = QFileDialog::getExistingDirectory(nullptr,
+                          QObject::tr("Choose or create new folder for SleepyHead data"), GetAppRoot(),
+                          QFileDialog::ShowDirsOnly);
+
+        if (datadir.isEmpty()) {
+            if (!havefolder) {
+                QMessageBox::information(nullptr, QObject::tr("Exiting"),
+                                         QObject::tr("As you did not select a data folder, SleepyHead will exit.")+"\n\n"+QObject::tr("Next time you run, you will be asked again."));
+                return 0;
+            } else {
+                QMessageBox::information(nullptr, STR_MessageBox_Warning,
+                                         QObject::tr("You did not select a directory.")+"\n\n"+QObject::tr("SleepyHead will now start with your old one.")+"\n\n"+
+                                         QDir::toNativeSeparators(GetAppRoot()), QMessageBox::Ok);
+            }
+        } else {
+            QDir dir(datadir);
+            QFile file(datadir + "/Preferences.xml");
+
+            if (!file.exists()) {
+                if (dir.count() > 2) {
+                    // Not a new directory.. nag the user.
+                    if (QMessageBox::question(nullptr, STR_MessageBox_Warning,
+                                              QObject::tr("The folder you chose is not empty, nor does it already contain valid SleepyHead data.")
+                                              + "\n\n"+QObject::tr("Are you sure you want to use this folder?")+"\n\n"
+                                              + datadir, QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) {
+                        goto retry_directory;
+                    }
+                }
+            }
+
+            settings.setValue("Settings/AppRoot", datadir);
+            qDebug() << "Changing data folder to" << datadir;
+        }
+    }
+
+    ////////////////////////////////////////////////////////////////////////////////////////////
+    // Register Importer Modules for autoscanner
+    ////////////////////////////////////////////////////////////////////////////////////////////
+    initialize();
+    PRS1Loader::Register();
+    ResmedLoader::Register();
+    IntellipapLoader::Register();
+    FPIconLoader::Register();
+    WeinmannLoader::Register();
+    CMS50Loader::Register();
+    CMS50F37Loader::Register();
+    MD300W1Loader::Register();
+    //ZEOLoader::Register(); // Use outside of directory importer..
+
+    schema::setOrders();
+
+    p_pref = new Preferences("Preferences");
+    p_layout = new Preferences("Layout");
+
+    PREF.Open();
+    LAYOUT.Open();
+
+    // Scan for user profiles
+    Profiles::Scan();
+
+
+    //qRegisterMetaType<Preference>("Preference");
+    PREF["AppName"] = STR_TR_SleepyHead;
+
+    // Skip login screen, unless asked not to on the command line
+    bool skip_login = PREF.ExistsAndTrue(STR_GEN_SkipLogin);
+
+    if (force_login_screen) { skip_login = false; }
+
+    // Todo: Make a wrapper for Preference settings, like Profile settings have..
+    QDateTime lastchecked, today = QDateTime::currentDateTime();
+
+    PREF.init(STR_GEN_UpdatesAutoCheck, true);
+    PREF.init(STR_GEN_UpdateCheckFrequency, 7);    // days
+    PREF.init(STR_PREF_AllowEarlyUpdates, false);
+
+    ////////////////////////////////////////////////////////////////////////////////////////////
+    // Check when last checked for updates..
+    ////////////////////////////////////////////////////////////////////////////////////////////
+    bool check_updates = false;
+
+    if (PREF[STR_GEN_UpdatesAutoCheck].toBool()) {
+        int update_frequency = PREF[STR_GEN_UpdateCheckFrequency].toInt();
+        int days = 1000;
+        lastchecked = PREF[STR_GEN_UpdatesLastChecked].toDateTime();
+
+        if (PREF.contains(STR_GEN_UpdatesLastChecked)) {
+            days = lastchecked.secsTo(today);
+            days /= 86400;
+        };
+
+        if (days > update_frequency) {
+            check_updates = true;
+        }
+    }
+
+    if (!Profiles::profiles.size()) {
+        // Show New User wizard..
+        NewProfile newprof(0);
+
+        if (newprof.exec() == NewProfile::Rejected) {
+            return 0;
+        }
+
+        release_notes();
+    } else {
+        if (PREF.contains(STR_PREF_VersionString)) {
+
+            int vc = compareVersion(PREF[STR_PREF_VersionString].toString());
+            if (vc < 0) {
+                release_notes();
+
+                check_updates = false;
+            } else if (vc > 0) {
+                if (QMessageBox::warning(nullptr, STR_MessageBox_Error, QObject::tr("The version of SleepyHead you just ran is OLDER than the one used to create this data (%1).").arg(PREF[STR_PREF_VersionString].toString()) +"\n\n"+
+                                         QObject::tr("It is likely that doing this will cause data corruption, are you sure you want to do this?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
+
+                    return 0;
+                }
+
+            }
+        }
+
+        ProfileSelect profsel(0);
+
+        if (skip_login) {
+            profsel.QuickLogin();
+
+            if (profsel.result() == ProfileSelect::Rejected) {
+                exit(1);
+            }
+
+            p_profile = Profiles::Get(PREF[STR_GEN_Profile].toString());
+        } else { p_profile = nullptr; }
+
+        if (!p_profile) {
+            if (profsel.exec() == ProfileSelect::Rejected) {
+                exit(1);
+            }
+        }
+    }
+
+    PREF[STR_PREF_VersionString] = FullVersionString;
+
+    p_profile = Profiles::Get(PREF[STR_GEN_Profile].toString());
+
+    qDebug() << "Opened Profile" << p_profile->user->userName();
+
+    //    int id=QFontDatabase::addApplicationFont(":/fonts/FreeSans.ttf");
+    //    QFontDatabase fdb;
+    //    QStringList ffam=fdb.families();
+    //    for (QStringList::iterator i=ffam.begin();i!=ffam.end();i++) {
+    //        qDebug() << "Loaded Font: " << (*i);
+    //    }
+
+    if (!PREF.contains("Fonts_Application_Name")) {
+        PREF["Fonts_Application_Name"] = "Sans Serif";
+        PREF["Fonts_Application_Size"] = 10;
+        PREF["Fonts_Application_Bold"] = false;
+        PREF["Fonts_Application_Italic"] = false;
+    }
+
+
+    QApplication::setFont(QFont(PREF["Fonts_Application_Name"].toString(),
+                                PREF["Fonts_Application_Size"].toInt(),
+                                PREF["Fonts_Application_Bold"].toBool() ? QFont::Bold : QFont::Normal,
+                                PREF["Fonts_Application_Italic"].toBool()));
+
+    qDebug() << "Selected Font" << QApplication::font().family();
+
+    // Must be initialized AFTER profile creation
+    MainWindow w;
+
+    mainwin = &w;
+
+  //  if (check_updates) { mainwin->CheckForUpdates(); }
+
+    w.show();
+
+    return a.exec();
+}
diff --git a/sleepyhead/mainwindow.cpp b/sleepyhead/mainwindow.cpp
new file mode 100644
index 0000000..c835ee8
--- /dev/null
+++ b/sleepyhead/mainwindow.cpp
@@ -0,0 +1,2714 @@
+/* SleepyHead MainWindow Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QGLFormat>
+#include <QFileDialog>
+#include <QMessageBox>
+#include <QResource>
+#include <QProgressBar>
+#include <QWebHistory>
+#include <QWebFrame>
+#include <QNetworkRequest>
+#include <QDesktopServices>
+#include <QNetworkReply>
+#include <QTimer>
+#include <QSettings>
+#include <QPixmap>
+#include <QDesktopWidget>
+#include <QListView>
+#include <QPrinter>
+#include <QPrintDialog>
+#include <QPainter>
+#include <QProcess>
+#include <QFontMetrics>
+#include <QTextDocument>
+#include <QTranslator>
+#include <QPushButton>
+#include <QCalendarWidget>
+
+#include "common_gui.h"
+#include "version.h"
+
+
+#include <cmath>
+
+// Custom loaders that don't autoscan..
+#include <SleepLib/loader_plugins/zeo_loader.h>
+#include <SleepLib/loader_plugins/somnopose_loader.h>
+
+#ifndef REMSTAR_M_SUPPORT
+#include <SleepLib/loader_plugins/mseries_loader.h>
+#endif
+
+#include "logger.h"
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include "newprofile.h"
+#include "exportcsv.h"
+#include "SleepLib/schema.h"
+#include "Graphs/glcommon.h"
+#include "UpdaterWindow.h"
+#include "SleepLib/calcs.h"
+#include "SleepLib/progressdialog.h"
+#include "version.h"
+
+#include "reports.h"
+#include "statistics.h"
+
+QProgressBar *qprogress;
+QLabel *qstatus;
+QStatusBar *qstatusbar;
+
+extern Profile *profile;
+
+QString getOpenGLVersionString()
+{
+    static QString glversion;
+
+    if (glversion.isEmpty()) {
+        QGLWidget w;
+        w.makeCurrent();
+
+        glversion = QString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
+        qDebug() << "OpenGL Version:" << glversion;
+    }
+    return glversion;
+}
+
+float getOpenGLVersion()
+{
+    QString glversion = getOpenGLVersionString();
+    glversion = glversion.section(" ",0,0);
+    bool ok;
+    float v = glversion.toFloat(&ok);
+
+    if (!ok) {
+        QString tmp = glversion.section(".",0,1);
+        v = tmp.toFloat(&ok);
+        if (!ok) {
+            // just look at major, we are only interested in whether we have OpenGL 2.0 anyway
+            tmp = glversion.section(".",0,0);
+            v = tmp.toFloat(&ok);
+        }
+    }
+    return v;
+}
+
+QString getGraphicsEngine()
+{
+    QString gfxEngine = QString();
+#ifdef BROKEN_OPENGL_BUILD
+    gfxEngine = CSTR_GFX_BrokenGL;
+#else
+    QString glversion = getOpenGLVersionString();
+    if (glversion.contains(CSTR_GFX_ANGLE)) {
+        gfxEngine = CSTR_GFX_ANGLE;
+    } else {
+        gfxEngine = CSTR_GFX_OpenGL;
+    }
+#endif
+    return gfxEngine;
+}
+
+void MainWindow::logMessage(QString msg)
+{
+    ui->logText->appendPlainText(msg);
+}
+
+void loadChannels();
+void saveChannels();
+
+MainWindow::MainWindow(QWidget *parent) :
+    QMainWindow(parent),
+    ui(new Ui::MainWindow)
+{
+    Q_ASSERT(p_profile != nullptr);
+
+    ui->setupUi(this);
+
+    if (logger) {
+        connect(logger, SIGNAL(outputLog(QString)), this, SLOT(logMessage(QString)));
+    }
+
+    QString version = VersionString;
+
+#ifdef TEST_BUILD
+    version += QString(STR_TestBuild);
+#else
+    ui->warningLabel->hide();
+#endif
+
+    version += " "+getGraphicsEngine();
+
+    if (QString(GIT_BRANCH) != "master") { version += " [" + QString(GIT_BRANCH)+" branch]"; }
+
+
+    this->setWindowTitle(STR_TR_SleepyHead + QString(" v%1 (" + tr("Profile") + ": %2)").arg(version).arg(PREF[STR_GEN_Profile].toString()));
+
+    qDebug() << STR_TR_SleepyHead << VersionString << "built with Qt" << QT_VERSION_STR << "on" << __DATE__ << __TIME__;
+
+#ifdef BROKEN_OPENGL_BUILD
+    qDebug() << "This build has been created especially for computers with older graphics hardware.\n";
+#endif
+
+    //ui->tabWidget->setCurrentIndex(1);
+
+#ifdef Q_OS_MAC
+
+    ui->action_About->setMenuRole(QAction::ApplicationSpecificRole);
+    ui->action_Preferences->setMenuRole(QAction::ApplicationSpecificRole);
+    ui->action_Exit->setMenuRole(QAction::ApplicationSpecificRole);
+#if(QT_VERSION<QT_VERSION_CHECK(5,0,0))
+    // Disable Screenshot on Mac Platform,as it doesn't work in Qt4, and the system provides this functionality anyway.
+    ui->action_Screenshot->setEnabled(false);
+#endif
+#endif
+
+//#ifdef LOCK_RESMED_SESSIONS
+//    QList<Machine *> machines = p_profile->GetMachines(MT_CPAP);
+//    for (QList<Machine *>::iterator it = machines.begin(); it != machines.end(); ++it) {
+//        QString mclass=(*it)->loaderName();
+//        if (mclass == STR_MACH_ResMed) {
+//            qDebug() << "ResMed machine found.. locking Session splitting capabilities";
+
+//            // Have to sacrifice these features to get access to summary data.
+//            p_profile->session->setCombineCloseSessions(0);
+//            p_profile->session->setDaySplitTime(QTime(12,0,0));
+//            p_profile->session->setIgnoreShortSessions(false);
+//            break;
+//        }
+//    }
+//#endif
+
+    ui->actionToggle_Line_Cursor->setChecked(p_profile->appearance->lineCursorMode());
+
+    overview = nullptr;
+    daily = nullptr;
+    prefdialog = nullptr;
+
+    m_inRecalculation = false;
+    m_restartRequired = false;
+    // Initialize Status Bar objects
+    qstatusbar = ui->statusbar;
+    qprogress = new QProgressBar(this);
+    qprogress->setMaximum(100);
+    qstatus = new QLabel("", this);
+    qprogress->hide();
+    ui->statusbar->setMinimumWidth(200);
+    ui->statusbar->addPermanentWidget(qstatus, 0);
+    ui->statusbar->addPermanentWidget(qprogress, 1);
+
+    ui->actionDebug->setChecked(p_profile->general->showDebug());
+
+    QTextCharFormat format = ui->statStartDate->calendarWidget()->weekdayTextFormat(Qt::Saturday);
+    format.setForeground(QBrush(Qt::black, Qt::SolidPattern));
+    Qt::DayOfWeek dow=firstDayOfWeekFromLocale();
+    ui->statStartDate->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format);
+    ui->statStartDate->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format);
+    ui->statStartDate->calendarWidget()->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);
+    ui->statStartDate->calendarWidget()->setFirstDayOfWeek(dow);
+    ui->statEndDate->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format);
+    ui->statEndDate->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format);
+    ui->statEndDate->calendarWidget()->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);
+    ui->statEndDate->calendarWidget()->setFirstDayOfWeek(dow);
+
+    ui->statEndDate->setVisible(false);
+    ui->statStartDate->setVisible(false);
+
+    ui->reportModeRange->setVisible(false);
+    switch(p_profile->general->statReportMode()) {
+        case 0:
+            ui->reportModeStandard->setChecked(true);
+            break;
+        case 1:
+            ui->reportModeMonthly->setChecked(true);
+            break;
+        case 2:
+            ui->reportModeRange->setChecked(true);
+            ui->statEndDate->setVisible(true);
+            ui->statStartDate->setVisible(true);
+            break;
+        default:
+            p_profile->general->setStatReportMode(0);
+    }
+    if (!p_profile->general->showDebug()) {
+        ui->logText->hide();
+    }
+
+    ui->actionShow_Performance_Counters->setChecked(p_profile->general->showPerformance());
+
+#ifdef Q_OS_MAC
+    p_profile->appearance->setAntiAliasing(false);
+#endif
+    //ui->action_Link_Graph_Groups->setChecked(p_profile->general->linkGroups());
+
+    first_load = true;
+
+    // Using the dirty registry here. :(
+    QSettings settings(getDeveloperName(), getAppName());
+
+    // Load previous Window geometry (this is currently broken on Mac as of Qt5.2.1)
+    restoreGeometry(settings.value("MainWindow/geometry").toByteArray());
+
+    daily = new Daily(ui->tabWidget, nullptr);
+    ui->tabWidget->insertTab(2, daily, STR_TR_Daily);
+
+
+    // Start with the Summary Tab
+    ui->tabWidget->setCurrentWidget(ui->statisticsTab); // setting this to daily shows the cube during loading..
+
+    // Nifty Notification popups in System Tray (uses Growl on Mac)
+    if (QSystemTrayIcon::isSystemTrayAvailable() && QSystemTrayIcon::supportsMessages()) {
+        systray = new QSystemTrayIcon(QIcon(":/icons/bob-v3.0.png"), this);
+        systray->show();
+        systraymenu = new QMenu(this);
+        systray->setContextMenu(systraymenu);
+        QAction *a = systraymenu->addAction(STR_TR_SleepyHead + " v" + VersionString);
+        a->setEnabled(false);
+        systraymenu->addSeparator();
+        systraymenu->addAction(tr("&About"), this, SLOT(on_action_About_triggered()));
+        systraymenu->addAction(tr("Check for &Updates"), this,
+                               SLOT(on_actionCheck_for_Updates_triggered()));
+        systraymenu->addSeparator();
+        systraymenu->addAction(tr("E&xit"), this, SLOT(close()));
+    } else { // if not available, the messages will popup in the taskbar
+        systray = nullptr;
+        systraymenu = nullptr;
+    }
+
+    ui->toolBox->setCurrentIndex(0);
+    bool b = p_profile->appearance->rightSidebarVisible();
+    ui->action_Sidebar_Toggle->setChecked(b);
+    ui->toolBox->setVisible(b);
+
+    daily->graphView()->redraw();
+
+    if (p_profile->cpap->AHIWindow() < 30.0) {
+        p_profile->cpap->setAHIWindow(60.0);
+    }
+
+    ui->recordsBox->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+    ui->statisticsView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+    ui->webView->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks);
+    ui->bookmarkView->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+
+    QString loadingtxt =
+        "<HTML><body style='text-align: center; vertical-align: center'><table width='100%' height='100%'><tr><td align=center><h1>"
+        + tr("Loading...") + "</h1></td></tr></table></body></HTML>";
+    ui->statisticsView->setHtml(loadingtxt);
+    on_tabWidget_currentChanged(0);
+
+#ifndef REMSTAR_M_SUPPORT
+    ui->actionImport_RemStar_MSeries_Data->setVisible(false);
+#endif
+
+    on_homeButton_clicked();
+
+    qsrand(QDateTime::currentDateTime().toTime_t());
+
+    // Translators, these are only temporary messages, don't bother unless you really want to..
+
+    warnmsg.push_back(tr("<b>Warning:</b> This is a pre-release build, and may at times show unstable behaviour. It is intended for testing purposes."));
+    warnmsg.push_back(tr("If you experience CPAP chart/data errors after upgrading to a new version, try rebuilding your CPAP database from the Data menu."));
+    warnmsg.push_back(tr("Make sure your keep your SleepyHead data folder backed up when trying testing versions."));
+    warnmsg.push_back(tr("Please ensure you are running the latest version before reporting any bugs."));
+    warnmsg.push_back(tr("When reporting bugs, please make sure to supply the SleepyHead version number, operating system details and CPAP machine model."));
+    warnmsg.push_back(tr("Make sure your willing and able to supply a .zip of your CPAP data or a crash report before you think about filing a bug report."));
+    warnmsg.push_back(tr("Think twice before filing a bug report that already exists, PLEASE search first, as your likely not the first one to notice it!"));
+    warnmsg.push_back(tr("This red message line is intentional, and will not be a feature in the final version..."));
+    warnmsg.push_back(tr(""));
+
+    wtimer.setParent(this);
+    warnidx = 0;
+    wtimer.singleShot(0, this, SLOT(on_changeWarningMessage()));
+    loadChannels();
+
+    connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(on_aboutToQuit()));
+
+}
+
+void MainWindow::on_changeWarningMessage()
+{
+    int i=warnidx++ % warnmsg.size();
+    QString warning = "<html><head/><body><p>"+warnmsg[i]+"</p></body></html>";
+    ui->warningLabel->setText(warning);
+    wtimer.singleShot(10000, this, SLOT(on_changeWarningMessage()));
+}
+
+
+quint16 chandata_version = 1;
+
+void saveChannels()
+{
+    QString filename = p_profile->Get("{DataFolder}/") + "channels.dat";
+    QFile f(filename);
+    qDebug() << "Saving Channel States";
+    f.open(QFile::WriteOnly);
+    QDataStream out(&f);
+    out.setVersion(QDataStream::Qt_4_6);
+    out.setByteOrder(QDataStream::LittleEndian);
+
+    out << (quint32)magic;
+    out << (quint16)chandata_version;
+
+    quint16 size = schema::channel.channels.size();
+    out << size;
+
+    QHash<ChannelID, schema::Channel *>::iterator it;
+    QHash<ChannelID, schema::Channel *>::iterator it_end = schema::channel.channels.end();
+
+    for (it = schema::channel.channels.begin(); it != it_end; ++it) {
+        schema::Channel * chan = it.value();
+        out << it.key();
+        out << chan->code();
+        out << chan->enabled();
+        out << chan->defaultColor();
+        out << chan->fullname();
+        out << chan->label();
+        out << chan->description();
+        out << chan->lowerThreshold();
+        out << chan->lowerThresholdColor();
+        out << chan->upperThreshold();
+        out << chan->upperThresholdColor();
+        out << chan->showInOverview();
+    }
+
+    f.close();
+
+}
+
+
+void loadChannels()
+{
+    QString filename = p_profile->Get("{DataFolder}/") + "channels.dat";
+    QFile f(filename);
+    if (!f.open(QFile::ReadOnly)) {
+        return;
+    }
+    qDebug() << "Loading Channel States";
+
+    QDataStream in(&f);
+    in.setVersion(QDataStream::Qt_4_6);
+    in.setByteOrder(QDataStream::LittleEndian);
+
+    quint32 mag;
+    in >> mag;
+
+    if (magic != mag)  {
+        qDebug() << "LoadChannels: Faulty data";
+        return;
+    }
+    quint16 version;
+    in >> version;
+
+    if (version < chandata_version) {
+        return;
+        //upgrade here..
+    }
+
+    quint16 size;
+    in >> size;
+
+    QString name;
+    ChannelID code;
+    bool enabled;
+    QColor color;
+    EventDataType lowerThreshold;
+    QColor lowerThresholdColor;
+    EventDataType upperThreshold;
+    QColor upperThresholdColor;
+
+    QString fullname;
+    QString label;
+    QString description;
+    bool showOverview = false;
+
+    for (int i=0; i < size; i++) {
+        in >> code;
+        schema::Channel * chan = &schema::channel[code];
+        in >> name;
+        if (chan->code() != name) {
+            qDebug() << "Looking up channel" << name << "by name, as it's ChannedID must have changed";
+            chan = &schema::channel[name];
+        }
+        in >> enabled;
+        in >> color;
+        in >> fullname;
+        in >> label;
+        in >> description;
+        in >> lowerThreshold;
+        in >> lowerThresholdColor;
+        in >> upperThreshold;
+        in >> upperThresholdColor;
+        if (version >= 1) {
+            in >> showOverview;
+        }
+
+        if (chan->isNull()) {
+            qDebug() << "loadChannels has no idea about channel" << name;
+            if (in.atEnd()) return;
+            continue;
+        }
+        chan->setEnabled(enabled);
+        chan->setDefaultColor(color);
+        chan->setFullname(fullname);
+        chan->setLabel(label);
+        chan->setDescription(description);
+        chan->setLowerThreshold(lowerThreshold);
+        chan->setLowerThresholdColor(lowerThresholdColor);
+        chan->setUpperThreshold(upperThreshold);
+        chan->setUpperThresholdColor(upperThresholdColor);
+
+        chan->setShowInOverview(showOverview);
+        if (in.atEnd()) return;
+    }
+
+    f.close();
+}
+
+void MainWindow::on_aboutToQuit()
+{
+    Notify(QObject::tr("Don't forget to place your datacard back in your CPAP machine"), QObject::tr("SleepyHead Reminder"));
+    QThread::msleep(1000);
+    QApplication::processEvents();
+}
+
+void MainWindow::closeEvent(QCloseEvent * event)
+{
+
+    saveChannels();
+    schema::channel.Save();
+
+    if (daily) {
+        daily->close();
+        daily->deleteLater();
+    }
+
+    if (overview) {
+        overview->close();
+        overview->deleteLater();
+    }
+
+    // Shutdown and Save the current User profile
+    Profiles::Done();
+
+    // Save current window position
+    QSettings settings(getDeveloperName(), getAppName());
+    settings.setValue("MainWindow/geometry", saveGeometry());
+
+    QMainWindow::closeEvent(event);
+}
+
+extern MainWindow *mainwin;
+MainWindow::~MainWindow()
+{
+//    if (systraymenu) { delete systraymenu; }
+
+//    if (systray) { delete systray; }
+
+    // Trash anything allocated by the Graph objects
+    DestroyGraphGlobals();
+
+    disconnect(logger, SIGNAL(outputLog(QString)), this, SLOT(logMessage(QString)));
+    shutdownLogger();
+
+    mainwin = nullptr;
+    delete ui;
+}
+
+void MainWindow::log(QString text)
+{
+    logger->appendClean(text);
+}
+
+
+void MainWindow::Notify(QString s, QString title, int ms)
+{
+    if (title.isEmpty()) {
+        title = "SleepyHead v" + VersionString;
+    }
+    if (systray) {
+        // GNOME3's systray hides the last line of the displayed Qt message.
+        // As a workaround, add an extra line to bump the message back
+        // into the visible area.
+        QString msg = s;
+
+#ifdef Q_OS_UNIX
+        char *desktop = getenv("DESKTOP_SESSION");
+
+        if (desktop && !strncmp(desktop, "gnome", 5)) {
+            msg += "\n";
+        }
+#endif
+
+        systray->showMessage(title, msg, QSystemTrayIcon::Information, ms);
+    } else {
+        ui->statusbar->showMessage(s, ms);
+    }
+}
+
+class MyStatsPage: public QWebPage
+{
+  public:
+    MyStatsPage(QObject *parent);
+    virtual ~MyStatsPage();
+  protected:
+    //virtual void javaScriptConsoleMessage(const QString & message, int lineNumber, const QString & sourceID);
+    virtual void javaScriptAlert(QWebFrame *frame, const QString &msg);
+};
+MyStatsPage::MyStatsPage(QObject *parent)
+    : QWebPage(parent)
+{
+}
+MyStatsPage::~MyStatsPage()
+{
+}
+
+void MyStatsPage::javaScriptAlert(QWebFrame *frame, const QString &msg)
+{
+    Q_UNUSED(frame);
+    mainwin->sendStatsUrl(msg);
+}
+
+QString getCPAPPixmap(QString mach_class)
+{
+    QString cpapimage;
+    if (mach_class == STR_MACH_ResMed) cpapimage = ":/icons/rms9.png";
+    else if (mach_class == STR_MACH_PRS1) cpapimage = ":/icons/prs1.png";
+    else if (mach_class == STR_MACH_Intellipap) cpapimage = ":/icons/intellipap.png";
+    return cpapimage;
+}
+
+//QIcon getCPAPIcon(QString mach_class)
+//{
+//    QString cpapimage = getCPAPPixmap(mach_class);
+
+//    return QIcon(cpapimage);
+//}
+
+void MainWindow::PopulatePurgeMenu()
+{
+    ui->menu_Rebuild_CPAP_Data->disconnect(ui->menu_Rebuild_CPAP_Data, SIGNAL(triggered(QAction*)), this, SLOT(on_actionRebuildCPAP(QAction *)));
+    ui->menu_Rebuild_CPAP_Data->clear();
+
+    ui->menuPurge_CPAP_Data->disconnect(ui->menuPurge_CPAP_Data, SIGNAL(triggered(QAction*)), this, SLOT(on_actionPurgeMachine(QAction *)));
+    ui->menuPurge_CPAP_Data->clear();
+
+    QList<Machine *> machines = p_profile->GetMachines(MT_CPAP);
+    for (int i=0; i < machines.size(); ++i) {
+        Machine *mach = machines.at(i);
+        QString name =  mach->brand() + " "+
+                        mach->model() + " "+
+                        mach->serial();
+
+        QAction * action = new QAction(name.replace("&","&&"), ui->menu_Rebuild_CPAP_Data);
+        action->setIconVisibleInMenu(true);
+        action->setIcon(mach->getPixmap());
+        action->setData(mach->loaderName()+":"+mach->serial());
+        ui->menu_Rebuild_CPAP_Data->addAction(action);
+
+        action = new QAction(name.replace("&","&&"), ui->menuPurge_CPAP_Data);
+        action->setIconVisibleInMenu(true);
+        action->setIcon(mach->getPixmap()); //getCPAPIcon(mach->loaderName()));
+        action->setData(mach->loaderName()+":"+mach->serial());
+
+        ui->menuPurge_CPAP_Data->addAction(action);
+    }
+    ui->menu_Rebuild_CPAP_Data->connect(ui->menu_Rebuild_CPAP_Data, SIGNAL(triggered(QAction*)), this, SLOT(on_actionRebuildCPAP(QAction*)));
+    ui->menuPurge_CPAP_Data->connect(ui->menuPurge_CPAP_Data, SIGNAL(triggered(QAction*)), this, SLOT(on_actionPurgeMachine(QAction*)));
+}
+
+QString GenerateWelcomeHTML();
+
+void MainWindow::Startup()
+{
+    qstatus->setText(tr("Loading Data"));
+    qprogress->show();
+    //qstatusbar->showMessage(tr("Loading Data"),0);
+
+    // profile is a global variable set in main after login
+    p_profile->LoadMachineData();
+
+    QList<MachineLoader *> loaders = GetLoaders();
+    for (int i=0; i<loaders.size(); ++i) {
+        connect(loaders.at(i), SIGNAL(machineUnsupported(Machine*)), this, SLOT(MachineUnsupported(Machine*)));
+    }
+
+    PopulatePurgeMenu();
+
+//    SnapshotGraph = new gGraphView(this, daily->graphView());
+
+//    // Snapshot graphs mess up with pixmap cache
+//    SnapshotGraph->setUsePixmapCache(false);
+
+//   // SnapshotGraph->setFormat(daily->graphView()->format());
+//    //SnapshotGraph->setMaximumSize(1024,512);
+//    //SnapshotGraph->setMinimumSize(1024,512);
+//    SnapshotGraph->hide();
+
+    overview = new Overview(ui->tabWidget, daily->graphView());
+    ui->tabWidget->insertTab(3, overview, STR_TR_Overview);
+
+
+//    GenerateStatistics();
+
+    ui->statStartDate->setDate(p_profile->FirstDay());
+    ui->statEndDate->setDate(p_profile->LastDay());
+
+    if (overview) { overview->ReloadGraphs(); }
+
+    qprogress->hide();
+    qstatus->setText("");
+
+    if (p_profile->p_preferences[STR_PREF_ReimportBackup].toBool()) {
+        importCPAPBackups();
+        p_profile->p_preferences[STR_PREF_ReimportBackup]=false;
+    }
+
+    ui->tabWidget->setCurrentWidget(ui->welcomeTab);
+
+    if (daily) {
+        daily->ReloadGraphs();
+//        daily->populateSessionWidget();
+    }
+
+}
+
+int MainWindow::importCPAP(ImportPath import, const QString &message)
+{
+    if (!import.loader) {
+        return 0;
+    }
+
+    QDialog * popup = new QDialog(this);
+    QLabel * waitmsg = new QLabel(message);
+    QHBoxLayout *hlayout = new QHBoxLayout;
+
+    QLabel * imglabel = new QLabel(popup);
+
+    QPixmap image = import.loader->getPixmap(import.loader->PeekInfo(import.path).series);
+//    QPixmap image(getCPAPPixmap(import.loader->loaderName()));
+    image = image.scaled(64,64);
+    imglabel->setPixmap(image);
+
+
+    QVBoxLayout * vlayout = new QVBoxLayout;
+    popup->setLayout(vlayout);
+    vlayout->addLayout(hlayout);
+    hlayout->addWidget(imglabel);
+    hlayout->addWidget(waitmsg,1,Qt::AlignCenter);
+    vlayout->addWidget(qprogress,1);
+
+    qprogress->setVisible(true);
+    popup->show();
+    int c = import.loader->Open(import.path);
+
+    if (c > 0) {
+        Notify(tr("Imported %1 CPAP session(s) from\n\n%2").arg(c).arg(import.path), tr("Import Success"));
+    } else if (c == 0) {
+        Notify(tr("Already up to date with CPAP data at\n\n%1").arg(import.path), tr("Up to date"));
+    } else {
+        Notify(tr("Couldn't find any valid Machine Data at\n\n%1").arg(import.path),tr("Import Problem"));
+    }
+
+    popup->hide();
+    vlayout->removeWidget(qprogress);
+    ui->statusbar->insertWidget(1,qprogress,1);
+    qprogress->setVisible(false);
+
+    delete popup;
+
+    disconnect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(on_aboutToQuit()));
+    connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), this, SLOT(on_aboutToQuit()));
+    return c;
+}
+
+void MainWindow::finishCPAPImport()
+{
+    p_profile->StoreMachines();
+    GenerateStatistics();
+
+    if (overview) { overview->ReloadGraphs(); }
+    if (daily) {
+//        daily->populateSessionWidget();
+        daily->ReloadGraphs();
+    }
+}
+
+void MainWindow::importCPAPBackups()
+{
+    // Get BackupPaths for all CPAP machines
+    QList<Machine *> machlist = p_profile->GetMachines(MT_CPAP);
+    QList<ImportPath> paths;
+    Q_FOREACH(Machine *m, machlist) {
+        paths.append(ImportPath(m->getBackupPath(), lookupLoader(m)));
+    }
+
+    if (paths.size() > 0) {
+        int c=0;
+        Q_FOREACH(ImportPath path, paths) {
+            c+=importCPAP(path, tr("Please wait, importing from backup folder(s)..."));
+        }
+        if (c>0) {
+            finishCPAPImport();
+        }
+    }
+}
+
+#ifdef Q_OS_UNIX
+# include <stdio.h>
+# include <unistd.h>
+
+# if defined(Q_OS_MAC) || defined(Q_OS_BSD4)
+#  include <sys/mount.h>
+# else
+#  include <sys/statfs.h>
+#  include <mntent.h>
+# endif // Q_OS_MAC/BSD
+
+#endif // Q_OS_UNIX
+
+//! \brief Returns a list of drive mountpoints
+QStringList getDriveList()
+{
+    QStringList drivelist;
+
+#if defined(Q_OS_MAC) || defined(Q_OS_BSD4)
+    struct statfs *mounts;
+    int num_mounts = getmntinfo(&mounts, MNT_WAIT);
+    if (num_mounts >= 0) {
+        for (int i = 0; i < num_mounts; i++) {
+            QString name = mounts[i].f_mntonname;
+
+            // Only interested in drives mounted under /Volumes
+            if (name.toLower().startsWith("/volumes/")) {
+                drivelist.push_back(name);
+//                qDebug() << QString("Disk type '%1' mounted at: %2").arg(mounts[i].f_fstypename).arg(mounts[i].f_mntonname);
+            }
+        }
+    }
+
+#elif defined(Q_OS_UNIX)
+    // Unix / Linux (except BSD)
+    FILE *mtab = setmntent("/etc/mtab", "r");
+    struct mntent *m;
+    struct mntent mnt;
+    char strings[4096];
+
+    // NOTE: getmntent_r is a GNU extension, requiring glibc.
+    while ((m = getmntent_r(mtab, &mnt, strings, sizeof(strings)))) {
+
+        struct statfs fs;
+        if ((mnt.mnt_dir != NULL) && (statfs(mnt.mnt_dir, &fs) == 0)) {
+            QString name = mnt.mnt_dir;
+            quint64 size = fs.f_blocks * fs.f_bsize;
+
+            if (size > 0) { // this should theoretically ignore /dev, /proc, /sys etc..
+                drivelist.push_back(name);
+            }
+//            quint64 free = fs.f_bfree * fs.f_bsize;
+//            quint64 avail = fs.f_bavail * fs.f_bsize;
+        }
+    }
+    endmntent(mtab);
+
+#elif defined(Q_OS_WIN)
+    QFileInfoList list = QDir::drives();
+
+    for (int i = 0; i < list.size(); ++i) {
+        QFileInfo fileInfo = list.at(i);
+        QString name = fileInfo.filePath();
+        if (name.at(0).toUpper() != QChar('C')) { // Ignore the C drive
+            drivelist.push_back(name);
+        }
+    }
+
+#endif
+
+    return drivelist;
+}
+
+
+QList<ImportPath> MainWindow::detectCPAPCards()
+{
+    const int timeout = 20000;
+
+    QList<ImportPath> detectedCards;
+
+    QList<MachineLoader *>loaders = GetLoaders(MT_CPAP);
+    QTime time;
+    time.start();
+
+    // Create dialog
+    QDialog popup(this, Qt::SplashScreen);
+    QLabel waitmsg(tr("Please insert your CPAP data card..."));
+    QProgressBar progress;
+    QVBoxLayout waitlayout;
+    popup.setLayout(&waitlayout);
+
+    QHBoxLayout layout2;
+    QIcon icon("://icons/sdcard.png");
+    QPushButton skipbtn(icon, tr("Choose a folder"));
+    skipbtn.setMinimumHeight(40);
+    waitlayout.addWidget(&waitmsg,1,Qt::AlignCenter);
+    waitlayout.addWidget(&progress,1);
+    waitlayout.addLayout(&layout2,1);
+    layout2.addWidget(&skipbtn);
+    popup.connect(&skipbtn, SIGNAL(clicked()), &popup, SLOT(hide()));
+    progress.setValue(0);
+    progress.setMaximum(timeout);
+    progress.setVisible(true);
+    popup.show();
+    QApplication::processEvents();
+    QString lastpath = (*p_profile)[STR_PREF_LastCPAPPath].toString();
+
+    do {
+        // Rescan in case card inserted
+        QStringList AutoScannerPaths = getDriveList();
+        //AutoScannerPaths.push_back(lastpath);
+
+        if (!AutoScannerPaths.contains(lastpath)) {
+            AutoScannerPaths.append(lastpath);
+        }
+
+        Q_FOREACH(const QString &path, AutoScannerPaths) {
+            // Scan through available machine loaders and test if this folder contains valid folder structure
+            Q_FOREACH(MachineLoader * loader, loaders) {
+                if (loader->Detect(path)) {
+                    detectedCards.append(ImportPath(path, loader));
+
+                    qDebug() << "Found" << loader->loaderName() << "datacard at" << path;
+                }
+            }
+        }
+        int el=time.elapsed();
+        progress.setValue(el);
+        QApplication::processEvents();
+        if (el > timeout) break;
+        if (!popup.isVisible()) break;
+        // needs a slight delay here
+        QThread::msleep(200);
+    } while (detectedCards.size() == 0);
+
+    popup.hide();
+    popup.disconnect(&skipbtn, SIGNAL(clicked()), &popup, SLOT(hide()));
+
+    return detectedCards;
+}
+
+
+void MainWindow::on_action_Import_Data_triggered()
+{
+    if (m_inRecalculation) {
+        Notify(tr("Access to Import has been blocked while recalculations are in progress."),STR_MessageBox_Busy);
+        return;
+    }
+
+    QList<ImportPath> datacards = detectCPAPCards();
+
+    QList<MachineLoader *>loaders = GetLoaders(MT_CPAP);
+
+    QTime time;
+    time.start();
+    QDialog popup(this, Qt::FramelessWindowHint);
+    popup.setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
+    QLabel * waitmsg = new QLabel(tr("Please wait, scanning for CPAP data cards..."));
+    QVBoxLayout *waitlayout = new QVBoxLayout();
+    waitlayout->addWidget(waitmsg,1,Qt::AlignCenter);
+    waitlayout->addWidget(qprogress,1);
+    popup.setLayout(waitlayout);
+
+    bool asknew = false;
+    qprogress->setVisible(false);
+
+    if (datacards.size() > 0) {
+        MachineInfo info = datacards[0].loader->PeekInfo(datacards[0].path);
+        QString infostr;
+        if (!info.model.isEmpty()) {
+            QString infostr2 = info.model+" ("+info.serial+")";
+            infostr = tr("A %1 file structure for a %2 was located at:").arg(info.brand).arg(infostr2);
+        } else {
+            infostr = tr("A %1 file structure was located at:").arg(datacards[0].loader->loaderName());
+        }
+
+        if (!p_profile->cpap->autoImport()) {
+            QMessageBox mbox(QMessageBox::NoIcon,
+                             tr("CPAP Data Located"),
+                             infostr+"\n\n"+QDir::toNativeSeparators(datacards[0].path)+"\n\n"+
+                             tr("Would you like to import from this location?"),
+                             QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel,
+                             this);
+            mbox.setDefaultButton(QMessageBox::Yes);
+            mbox.setButtonText(QMessageBox::No, tr("Specify"));
+
+            QPixmap pixmap = datacards[0].loader->getPixmap(datacards[0].loader->PeekInfo(datacards[0].path).series).scaled(64,64);
+
+            //QPixmap pixmap = QPixmap(getCPAPPixmap(datacards[0].loader->loaderName())).scaled(64,64);
+            mbox.setIconPixmap(pixmap);
+            int res = mbox.exec();
+
+            if (res == QMessageBox::Cancel) {
+                // Give the communal progress bar back
+                ui->statusbar->insertWidget(1,qprogress,1);
+                return;
+            } else if (res == QMessageBox::No) {
+                waitmsg->setText(tr("Please wait, launching file dialog..."));
+                datacards.clear();
+                asknew = true;
+            }
+        }
+    } else {
+        waitmsg->setText(tr("No CPAP data card detected, launching file dialog..."));
+        asknew = true;
+    }
+
+    if (asknew) {
+        popup.show();
+        mainwin->Notify(tr("Please remember to point the importer at the root folder or drive letter of your data-card, and not a subfolder."),
+                        tr("Import Reminder"),8000);
+
+        QFileDialog w(this);
+
+        QString folder;
+        if (p_profile->contains(STR_PREF_LastCPAPPath)) {
+            folder = (*p_profile)[STR_PREF_LastCPAPPath].toString();
+        } else {
+#if QT_VERSION  < QT_VERSION_CHECK(5,0,0)
+            folder = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
+#else
+            folder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
+#endif
+        }
+
+        w.setDirectory(folder);
+        w.setFileMode(QFileDialog::Directory);
+        w.setOption(QFileDialog::ShowDirsOnly, true);
+
+        // This doesn't work on WinXP
+
+#if defined(Q_OS_MAC)
+#if (QT_VERSION < QT_VERSION_CHECK(4,8,0))
+        // Fix for tetragon, 10.6 barfs up Qt's custom dialog
+        w.setOption(QFileDialog::DontUseNativeDialog, true);
+#else
+        w.setOption(QFileDialog::DontUseNativeDialog,false);
+#endif // version check
+
+#elif defined(Q_OS_UNIX)
+        w.setOption(QFileDialog::DontUseNativeDialog,false);
+#elif defined(Q_OS_WIN)
+        // check the Os version.. winxp chokes
+        w.setOption(QFileDialog::DontUseNativeDialog, true);
+#endif
+//#else
+//        w.setOption(QFileDialog::DontUseNativeDialog, false);
+
+//        QListView *l = w.findChild<QListView *>("listView");
+//        if (l) {
+//            l->setSelectionMode(QAbstractItemView::MultiSelection);
+//        }
+
+//        QTreeView *t = w.findChild<QTreeView *>();
+//        if (t) {
+//            t->setSelectionMode(QAbstractItemView::MultiSelection);
+//        }
+
+//#endif
+
+        if (w.exec() != QDialog::Accepted) {
+            popup.hide();
+            ui->statusbar->insertWidget(1,qprogress,1);
+
+            return;
+        }
+
+        popup.hide();
+
+        for (int i = 0; i < w.selectedFiles().size(); i++) {
+            Q_FOREACH(MachineLoader * loader, loaders) {
+                if (loader->Detect(w.selectedFiles().at(i))) {
+                    datacards.append(ImportPath(w.selectedFiles().at(i), loader));
+                    break;
+                }
+            }
+        }
+    }
+
+    bool newdata = false;
+
+//    QStringList goodlocations;
+
+//    waitmsg.setText(tr("Please wait, SleepyHead is importing data..."));
+//    qprogress->setVisible(true);
+
+//    popup.show();
+
+    int c = -1;
+    for (int i = 0; i < datacards.size(); i++) {
+        QString dir = datacards[i].path;
+        MachineLoader * loader = datacards[i].loader;
+        if (!loader) continue;
+
+        if (!dir.isEmpty()) {
+//            qprogress->setValue(0);
+//            qprogress->show();
+//            qstatus->setText(tr("Importing Data"));
+            c = importCPAP(datacards[i], tr("Importing Data"));
+            qDebug() << "Finished Importing data" << c;
+
+            if (c >= 0) {
+            //    goodlocations.push_back(dir);
+                QDir d(dir.section("/",0,-1));
+                (*p_profile)[STR_PREF_LastCPAPPath] = d.absolutePath();
+            }
+
+            if (c > 0) {
+                newdata = true;
+            }
+
+//            qstatus->setText("");
+//            qprogress->hide();
+        }
+    }
+//    popup.hide();
+
+//    ui->statusbar->insertWidget(1, qprogress,1);
+
+    if (newdata)  {
+        finishCPAPImport();
+        PopulatePurgeMenu();
+    }
+}
+
+QMenu *MainWindow::CreateMenu(QString title)
+{
+    QMenu *menu = new QMenu(title, ui->menubar);
+    ui->menubar->insertMenu(ui->menu_Help->menuAction(), menu);
+    return menu;
+}
+
+void MainWindow::on_action_Fullscreen_triggered()
+{
+    if (ui->action_Fullscreen->isChecked()) {
+        this->showFullScreen();
+    } else {
+        this->showNormal();
+    }
+}
+
+void MainWindow::setRecBoxHTML(QString html)
+{
+    ui->recordsBox->setHtml(html);
+}
+
+QString MainWindow::getWelcomeHTML()
+{
+    // This is messy, but allows it to be translated easier
+    return "<html>\n<head>"
+           " <style type='text/css'>"
+           "  <!--h1,p,a,td,body { font-family: 'FreeSans', 'Sans Serif' } --/>"
+           "  p,a,td,body { font-size: 14px }"
+           "  a:link,a:visited { color: \"#000020\"; text-decoration: none; font-weight: bold;}"
+           "  a:hover { background-color: inherit; color: red; text-decoration:none; font-weight: bold; }"
+           " </style>\n"
+           "</head>"
+           "<body leftmargin=0 topmargin=0 rightmargin=0>"
+           "<table width=\"100%\" cellspacing=0 cellpadding=4 border=0 >"
+           "<tr><td bgcolor=\"#d0d0d0\" colspan=2 cellpadding=0 valign=center align=center><font color=\"black\" size=+1><b>"
+           + tr("Welcome to SleepyHead") + "</b></font></td></tr>"
+           "<tr>"
+           "<td valign=\"top\" leftmargin=0 cellpadding=6>"
+           "<h3>" + tr("About SleepyHead") + "</h3>"
+           "<p>" + tr("This software has been created to assist you in reviewing the data produced by CPAP Machines, used in the treatment of various Sleep Disorders.")
+           + "</p>"
+           "<p>" + tr("SleepyHead has been designed by a software developer with personal experience with a sleep disorder, and shaped by the feedback of many other willing testers dealing with similar conditions.")
+           + "</p>"
+           "<p><i><b>" + tr("This is a beta release, some features may not yet behave as expected.") +
+           "</b></i><br/>" + tr("Please report any bugs you find to SleepyHead's SourceForge page.") + "</p>"
+
+           "<h3>" + tr("Currenly supported machines:") + "</h3>"
+           "<b>" + tr("CPAP") + "</b>"
+           "<li>" + tr("Philips Respironics System One (CPAP Pro, Auto, BiPAP & ASV models)") + "</li>"
+           "<li>" + tr("ResMed S9 models (CPAP, Auto, VPAP)") + "</li>"
+           "<li>" + tr("DeVilbiss Intellipap (Auto)") + "</li>"
+           "<li>" + tr("Fisher & Paykel ICON (CPAP, Auto)") + "</li>"
+           "<b>" + tr("Oximetry") + "</b>"
+           "<li>" + tr("Contec CMS50D+, CMS50E and CMS50F (not 50FW) Oximeters") + "</li>"
+           "<li>" + tr("ResMed S9 Oximeter Attachment") + "</li>"
+           "<p><h3>" + tr("Online Help Resources") + "</h3></p>"
+           "<p><b>" + tr("Note:") + "</b>" +
+           tr("I don't recommend using this built in web browser to do any major surfing in, it will work, but it's mainly meant as a help browser.")
+           +
+           tr("(It doesn't support SSL encryption, so it's not a good idea to type your passwords or personal details anywhere.)")
+           + "</p>" +
+
+           tr("SleepyHead's Online <a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide\">Users Guide</a><br/>")
+           +
+           tr("<a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions\">Frequently Asked Questions</a><br/>")
+           +
+           tr("<a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary\">Glossary of Sleep Disorder Terms</a><br/>")
+           +
+           tr("<a href=\"http://sleepyhead.sourceforge.net/wiki/index.php?title=Main_Page\">SleepyHead Wiki</a><br/>")
+           +
+           tr("SleepyHead's <a href='http://www.sourceforge.net/projects/sleepyhead'>Project Website</a> on SourceForge<br/>")
+           +
+           "<p><h3>" + tr("Further Information") + "</h3></p>"
+           "<p>" +
+           tr("Here are the <a href='qrc:/docs/release_notes.html'>release notes</a> for this version.") +
+           "<br/>" +
+           tr("Plus a few <a href='qrc:/docs/usage.html'>usage notes</a>, and some important information for Mac users.")
+           + "<br/>" +
+           "<p>" + tr("About <a href='http://en.wikipedia.org/wiki/Sleep_apnea'>Sleep Apnea</a> on Wikipedia")
+           + "</p>"
+
+           "<p>" + tr("Friendly forums to talk and learn about Sleep Apnea:") + "<br/>" +
+           tr("<a href='http://www.cpaptalk.com'>CPAPTalk Forum</a>,") +
+           tr("<a href='http://www.apneaboard.com/forums/'>Apnea Board</a>") + "</p>"
+           "</td>"
+           "<td><image src='qrc:/icons/bob-v3.0.png' width=220 height=220><br/>"
+           "</td>"
+           "</tr>"
+           "<tr>"
+           "<td colspan=2>"
+           "<hr/>"
+           "<p><b>" + tr("Copyright:") + "</b> " + tr("©2011-2014") +
+           " <a href=\"http://jedimark64.blogspot.com\">Mark Watkins</a> (jedimark)</p>"
+           "<p><b>" + tr("License:") + "</b> " +
+           tr("This software is released freely under the <a href=\"qrc:/COPYING\">GNU Public License</a>.") +
+           "</p>"
+           "<hr/>"
+           "<p><b>" + tr("DISCLAIMER:") + "</b></p>"
+           "<b><p>" +
+           tr("This is <font color='red'><u>NOT</u></font> medical software. This application is merely a data viewer, and no guarantee is made regarding accuracy or correctness of any calculations or data displayed.")
+           + "</p>"
+           "<p>" + tr("The author will NOT be held liable by anyone who harms themselves or others by use or misuse of this software.")
+           + "</p>"
+           "<p>" + tr("Your doctor should always be your first and best source of guidance regarding the important matter of managing your health.")
+           + "</p>"
+           "<p>" + tr("*** <u>Use at your own risk</u> ***") + "</p></b>"
+           "<hr/>"
+           "</td></tr>"
+           "</table>"
+           "</body>"
+           "</html>"
+
+           ;
+}
+
+void MainWindow::on_homeButton_clicked()
+{
+
+    ui->webView->setHtml(getWelcomeHTML());
+
+    //QString infourl="qrc:/docs/index.html"; // use this as a fallback
+    //ui->webView->setUrl(QUrl(infourl));
+}
+
+void MainWindow::updateFavourites()
+{
+    QDate date = p_profile->LastDay(MT_JOURNAL);
+
+    if (!date.isValid()) {
+        return;
+    }
+
+    QString html = "<html><head><style type='text/css'>"
+                   "p,a,td,body { font-family: '" + QApplication::font().family() + "'; }"
+                   "p,a,td,body { font-size: " + QString::number(QApplication::font().pointSize() + 2) + "px; }"
+                   "a:link,a:visited { color: inherit; text-decoration: none; }" //font-weight: normal;
+                   "a:hover { background-color: inherit; color: white; text-decoration:none; font-weight: bold; }"
+                   "</style></head><body>"
+                   "<table width=100% cellpadding=2 cellspacing=0>";
+
+    do {
+        Day *journal = p_profile->GetDay(date, MT_JOURNAL);
+
+        if (journal) {
+            if (journal->size() > 0) {
+                Session *sess = journal->firstSession(MT_JOURNAL);
+                QString tmp;
+                bool filtered = !bookmarkFilter.isEmpty();
+                bool found = !filtered;
+
+                if (sess->settings.contains(Bookmark_Start)) {
+                    //QVariantList start=sess->settings[Bookmark_Start].toList();
+                    //QVariantList end=sess->settings[Bookmark_End].toList();
+                    QStringList notes = sess->settings[Bookmark_Notes].toStringList();
+
+                    if (notes.size() > 0) {
+                        tmp += QString("<tr><td><b><a href='daily=%1'>%2</a></b><br/>")
+                               .arg(date.toString(Qt::ISODate))
+                               .arg(date.toString());
+
+                        tmp += "<list>";
+
+                        for (int i = 0; i < notes.size(); i++) {
+                            //QDate d=start[i].toDate();
+                            QString note = notes[i];
+
+                            if (filtered && note.contains(bookmarkFilter, Qt::CaseInsensitive)) {
+                                found = true;
+                            }
+
+                            tmp += "<li>" + note + "</li>";
+                        }
+
+                        tmp += "</list></td>";
+                    }
+                }
+
+                if (found) { html += tmp; }
+            }
+        }
+
+        date = date.addDays(-1);
+    } while (date >= p_profile->FirstDay(MT_JOURNAL));
+
+    html += "</table></body></html>";
+    ui->bookmarkView->setHtml(html);
+}
+
+void MainWindow::on_backButton_clicked()
+{
+    ui->webView->back();
+}
+
+void MainWindow::on_forwardButton_clicked()
+{
+    ui->webView->forward();
+}
+
+void MainWindow::on_webView_urlChanged(const QUrl &arg1)
+{
+    ui->urlBar->setEditText(arg1.toString());
+}
+
+void MainWindow::on_urlBar_activated(const QString &arg1)
+{
+    QUrl url(arg1);
+    ui->webView->setUrl(url);
+}
+
+void MainWindow::on_dailyButton_clicked()
+{
+    ui->tabWidget->setCurrentWidget(daily);
+    daily->RedrawGraphs();
+}
+void MainWindow::JumpDaily()
+{
+    on_dailyButton_clicked();
+}
+
+void MainWindow::on_overviewButton_clicked()
+{
+    ui->tabWidget->setCurrentWidget(overview);
+}
+
+void MainWindow::on_webView_loadFinished(bool arg1)
+{
+    Q_UNUSED(arg1);
+    qprogress->hide();
+
+    if (first_load) {
+        QTimer::singleShot(0, this, SLOT(Startup()));
+        first_load = false;
+    } else {
+        qstatus->setText("");
+    }
+
+    ui->backButton->setEnabled(ui->webView->history()->canGoBack());
+    ui->forwardButton->setEnabled(ui->webView->history()->canGoForward());
+
+    connect(ui->webView->page(), SIGNAL(linkHovered(QString, QString, QString)), this,
+            SLOT(LinkHovered(QString, QString, QString)));
+}
+
+void MainWindow::on_webView_loadStarted()
+{
+    disconnect(ui->webView->page(), SIGNAL(linkHovered(QString, QString, QString)), this,
+               SLOT(LinkHovered(QString, QString, QString)));
+
+    if (!first_load) {
+        qstatus->setText(tr("Loading"));
+        qprogress->reset();
+        qprogress->show();
+    }
+}
+
+void MainWindow::on_webView_loadProgress(int progress)
+{
+    qprogress->setValue(progress);
+}
+
+void MainWindow::aboutBoxLinkClicked(const QUrl &url)
+{
+    QDesktopServices::openUrl(url);
+}
+
+void MainWindow::on_action_About_triggered()
+{
+    QString gitrev = QString(GIT_REVISION);
+
+    if (!gitrev.isEmpty()) { gitrev = tr("Revision:")+" " + gitrev + " (" + QString(GIT_BRANCH) + " " + tr("branch") + ")"; }
+
+    //    "<style type=\"text/css\">body { margin:0; padding:0; } html, body, #bg { height:100%; width:100% } #bg { position: absolute; left:0; right:0; bottom:0; top:0; overflow:hidden; z-index:1; } #bg img { width:100%; min-width:100%; min-height:100%; } #content { z-index:0; }</style><body><div id=\"bg\"> <img style=\"display:block;\" src=\"qrc:/icons/Bob Strikes Back.png\"></div><div id=\"content\">"
+    QString msg = QString(
+                "<html>"
+                "<head><style type=\"text/css\">a:link, a:visited { color: #000044; text-decoration: underline; font-weight: normal;}"
+                "a:hover { background-color: inherit; color: #4444ff; text-decoration:none; font-weight: normal; }"
+                "</style></head>"
+
+                "<body>"
+                "<span style=\"color:#000000; font-weight:600; vertical-align:middle;\">"
+                "<table width=100%><tr><td>"
+                "<p><h1>" + STR_TR_SleepyHead +
+                QString(" v%1 (%2)</h1></p><font color=black><p>").arg(VersionString).arg(ReleaseStatus) +
+                tr("Build Date: %1 %2").arg(__DATE__).arg(__TIME__) +
+                QString("<br/>%1<br/>").arg(gitrev) +
+                tr("Graphics Engine: %1").arg(getGraphicsEngine())+
+                "<br/>" +
+                (tr("Data Folder Location: <a href=\"file://%1\">%2</a>").arg(GetAppRoot()).arg(QDir::toNativeSeparators(GetAppRoot())) +
+                "<hr/>"+tr("Copyright") + " ©2011-2014 Mark Watkins (jedimark) <br/> \n" +
+                tr("This software is released under the GNU Public License v3.0<br/>") +
+                "<hr>"
+
+                // Project links
+                "<p>" +tr("SleepyHead Project Page") +
+                ": <a href=\"http://sourceforge.net/projects/sleepyhead\">http://sourceforge.net/projects/sleepyhead</a><br/>"
+                +
+                tr("SleepyHead Wiki") +
+                ": <a href=\"http://sleepyhead.sourceforge.net/wiki\">http://sleepyhead.sourceforge.net/wiki</a><p/>" +
+
+                // Social media links.. (Dear Translators, if one of these isn't available in your country, it's ok to leave it out.)
+                tr("Don't forget to Like/+1 SleepyHead on <a href=\"http://www.facebook.com/SleepyHeadCPAP\">Facebook</a> or <a href=\"http://plus.google.com/u/0/b/101426655252362287937\">Google+")
+                + "</p>" +
+
+                // Image
+                "</td><td align='center'><img src=\"qrc:/icons/Jedimark.png\" width=260px><br/> <br/><i>"
+                +tr("SleepyHead, brought to you by Jedimark") + "</i></td></tr><tr colspan><td colspan=2>" +
+
+
+                // Credits section
+                "<hr/><p><b><font size='+1'>" +tr("Kudos & Credits") + "</font></b></p><b>" +
+                tr("Bugfixes, Patches and Platform Help:") + "</b> " +
+                tr("James Marshall, Rich Freeman, John Masters, Keary Griffin, Patricia Shanahan, Alec Clews, manders99, Sean Stangl, Roy Stone, François Revol, Michael Masterson.")
+                + "</p>"
+
+                "<p><b>" + tr("Translators:") + "</b> " + tr("Arie Klerk (Dutch), Steffen Reitz and Marc Stephan (German), Chen Hao (Chinese), Lars-Erik Söderström (Swedish), Damien Vigneron (French), António Jorge Costa (Portuguese), Judith Guzmán (Spanish) and others I've still to add here.") +
+                "</p>"
+
+                "<p><b>" + tr("3rd Party Libaries:") + "</b> " +
+                tr("SleepyHead is built using the <a href=\"http://qt-project.org\">Qt Application Framework</a>.")
+                + " " +
+                tr("In the updater code, SleepyHead uses <a href=\"http://sourceforge.net/projects/quazip\">QuaZip</a> by Sergey A. Tachenov, which is a C++ wrapper over Gilles Vollant's ZIP/UNZIP package.")
+                + "<br/>"
+                "<p>" + tr("Special thanks to Pugsy and Robysue from <a href='http://cpaptalk.com'>CPAPTalk</a> for their help with documentation and tutorials, as well as everyone who helped out by testing and sharing their CPAP data.")
+                + "</p>"
+
+                // Donations
+                "<hr><p><font color=\"blue\">" +
+                tr("Thanks for using SleepyHead. If you find it within your means, please consider encouraging future development by making a donation via Paypal.")
+                + "</font>"
+
+
+                "<hr><p><b>Disclaimer</b><br/><i>" +
+                tr("This software comes with absolutely no warranty, either express of implied.") + " " +
+                tr("It comes with no guarantee of fitness for any particular purpose.") + " " +
+                tr("No guarantees are made regarding the accuracy of any data this program displays.") + "</i></p>"
+                "<p><i>" +
+                tr("This is NOT medical software, it is merely a research tool that provides a visual interpretation of data recorded by supported devices.")
+                +
+                "<b> " + tr("This software is NOT suitable for medical diagnostics purposes, neither is it fit for CPAP complaince reporting purposes, or ANY other medical use for that matter.")
+                + "</b></i></p>"
+                "<p><i>" +
+                tr("The author and anyone associated with him accepts NO responsibilty for damages, issues or non-issues resulting from the use or mis-use of this software.")
+                + "</p><p><b>" +
+                tr("Use this software entirely at your own risk.") + "</b></i></p>"
+                "</font></td></tr></table></span></body>"
+               ));
+    //"</div></body></html>"
+
+    QDialog aboutbox;
+    aboutbox.setWindowTitle(QObject::tr("About SleepyHead"));
+
+
+    QVBoxLayout layout;
+    aboutbox.setLayout(&layout);
+
+    QWebView webview(&aboutbox);
+
+    webview.setHtml(msg);
+    webview.page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
+    connect(&webview, SIGNAL(linkClicked(const QUrl &)), SLOT(aboutBoxLinkClicked(const QUrl &)));
+
+    layout.insertWidget(0, &webview, 1);
+
+    QHBoxLayout layout2;
+    layout.insertLayout(1, &layout2, 1);
+    QPushButton okbtn(QObject::tr("&Close"), &aboutbox);
+    aboutbox.connect(&okbtn, SIGNAL(clicked()), SLOT(reject()));
+    layout2.insertWidget(1, &okbtn, 1);
+
+    QPushButton donatebtn(QObject::tr("&Donate"), &aboutbox);
+    aboutbox.connect(&donatebtn, SIGNAL(clicked()),
+                     SLOT(accept())); //hack this button to use the accepted slot, so clicking x closes like it shouldß
+    layout2.insertWidget(1, &donatebtn, 1);
+
+    QApplication::processEvents(); // MW: Needed on Mac, as the html has to finish loading
+
+
+    if (aboutbox.exec() == QDialog::Accepted) {
+        QDesktopServices::openUrl(QUrl("http://sourceforge.net/p/sleepyhead/donate"));
+        //spawn browser with paypal site.
+    }
+
+    disconnect(&webview, SIGNAL(linkClicked(const QUrl &)), this,
+               SLOT(aboutBoxLinkClicked(const QUrl &)));
+}
+
+void MainWindow::on_actionDebug_toggled(bool checked)
+{
+    p_profile->general->setShowDebug(checked);
+
+    logger->strlock.lock();
+    if (checked) {
+        ui->logText->show();
+    } else {
+        ui->logText->hide();
+    }
+  //  QApplication::processEvents();
+    logger->strlock.unlock();
+}
+
+void MainWindow::on_action_Reset_Graph_Layout_triggered()
+{
+    if (daily && (ui->tabWidget->currentWidget() == daily)) { daily->ResetGraphLayout(); }
+
+    if (overview && (ui->tabWidget->currentWidget() == overview)) { overview->ResetGraphLayout(); }
+}
+
+void MainWindow::on_action_Preferences_triggered()
+{
+    //MW: TODO: This will crash if attempted to enter while still loading..
+
+    if (m_inRecalculation) {
+        mainwin->Notify(tr("Access to Preferences has been blocked until recalculation completes."));
+        return;
+    }
+
+    PreferencesDialog pd(this, p_profile);
+    prefdialog = &pd;
+
+    if (pd.exec() == PreferencesDialog::Accepted) {
+        qDebug() << "Preferences Accepted";
+
+        //pd.Save();
+        if (daily) {
+            //daily->ReloadGraphs();
+            daily->RedrawGraphs();
+        }
+
+        if (overview) {
+            overview->RebuildGraphs(true);
+            //overview->RedrawGraphs();
+        }
+    }
+
+    prefdialog = nullptr;
+}
+
+#include "oximeterimport.h"
+QDateTime datetimeDialog(QDateTime datetime, QString message);
+
+void MainWindow::on_oximetryButton_clicked()
+{
+    OximeterImport oxiimp(this);
+    oxiimp.exec();
+}
+
+void MainWindow::CheckForUpdates()
+{
+    on_actionCheck_for_Updates_triggered();
+}
+
+void MainWindow::on_actionCheck_for_Updates_triggered()
+{
+    UpdaterWindow *w = new UpdaterWindow(this);
+    w->checkForUpdates();
+}
+
+bool toolbox_visible = false;
+void MainWindow::on_action_Screenshot_triggered()
+{
+    daily->hideSpaceHogs();
+    toolbox_visible = ui->toolBox->isVisible();
+    ui->toolBox->hide();
+    QTimer::singleShot(250, this, SLOT(DelayedScreenshot()));
+}
+void MainWindow::DelayedScreenshot()
+{
+    int w = width();
+    int h = height();
+
+    // Scale for high resolution displays (like Retina)
+#if(QT_VERSION>=QT_VERSION_CHECK(5,0,0))
+    qreal pr = devicePixelRatio();
+    w /= pr;
+    h /= pr;
+#endif
+
+#if defined(Q_OS_WIN32) || defined(Q_OS_LINUX)
+     QRect rec = QApplication::desktop()->screenGeometry();
+
+     // grab the whole screen
+     QPixmap desktop = QPixmap::grabWindow(QApplication::desktop()->winId());
+
+     QPixmap pixmap = desktop.copy(x() * devicePixelRatio(), y() * devicePixelRatio(), (width()+6) * devicePixelRatio(), (height()+22) * devicePixelRatio());
+
+#elif defined(Q_OS_MAC)
+    QPixmap pixmap = QPixmap::grabWindow(this->winId(), x(), y(), w, h+10);
+#endif
+
+    QString a = PREF.Get("{home}/Screenshots");
+    QDir dir(a);
+
+    if (!dir.exists()) {
+        dir.mkdir(a);
+    }
+
+    a += "/screenshot-" + QDateTime::currentDateTime().toString("yyyyMMdd-hhmmss") + ".png";
+
+    qDebug() << "Saving screenshot to" << a;
+
+    if (!pixmap.save(a)) {
+        Notify(tr("There was an error saving screenshot to file \"%1\"").arg(QDir::toNativeSeparators(a)));
+    } else {
+        Notify(tr("Screenshot saved to file \"%1\"").arg(QDir::toNativeSeparators(a)));
+    }
+    daily->showSpaceHogs();
+    ui->toolBox->setVisible(toolbox_visible);
+
+}
+
+void MainWindow::on_actionView_Oximetry_triggered()
+{
+    on_oximetryButton_clicked();
+}
+void MainWindow::updatestatusBarMessage(const QString &text)
+{
+    ui->statusbar->showMessage(text, 1000);
+}
+
+void MainWindow::on_actionPrint_Report_triggered()
+{
+#ifdef Q_WS_MAC
+#if ((QT_VERSION <= QT_VERSION_CHECK(4, 8, 4)))
+    QMessageBox::information(this, tr("Printing Disabled"),
+                             tr("Please rebuild SleepyHead with Qt 4.8.5 or greater, as printing causes a crash with this version of Qt"),
+                             QMessageBox::Ok);
+    return;
+#endif
+#endif
+    Report report;
+
+    if (ui->tabWidget->currentWidget() == overview) {
+        Report::PrintReport(overview->graphView(), STR_TR_Overview);
+    } else if (ui->tabWidget->currentWidget() == daily) {
+        Report::PrintReport(daily->graphView(), STR_TR_Daily, daily->getDate());
+    } else {
+        QPrinter printer(QPrinter::HighResolution);
+#ifdef Q_WS_X11
+        printer.setPrinterName("Print to File (PDF)");
+        printer.setOutputFormat(QPrinter::PdfFormat);
+        QString name;
+        QString datestr;
+
+        if (ui->tabWidget->currentWidget() == ui->statisticsTab) {
+            name = "Statistics";
+            datestr = QDate::currentDate().toString(Qt::ISODate);
+        } else if (ui->tabWidget->currentWidget() == ui->helpTab) {
+            name = "Help";
+            datestr = QDateTime::currentDateTime().toString(Qt::ISODate);
+        } else { name = "Unknown"; }
+
+        QString filename = PREF.Get("{home}/" + name + "_" + p_profile->user->userName() + "_" + datestr + ".pdf");
+
+        printer.setOutputFileName(filename);
+#endif
+        printer.setPrintRange(QPrinter::AllPages);
+        printer.setOrientation(QPrinter::Portrait);
+        printer.setFullPage(false); // This has nothing to do with scaling
+        printer.setNumCopies(1);
+        printer.setPageMargins(5, 5, 5, 5, QPrinter::Millimeter);
+        QPrintDialog pdlg(&printer, this);
+
+        if (pdlg.exec() == QPrintDialog::Accepted) {
+
+            if (ui->tabWidget->currentWidget() == ui->statisticsTab) {
+                ui->statisticsView->print(&printer);
+            } else if (ui->tabWidget->currentWidget() == ui->helpTab) {
+                ui->webView->print(&printer);
+            }
+
+        }
+
+        //QMessageBox::information(this,tr("Not supported Yet"),tr("Sorry, printing from this page is not supported yet"),QMessageBox::Ok);
+    }
+}
+
+void MainWindow::on_action_Edit_Profile_triggered()
+{
+    NewProfile *newprof = new NewProfile(this);
+    QString name =PREF[STR_GEN_Profile].toString();
+    newprof->edit(name);
+    newprof->setWindowModality(Qt::ApplicationModal);
+    newprof->setModal(true);
+    newprof->exec();
+    qDebug()  << newprof;
+    delete newprof;
+}
+
+void MainWindow::on_action_CycleTabs_triggered()
+{
+    int i;
+    qDebug() << "Switching Tabs";
+    i = ui->tabWidget->currentIndex() + 1;
+
+    if (i >= ui->tabWidget->count()) {
+        i = 0;
+    }
+
+    ui->tabWidget->setCurrentIndex(i);
+}
+
+void MainWindow::on_actionExp_ort_triggered()
+{
+    ExportCSV ex(this);
+
+    if (ex.exec() == ExportCSV::Accepted) {
+    }
+}
+
+void MainWindow::on_actionOnline_Users_Guide_triggered()
+{
+    ui->webView->load(
+        QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=SleepyHead_Users_Guide"));
+    ui->tabWidget->setCurrentWidget(ui->helpTab);
+}
+
+void MainWindow::on_action_Frequently_Asked_Questions_triggered()
+{
+    ui->webView->load(
+        QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=Frequently_Asked_Questions"));
+    ui->tabWidget->setCurrentWidget(ui->helpTab);
+}
+
+void packEventList(EventList *el, EventDataType minval = 0)
+{
+    if (el->count() < 2) { return; }
+
+    EventList nel(EVL_Waveform);
+    EventDataType t = 0, lastt = 0; //el->data(0);
+    qint64 ti = 0; //=el->time(0);
+    //nel.AddEvent(ti,lastt);
+    bool f = false;
+    qint64 lasttime = 0;
+    EventDataType min = 999, max = 0;
+
+
+    for (quint32 i = 0; i < el->count(); i++) {
+        t = el->data(i);
+        ti = el->time(i);
+        f = false;
+
+        if (t > minval) {
+            if (t != lastt) {
+                if (!lasttime) {
+                    nel.setFirst(ti);
+                }
+
+                nel.AddEvent(ti, t);
+
+                if (t < min) { min = t; }
+
+                if (t > max) { max = t; }
+
+                lasttime = ti;
+                f = true;
+            }
+        } else {
+            if (lastt > minval) {
+                nel.AddEvent(ti, lastt);
+                lasttime = ti;
+                f = true;
+            }
+        }
+
+        lastt = t;
+    }
+
+    if (!f) {
+        if (t > minval) {
+            nel.AddEvent(ti, t);
+            lasttime = ti;
+        }
+    }
+
+    el->setFirst(nel.first());
+    el->setLast(nel.last());
+    el->setMin(min);
+    el->setMax(max);
+
+    el->getData().clear();
+    el->getTime().clear();
+    el->setCount(nel.count());
+
+    el->getData() = nel.getData();
+    el->getTime() = nel.getTime();
+}
+
+void MainWindow::on_action_Rebuild_Oximetry_Index_triggered()
+{
+    QVector<ChannelID> valid;
+    valid.push_back(OXI_Pulse);
+    valid.push_back(OXI_SPO2);
+    valid.push_back(OXI_Plethy);
+    //valid.push_back(OXI_PulseChange); // Delete these and recalculate..
+    //valid.push_back(OXI_SPO2Drop);
+
+    QVector<ChannelID> invalid;
+
+    QList<Machine *> machines = p_profile->GetMachines(MT_OXIMETER);
+
+    qint64 f = 0, l = 0;
+
+    int discard_threshold = p_profile->oxi->oxiDiscardThreshold();
+    Machine *m;
+
+    for (int z = 0; z < machines.size(); z++) {
+        m = machines.at(z);
+        //m->sessionlist.erase(m->sessionlist.find(0));
+
+        // For each Session
+        for (QHash<SessionID, Session *>::iterator s = m->sessionlist.begin(); s != m->sessionlist.end();
+                s++) {
+            Session *sess = s.value();
+
+            if (!sess) { continue; }
+
+            sess->OpenEvents();
+
+            // For each EventList contained in session
+            invalid.clear();
+            f = 0;
+            l = 0;
+
+            for (QHash<ChannelID, QVector<EventList *> >::iterator e = sess->eventlist.begin();
+                    e != sess->eventlist.end(); e++) {
+
+                // Discard any non data events.
+                if (!valid.contains(e.key())) {
+                    // delete and push aside for later to clean up
+                    for (int i = 0; i < e.value().size(); i++)  {
+                        delete e.value()[i];
+                    }
+
+                    e.value().clear();
+                    invalid.push_back(e.key());
+                } else {
+                    // Valid event
+
+
+                    //                    // Clean up outliers at start of eventlist chunks
+                    //                    EventDataType baseline=sess->wavg(OXI_SPO2);
+                    //                    if (e.key()==OXI_SPO2) {
+                    //                        const int o2start_threshold=10000; // seconds since start of event
+
+                    //                        EventDataType zz;
+                    //                        int ii;
+
+                    //                        // Trash suspect outliers in the first o2start_threshold milliseconds
+                    //                        for (int j=0;j<e.value().size();j++) {
+                    //                            EventList *ev=e.value()[j];
+                    //                            if ((ev->count() <= (unsigned)discard_threshold))
+                    //                                continue;
+
+                    //                            qint64 ti=ev->time(0);
+
+                    //                            zz=-1;
+                    //                            // Peek o2start_threshold ms ahead and grab the value
+                    //                            for (ii=0;ii<ev->count();ii++) {
+                    //                                if (((ev->time(ii)-ti) > o2start_threshold)) {
+                    //                                    zz=ev->data(ii);
+                    //                                    break;
+                    //                                }
+                    //                            }
+                    //                            if (zz<0)
+                    //                                continue;
+                    //                            // Trash any suspect outliers
+                    //                            for (int i=0;i<ii;i++) {
+                    //                                if (ev->data(i) < baseline) { //(zz-10)) {
+
+                    //                                    ev->getData()[i]=0;
+                    //                                }
+                    //                            }
+                    //                        }
+                    //                    }
+                    QVector<EventList *> newlist;
+
+                    for (int i = 0; i < e.value().size(); i++)  {
+                        if (e.value()[i]->count() > (unsigned)discard_threshold) {
+                            newlist.push_back(e.value()[i]);
+                        } else {
+                            delete e.value()[i];
+                        }
+                    }
+
+                    for (int i = 0; i < newlist.size(); i++) {
+                        packEventList(newlist[i], 8);
+
+                        EventList *el = newlist[i];
+
+                        if (!f || f > el->first()) { f = el->first(); }
+
+                        if (!l || l < el->last()) { l = el->last(); }
+                    }
+
+                    e.value() = newlist;
+                }
+            }
+
+            for (int i = 0; i < invalid.size(); i++) {
+                sess->eventlist.erase(sess->eventlist.find(invalid[i]));
+            }
+
+            if (f) { sess->really_set_first(f); }
+
+            if (l) { sess->really_set_last(l); }
+
+            sess->m_cnt.clear();
+            sess->m_sum.clear();
+            sess->m_min.clear();
+            sess->m_max.clear();
+            sess->m_cph.clear();
+            sess->m_sph.clear();
+            sess->m_avg.clear();
+            sess->m_wavg.clear();
+            sess->m_valuesummary.clear();
+            sess->m_timesummary.clear();
+            sess->m_firstchan.clear();
+            sess->m_lastchan.clear();
+            sess->SetChanged(true);
+        }
+
+    }
+
+    for (int i = 0; i < machines.size(); i++) {
+        Machine *m = machines[i];
+        m->Save();
+        m->SaveSummary();
+    }
+
+    daily->LoadDate(getDaily()->getDate());
+    overview->ReloadGraphs();
+}
+
+void MainWindow::RestartApplication(bool force_login, bool change_datafolder)
+{
+    QString apppath;
+#ifdef Q_OS_MAC
+    // In Mac OS the full path of aplication binary is:
+    //    <base-path>/myApp.app/Contents/MacOS/myApp
+
+    // prune the extra bits to just get the app bundle path
+    apppath = QApplication::instance()->applicationDirPath().section("/", 0, -3);
+
+    QStringList args;
+    args << "-n"; // -n option is important, as it opens a new process
+    args << apppath;
+
+    args << "--args"; // SleepyHead binary options after this
+    args << "-p"; // -p starts with 1 second delay, to give this process time to save..
+
+
+    if (force_login) { args << "-l"; }
+
+    if (change_datafolder) { args << "-d"; }
+
+    if (QProcess::startDetached("/usr/bin/open", args)) {
+        QApplication::instance()->exit();
+    } else { QMessageBox::warning(nullptr, tr("Gah!"), tr("If you can read this, the restart command didn't work. Your going to have to do it yourself manually."), QMessageBox::Ok); }
+
+#else
+    apppath = QApplication::instance()->applicationFilePath();
+
+    // If this doesn't work on windoze, try uncommenting this method
+    // Technically should be the same thing..
+
+    //if (QDesktopServices::openUrl(apppath)) {
+    //    QApplication::instance()->exit();
+    //} else
+    QStringList args;
+    args << "-p";
+
+    if (force_login) { args << "-l"; }
+
+    if (change_datafolder) { args << "-d"; }
+
+    if (QProcess::startDetached(apppath, args)) {
+        ::exit(0);
+        //QApplication::instance()->exit();
+    } else { QMessageBox::warning(nullptr, tr("Gah!"), tr("If you can read this, the restart command didn't work. Your going to have to do it yourself manually."), QMessageBox::Ok); }
+
+#endif
+}
+
+void MainWindow::on_actionChange_User_triggered()
+{
+    p_profile->Save();
+    PREF.Save();
+    p_profile->removeLock();
+
+    RestartApplication(true);
+}
+
+void MainWindow::on_actionPurge_Current_Day_triggered()
+{
+    QDate date = getDaily()->getDate();
+    getDaily()->Unload(date);
+    Day *day = p_profile->GetDay(date, MT_CPAP);
+    Machine *cpap = nullptr;
+    if (day) cpap = day->machine(MT_CPAP);
+
+    if (cpap) {
+        QList<Session *>::iterator s;
+
+        QList<Session *> list;
+        QList<SessionID> sidlist;
+        for (s = day->begin(); s != day->end(); ++s) {
+            list.push_back(*s);
+            sidlist.push_back((*s)->session());
+        }
+
+        QHash<QString, SessionID> skipfiles;
+        // Read the already imported file list
+
+        QFile impfile(cpap->getDataPath()+"/imported_files.csv");
+        if (impfile.exists()) {
+            if (impfile.open(QFile::ReadOnly)) {
+                QTextStream impstream(&impfile);
+                QString serial;
+                impstream >> serial;
+                if (cpap->serial() == serial) {
+                    QString line, file, str;
+                    SessionID sid;
+                    bool ok;
+                    do {
+                        line = impstream.readLine();
+                        file = line.section(',',0,0);
+                        str = line.section(',',1);
+                        sid = str.toInt(&ok);
+                        if (!sidlist.contains(sid)) {
+                            skipfiles[file] = sid;
+                        }
+                    } while (!impstream.atEnd());
+                }
+            }
+            impfile.close();
+            // Delete the file
+            impfile.remove();
+
+            // Rewrite the file without the sessions being removed.
+            if (impfile.open(QFile::WriteOnly)) {
+                QTextStream out(&impfile);
+                out << cpap->serial();
+                QHash<QString, SessionID>::iterator skit;
+                QHash<QString, SessionID>::iterator skit_end = skipfiles.end();
+                for (skit = skipfiles.begin(); skit != skit_end; ++skit) {
+                    QString a = QString("%1,%2\n").arg(skit.key()).arg(skit.value());;
+                    out << a;
+                }
+                out.flush();
+            }
+            impfile.close();
+        }
+
+
+//        m->day.erase(m->day.find(date));
+
+        for (int i = 0; i < list.size(); i++) {
+            Session *sess = list.at(i);
+            sess->Destroy();
+            delete sess;
+        }
+    }
+    day = p_profile->GetDay(date, MT_CPAP);
+
+    if (day != nullptr) {
+        int i = 5;
+    }
+
+    getDaily()->clearLastDay();
+    getDaily()->LoadDate(date);
+}
+
+void MainWindow::on_actionRebuildCPAP(QAction *action)
+{
+    QString data = action->data().toString();
+    QString cls = data.section(":",0,0);
+    QString serial = data.section(":", 1);
+    QList<Machine *> machines = p_profile->GetMachines(MT_CPAP);
+    Machine * mach = nullptr;
+    for (int i=0; i < machines.size(); ++i) {
+        Machine * m = machines.at(i);
+        if ((m->loaderName() == cls) && (m->serial() == serial)) {
+            mach = m;
+            break;
+        }
+    }
+    if (!mach) return;
+    QString bpath = mach->getBackupPath();
+    bool backups = (dirCount(bpath) > 0) ? true : false;
+
+    if (backups) {
+        if (QMessageBox::question(this,
+                              STR_MessageBox_Question,
+                              tr("Are you sure you want to rebuild all CPAP data for the following machine:")+ "\n\n" +
+                              mach->brand() + " " + mach->model() + " " +
+                              mach->modelnumber() + " (" + mach->serial() + ")" + "\n\n"+
+                              tr("Please note, that this could result in loss of graph data if SleepyHead's internal backups have been disabled or interfered with in any way."),
+                              QMessageBox::Yes | QMessageBox::No,
+                              QMessageBox::No) == QMessageBox::No) {
+            return;
+        }
+    } else {
+        if (QMessageBox::question(this,
+                              STR_MessageBox_Warning,
+                              "<p><b>"+STR_MessageBox_Warning+": </b>"+tr("For some reason, SleepyHead does not have internal backups for the following machine:")+ "</p>" +
+                              "<p>"+mach->brand() + " " + mach->model() + " " +
+                              mach->modelnumber() + " (" + mach->serial() + ")" + "</p>"+
+                              "<p>"+tr("Provided you have made <i>your <b>own</b> backups for ALL of your CPAP data</i>, you can still complete this operation, but you will have to restore from your backups manually.")+"</p>"
+                              "<p><b>"+tr("Are you really sure you want to do this?")+"</b></p>",
+                              QMessageBox::Yes | QMessageBox::No,
+                              QMessageBox::No) == QMessageBox::No) {
+            return;
+        }
+    }
+
+    purgeMachine(mach);
+
+    if (backups) {
+        importCPAP(ImportPath(mach->getBackupPath(), lookupLoader(mach)), tr("Please wait, importing from backup folder(s)..."));
+    } else {
+        if (QMessageBox::information(this, STR_MessageBox_Warning,
+                                 tr("Because there are no internal backups to rebuild from, you will have to restore from your own.")+"\n\n"+
+                                 tr("Would you like to import from your own backups now? (you will have no data visible for this machine until you do)"),
+                                 QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) {
+            on_action_Import_Data_triggered();
+        } else {
+        }
+    }
+    if (overview) overview->ReloadGraphs();
+    if (daily) {
+        daily->Unload();
+        daily->clearLastDay(); // otherwise Daily will crash
+        daily->ReloadGraphs();
+    }
+    GenerateStatistics();
+    p_profile->StoreMachines();
+}
+
+void MainWindow::on_actionPurgeMachine(QAction *action)
+{
+    QString data = action->data().toString();
+    QString cls = data.section(":",0,0);
+    QString serial = data.section(":", 1);
+    QList<Machine *> machines = p_profile->GetMachines(MT_CPAP);
+    Machine * mach = nullptr;
+    for (int i=0; i < machines.size(); ++i) {
+        Machine * m = machines.at(i);
+        if ((m->loaderName() == cls) && (m->serial() == serial)) {
+            mach = m;
+            break;
+        }
+    }
+    if (!mach) return;
+
+    if (QMessageBox::question(this, STR_MessageBox_Warning, "<p><b>"+STR_MessageBox_Warning+":</b> "+tr("You are about to <font size=+2>obliterate</font> SleepyHead's machine database for the following machine:")+"</p>"+
+                              "<p>"+mach->brand() + " " + mach->model() + " " +
+                              mach->modelnumber() + " (" + mach->serial() + ")" + "</p>"+
+                              "<p>"+tr("Note as a precaution, the backup folder will be left in place.")+"</p>"+
+                              "<p>"+tr("Are you <b>absolutely sure</b> you want to proceed?")+"</p>", QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) {
+
+        purgeMachine(mach);
+
+        p_profile->DelMachine(mach);
+        delete mach;
+        PopulatePurgeMenu();
+
+    }
+
+}
+
+void MainWindow::purgeMachine(Machine * mach)
+{
+    // detect backups
+    daily->Unload(daily->getDate());
+
+    // Technicially the above won't sessions under short session limit.. Using Purge to clean up the rest.
+    if (mach->Purge(3478216)) {
+        mach->sessionlist.clear();
+        mach->day.clear();
+    } else {
+        QMessageBox::warning(this, STR_MessageBox_Error,
+                             tr("A file permission error or simillar screwed up the purge process, you will have to delete the following folder manually:")
+                             +"\n\n"+
+                             QDir::toNativeSeparators(mach->getDataPath()), QMessageBox::Ok, QMessageBox::Ok);
+        if (overview) overview->ReloadGraphs();
+
+        if (daily) {
+            daily->clearLastDay(); // otherwise Daily will crash
+            daily->ReloadGraphs();
+        }
+        //GenerateStatistics();
+        return;
+    }
+
+    if (overview) overview->ReloadGraphs();
+    QFile rxcache(p_profile->Get("{" + STR_GEN_DataFolder + "}/RXChanges.cache" ));
+    rxcache.remove();
+
+    if (daily) {
+        daily->clearLastDay(); // otherwise Daily will crash
+        daily->ReloadGraphs();
+    }
+    QApplication::processEvents();
+
+
+//    GenerateStatistics();
+}
+
+void MainWindow::keyPressEvent(QKeyEvent *event)
+{
+    Q_UNUSED(event)
+    //qDebug() << "Keypress:" << event->key();
+}
+
+void MainWindow::on_action_Sidebar_Toggle_toggled(bool visible)
+{
+    ui->toolBox->setVisible(visible);
+    p_profile->appearance->setRightSidebarVisible(visible);
+}
+
+void MainWindow::on_recordsBox_linkClicked(const QUrl &linkurl)
+{
+    QString link = linkurl.toString().section("=", 0, 0).toLower();
+    QString data = linkurl.toString().section("=", 1).toLower();
+    qDebug() << linkurl.toString() << link << data;
+
+    if (link == "daily") {
+        QDate date = QDate::fromString(data, Qt::ISODate);
+        ui->tabWidget->setCurrentWidget(daily);
+        QApplication::processEvents();
+        daily->LoadDate(date);
+    } else if (link == "overview") {
+        QString date1 = data.section(",", 0, 0);
+        QString date2 = data.section(",", 1);
+
+        QDate d1 = QDate::fromString(date1, Qt::ISODate);
+        QDate d2 = QDate::fromString(date2, Qt::ISODate);
+        overview->setRange(d1, d2);
+        ui->tabWidget->setCurrentWidget(overview);
+    } else if (link == "import") {
+        if (data == "cpap") on_importButton_clicked();
+        if (data == "oximeter") on_oximetryButton_clicked();
+    } else if (link == "statistics") {
+        ui->tabWidget->setCurrentWidget(ui->statisticsTab);
+    }
+}
+
+void MainWindow::on_helpButton_clicked()
+{
+    ui->tabWidget->setCurrentWidget(ui->helpTab);
+}
+
+void MainWindow::on_actionView_Statistics_triggered()
+{
+    ui->tabWidget->setCurrentWidget(ui->statisticsTab);
+}
+
+void MainWindow::on_webView_linkClicked(const QUrl &url)
+{
+    QString s = url.toString();
+    qDebug() << "Link Clicked" << url;
+
+    if (s.toLower().startsWith("https:")) {
+        QDesktopServices().openUrl(url);
+    } else {
+        ui->webView->setUrl(url);
+    }
+}
+
+void MainWindow::on_webView_statusBarMessage(const QString &text)
+{
+    ui->statusbar->showMessage(text);
+}
+
+void MainWindow::LinkHovered(const QString &link, const QString &title, const QString &textContent)
+{
+    Q_UNUSED(title);
+    Q_UNUSED(textContent);
+    ui->statusbar->showMessage(link);
+}
+
+void MainWindow::on_tabWidget_currentChanged(int index)
+{
+    Q_UNUSED(index);
+   // QWidget *widget = ui->tabWidget->currentWidget();
+}
+
+
+void MainWindow::on_bookmarkView_linkClicked(const QUrl &arg1)
+{
+    on_recordsBox_linkClicked(arg1);
+}
+
+void MainWindow::on_filterBookmarks_editingFinished()
+{
+    bookmarkFilter = ui->filterBookmarks->text();
+    updateFavourites();
+}
+
+void MainWindow::on_filterBookmarksButton_clicked()
+{
+    if (!bookmarkFilter.isEmpty()) {
+        ui->filterBookmarks->setText("");
+        bookmarkFilter = "";
+        updateFavourites();
+    }
+}
+
+void MainWindow::reprocessEvents(bool restart)
+{
+    m_restartRequired = restart;
+    QTimer::singleShot(0, this, SLOT(doReprocessEvents()));
+}
+
+
+void MainWindow::FreeSessions()
+{
+    QDate first = p_profile->FirstDay();
+    QDate date = p_profile->LastDay();
+    Day *day;
+    QDate current = daily->getDate();
+
+    do {
+        day = p_profile->GetDay(date, MT_CPAP);
+
+        if (day) {
+            if (date != current) {
+                day->CloseEvents();
+            }
+        }
+
+        date = date.addDays(-1);
+    }  while (date >= first);
+}
+
+void MainWindow::MachineUnsupported(Machine * m)
+{
+    Q_ASSERT(m != nullptr);
+    QMessageBox::information(this, STR_MessageBox_Error, QObject::tr("Sorry, your %1 %2 machine is not currently supported.").arg(m->brand()).arg(m->model()), QMessageBox::Ok);
+}
+
+void MainWindow::doReprocessEvents()
+{
+    if (p_profile->countDays(MT_CPAP, p_profile->FirstDay(), p_profile->LastDay()) == 0) {
+        return;
+    }
+
+    m_inRecalculation = true;
+    QDate first = p_profile->FirstDay();
+    QDate date = p_profile->LastDay();
+    Session *sess;
+    Day *day;
+    //FlowParser flowparser;
+
+    mainwin->Notify(tr("Performance will be degraded during these recalculations."),
+                    tr("Recalculating Indices"));
+
+    // For each day in history
+    int daycount = first.daysTo(date);
+    int idx = 0;
+
+    QList<Machine *> machines = p_profile->GetMachines(MT_CPAP);
+
+    // Disabling multithreaded save as it appears it's causing problems
+    bool cache_sessions = false; //p_profile->session->cacheSessions();
+
+    if (cache_sessions) { // Use multithreaded save to handle reindexing.. (hogs memory like hell)
+        qstatus->setText(tr("Loading Event Data"));
+    } else {
+        qstatus->setText(tr("Recalculating Summaries"));
+    }
+
+    if (qprogress) {
+        qprogress->setValue(0);
+        qprogress->setVisible(true);
+    }
+
+    bool isopen;
+
+    do {
+        day = p_profile->GetDay(date, MT_CPAP);
+
+        if (day) {
+            for (int i = 0; i < day->size(); i++) {
+                sess = (*day)[i];
+                isopen = sess->eventsLoaded();
+
+                // Load the events if they aren't loaded already
+                sess->OpenEvents();
+
+                //if (!sess->channelDataExists(CPAP_FlowRate)) continue;
+
+                //QVector<EventList *> & flowlist=sess->eventlist[CPAP_FlowRate];
+
+                // Destroy any current user flags..
+                sess->destroyEvent(CPAP_UserFlag1);
+                sess->destroyEvent(CPAP_UserFlag2);
+                sess->destroyEvent(CPAP_UserFlag3);
+
+                // AHI flags
+                sess->destroyEvent(CPAP_AHI);
+                sess->destroyEvent(CPAP_RDI);
+
+                if (sess->machine()->loaderName() != STR_MACH_PRS1) {
+                    sess->destroyEvent(CPAP_LargeLeak);
+                }
+
+                sess->SetChanged(true);
+
+                if (!cache_sessions) {
+                    sess->UpdateSummaries();
+                    sess->machine()->SaveSession(sess);
+
+                    if (!isopen) {
+                        sess->TrashEvents();
+                    }
+                }
+            }
+        }
+
+        date = date.addDays(-1);
+        // if (qprogress && (++idx % 10) ==0) {
+        qprogress->setValue(0 + (float(++idx) / float(daycount) * 100.0));
+        QApplication::processEvents();
+        // }
+
+    } while (date >= first);
+
+    if (cache_sessions) {
+        qstatus->setText(tr("Recalculating Summaries"));
+
+        for (int i = 0; i < machines.size(); i++) {
+            machines.at(i)->Save();
+        }
+    }
+
+    qstatus->setText(tr(""));
+    qprogress->setVisible(false);
+    m_inRecalculation = false;
+
+    if (m_restartRequired) {
+        QMessageBox::information(this, tr("Restart Required"),
+                                 tr("Recalculations are complete, the application now needs to restart to display the changes."),
+                                 QMessageBox::Ok);
+        RestartApplication();
+        return;
+    } else {
+        Notify(tr("Recalculations are now complete."), tr("Task Completed"));
+
+        FreeSessions();
+        QDate current = daily->getDate();
+        daily->LoadDate(current);
+
+        if (overview) { overview->ReloadGraphs(); }
+    }
+}
+
+void MainWindow::on_actionImport_ZEO_Data_triggered()
+{
+    QFileDialog w;
+    w.setFileMode(QFileDialog::ExistingFiles);
+    w.setOption(QFileDialog::ShowDirsOnly, false);
+    w.setOption(QFileDialog::DontUseNativeDialog, true);
+    w.setNameFilters(QStringList("Zeo CSV File (*.csv)"));
+
+    ZEOLoader zeo;
+
+    if (w.exec() == QFileDialog::Accepted) {
+        QString filename = w.selectedFiles()[0];
+
+        if (!zeo.OpenFile(filename)) {
+            Notify(tr("There was a problem opening ZEO File: ") + filename);
+            return;
+        }
+
+        Notify(tr("Zeo CSV Import complete"));
+        daily->LoadDate(daily->getDate());
+    }
+
+
+}
+
+void MainWindow::on_actionImport_RemStar_MSeries_Data_triggered()
+{
+#ifdef REMSTAR_M_SUPPORT
+    QFileDialog w;
+    w.setFileMode(QFileDialog::ExistingFiles);
+    w.setOption(QFileDialog::ShowDirsOnly, false);
+    w.setOption(QFileDialog::DontUseNativeDialog, true);
+    w.setNameFilters(QStringList("M-Series data file (*.bin)"));
+
+    MSeriesLoader mseries;
+
+    if (w.exec() == QFileDialog::Accepted) {
+        QString filename = w.selectedFiles()[0];
+
+        if (!mseries.Open(filename, p_profile)) {
+            Notify(tr("There was a problem opening MSeries block File: ") + filename);
+            return;
+        }
+
+        Notify(tr("MSeries Import complete"));
+        daily->LoadDate(daily->getDate());
+    }
+
+#endif
+}
+
+void MainWindow::on_actionSleep_Disorder_Terms_Glossary_triggered()
+{
+    ui->webView->load(
+        QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=Glossary"));
+    ui->tabWidget->setCurrentWidget(ui->helpTab);
+}
+
+void MainWindow::on_actionHelp_Support_SleepyHead_Development_triggered()
+{
+    QUrl url =
+        QUrl("http://sleepyhead.sourceforge.net/wiki/index.php?title=Support_SleepyHead_Development");
+    QDesktopServices().openUrl(url);
+    //    ui->webView->load(url);
+    //    ui->tabWidget->setCurrentWidget(ui->helpTab);
+}
+
+void MainWindow::on_actionChange_Language_triggered()
+{
+    QSettings *settings = new QSettings(getDeveloperName(), getAppName());
+    settings->remove("Settings/Language");
+    delete settings;
+    p_profile->Save();
+    PREF.Save();
+    p_profile->removeLock();
+
+    RestartApplication(true);
+}
+
+void MainWindow::on_actionChange_Data_Folder_triggered()
+{
+    p_profile->Save();
+    PREF.Save();
+    p_profile->removeLock();
+
+    RestartApplication(false, true);
+}
+
+void MainWindow::on_actionImport_Somnopose_Data_triggered()
+{
+    QFileDialog w;
+    w.setFileMode(QFileDialog::ExistingFiles);
+    w.setOption(QFileDialog::ShowDirsOnly, false);
+    w.setOption(QFileDialog::DontUseNativeDialog, true);
+    w.setNameFilters(QStringList("Somnopause CSV File (*.csv)"));
+
+    SomnoposeLoader somno;
+
+    if (w.exec() == QFileDialog::Accepted) {
+        QString filename = w.selectedFiles()[0];
+
+        if (!somno.OpenFile(filename)) {
+            Notify(tr("There was a problem opening Somnopose Data File: ") + filename);
+            return;
+        }
+
+        Notify(tr("Somnopause Data Import complete"));
+        daily->LoadDate(daily->getDate());
+    }
+
+}
+
+void MainWindow::GenerateStatistics()
+{
+    QDate first = p_profile->FirstDay();
+    QDate last = p_profile->LastDay();
+    ui->statStartDate->setMinimumDate(first);
+    ui->statStartDate->setMaximumDate(last);
+
+    ui->statEndDate->setMinimumDate(first);
+    ui->statEndDate->setMaximumDate(last);
+
+    Statistics stats;
+    QString html = stats.GenerateHTML();
+
+    updateFavourites();
+
+    //QWebFrame *frame=ui->statisticsView->page()->currentFrame();
+    //frame->addToJavaScriptWindowObject("mainwin",this);
+    //ui->statisticsView->setHtml(html);
+    MyStatsPage *page = new MyStatsPage(this);
+    page->currentFrame()->setHtml(html);
+    ui->statisticsView->setPage(page);
+
+
+
+    MyStatsPage *page2 = new MyStatsPage(this);
+    page2->currentFrame()->setHtml(GenerateWelcomeHTML());
+    ui->welcomeView->setPage(page2);
+
+    //    connect(ui->statisticsView->page()->currentFrame(),SIGNAL(javaScriptWindowObjectCleared())
+    //    QString file="qrc:/docs/index.html";
+    //    QUrl url(file);
+    //    ui->webView->setUrl(url);
+}
+
+
+void MainWindow::on_statisticsButton_clicked()
+{
+    ui->tabWidget->setCurrentWidget(ui->statisticsTab);
+}
+
+void MainWindow::on_statisticsView_linkClicked(const QUrl &arg1)
+{
+    //qDebug() << arg1;
+    on_recordsBox_linkClicked(arg1);
+}
+
+void MainWindow::on_reportModeMonthly_clicked()
+{
+    ui->statStartDate->setVisible(false);
+    ui->statEndDate->setVisible(false);
+    if (p_profile->general->statReportMode() != 1) {
+        p_profile->general->setStatReportMode(1);
+        GenerateStatistics();
+    }
+}
+
+void MainWindow::on_reportModeStandard_clicked()
+{
+    ui->statStartDate->setVisible(false);
+    ui->statEndDate->setVisible(false);
+    if (p_profile->general->statReportMode() != 0) {
+        p_profile->general->setStatReportMode(0);
+        GenerateStatistics();
+    }
+}
+
+
+void MainWindow::on_reportModeRange_clicked()
+{
+    ui->statStartDate->setVisible(true);
+    ui->statEndDate->setVisible(true);
+    if (p_profile->general->statReportMode() != 2) {
+        p_profile->general->setStatReportMode(2);
+        GenerateStatistics();
+    }
+}
+
+void MainWindow::on_actionPurgeCurrentDaysOximetry_triggered()
+{
+    if (!getDaily())
+        return;
+    QDate date = getDaily()->getDate();
+    Day * day = p_profile->GetDay(date, MT_OXIMETER);
+    if (day) {
+        if (QMessageBox::question(this, STR_MessageBox_Warning,
+            tr("Are you sure you want to delete oximetry data for %1").
+                arg(getDaily()->getDate().toString(Qt::DefaultLocaleLongDate))+"<br/><br/>"+
+            tr("<b>Please be aware you can not undo this operation!</b>"),
+            QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) {
+            return;
+        }
+
+        QList<Session *> sessionlist;
+        sessionlist.append(day->sessions);
+
+        for (int i=0; i < sessionlist.size(); ++i) {
+            Session * sess = sessionlist.at(i);
+            sess->Destroy();
+            delete sess;
+        }
+
+
+        daily->clearLastDay(); // otherwise Daily will crash
+
+        getDaily()->ReloadGraphs();
+    } else {
+        QMessageBox::information(this, STR_MessageBox_Information,
+            tr("Select the day with valid oximetry data in daily view first."),QMessageBox::Ok);
+    }
+}
+
+void MainWindow::on_importButton_clicked()
+{
+    on_action_Import_Data_triggered();
+}
+
+
+void MainWindow::on_actionToggle_Line_Cursor_toggled(bool b)
+{
+    p_profile->appearance->setLineCursorMode(b);
+    if (ui->tabWidget->currentWidget() == getDaily()) {
+        getDaily()->graphView()->timedRedraw(0);
+    } else if (ui->tabWidget->currentWidget() == getOverview()) {
+        getOverview()->graphView()->timedRedraw(0);
+    }
+}
+
+void MainWindow::on_actionLeft_Daily_Sidebar_toggled(bool visible)
+{
+    getDaily()->setSidebarVisible(visible);
+}
+
+void MainWindow::on_actionDaily_Calendar_toggled(bool visible)
+{
+    getDaily()->setCalendarVisible(visible);
+}
+
+#include "SleepLib/journal.h"
+
+void MainWindow::on_actionExport_Journal_triggered()
+{
+    QString folder;
+#if QT_VERSION  < QT_VERSION_CHECK(5,0,0)
+    folder = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
+#else
+    folder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
+#endif
+    folder += QDir::separator() + tr("%1's Journal").arg(p_profile->user->userName()) + ".xml";
+
+    QString filename = QFileDialog::getSaveFileName(this, tr("Choose where to save journal"), folder, tr("XML Files (*.xml)"));
+
+    BackupJournal(filename);
+}
+
+void MainWindow::on_actionShow_Performance_Counters_toggled(bool arg1)
+{
+    p_profile->general->setShowPerformance(arg1);
+}
diff --git a/sleepyhead/mainwindow.h b/sleepyhead/mainwindow.h
new file mode 100644
index 0000000..01e6a70
--- /dev/null
+++ b/sleepyhead/mainwindow.h
@@ -0,0 +1,365 @@
+/* SleepyHead MainWindow Headers
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QGLContext>
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QSystemTrayIcon>
+#include <QTimer>
+
+#include "daily.h"
+#include "overview.h"
+#include "preferencesdialog.h"
+
+extern Profile *profile;
+QString getCPAPPixmap(QString mach_class);
+
+namespace Ui {
+class MainWindow;
+}
+
+
+/*! \mainpage SleepyHead
+
+ \section intro_sec Introduction
+
+ SleepyHead is Cross-Platform Open-Source software for reviewing data from %CPAP machines, which are used in the treatment of Sleep Disorders.
+
+ SleepyHead has been created by <a href="http://jedimark64.blogspot.com">Mark Watkins</a> (JediMark), an Australian software developer.
+
+ This document is an attempt to provide a little technical insight into SleepyHead's program internals.
+
+ \section project_info Further Information
+ The project is hosted on sourceforge, and it's project page can be reached at <a href="http://sourceforge.net/projects/sleepyhead">http://sourceforge.net/projects/sleepyhead</a>.
+
+ There is also the <a href="http://sleepyhead.sourceforge.net">SleepyHead Wiki</a> containing further information
+
+ \section structure Program Structure
+ SleepyHead is written in C++ using Qt Toolkit library, and comprises of 3 main components
+ \list
+ \li The SleepLib Database, a specialized database for working with multiple sources of Sleep machine data.
+ \li A custom designed, high performance and interactive OpenGL Graphing Library.
+ \li and the main Application user interface.
+ \endlist
+
+ This document is still a work in progress, right now all the classes and sections are jumbled together.
+
+ */
+
+// * \section install_sec Installation
+
+extern QStatusBar *qstatusbar;
+
+//QString getCPAPPixmap(QString mach_class);
+
+
+class Daily;
+class Report;
+class Overview;
+
+
+/*! \class MainWindow
+    \author Mark Watkins
+    \brief The Main Application window for SleepyHead
+    */
+
+class MainWindow : public QMainWindow
+{
+    Q_OBJECT
+
+  public:
+    explicit MainWindow(QWidget *parent = 0);
+    ~MainWindow();
+
+    //! \brief Update the list of Favourites (Bookmarks) in the right sidebar.
+    void updateFavourites();
+
+    //! \brief Update statistics report
+    void GenerateStatistics();
+
+    //! \brief Create a new menu object in the main menubar.
+    QMenu *CreateMenu(QString title);
+
+    //! \brief Start the automatic update checker process
+    void CheckForUpdates();
+
+
+    /*! \fn Notify(QString s,int ms=5000, QString title="SleepyHead v"+VersionString());
+        \brief Pops up a message box near the system tray
+        \param QString string
+        \param title
+        \param int ms
+
+        Title is shown in bold
+        string is the main message content to show
+        ms = millisecond delay of how long to show popup
+
+        Mac needs Growl notification system for this to work
+        */
+    void Notify(QString s, QString title = "", int ms = 5000);
+
+//    /*! \fn gGraphView *snapshotGraph()
+//        \brief Returns the current snapshotGraph object used by the report printing system */
+//    gGraphView *snapshotGraph() { return SnapshotGraph; }
+
+    //! \brief Returns the Daily Tab object
+    Daily *getDaily() { return daily; }
+
+    //! \brief Returns the Overview Tab object
+    Overview *getOverview() { return overview; }
+
+    /*! \fn void RestartApplication(bool force_login=false);
+        \brief Closes down SleepyHead and restarts it
+        \param bool force_login
+
+        If force_login is set, it will return to the login menu even if it's set to skip
+        */
+    static void RestartApplication(bool force_login = false, bool change_datafolder = false);
+
+    void JumpDaily();
+
+    void sendStatsUrl(QString msg) { on_recordsBox_linkClicked(QUrl(msg)); }
+
+    //! \brief Sets up recalculation of all event summaries and flags
+    void reprocessEvents(bool restart = false);
+
+
+    //! \brief Internal function to set Records Box html from statistics module
+    void setRecBoxHTML(QString html);
+    int importCPAP(ImportPath import, const QString &message);
+
+    void startImportDialog() { on_action_Import_Data_triggered(); }
+
+    void log(QString text);
+
+  public slots:
+    //! \brief Recalculate all event summaries and flags
+    void doReprocessEvents();
+
+    void MachineUnsupported(Machine * m);
+
+
+  protected:
+    virtual void closeEvent(QCloseEvent *);
+    virtual void keyPressEvent(QKeyEvent *event);
+
+  private slots:
+    /*! \fn void on_action_Import_Data_triggered();
+        \brief Provide the file dialog for selecting import location, and start the import process
+        This is called when the Import button is clicked
+        */
+    void on_action_Import_Data_triggered();
+
+    //! \brief Toggle Fullscreen (currently F11)
+    void on_action_Fullscreen_triggered();
+
+    //! \brief Loads the default page in the Welcome screens web browser
+    void on_homeButton_clicked();
+
+    //! \brief Go back in the welcome browsers history
+    void on_backButton_clicked();
+
+    //! \brief Go forward in the welcome browsers history
+    void on_forwardButton_clicked();
+
+    //! \brief Updates the URL bar to show changes to the URL
+    void on_webView_urlChanged(const QUrl &arg1);
+
+    //! \brief Loads a web page when enter is pressed in the URL bar
+    void on_urlBar_activated(const QString &arg1);
+
+    //! \brief Selects the Daily page and redraws the graphs
+    void on_dailyButton_clicked();
+
+    //! \brief Selects the Overview page and redraws the graphs
+    void on_overviewButton_clicked();
+
+    //! \brief called when webpage has finished loading in welcome browser
+    void on_webView_loadFinished(bool arg1);
+
+    //! \brief called when webpage has starts loading in welcome browser
+    void on_webView_loadStarted();
+
+    //! \brief Updates the progress bar in the statusbar while a page is loading
+    void on_webView_loadProgress(int progress);
+
+    //! \brief Display About Dialog
+    void on_action_About_triggered();
+
+    //! \brief Called after a timeout to initiate loading of all summary data for this profile
+    void Startup();
+
+    //! \brief Toggle the Debug pane on and off
+    void on_actionDebug_toggled(bool arg1);
+
+    //! \brief passes the ResetGraphLayout menu click to the Daily & Overview views
+    void on_action_Reset_Graph_Layout_triggered();
+
+    //! \brief Opens the Preferences Dialog, and saving changes if OK is pressed
+    void on_action_Preferences_triggered();
+
+    //! \brief Opens and/or shows the Oximetry page
+    void on_oximetryButton_clicked();
+
+    //! \brief Creates the UpdaterWindow object that actually does the real check for updates
+    void on_actionCheck_for_Updates_triggered();
+
+    //! \brief Attempts to do a screenshot of the application window
+    //! \note This is currently broken on Macs
+    void on_action_Screenshot_triggered();
+
+    //! \brief This is the actual screenshot code.. It's delayed with a QTimer to give the menu time to close.
+    void DelayedScreenshot();
+
+    //! \brief a slot that calls the real Oximetry tab selector
+    void on_actionView_Oximetry_triggered();
+
+    //! \brief Updates the Statusbar message with the QString message contained in Text
+    void updatestatusBarMessage(const QString &text);
+
+    //! \brief Passes the Daily, Overview & Oximetry object to Print Report, based on current tab
+    void on_actionPrint_Report_triggered();
+
+    //! \brief Opens the Profile Editor
+    void on_action_Edit_Profile_triggered();
+
+    //! \brief Selects the next view tab
+    void on_action_CycleTabs_triggered();
+
+    //! \brief Opens the CSV Export window
+    void on_actionExp_ort_triggered();
+
+    //! \brief Opens the User Guide at the wiki in the welcome browser.
+    void on_actionOnline_Users_Guide_triggered();
+
+    //! \brief Opens the Frequently Asked Questions at the wiki in the welcome browser.
+    void on_action_Frequently_Asked_Questions_triggered();
+
+    /*! \fn void on_action_Rebuild_Oximetry_Index_triggered();
+        \brief This function scans over all oximetry data and reindexes and tries to fix any inconsistencies.
+        */
+    void on_action_Rebuild_Oximetry_Index_triggered();
+
+    //! \brief Log out, by effectively forcing a restart
+    void on_actionChange_User_triggered();
+
+    //! \brief Destroy the CPAP data for the currently selected day, so it can be freshly imported again
+    void on_actionPurge_Current_Day_triggered();
+
+    void on_action_Sidebar_Toggle_toggled(bool arg1);
+
+    void on_recordsBox_linkClicked(const QUrl &arg1);
+
+    void on_helpButton_clicked();
+
+    void on_actionView_Statistics_triggered();
+
+    void on_webView_linkClicked(const QUrl &arg1);
+
+    //void on_favouritesList_itemSelectionChanged();
+
+    //void on_favouritesList_itemClicked(QListWidgetItem *item);
+
+    void on_webView_statusBarMessage(const QString &text);
+
+    //! \brief Display Help WebView Link in statusbar.
+    void LinkHovered(const QString &link, const QString &title, const QString &textContent);
+    void on_tabWidget_currentChanged(int index);
+
+    void on_bookmarkView_linkClicked(const QUrl &arg1);
+
+    void on_filterBookmarks_editingFinished();
+
+    void on_filterBookmarksButton_clicked();
+
+    void on_actionImport_ZEO_Data_triggered();
+
+    void on_actionImport_RemStar_MSeries_Data_triggered();
+
+    void on_actionSleep_Disorder_Terms_Glossary_triggered();
+
+    void on_actionHelp_Support_SleepyHead_Development_triggered();
+
+    void aboutBoxLinkClicked(const QUrl &url);
+
+    void on_actionChange_Language_triggered();
+
+    void on_actionChange_Data_Folder_triggered();
+
+    void on_actionImport_Somnopose_Data_triggered();
+
+    //! \brief Populates the statistics with information.
+    void on_statisticsButton_clicked();
+
+    void on_statisticsView_linkClicked(const QUrl &arg1);
+
+    void on_reportModeMonthly_clicked();
+
+    void on_reportModeStandard_clicked();
+
+    void on_actionRebuildCPAP(QAction *action);
+
+    void on_actionPurgeMachine(QAction *action);
+
+    void on_reportModeRange_clicked();
+
+    void on_actionPurgeCurrentDaysOximetry_triggered();
+
+    void logMessage(QString msg);
+
+    void on_importButton_clicked();
+
+    void on_changeWarningMessage();
+
+    void on_actionToggle_Line_Cursor_toggled(bool arg1);
+
+    void on_actionLeft_Daily_Sidebar_toggled(bool arg1);
+
+    void on_actionDaily_Calendar_toggled(bool arg1);
+
+    void on_actionExport_Journal_triggered();
+
+    void on_actionShow_Performance_Counters_toggled(bool arg1);
+    void on_aboutToQuit();
+
+private:
+    void importCPAPBackups();
+    void finishCPAPImport();
+    QList<ImportPath> detectCPAPCards();
+
+    QString getWelcomeHTML();
+    void FreeSessions();
+
+    Ui::MainWindow *ui;
+    Daily *daily;
+    Overview *overview;
+    bool first_load;
+    PreferencesDialog *prefdialog;
+    QTime logtime;
+    QSystemTrayIcon *systray;
+    QMenu *systraymenu;
+//    gGraphView *SnapshotGraph;
+    QString bookmarkFilter;
+    bool m_restartRequired;
+    volatile bool m_inRecalculation;
+
+    void PopulatePurgeMenu();
+
+    //! \brief Destroy ALL the CPAP data for the selected machine
+    void purgeMachine(Machine *);
+
+    int warnidx;
+    QStringList warnmsg;
+    QTimer wtimer;
+};
+
+#endif // MAINWINDOW_H
diff --git a/sleepyhead/mainwindow.ui b/sleepyhead/mainwindow.ui
new file mode 100644
index 0000000..6a43909
--- /dev/null
+++ b/sleepyhead/mainwindow.ui
@@ -0,0 +1,3614 @@
+<?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>1005</width>
+    <height>849</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Ignored" vsizetype="Ignored">
+    <horstretch>0</horstretch>
+    <verstretch>1</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>16777215</width>
+    <height>16777215</height>
+   </size>
+  </property>
+  <property name="palette">
+   <palette>
+    <active>
+     <colorrole role="WindowText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Button">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Light">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Midlight">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Dark">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Mid">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>170</red>
+        <green>170</green>
+        <blue>170</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Text">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="BrightText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ButtonText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Base">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Window">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Shadow">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="AlternateBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>220</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+    </active>
+    <inactive>
+     <colorrole role="WindowText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Button">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Light">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Midlight">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Dark">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Mid">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>170</red>
+        <green>170</green>
+        <blue>170</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Text">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="BrightText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ButtonText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Base">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Window">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Shadow">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="AlternateBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>220</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+    </inactive>
+    <disabled>
+     <colorrole role="WindowText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Button">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Light">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Midlight">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Dark">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Mid">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>170</red>
+        <green>170</green>
+        <blue>170</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Text">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="BrightText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ButtonText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>127</red>
+        <green>127</green>
+        <blue>127</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Base">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Window">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="Shadow">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="AlternateBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>255</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipBase">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>255</red>
+        <green>255</green>
+        <blue>220</blue>
+       </color>
+      </brush>
+     </colorrole>
+     <colorrole role="ToolTipText">
+      <brush brushstyle="SolidPattern">
+       <color alpha="255">
+        <red>0</red>
+        <green>0</green>
+        <blue>0</blue>
+       </color>
+      </brush>
+     </colorrole>
+    </disabled>
+   </palette>
+  </property>
+  <property name="windowTitle">
+   <string>SleepyHead</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="Resources.qrc">
+    <normaloff>:/icons/bob-v3.0.png</normaloff>:/icons/bob-v3.0.png</iconset>
+  </property>
+  <property name="iconSize">
+   <size>
+    <width>64</width>
+    <height>64</height>
+   </size>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <layout class="QVBoxLayout" name="verticalLayout_3">
+    <property name="spacing">
+     <number>4</number>
+    </property>
+    <property name="leftMargin">
+     <number>0</number>
+    </property>
+    <property name="topMargin">
+     <number>0</number>
+    </property>
+    <property name="rightMargin">
+     <number>0</number>
+    </property>
+    <property name="bottomMargin">
+     <number>0</number>
+    </property>
+    <item>
+     <widget class="QSplitter" name="splitter_2">
+      <property name="orientation">
+       <enum>Qt::Horizontal</enum>
+      </property>
+      <widget class="QSplitter" name="splitter">
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="orientation">
+        <enum>Qt::Vertical</enum>
+       </property>
+       <widget class="QTabWidget" name="tabWidget">
+        <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="palette">
+         <palette>
+          <active>
+           <colorrole role="WindowText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Button">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Light">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Midlight">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Dark">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>127</red>
+              <green>127</green>
+              <blue>127</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Mid">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>170</red>
+              <green>170</green>
+              <blue>170</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Text">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="BrightText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="ButtonText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Base">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Window">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Shadow">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="AlternateBase">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="ToolTipBase">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>220</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="ToolTipText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+          </active>
+          <inactive>
+           <colorrole role="WindowText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Button">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Light">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Midlight">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Dark">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>127</red>
+              <green>127</green>
+              <blue>127</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Mid">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>170</red>
+              <green>170</green>
+              <blue>170</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Text">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="BrightText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="ButtonText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Base">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Window">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Shadow">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="AlternateBase">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="ToolTipBase">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>220</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="ToolTipText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+          </inactive>
+          <disabled>
+           <colorrole role="WindowText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>127</red>
+              <green>127</green>
+              <blue>127</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Button">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Light">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Midlight">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Dark">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>127</red>
+              <green>127</green>
+              <blue>127</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Mid">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>170</red>
+              <green>170</green>
+              <blue>170</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Text">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>127</red>
+              <green>127</green>
+              <blue>127</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="BrightText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="ButtonText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>127</red>
+              <green>127</green>
+              <blue>127</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Base">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Window">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Shadow">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="AlternateBase">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="ToolTipBase">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>255</red>
+              <green>255</green>
+              <blue>220</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="ToolTipText">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>0</green>
+              <blue>0</blue>
+             </color>
+            </brush>
+           </colorrole>
+          </disabled>
+         </palette>
+        </property>
+        <property name="mouseTracking">
+         <bool>true</bool>
+        </property>
+        <property name="autoFillBackground">
+         <bool>true</bool>
+        </property>
+        <property name="tabPosition">
+         <enum>QTabWidget::North</enum>
+        </property>
+        <property name="tabShape">
+         <enum>QTabWidget::Rounded</enum>
+        </property>
+        <property name="currentIndex">
+         <number>1</number>
+        </property>
+        <property name="documentMode">
+         <bool>false</bool>
+        </property>
+        <property name="tabsClosable">
+         <bool>false</bool>
+        </property>
+        <property name="movable">
+         <bool>false</bool>
+        </property>
+        <widget class="QWidget" name="welcomeTab">
+         <attribute name="title">
+          <string>Welcome</string>
+         </attribute>
+         <layout class="QVBoxLayout" name="verticalLayout_8">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="QLabel" name="warningLabel">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <pointsize>14</pointsize>
+              <weight>50</weight>
+              <italic>false</italic>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="styleSheet">
+             <string notr="true">background-color: red;
+color: yellow;</string>
+            </property>
+            <property name="text">
+             <string><html><head/><body><p><span style=" font-weight:600;">Warning: </span>This is pre-release software, some parts of this program may not yet function as intended.</p></body></html></string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignHCenter|Qt::AlignTop</set>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QWebView" name="welcomeView">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="url">
+             <url>
+              <string>about:blank</string>
+             </url>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="statisticsTab">
+         <attribute name="title">
+          <string>&Statistics</string>
+         </attribute>
+         <layout class="QVBoxLayout" name="verticalLayout_7">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="QWebView" name="statisticsView">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="url">
+             <url>
+              <string>about:blank</string>
+             </url>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QFrame" name="frame_3">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="frameShape">
+             <enum>QFrame::StyledPanel</enum>
+            </property>
+            <property name="frameShadow">
+             <enum>QFrame::Raised</enum>
+            </property>
+            <layout class="QHBoxLayout" name="horizontalLayout_2">
+             <property name="spacing">
+              <number>8</number>
+             </property>
+             <property name="leftMargin">
+              <number>8</number>
+             </property>
+             <property name="topMargin">
+              <number>4</number>
+             </property>
+             <property name="rightMargin">
+              <number>4</number>
+             </property>
+             <property name="bottomMargin">
+              <number>4</number>
+             </property>
+             <item>
+              <widget class="QLabel" name="reportModeLabel">
+               <property name="text">
+                <string>Report Mode</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QRadioButton" name="reportModeStandard">
+               <property name="text">
+                <string>Standard</string>
+               </property>
+               <property name="checked">
+                <bool>true</bool>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QRadioButton" name="reportModeMonthly">
+               <property name="text">
+                <string>Monthly</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QRadioButton" name="reportModeRange">
+               <property name="text">
+                <string>Date Range</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QDateEdit" name="statStartDate">
+               <property name="calendarPopup">
+                <bool>true</bool>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QDateEdit" name="statEndDate">
+               <property name="calendarPopup">
+                <bool>true</bool>
+               </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>
+            </layout>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+        <widget class="QWidget" name="helpTab">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <attribute name="title">
+          <string>&Help Browser</string>
+         </attribute>
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <property name="spacing">
+           <number>0</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="QFrame" name="frame">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>0</width>
+              <height>40</height>
+             </size>
+            </property>
+            <property name="maximumSize">
+             <size>
+              <width>16777215</width>
+              <height>40</height>
+             </size>
+            </property>
+            <property name="frameShape">
+             <enum>QFrame::NoFrame</enum>
+            </property>
+            <property name="frameShadow">
+             <enum>QFrame::Plain</enum>
+            </property>
+            <layout class="QHBoxLayout" name="horizontalLayout_3">
+             <property name="spacing">
+              <number>4</number>
+             </property>
+             <property name="leftMargin">
+              <number>6</number>
+             </property>
+             <property name="topMargin">
+              <number>0</number>
+             </property>
+             <property name="rightMargin">
+              <number>6</number>
+             </property>
+             <property name="bottomMargin">
+              <number>0</number>
+             </property>
+             <item>
+              <widget class="QToolButton" name="backButton">
+               <property name="text">
+                <string>...</string>
+               </property>
+               <property name="icon">
+                <iconset resource="Resources.qrc">
+                 <normaloff>:/icons/back.png</normaloff>:/icons/back.png</iconset>
+               </property>
+               <property name="iconSize">
+                <size>
+                 <width>24</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="autoRaise">
+                <bool>true</bool>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QToolButton" name="forwardButton">
+               <property name="text">
+                <string>...</string>
+               </property>
+               <property name="icon">
+                <iconset resource="Resources.qrc">
+                 <normaloff>:/icons/forward.png</normaloff>:/icons/forward.png</iconset>
+               </property>
+               <property name="iconSize">
+                <size>
+                 <width>24</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="autoRaise">
+                <bool>true</bool>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QToolButton" name="homeButton">
+               <property name="text">
+                <string>...</string>
+               </property>
+               <property name="icon">
+                <iconset resource="Resources.qrc">
+                 <normaloff>:/icons/go-home.png</normaloff>:/icons/go-home.png</iconset>
+               </property>
+               <property name="iconSize">
+                <size>
+                 <width>24</width>
+                 <height>24</height>
+                </size>
+               </property>
+               <property name="autoRaise">
+                <bool>true</bool>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QComboBox" name="urlBar">
+               <property name="editable">
+                <bool>true</bool>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </widget>
+          </item>
+          <item>
+           <widget class="QFrame" name="frame_4">
+            <property name="frameShape">
+             <enum>QFrame::StyledPanel</enum>
+            </property>
+            <property name="frameShadow">
+             <enum>QFrame::Raised</enum>
+            </property>
+            <layout class="QVBoxLayout" name="verticalLayout_4">
+             <property name="spacing">
+              <number>0</number>
+             </property>
+             <property name="leftMargin">
+              <number>0</number>
+             </property>
+             <property name="topMargin">
+              <number>0</number>
+             </property>
+             <property name="rightMargin">
+              <number>0</number>
+             </property>
+             <property name="bottomMargin">
+              <number>0</number>
+             </property>
+             <item>
+              <widget class="QWebView" name="webView">
+               <property name="sizePolicy">
+                <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
+               <property name="minimumSize">
+                <size>
+                 <width>0</width>
+                 <height>200</height>
+                </size>
+               </property>
+               <property name="baseSize">
+                <size>
+                 <width>0</width>
+                 <height>200</height>
+                </size>
+               </property>
+               <property name="url">
+                <url>
+                 <string>qrc:/docs/index.html</string>
+                </url>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </widget>
+       <widget class="QPlainTextEdit" name="logText">
+        <property name="readOnly">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </widget>
+      <widget class="QToolBox" name="toolBox">
+       <property name="minimumSize">
+        <size>
+         <width>230</width>
+         <height>0</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>180</width>
+         <height>16777215</height>
+        </size>
+       </property>
+       <property name="palette">
+        <palette>
+         <active>
+          <colorrole role="Button">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>163</red>
+             <green>190</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Base">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>163</red>
+             <green>190</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Window">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>163</red>
+             <green>190</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+         </active>
+         <inactive>
+          <colorrole role="Button">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>163</red>
+             <green>190</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Base">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>163</red>
+             <green>190</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Window">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>163</red>
+             <green>190</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+         </inactive>
+         <disabled>
+          <colorrole role="Button">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>163</red>
+             <green>190</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Base">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>163</red>
+             <green>190</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Window">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>163</red>
+             <green>190</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+         </disabled>
+        </palette>
+       </property>
+       <property name="font">
+        <font>
+         <pointsize>12</pointsize>
+        </font>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">QToolBox { 
+icon-size: 24px; 
+border-radius: 15px;
+background: rgb(163, 190, 255)
+}
+
+QToolBox::tab {
+    color: #444444;
+   background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+                                stop: 0 #8181b1, 
+                                stop: 1.0 #8393c3);
+ }
+
+QToolBox::tab:pressed {
+  font: italic;
+  color: #ffffff;
+   background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+                                stop: 0 #8181b1, 
+                                stop: 1.0 #8393c3);
+
+}
+
+QToolBox::tab:selected  {
+   font: italic;
+   color: #ffffff; 
+   background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
+                                stop: 0 #8181b1, 
+                                stop: 1.0 #8393c3);
+}</string>
+       </property>
+       <property name="frameShape">
+        <enum>QFrame::Box</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Sunken</enum>
+       </property>
+       <property name="lineWidth">
+        <number>1</number>
+       </property>
+       <property name="midLineWidth">
+        <number>1</number>
+       </property>
+       <property name="currentIndex">
+        <number>2</number>
+       </property>
+       <property name="tabSpacing">
+        <number>0</number>
+       </property>
+       <widget class="QWidget" name="navPage">
+        <property name="geometry">
+         <rect>
+          <x>0</x>
+          <y>0</y>
+          <width>250</width>
+          <height>724</height>
+         </rect>
+        </property>
+        <property name="palette">
+         <palette>
+          <active>
+           <colorrole role="Button">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>163</red>
+              <green>190</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Base">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>163</red>
+              <green>190</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Window">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>163</red>
+              <green>190</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+          </active>
+          <inactive>
+           <colorrole role="Button">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>163</red>
+              <green>190</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Base">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>163</red>
+              <green>190</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Window">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>163</red>
+              <green>190</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+          </inactive>
+          <disabled>
+           <colorrole role="Button">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>163</red>
+              <green>190</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Base">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>163</red>
+              <green>190</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="Window">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>163</red>
+              <green>190</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+          </disabled>
+         </palette>
+        </property>
+        <property name="mouseTracking">
+         <bool>true</bool>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">background: rgb(163, 190, 255)</string>
+        </property>
+        <attribute name="icon">
+         <iconset resource="Resources.qrc">
+          <normaloff>:/icons/bob-v3.0.png</normaloff>:/icons/bob-v3.0.png</iconset>
+        </attribute>
+        <attribute name="label">
+         <string>Navigation</string>
+        </attribute>
+        <layout class="QVBoxLayout" name="verticalLayout_2">
+         <item>
+          <widget class="QToolButton" name="statisticsButton">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">QToolButton {
+background: transparent;
+border: 2px solid transparent; border-radius: 30px;
+}
+
+QToolButton:hover {
+border: 2px solid #56789a; border-radius: 30px;
+}
+
+QToolButton:pressed {
+background-color: #8080ff;
+border: 2px solid #56789a; border-radius: 30px;
+}</string>
+           </property>
+           <property name="text">
+            <string>Statistics</string>
+           </property>
+           <property name="icon">
+            <iconset resource="Resources.qrc">
+             <normaloff>:/icons/eye.png</normaloff>:/icons/eye.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>64</width>
+             <height>64</height>
+            </size>
+           </property>
+           <property name="toolButtonStyle">
+            <enum>Qt::ToolButtonTextUnderIcon</enum>
+           </property>
+           <property name="autoRaise">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QToolButton" name="dailyButton">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>0</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">QToolButton {
+background: transparent;
+border: 2px solid transparent; border-radius: 30px;
+}
+
+QToolButton:hover {
+border: 2px solid #56789a; border-radius: 30px;
+}
+
+QToolButton:pressed {
+background-color: #8080ff;
+border: 2px solid #56789a; border-radius: 30px;
+}</string>
+           </property>
+           <property name="text">
+            <string>Daily</string>
+           </property>
+           <property name="icon">
+            <iconset resource="Resources.qrc">
+             <normaloff>:/icons/edit-find.png</normaloff>:/icons/edit-find.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>64</width>
+             <height>64</height>
+            </size>
+           </property>
+           <property name="toolButtonStyle">
+            <enum>Qt::ToolButtonTextUnderIcon</enum>
+           </property>
+           <property name="autoRaise">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QToolButton" name="overviewButton">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">QToolButton {
+background: transparent;
+border: 2px solid transparent; border-radius: 30px;
+}
+
+QToolButton:hover {
+border: 2px solid #56789a; border-radius: 30px;
+}
+
+QToolButton:pressed {
+background-color: #8080ff;
+border: 2px solid #56789a; border-radius: 30px;
+}</string>
+           </property>
+           <property name="text">
+            <string>Overview</string>
+           </property>
+           <property name="icon">
+            <iconset resource="Resources.qrc">
+             <normaloff>:/icons/overview.png</normaloff>:/icons/overview.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>64</width>
+             <height>64</height>
+            </size>
+           </property>
+           <property name="toolButtonStyle">
+            <enum>Qt::ToolButtonTextUnderIcon</enum>
+           </property>
+           <property name="autoRaise">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QToolButton" name="oximetryButton">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">QToolButton {
+background: transparent;
+border: 2px solid transparent; border-radius: 30px;
+}
+
+QToolButton:hover {
+border: 2px solid #56789a; border-radius: 30px;
+}
+
+QToolButton:pressed {
+background-color: #8080ff;
+border: 2px solid #56789a; border-radius: 30px;
+}</string>
+           </property>
+           <property name="text">
+            <string>Oximetry</string>
+           </property>
+           <property name="icon">
+            <iconset resource="Resources.qrc">
+             <normaloff>:/icons/oximeter.png</normaloff>:/icons/oximeter.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>64</width>
+             <height>64</height>
+            </size>
+           </property>
+           <property name="toolButtonStyle">
+            <enum>Qt::ToolButtonTextUnderIcon</enum>
+           </property>
+           <property name="autoRaise">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QToolButton" name="importButton">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="minimumSize">
+            <size>
+             <width>0</width>
+             <height>0</height>
+            </size>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">QToolButton {
+background: transparent;
+border: 2px solid transparent; border-radius: 30px;
+}
+
+QToolButton:hover {
+border: 2px solid #56789a; border-radius: 30px;
+}
+
+QToolButton:pressed {
+background-color: #8080ff;
+border: 2px solid #56789a; border-radius: 30px;
+}</string>
+           </property>
+           <property name="text">
+            <string>Import</string>
+           </property>
+           <property name="icon">
+            <iconset resource="Resources.qrc">
+             <normaloff>:/icons/sdcard.png</normaloff>:/icons/sdcard.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>64</width>
+             <height>64</height>
+            </size>
+           </property>
+           <property name="checkable">
+            <bool>false</bool>
+           </property>
+           <property name="toolButtonStyle">
+            <enum>Qt::ToolButtonTextUnderIcon</enum>
+           </property>
+           <property name="autoRaise">
+            <bool>true</bool>
+           </property>
+           <property name="arrowType">
+            <enum>Qt::NoArrow</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QToolButton" name="helpButton">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">QToolButton {
+background: transparent;
+border: 2px solid transparent; border-radius: 30px;
+}
+
+QToolButton:hover {
+border: 2px solid #56789a; border-radius: 30px;
+}
+
+QToolButton:pressed {
+background-color: #8080ff;
+border: 2px solid #56789a; border-radius: 30px;
+}</string>
+           </property>
+           <property name="text">
+            <string>Help</string>
+           </property>
+           <property name="icon">
+            <iconset resource="Resources.qrc">
+             <normaloff>:/icons/help.png</normaloff>:/icons/help.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>64</width>
+             <height>64</height>
+            </size>
+           </property>
+           <property name="toolButtonStyle">
+            <enum>Qt::ToolButtonTextUnderIcon</enum>
+           </property>
+           <property name="autoRaise">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="verticalSpacer">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Expanding</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>0</width>
+             <height>0</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="bookmarksPage">
+        <property name="geometry">
+         <rect>
+          <x>0</x>
+          <y>0</y>
+          <width>250</width>
+          <height>724</height>
+         </rect>
+        </property>
+        <property name="palette">
+         <palette>
+          <active>
+           <colorrole role="Base">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>170</red>
+              <green>170</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="AlternateBase">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>170</red>
+              <green>170</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+          </active>
+          <inactive>
+           <colorrole role="Base">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>170</red>
+              <green>170</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="AlternateBase">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>170</red>
+              <green>170</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+          </inactive>
+          <disabled>
+           <colorrole role="Base">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>0</red>
+              <green>31</green>
+              <blue>237</blue>
+             </color>
+            </brush>
+           </colorrole>
+           <colorrole role="AlternateBase">
+            <brush brushstyle="SolidPattern">
+             <color alpha="255">
+              <red>170</red>
+              <green>170</green>
+              <blue>255</blue>
+             </color>
+            </brush>
+           </colorrole>
+          </disabled>
+         </palette>
+        </property>
+        <property name="mouseTracking">
+         <bool>true</bool>
+        </property>
+        <property name="styleSheet">
+         <string notr="true"/>
+        </property>
+        <attribute name="icon">
+         <iconset resource="Resources.qrc">
+          <normaloff>:/icons/bookmark.png</normaloff>:/icons/bookmark.png</iconset>
+        </attribute>
+        <attribute name="label">
+         <string>Bookmarks</string>
+        </attribute>
+        <layout class="QVBoxLayout" name="verticalLayout_5">
+         <property name="spacing">
+          <number>0</number>
+         </property>
+         <property name="sizeConstraint">
+          <enum>QLayout::SetNoConstraint</enum>
+         </property>
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QFrame" name="frame_2">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="palette">
+            <palette>
+             <active>
+              <colorrole role="WindowText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Button">
+               <brush brushstyle="LinearGradientPattern">
+                <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+                 <gradientstop position="0.000000000000000">
+                  <color alpha="255">
+                   <red>125</red>
+                   <green>125</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                 <gradientstop position="1.000000000000000">
+                  <color alpha="255">
+                   <red>200</red>
+                   <green>200</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                </gradient>
+               </brush>
+              </colorrole>
+              <colorrole role="Light">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>255</red>
+                 <green>255</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Midlight">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>212</red>
+                 <green>212</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Dark">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>85</red>
+                 <green>85</green>
+                 <blue>127</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Mid">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>113</red>
+                 <green>113</green>
+                 <blue>170</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Text">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="BrightText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>255</red>
+                 <green>255</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="ButtonText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Base">
+               <brush brushstyle="LinearGradientPattern">
+                <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+                 <gradientstop position="0.000000000000000">
+                  <color alpha="255">
+                   <red>125</red>
+                   <green>125</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                 <gradientstop position="1.000000000000000">
+                  <color alpha="255">
+                   <red>200</red>
+                   <green>200</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                </gradient>
+               </brush>
+              </colorrole>
+              <colorrole role="Window">
+               <brush brushstyle="LinearGradientPattern">
+                <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+                 <gradientstop position="0.000000000000000">
+                  <color alpha="255">
+                   <red>125</red>
+                   <green>125</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                 <gradientstop position="1.000000000000000">
+                  <color alpha="255">
+                   <red>200</red>
+                   <green>200</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                </gradient>
+               </brush>
+              </colorrole>
+              <colorrole role="Shadow">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="AlternateBase">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>212</red>
+                 <green>212</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="ToolTipBase">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>255</red>
+                 <green>255</green>
+                 <blue>220</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="ToolTipText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+             </active>
+             <inactive>
+              <colorrole role="WindowText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Button">
+               <brush brushstyle="LinearGradientPattern">
+                <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+                 <gradientstop position="0.000000000000000">
+                  <color alpha="255">
+                   <red>125</red>
+                   <green>125</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                 <gradientstop position="1.000000000000000">
+                  <color alpha="255">
+                   <red>200</red>
+                   <green>200</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                </gradient>
+               </brush>
+              </colorrole>
+              <colorrole role="Light">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>255</red>
+                 <green>255</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Midlight">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>212</red>
+                 <green>212</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Dark">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>85</red>
+                 <green>85</green>
+                 <blue>127</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Mid">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>113</red>
+                 <green>113</green>
+                 <blue>170</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Text">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="BrightText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>255</red>
+                 <green>255</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="ButtonText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Base">
+               <brush brushstyle="LinearGradientPattern">
+                <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+                 <gradientstop position="0.000000000000000">
+                  <color alpha="255">
+                   <red>125</red>
+                   <green>125</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                 <gradientstop position="1.000000000000000">
+                  <color alpha="255">
+                   <red>200</red>
+                   <green>200</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                </gradient>
+               </brush>
+              </colorrole>
+              <colorrole role="Window">
+               <brush brushstyle="LinearGradientPattern">
+                <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+                 <gradientstop position="0.000000000000000">
+                  <color alpha="255">
+                   <red>125</red>
+                   <green>125</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                 <gradientstop position="1.000000000000000">
+                  <color alpha="255">
+                   <red>200</red>
+                   <green>200</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                </gradient>
+               </brush>
+              </colorrole>
+              <colorrole role="Shadow">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="AlternateBase">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>212</red>
+                 <green>212</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="ToolTipBase">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>255</red>
+                 <green>255</green>
+                 <blue>220</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="ToolTipText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+             </inactive>
+             <disabled>
+              <colorrole role="WindowText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>85</red>
+                 <green>85</green>
+                 <blue>127</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Button">
+               <brush brushstyle="LinearGradientPattern">
+                <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+                 <gradientstop position="0.000000000000000">
+                  <color alpha="255">
+                   <red>125</red>
+                   <green>125</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                 <gradientstop position="1.000000000000000">
+                  <color alpha="255">
+                   <red>200</red>
+                   <green>200</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                </gradient>
+               </brush>
+              </colorrole>
+              <colorrole role="Light">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>255</red>
+                 <green>255</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Midlight">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>212</red>
+                 <green>212</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Dark">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>85</red>
+                 <green>85</green>
+                 <blue>127</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Mid">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>113</red>
+                 <green>113</green>
+                 <blue>170</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Text">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>85</red>
+                 <green>85</green>
+                 <blue>127</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="BrightText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>255</red>
+                 <green>255</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="ButtonText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>85</red>
+                 <green>85</green>
+                 <blue>127</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Base">
+               <brush brushstyle="LinearGradientPattern">
+                <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+                 <gradientstop position="0.000000000000000">
+                  <color alpha="255">
+                   <red>125</red>
+                   <green>125</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                 <gradientstop position="1.000000000000000">
+                  <color alpha="255">
+                   <red>200</red>
+                   <green>200</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                </gradient>
+               </brush>
+              </colorrole>
+              <colorrole role="Window">
+               <brush brushstyle="LinearGradientPattern">
+                <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+                 <gradientstop position="0.000000000000000">
+                  <color alpha="255">
+                   <red>125</red>
+                   <green>125</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                 <gradientstop position="1.000000000000000">
+                  <color alpha="255">
+                   <red>200</red>
+                   <green>200</green>
+                   <blue>255</blue>
+                  </color>
+                 </gradientstop>
+                </gradient>
+               </brush>
+              </colorrole>
+              <colorrole role="Shadow">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="AlternateBase">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>170</red>
+                 <green>170</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="ToolTipBase">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>255</red>
+                 <green>255</green>
+                 <blue>220</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="ToolTipText">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>0</red>
+                 <green>0</green>
+                 <blue>0</blue>
+                </color>
+               </brush>
+              </colorrole>
+             </disabled>
+            </palette>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(125, 125, 255, 255), stop:1 rgba(200, 200, 255, 255))</string>
+           </property>
+           <property name="frameShape">
+            <enum>QFrame::Box</enum>
+           </property>
+           <property name="frameShadow">
+            <enum>QFrame::Sunken</enum>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout">
+            <property name="spacing">
+             <number>0</number>
+            </property>
+            <property name="leftMargin">
+             <number>0</number>
+            </property>
+            <property name="topMargin">
+             <number>0</number>
+            </property>
+            <property name="rightMargin">
+             <number>0</number>
+            </property>
+            <property name="bottomMargin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QLineEdit" name="filterBookmarks">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="palette">
+               <palette>
+                <active>
+                 <colorrole role="WindowText">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>255</red>
+                    <green>255</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Button">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>190</red>
+                    <green>209</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Text">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>255</red>
+                    <green>255</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="ButtonText">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>255</red>
+                    <green>255</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Base">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>190</red>
+                    <green>209</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Window">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>190</red>
+                    <green>209</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="AlternateBase">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>170</red>
+                    <green>170</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                </active>
+                <inactive>
+                 <colorrole role="WindowText">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>255</red>
+                    <green>255</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Button">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>190</red>
+                    <green>209</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Text">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>255</red>
+                    <green>255</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="ButtonText">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>255</red>
+                    <green>255</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Base">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>190</red>
+                    <green>209</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Window">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>190</red>
+                    <green>209</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="AlternateBase">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>170</red>
+                    <green>170</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                </inactive>
+                <disabled>
+                 <colorrole role="WindowText">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>255</red>
+                    <green>255</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Button">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>190</red>
+                    <green>209</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Text">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>255</red>
+                    <green>255</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="ButtonText">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>255</red>
+                    <green>255</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Base">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>190</red>
+                    <green>209</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Window">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>190</red>
+                    <green>209</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="AlternateBase">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>170</red>
+                    <green>170</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                </disabled>
+               </palette>
+              </property>
+              <property name="font">
+               <font>
+                <pointsize>15</pointsize>
+               </font>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">QLineEdit {
+border: 1px solid #6060e0;
+border-radius: 20px;
+color: white;
+background-color: rgb(190, 209, 255);
+}
+
+QLineEdit:selected {
+background-color: rgb(190, 209, 255);
+
+}</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QToolButton" name="filterBookmarksButton">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="palette">
+               <palette>
+                <active>
+                 <colorrole role="Button">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>163</red>
+                    <green>190</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Base">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>163</red>
+                    <green>190</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Window">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>163</red>
+                    <green>190</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="AlternateBase">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>170</red>
+                    <green>170</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                </active>
+                <inactive>
+                 <colorrole role="Button">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>163</red>
+                    <green>190</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Base">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>163</red>
+                    <green>190</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Window">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>163</red>
+                    <green>190</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="AlternateBase">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>170</red>
+                    <green>170</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                </inactive>
+                <disabled>
+                 <colorrole role="Button">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>163</red>
+                    <green>190</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Base">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>163</red>
+                    <green>190</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="Window">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>163</red>
+                    <green>190</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                 <colorrole role="AlternateBase">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>170</red>
+                    <green>170</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                </disabled>
+               </palette>
+              </property>
+              <property name="styleSheet">
+               <string notr="true">QToolButton {
+background: rgb(163, 190, 255);
+}
+
+QToolButton:hover {
+background: rgb(163, 190, 255);
+border: 2px solid #272727;
+border-radius: 10px;
+}
+QToolButton:pressed {
+background: #6060c0;
+border: 2px solid #272727;
+border-radius: 10px;
+}
+</string>
+              </property>
+              <property name="text">
+               <string>...</string>
+              </property>
+              <property name="icon">
+               <iconset resource="Resources.qrc">
+                <normaloff>:/icons/refresh.png</normaloff>:/icons/refresh.png</iconset>
+              </property>
+              <property name="autoRaise">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="QWebView" name="bookmarkView">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="palette">
+            <palette>
+             <active>
+              <colorrole role="Button">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>163</red>
+                 <green>190</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Base">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>163</red>
+                 <green>190</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Window">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>163</red>
+                 <green>190</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+             </active>
+             <inactive>
+              <colorrole role="Button">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>163</red>
+                 <green>190</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Base">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>163</red>
+                 <green>190</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Window">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>163</red>
+                 <green>190</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+             </inactive>
+             <disabled>
+              <colorrole role="Button">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>163</red>
+                 <green>190</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Base">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>163</red>
+                 <green>190</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+              <colorrole role="Window">
+               <brush brushstyle="SolidPattern">
+                <color alpha="255">
+                 <red>163</red>
+                 <green>190</green>
+                 <blue>255</blue>
+                </color>
+               </brush>
+              </colorrole>
+             </disabled>
+            </palette>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">background: rgb(163, 190, 255)</string>
+           </property>
+           <property name="url">
+            <url>
+             <string>about:blank</string>
+            </url>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="recordsPage">
+        <property name="geometry">
+         <rect>
+          <x>0</x>
+          <y>0</y>
+          <width>230</width>
+          <height>724</height>
+         </rect>
+        </property>
+        <property name="mouseTracking">
+         <bool>true</bool>
+        </property>
+        <property name="styleSheet">
+         <string notr="true"/>
+        </property>
+        <attribute name="icon">
+         <iconset resource="Resources.qrc">
+          <normaloff>:/icons/trophy.png</normaloff>:/icons/trophy.png</iconset>
+        </attribute>
+        <attribute name="label">
+         <string>Records</string>
+        </attribute>
+        <layout class="QVBoxLayout" name="verticalLayout_6">
+         <property name="spacing">
+          <number>0</number>
+         </property>
+         <property name="leftMargin">
+          <number>0</number>
+         </property>
+         <property name="topMargin">
+          <number>0</number>
+         </property>
+         <property name="rightMargin">
+          <number>0</number>
+         </property>
+         <property name="bottomMargin">
+          <number>0</number>
+         </property>
+         <item>
+          <widget class="QWebView" name="recordsBox">
+           <property name="font">
+            <font>
+             <pointsize>10</pointsize>
+            </font>
+           </property>
+           <property name="styleSheet">
+            <string notr="true">background: rgb(163, 190, 255)</string>
+           </property>
+           <property name="url">
+            <url>
+             <string>about:blank</string>
+            </url>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </widget>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>1005</width>
+     <height>22</height>
+    </rect>
+   </property>
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <widget class="QMenu" name="menu_File">
+    <property name="title">
+     <string>&File</string>
+    </property>
+    <widget class="QMenu" name="menuExp_ort_CSV_Data">
+     <property name="title">
+      <string>Exp&ort Data</string>
+     </property>
+     <addaction name="actionExport_CSV"/>
+     <addaction name="separator"/>
+     <addaction name="actionExport_Current_Day"/>
+    </widget>
+    <addaction name="action_Import_Data"/>
+    <addaction name="action_Preferences"/>
+    <addaction name="action_Edit_Profile"/>
+    <addaction name="separator"/>
+    <addaction name="actionPrint_Report"/>
+    <addaction name="menuExp_ort_CSV_Data"/>
+    <addaction name="separator"/>
+    <addaction name="actionExport_Journal"/>
+    <addaction name="separator"/>
+    <addaction name="actionChange_User"/>
+    <addaction name="actionChange_Data_Folder"/>
+    <addaction name="separator"/>
+    <addaction name="action_Exit"/>
+   </widget>
+   <widget class="QMenu" name="menu_View">
+    <property name="title">
+     <string>&View</string>
+    </property>
+    <addaction name="actionView_Statistics"/>
+    <addaction name="actionView_Daily"/>
+    <addaction name="actionView_Overview"/>
+    <addaction name="separator"/>
+    <addaction name="action_Fullscreen"/>
+    <addaction name="action_Screenshot"/>
+    <addaction name="separator"/>
+    <addaction name="action_Reset_Graph_Layout"/>
+    <addaction name="separator"/>
+    <addaction name="actionToggle_Line_Cursor"/>
+    <addaction name="actionLeft_Daily_Sidebar"/>
+    <addaction name="actionDaily_Calendar"/>
+    <addaction name="action_Sidebar_Toggle"/>
+   </widget>
+   <widget class="QMenu" name="menu_Help">
+    <property name="title">
+     <string>&Help</string>
+    </property>
+    <addaction name="actionOnline_Users_Guide"/>
+    <addaction name="action_Frequently_Asked_Questions"/>
+    <addaction name="actionSleep_Disorder_Terms_Glossary"/>
+    <addaction name="separator"/>
+    <addaction name="actionChange_Language"/>
+    <addaction name="separator"/>
+    <addaction name="actionDebug"/>
+    <addaction name="actionShow_Performance_Counters"/>
+    <addaction name="actionCheck_for_Updates"/>
+    <addaction name="separator"/>
+    <addaction name="actionHelp_Support_SleepyHead_Development"/>
+    <addaction name="action_About"/>
+   </widget>
+   <widget class="QMenu" name="menu_Data">
+    <property name="title">
+     <string>&Data</string>
+    </property>
+    <widget class="QMenu" name="menu_Advanced">
+     <property name="title">
+      <string>&Advanced</string>
+     </property>
+     <widget class="QMenu" name="menuPurge_Oximetery_Data">
+      <property name="title">
+       <string>Purge Oximetery Data</string>
+      </property>
+      <addaction name="actionPurgeCurrentDaysOximetry"/>
+     </widget>
+     <widget class="QMenu" name="menuPurge_CPAP_Data">
+      <property name="title">
+       <string>Purge ALL CPAP Data</string>
+      </property>
+     </widget>
+     <addaction name="actionPurge_Current_Day"/>
+     <addaction name="menuPurge_CPAP_Data"/>
+     <addaction name="separator"/>
+     <addaction name="menuPurge_Oximetery_Data"/>
+    </widget>
+    <widget class="QMenu" name="menu_Rebuild_CPAP_Data">
+     <property name="title">
+      <string>Rebuild CPAP Data</string>
+     </property>
+    </widget>
+    <addaction name="actionView_Oximetry"/>
+    <addaction name="separator"/>
+    <addaction name="actionImport_ZEO_Data"/>
+    <addaction name="actionImport_Somnopose_Data"/>
+    <addaction name="actionImport_RemStar_MSeries_Data"/>
+    <addaction name="separator"/>
+    <addaction name="action_Rebuild_Oximetry_Index"/>
+    <addaction name="menu_Rebuild_CPAP_Data"/>
+    <addaction name="separator"/>
+    <addaction name="menu_Advanced"/>
+   </widget>
+   <addaction name="menu_File"/>
+   <addaction name="menu_View"/>
+   <addaction name="menu_Data"/>
+   <addaction name="menu_Help"/>
+  </widget>
+  <widget class="QStatusBar" name="statusbar">
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <property name="maximumSize">
+    <size>
+     <width>16777215</width>
+     <height>7</height>
+    </size>
+   </property>
+   <property name="sizeGripEnabled">
+    <bool>true</bool>
+   </property>
+  </widget>
+  <action name="action_Import_Data">
+   <property name="text">
+    <string>&Import Data</string>
+   </property>
+   <property name="shortcut">
+    <string>Shift+F2</string>
+   </property>
+  </action>
+  <action name="action_Preferences">
+   <property name="text">
+    <string>&Preferences</string>
+   </property>
+  </action>
+  <action name="action_Profiles">
+   <property name="text">
+    <string>&Profiles</string>
+   </property>
+  </action>
+  <action name="action_Exit">
+   <property name="text">
+    <string>Exit</string>
+   </property>
+  </action>
+  <action name="actionView_Daily">
+   <property name="text">
+    <string>View &Daily</string>
+   </property>
+   <property name="shortcut">
+    <string>F5</string>
+   </property>
+  </action>
+  <action name="actionView_Overview">
+   <property name="text">
+    <string>View &Overview</string>
+   </property>
+   <property name="shortcut">
+    <string>F6</string>
+   </property>
+  </action>
+  <action name="actionView_Welcome">
+   <property name="text">
+    <string>View &Welcome</string>
+   </property>
+   <property name="shortcut">
+    <string>F4</string>
+   </property>
+  </action>
+  <action name="action_CycleTabs">
+   <property name="text">
+    <string>-</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+Tab</string>
+   </property>
+  </action>
+  <action name="actionUse_AntiAliasing">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Use &AntiAliasing</string>
+   </property>
+  </action>
+  <action name="action_About">
+   <property name="text">
+    <string>&About SleepyHead</string>
+   </property>
+  </action>
+  <action name="action_Fullscreen">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>&Fullscreen Toggle</string>
+   </property>
+   <property name="shortcut">
+    <string>F11</string>
+   </property>
+  </action>
+  <action name="actionDebug">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Show Debug Pane</string>
+   </property>
+  </action>
+  <action name="action_Reset_Graph_Layout">
+   <property name="text">
+    <string>&Reset Graph Layout</string>
+   </property>
+  </action>
+  <action name="actionCheck_for_Updates">
+   <property name="text">
+    <string>Check for &Updates</string>
+   </property>
+  </action>
+  <action name="action_Screenshot">
+   <property name="text">
+    <string>Take &Screenshot</string>
+   </property>
+   <property name="shortcut">
+    <string>F12</string>
+   </property>
+  </action>
+  <action name="actionView_Oximetry">
+   <property name="text">
+    <string>O&ximetry Wizard</string>
+   </property>
+   <property name="shortcut">
+    <string>F7</string>
+   </property>
+  </action>
+  <action name="actionPrint_Report">
+   <property name="text">
+    <string>Print &Report</string>
+   </property>
+  </action>
+  <action name="action_Edit_Profile">
+   <property name="text">
+    <string>&Edit Profile</string>
+   </property>
+  </action>
+  <action name="actionOnline_Users_Guide">
+   <property name="text">
+    <string>Online Users &Guide</string>
+   </property>
+  </action>
+  <action name="action_Frequently_Asked_Questions">
+   <property name="text">
+    <string>&Frequently Asked Questions</string>
+   </property>
+  </action>
+  <action name="action_Rebuild_Oximetry_Index">
+   <property name="text">
+    <string>&Automatic Oximetry Cleanup</string>
+   </property>
+  </action>
+  <action name="actionChange_User">
+   <property name="text">
+    <string>Change &User</string>
+   </property>
+  </action>
+  <action name="actionPurge_Current_Day">
+   <property name="text">
+    <string>Purge &Current Selected Day</string>
+   </property>
+  </action>
+  <action name="action_Sidebar_Toggle">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="checked">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Right &Sidebar</string>
+   </property>
+   <property name="shortcut">
+    <string>F10</string>
+   </property>
+  </action>
+  <action name="actionView_Statistics">
+   <property name="text">
+    <string>View S&tatistics</string>
+   </property>
+   <property name="iconText">
+    <string>View Statistics</string>
+   </property>
+   <property name="toolTip">
+    <string>View Statistics</string>
+   </property>
+   <property name="shortcut">
+    <string>F4</string>
+   </property>
+  </action>
+  <action name="actionImport_ZEO_Data">
+   <property name="text">
+    <string>Import &ZEO Data</string>
+   </property>
+  </action>
+  <action name="actionImport_RemStar_MSeries_Data">
+   <property name="text">
+    <string>Import RemStar &MSeries Data</string>
+   </property>
+  </action>
+  <action name="actionHelp_Support_SleepyHead_Development">
+   <property name="text">
+    <string>&Support SleepyHead Development</string>
+   </property>
+  </action>
+  <action name="actionSleep_Disorder_Terms_Glossary">
+   <property name="text">
+    <string>Sleep Disorder Terms &Glossary</string>
+   </property>
+  </action>
+  <action name="actionChange_Language">
+   <property name="text">
+    <string>Change &Language</string>
+   </property>
+  </action>
+  <action name="actionChange_Data_Folder">
+   <property name="text">
+    <string>Change &Data Folder</string>
+   </property>
+  </action>
+  <action name="actionImport_Somnopose_Data">
+   <property name="text">
+    <string>Import &Somnopose Data</string>
+   </property>
+  </action>
+  <action name="actionPurgeCurrentDaysOximetry">
+   <property name="text">
+    <string>Current Days</string>
+   </property>
+  </action>
+  <action name="actionToggle_Line_Cursor">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Toggle &Line Cursor</string>
+   </property>
+   <property name="shortcut">
+    <string>Ctrl+L</string>
+   </property>
+  </action>
+  <action name="action">
+   <property name="text">
+    <string/>
+   </property>
+  </action>
+  <action name="actionLeft_Daily_Sidebar">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="checked">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Daily Sidebar</string>
+   </property>
+   <property name="shortcut">
+    <string>F8</string>
+   </property>
+  </action>
+  <action name="actionDaily_Calendar">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="checked">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Daily Calendar</string>
+   </property>
+   <property name="shortcut">
+    <string>F9</string>
+   </property>
+  </action>
+  <action name="actionExport_Journal">
+   <property name="text">
+    <string>Backup &Journal</string>
+   </property>
+  </action>
+  <action name="actionShow_Performance_Counters">
+   <property name="checkable">
+    <bool>true</bool>
+   </property>
+   <property name="text">
+    <string>Show Performance Information</string>
+   </property>
+  </action>
+  <action name="actionExport_CSV">
+   <property name="text">
+    <string>Export as CSV</string>
+   </property>
+  </action>
+  <action name="actionExport_Current_Day">
+   <property name="text">
+    <string>Export for Review</string>
+   </property>
+  </action>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>QWebView</class>
+   <extends>QWidget</extends>
+   <header>QtWebKitWidgets/QWebView</header>
+  </customwidget>
+ </customwidgets>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>action_Exit</sender>
+   <signal>triggered()</signal>
+   <receiver>MainWindow</receiver>
+   <slot>close()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>399</x>
+     <y>299</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>actionView_Daily</sender>
+   <signal>triggered()</signal>
+   <receiver>dailyButton</receiver>
+   <slot>click()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>850</x>
+     <y>219</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>actionView_Overview</sender>
+   <signal>triggered()</signal>
+   <receiver>overviewButton</receiver>
+   <slot>click()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>850</x>
+     <y>301</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>actionView_Statistics</sender>
+   <signal>triggered()</signal>
+   <receiver>statisticsButton</receiver>
+   <slot>click()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>-1</x>
+     <y>-1</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>772</x>
+     <y>101</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/sleepyhead/newprofile.cpp b/sleepyhead/newprofile.cpp
new file mode 100644
index 0000000..c4b64f1
--- /dev/null
+++ b/sleepyhead/newprofile.cpp
@@ -0,0 +1,461 @@
+/* Create New Profile Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QMessageBox>
+#include <QFile>
+#include <QTextStream>
+#include <QCryptographicHash>
+#include <QFileDialog>
+#include <QFile>
+#include <QDesktopServices>
+#include <QSettings>
+#include "SleepLib/profiles.h"
+
+#include "newprofile.h"
+#include "ui_newprofile.h"
+#include "mainwindow.h"
+
+extern MainWindow *mainwin;
+
+
+NewProfile::NewProfile(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::NewProfile)
+{
+    ui->setupUi(this);
+//    ui->userNameEdit->setText(getUserName());
+    QLocale locale = QLocale::system();
+    QString shortformat = locale.dateFormat(QLocale::ShortFormat);
+
+    if (!shortformat.toLower().contains("yyyy")) {
+        shortformat.replace("yy", "yyyy");
+    }
+
+    ui->dobEdit->setDisplayFormat(shortformat);
+    ui->dateDiagnosedEdit->setDisplayFormat(shortformat);
+    m_firstPage = 0;
+    ui->backButton->setEnabled(false);
+    ui->nextButton->setEnabled(false);
+
+    ui->stackedWidget->setCurrentIndex(0);
+    on_cpapModeCombo_activated(0);
+    m_passwordHashed = false;
+    ui->heightEdit2->setVisible(false);
+    ui->heightEdit->setDecimals(2);
+    ui->heightEdit->setSuffix(STR_UNIT_CM);
+
+    {
+        // process countries list
+        QFile f(":/docs/countries.txt");
+        f.open(QFile::ReadOnly);
+        QTextStream cnt(&f);
+        QString a;
+        ui->countryCombo->clear();
+        ui->countryCombo->addItem(tr("Select Country"));
+
+        do {
+            a = cnt.readLine();
+
+            if (a.isEmpty()) { break; }
+
+            ui->countryCombo->addItem(a);
+        } while (1);
+
+        f.close();
+    }
+    {
+        // timezone list
+        QFile f(":/docs/tz.txt");
+        f.open(QFile::ReadOnly);
+        QTextStream cnt(&f);
+        QString a;
+        ui->timezoneCombo->clear();
+
+        //ui->countryCombo->addItem("Select TimeZone");
+        do {
+            a = cnt.readLine();
+
+            if (a.isEmpty()) { break; }
+
+            QStringList l;
+            l = a.split("=");
+            ui->timezoneCombo->addItem(l[1], l[0]);
+        } while (1);
+
+        f.close();
+    }
+    ui->AppTitle->setText("SleepyHead v" + VersionString);
+    ui->releaseStatus->setText(ReleaseStatus);
+
+
+    ui->textBrowser->setHtml(getIntroHTML());
+}
+
+NewProfile::~NewProfile()
+{
+    delete ui;
+}
+
+
+QString NewProfile::getIntroHTML()
+{
+    return "<html>"
+           "<body>"
+           "<div align=center><h1>" + tr("Welcome to SleepyHead") + "</h1></div>"
+
+           "<p>" + tr("This software is being designed to assist you in reviewing the data produced by your CPAP machines and related equipment.")
+           + "</p>"
+
+           "<p>" + tr("SleepyHead has been released freely under the <a href='qrc:/COPYING'>GNU Public License</a>, and comes with no warranty, and without ANY claims to fitness for any purpose.")
+           + "</p>"
+           "<div align=center><font color=\"red\"><h2>" + tr("PLEASE READ CAREFULLY") + "</h2></font></div>"
+           "<p>" + tr("SleepyHead is intended merely as a data viewer, and definitely not a substitute for competent medical guidance from your Doctor.")
+           + "</p>"
+
+           "<p>" + tr("Accuracy of any data displayed is not and can not be guaranteed.") + "</p>"
+
+           "<p>" + tr("Any reports generated are for PERSONAL USE ONLY, and NOT IN ANY WAY fit for compliance or medical diagnostic purposes.")
+           + "</p>"
+
+           "<p>" + tr("The author will not be held liable for <u>anything</u> related to the use or misuse of this software.")
+           + "</p>"
+
+           "<div align=center>"
+           "<p><b><font size=+1>" + tr("Use of this software is entirely at your own risk.") +
+           "</font></b></p>"
+
+           "<p><i>" + tr("SleepyHead is copyright ©2011-2014 Mark Watkins") + "<i></p>"
+           "</div>"
+           "</body>"
+           "</html>";
+}
+
+void NewProfile::on_nextButton_clicked()
+{
+    const QString xmlext = ".xml";
+
+    QSettings settings(getDeveloperName(), getAppName());
+
+    int index = ui->stackedWidget->currentIndex();
+
+    switch (index) {
+    case 0:
+        if (!ui->agreeCheckbox->isChecked()) {
+            return;
+        }
+
+        // Reload Preferences object
+        break;
+
+    case 1:
+        if (ui->userNameEdit->text().isEmpty()) {
+            QMessageBox::information(this, STR_MessageBox_Error, tr("Please provide a username for this profile"), QMessageBox::Ok);
+            return;
+        }
+
+        if (ui->genderCombo->currentIndex() == 0) {
+            //QMessageBox::information(this,tr("Notice"),tr("You did not specify Gender."),QMessageBox::Ok);
+        }
+
+        if (ui->passwordGroupBox->isChecked()) {
+            if (ui->passwordEdit1->text() != ui->passwordEdit2->text()) {
+                QMessageBox::information(this, STR_MessageBox_Error, tr("Passwords don't match"), QMessageBox::Ok);
+                return;
+            }
+
+            if (ui->passwordEdit1->text().isEmpty()) {
+                ui->passwordGroupBox->setChecked(false);
+            }
+        }
+
+        break;
+
+    case 2:
+        break;
+
+    case 3:
+        break;
+
+    default:
+        break;
+    }
+
+    int max_pages = ui->stackedWidget->count() - 1;
+
+    if (index < max_pages) {
+        index++;
+        ui->stackedWidget->setCurrentIndex(index);
+    } else {
+        // Finish button clicked.
+        QString username = ui->userNameEdit->text();
+
+        if (QMessageBox::question(this, tr("Profile Changes"), tr("Accept and save this information?"),
+                                  QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
+            Profile *profile = Profiles::Get(username);
+
+            if (!profile) { // No profile, create one.
+                profile = Profiles::Create(username);
+            }
+
+            Profile &prof = *profile;
+            profile->user->setFirstName(ui->firstNameEdit->text());
+            profile->user->setLastName(ui->lastNameEdit->text());
+            profile->user->setDOB(ui->dobEdit->date());
+            profile->user->setEmail(ui->emailEdit->text());
+            profile->user->setPhone(ui->phoneEdit->text());
+            profile->user->setAddress(ui->addressEdit->toPlainText());
+
+            if (ui->passwordGroupBox->isChecked()) {
+                if (!m_passwordHashed) {
+                    profile->user->setPassword(ui->passwordEdit1->text().toUtf8());
+                }
+            } else {
+
+                prof.Erase(STR_UI_Password);
+            }
+
+            profile->user->setGender((Gender)ui->genderCombo->currentIndex());
+
+            profile->cpap->setDateDiagnosed(ui->dateDiagnosedEdit->date());
+            profile->cpap->setUntreatedAHI(ui->untreatedAHIEdit->value());
+            profile->cpap->setMode((CPAPMode)ui->cpapModeCombo->currentIndex());
+            profile->cpap->setMinPressure(ui->minPressureEdit->value());
+            profile->cpap->setMaxPressure(ui->maxPressureEdit->value());
+            profile->cpap->setNotes(ui->cpapNotes->toPlainText());
+            profile->doctor->setName(ui->doctorNameEdit->text());
+            profile->doctor->setPracticeName(ui->doctorPracticeEdit->text());
+            profile->doctor->setAddress(ui->doctorAddressEdit->toPlainText());
+            profile->doctor->setPhone(ui->doctorPhoneEdit->text());
+            profile->doctor->setEmail(ui->doctorEmailEdit->text());
+            profile->doctor->setPatientID(ui->doctorPatientIDEdit->text());
+            profile->user->setTimeZone(ui->timezoneCombo->itemData(
+                                           ui->timezoneCombo->currentIndex()).toString());
+            profile->user->setCountry(ui->countryCombo->currentText());
+            profile->user->setDaylightSaving(ui->DSTcheckbox->isChecked());
+            UnitSystem us;
+
+            if (ui->heightCombo->currentIndex() == 0) { us = US_Metric; }
+            else if (ui->heightCombo->currentIndex() == 1) { us = US_Archiac; }
+            else { us = US_Metric; }
+
+            if (profile->general->unitSystem() != us) {
+                profile->general->setUnitSystem(us);
+
+                if (mainwin && mainwin->getDaily()) { mainwin->getDaily()->UnitsChanged(); }
+            }
+
+            double v = 0;
+
+            if (us == US_Archiac) {
+                // convert to metric
+                v = (ui->heightEdit->value() * 30.48);
+                v += ui->heightEdit2->value() * 2.54;
+            } else {
+                v = ui->heightEdit->value();
+            }
+
+            profile->user->setHeight(v);
+
+            //profile->user->setUserName(username);
+            PREF[STR_GEN_Profile] = username;
+
+
+            this->accept();
+        }
+    }
+
+    if (index >= max_pages) {
+        ui->nextButton->setText(tr("&Finish"));
+    } else {
+        ui->nextButton->setText(tr("&Next"));
+    }
+
+    ui->backButton->setEnabled(true);
+
+}
+
+void NewProfile::on_backButton_clicked()
+{
+    ui->nextButton->setText(tr("&Next"));
+
+    if (ui->stackedWidget->currentIndex() > m_firstPage) {
+        ui->stackedWidget->setCurrentIndex(ui->stackedWidget->currentIndex() - 1);
+    }
+
+    if (ui->stackedWidget->currentIndex() == m_firstPage) {
+        ui->backButton->setEnabled(false);
+    } else {
+        ui->backButton->setEnabled(true);
+    }
+
+
+}
+
+
+void NewProfile::on_cpapModeCombo_activated(int index)
+{
+    if (index == 0) {
+        ui->maxPressureEdit->setVisible(false);
+    } else {
+        ui->maxPressureEdit->setVisible(true);
+    }
+}
+
+void NewProfile::on_agreeCheckbox_clicked(bool checked)
+{
+    ui->nextButton->setEnabled(checked);
+}
+
+void NewProfile::skipWelcomeScreen()
+{
+    ui->agreeCheckbox->setChecked(true);
+    ui->stackedWidget->setCurrentIndex(m_firstPage = 1);
+    ui->backButton->setEnabled(false);
+    ui->nextButton->setEnabled(true);
+}
+void NewProfile::edit(const QString name)
+{
+    skipWelcomeScreen();
+    Profile *profile = Profiles::Get(name);
+
+    if (!profile) {
+        profile = Profiles::Create(name);
+    }
+
+    ui->userNameEdit->setText(name);
+    ui->userNameEdit->setReadOnly(true);
+    ui->firstNameEdit->setText(profile->user->firstName());
+    ui->lastNameEdit->setText(profile->user->lastName());
+
+    if (profile->contains(STR_UI_Password)
+            && !profile->p_preferences[STR_UI_Password].toString().isEmpty()) {
+        // leave the password box blank..
+        QString a = "******";
+        ui->passwordEdit1->setText(a);
+        ui->passwordEdit2->setText(a);
+        ui->passwordGroupBox->setChecked(true);
+        m_passwordHashed = true;
+    }
+
+    ui->dobEdit->setDate(profile->user->DOB());
+
+    if (profile->user->gender() == Male) {
+        ui->genderCombo->setCurrentIndex(1);
+    } else if (profile->user->gender() == Female) {
+        ui->genderCombo->setCurrentIndex(2);
+    } else { ui->genderCombo->setCurrentIndex(0); }
+
+    ui->heightEdit->setValue(profile->user->height());
+    ui->addressEdit->setText(profile->user->address());
+    ui->emailEdit->setText(profile->user->email());
+    ui->phoneEdit->setText(profile->user->phone());
+    ui->dateDiagnosedEdit->setDate(profile->cpap->dateDiagnosed());
+    ui->cpapNotes->clear();
+    ui->cpapNotes->appendPlainText(profile->cpap->notes());
+    ui->minPressureEdit->setValue(profile->cpap->minPressure());
+    ui->maxPressureEdit->setValue(profile->cpap->maxPressure());
+    ui->untreatedAHIEdit->setValue(profile->cpap->untreatedAHI());
+    ui->cpapModeCombo->setCurrentIndex((int)profile->cpap->mode());
+
+    ui->doctorNameEdit->setText(profile->doctor->name());
+    ui->doctorPracticeEdit->setText(profile->doctor->practiceName());
+    ui->doctorPhoneEdit->setText(profile->doctor->phone());
+    ui->doctorEmailEdit->setText(profile->doctor->email());
+    ui->doctorAddressEdit->setText(profile->doctor->address());
+    ui->doctorPatientIDEdit->setText(profile->doctor->patientID());
+
+    ui->DSTcheckbox->setChecked(profile->user->daylightSaving());
+    int i = ui->timezoneCombo->findData(profile->user->timeZone());
+    ui->timezoneCombo->setCurrentIndex(i);
+    i = ui->countryCombo->findText(profile->user->country());
+    ui->countryCombo->setCurrentIndex(i);
+
+    UnitSystem us = profile->general->unitSystem();
+    i = (int)us - 1;
+
+    if (i < 0) { i = 0; }
+
+    ui->heightCombo->setCurrentIndex(i);
+
+    double v = profile->user->height();
+
+    if (us == US_Archiac)  { // evil non-metric
+        int ti = v / 2.54;
+        int feet = ti / 12;
+        int inches = ti % 12;
+        ui->heightEdit->setValue(feet);
+        ui->heightEdit2->setValue(inches);
+        ui->heightEdit2->setVisible(true);
+        ui->heightEdit->setDecimals(0);
+        ui->heightEdit2->setDecimals(0);
+        ui->heightEdit->setSuffix(STR_UNIT_FOOT); // foot
+        ui->heightEdit2->setSuffix(STR_UNIT_INCH); // inches
+    } else { // good wholesome metric
+        ui->heightEdit->setValue(v);
+        ui->heightEdit2->setVisible(false);
+        ui->heightEdit->setDecimals(2);
+        ui->heightEdit->setSuffix(STR_UNIT_CM);
+    }
+}
+
+void NewProfile::on_passwordEdit1_editingFinished()
+{
+    m_passwordHashed = false;
+}
+
+void NewProfile::on_passwordEdit2_editingFinished()
+{
+    m_passwordHashed = false;
+}
+
+void NewProfile::on_heightCombo_currentIndexChanged(int index)
+{
+    if (index == 0) {
+        //metric
+        ui->heightEdit2->setVisible(false);
+        ui->heightEdit->setDecimals(2);
+        ui->heightEdit->setSuffix(STR_UNIT_CM);
+        double v = ui->heightEdit->value() * 30.48;
+        v += ui->heightEdit2->value() * 2.54;
+        ui->heightEdit->setValue(v);
+    } else {        //evil
+        ui->heightEdit->setDecimals(0);
+        ui->heightEdit2->setDecimals(0);
+        ui->heightEdit->setSuffix(STR_UNIT_FOOT);
+        ui->heightEdit2->setVisible(true);
+        ui->heightEdit2->setSuffix(STR_UNIT_INCH);
+        int v = ui->heightEdit->value() / 2.54;
+        int feet = v / 12;
+        int inches = v % 12;
+        ui->heightEdit->setValue(feet);
+        ui->heightEdit2->setValue(inches);
+    }
+}
+
+void NewProfile::on_textBrowser_anchorClicked(const QUrl &arg1)
+{
+    QDialog *dlg = new QDialog(this);
+    dlg->setMinimumWidth(600);
+    dlg->setMinimumHeight(500);
+    QVBoxLayout *layout = new QVBoxLayout();
+    dlg->setLayout(layout);
+    QTextBrowser *browser = new QTextBrowser(this);
+    dlg->layout()->addWidget(browser);
+    QPushButton *button = new QPushButton(tr("&Close this window"), browser);
+
+    QFile f(arg1.toString().replace("qrc:", ":"));
+    f.open(QIODevice::ReadOnly);
+    QTextStream ts(&f);
+    QString text = ts.readAll();
+    connect(button, SIGNAL(clicked()), dlg, SLOT(close()));
+    dlg->layout()->addWidget(button);
+    browser->setPlainText(text);
+    dlg->exec();
+
+    delete dlg;
+}
diff --git a/sleepyhead/newprofile.h b/sleepyhead/newprofile.h
new file mode 100644
index 0000000..74c30ad
--- /dev/null
+++ b/sleepyhead/newprofile.h
@@ -0,0 +1,65 @@
+/* Create New Profile Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef NEWPROFILE_H
+#define NEWPROFILE_H
+
+#include <QDialog>
+#include <QUrl>
+
+namespace Ui {
+class NewProfile;
+}
+
+/*! \class NewProfile
+    \author Mark Watkins <jedimark_at_users.sourceforge.net>
+    \brief Profile creation/editing wizard
+    */
+class NewProfile : public QDialog
+{
+    Q_OBJECT
+
+  public:
+    explicit NewProfile(QWidget *parent = 0);
+    ~NewProfile();
+
+    //! \brief When used in edit mode, this skips the first page
+    void skipWelcomeScreen();
+
+    //! \brief Open profile named 'name' for editing, loading all it's content
+    void edit(const QString name);
+
+  private slots:
+    //! \brief Validate each step and move to the next page, saving at the end if requested.
+    void on_nextButton_clicked();
+
+    //! \brief Go back to the previous wizard page
+    void on_backButton_clicked();
+
+    void on_cpapModeCombo_activated(int index);
+
+    void on_agreeCheckbox_clicked(bool checked);
+
+    void on_passwordEdit1_editingFinished();
+
+    void on_passwordEdit2_editingFinished();
+
+    void on_heightCombo_currentIndexChanged(int index);
+
+    void on_textBrowser_anchorClicked(const QUrl &arg1);
+
+  private:
+    QString getIntroHTML();
+
+    Ui::NewProfile *ui;
+    bool m_editMode;
+    int m_firstPage;
+    bool m_passwordHashed;
+};
+
+#endif // NEWPROFILE_H
diff --git a/sleepyhead/newprofile.ui b/sleepyhead/newprofile.ui
new file mode 100644
index 0000000..809564d
--- /dev/null
+++ b/sleepyhead/newprofile.ui
@@ -0,0 +1,1010 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>NewProfile</class>
+ <widget class="QDialog" name="NewProfile">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>667</width>
+    <height>450</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Edit User Profile</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="Resources.qrc">
+    <normaloff>:/icons/bob-v3.0.png</normaloff>:/icons/bob-v3.0.png</iconset>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_3">
+   <property name="leftMargin">
+    <number>8</number>
+   </property>
+   <property name="topMargin">
+    <number>8</number>
+   </property>
+   <property name="rightMargin">
+    <number>8</number>
+   </property>
+   <property name="bottomMargin">
+    <number>8</number>
+   </property>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout_2">
+       <property name="spacing">
+        <number>0</number>
+       </property>
+       <item>
+        <widget class="QStackedWidget" name="stackedWidget">
+         <property name="currentIndex">
+          <number>0</number>
+         </property>
+         <widget class="QWidget" name="welcomePage">
+          <layout class="QVBoxLayout" name="verticalLayout_8">
+           <item>
+            <widget class="QTextBrowser" name="textBrowser">
+             <property name="autoFormatting">
+              <set>QTextEdit::AutoNone</set>
+             </property>
+             <property name="source">
+              <url>
+               <string>about:blank</string>
+              </url>
+             </property>
+             <property name="openExternalLinks">
+              <bool>false</bool>
+             </property>
+             <property name="openLinks">
+              <bool>false</bool>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <layout class="QHBoxLayout" name="horizontalLayout_5">
+             <item>
+              <widget class="QCheckBox" name="agreeCheckbox">
+               <property name="text">
+                <string>I agree to all the conditions above.</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>
+            </layout>
+           </item>
+          </layout>
+         </widget>
+         <widget class="QWidget" name="userPage">
+          <layout class="QVBoxLayout" name="verticalLayout_9">
+           <property name="spacing">
+            <number>-1</number>
+           </property>
+           <property name="leftMargin">
+            <number>8</number>
+           </property>
+           <property name="topMargin">
+            <number>8</number>
+           </property>
+           <property name="rightMargin">
+            <number>8</number>
+           </property>
+           <property name="bottomMargin">
+            <number>8</number>
+           </property>
+           <item>
+            <widget class="QGroupBox" name="groupBox">
+             <property name="title">
+              <string>User Information</string>
+             </property>
+             <property name="flat">
+              <bool>false</bool>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_10">
+              <property name="spacing">
+               <number>-1</number>
+              </property>
+              <property name="leftMargin">
+               <number>8</number>
+              </property>
+              <property name="topMargin">
+               <number>8</number>
+              </property>
+              <property name="rightMargin">
+               <number>8</number>
+              </property>
+              <property name="bottomMargin">
+               <number>8</number>
+              </property>
+              <item>
+               <layout class="QHBoxLayout" name="horizontalLayout_7">
+                <item>
+                 <widget class="QLabel" name="label">
+                  <property name="text">
+                   <string>User Name</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QLineEdit" name="userNameEdit"/>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="passwordGroupBox">
+             <property name="toolTip">
+              <string>Keep the kids out.. Nothing more.. This isn't meant to be uber security.</string>
+             </property>
+             <property name="title">
+              <string>Password Protect Profile</string>
+             </property>
+             <property name="flat">
+              <bool>false</bool>
+             </property>
+             <property name="checkable">
+              <bool>true</bool>
+             </property>
+             <property name="checked">
+              <bool>false</bool>
+             </property>
+             <layout class="QGridLayout" name="gridLayout_2">
+              <property name="leftMargin">
+               <number>8</number>
+              </property>
+              <property name="topMargin">
+               <number>8</number>
+              </property>
+              <property name="rightMargin">
+               <number>8</number>
+              </property>
+              <property name="bottomMargin">
+               <number>8</number>
+              </property>
+              <item row="0" column="0">
+               <widget class="QLabel" name="label_13">
+                <property name="text">
+                 <string>Password</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="QLineEdit" name="passwordEdit1">
+                <property name="echoMode">
+                 <enum>QLineEdit::PasswordEchoOnEdit</enum>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0">
+               <widget class="QLabel" name="label_14">
+                <property name="text">
+                 <string>...twice...</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1">
+               <widget class="QLineEdit" name="passwordEdit2">
+                <property name="echoMode">
+                 <enum>QLineEdit::PasswordEchoOnEdit</enum>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="groupBox_3">
+             <property name="title">
+              <string>Locale Settings</string>
+             </property>
+             <layout class="QGridLayout" name="gridLayout">
+              <property name="leftMargin">
+               <number>8</number>
+              </property>
+              <property name="topMargin">
+               <number>8</number>
+              </property>
+              <property name="rightMargin">
+               <number>8</number>
+              </property>
+              <property name="bottomMargin">
+               <number>8</number>
+              </property>
+              <property name="spacing">
+               <number>-1</number>
+              </property>
+              <item row="4" column="0">
+               <widget class="QCheckBox" name="DSTcheckbox">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>DST Zone</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0">
+               <widget class="QLabel" name="label_27">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>TimeZone</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item row="6" 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="2" column="1" colspan="2">
+               <widget class="QComboBox" name="timezoneCombo"/>
+              </item>
+              <item row="1" column="0">
+               <widget class="QLabel" name="label_25">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Country</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1" colspan="2">
+               <widget class="QComboBox" name="countryCombo"/>
+              </item>
+             </layout>
+            </widget>
+           </item>
+          </layout>
+         </widget>
+         <widget class="QWidget" name="personalPage">
+          <layout class="QVBoxLayout" name="verticalLayout_4">
+           <property name="spacing">
+            <number>-1</number>
+           </property>
+           <property name="leftMargin">
+            <number>8</number>
+           </property>
+           <property name="topMargin">
+            <number>8</number>
+           </property>
+           <property name="rightMargin">
+            <number>8</number>
+           </property>
+           <property name="bottomMargin">
+            <number>8</number>
+           </property>
+           <item>
+            <widget class="QGroupBox" name="groupBox_6">
+             <property name="title">
+              <string>Personal Information (for reports)</string>
+             </property>
+             <layout class="QFormLayout" name="formLayout_6">
+              <property name="horizontalSpacing">
+               <number>-1</number>
+              </property>
+              <property name="verticalSpacing">
+               <number>-1</number>
+              </property>
+              <property name="leftMargin">
+               <number>8</number>
+              </property>
+              <property name="topMargin">
+               <number>8</number>
+              </property>
+              <property name="rightMargin">
+               <number>8</number>
+              </property>
+              <property name="bottomMargin">
+               <number>8</number>
+              </property>
+              <item row="0" column="0">
+               <widget class="QLabel" name="label_5">
+                <property name="text">
+                 <string>First Name</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="QLineEdit" name="firstNameEdit"/>
+              </item>
+              <item row="1" column="0">
+               <widget class="QLabel" name="label_6">
+                <property name="text">
+                 <string>Last Name</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1">
+               <widget class="QLineEdit" name="lastNameEdit"/>
+              </item>
+              <item row="2" column="0">
+               <widget class="QLabel" name="label_7">
+                <property name="text">
+                 <string>D.O.B.</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="1">
+               <layout class="QHBoxLayout" name="horizontalLayout_3">
+                <item>
+                 <widget class="QDateEdit" name="dobEdit">
+                  <property name="calendarPopup">
+                   <bool>true</bool>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QLabel" name="label_8">
+                  <property name="text">
+                   <string>Gender</string>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QComboBox" name="genderCombo">
+                  <item>
+                   <property name="text">
+                    <string/>
+                   </property>
+                  </item>
+                  <item>
+                   <property name="text">
+                    <string>Male</string>
+                   </property>
+                  </item>
+                  <item>
+                   <property name="text">
+                    <string>Female</string>
+                   </property>
+                  </item>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+              <item row="3" column="0">
+               <widget class="QLabel" name="label_10">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>Height</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="1">
+               <layout class="QHBoxLayout" name="horizontalLayout_6">
+                <item>
+                 <widget class="QDoubleSpinBox" name="heightEdit">
+                  <property name="decimals">
+                   <number>2</number>
+                  </property>
+                  <property name="maximum">
+                   <double>350.000000000000000</double>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QDoubleSpinBox" name="heightEdit2">
+                  <property name="decimals">
+                   <number>0</number>
+                  </property>
+                  <property name="singleStep">
+                   <double>1.000000000000000</double>
+                  </property>
+                 </widget>
+                </item>
+                <item>
+                 <widget class="QComboBox" name="heightCombo">
+                  <property name="sizePolicy">
+                   <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+                    <horstretch>0</horstretch>
+                    <verstretch>0</verstretch>
+                   </sizepolicy>
+                  </property>
+                  <item>
+                   <property name="text">
+                    <string>metric</string>
+                   </property>
+                  </item>
+                  <item>
+                   <property name="text">
+                    <string>archiac</string>
+                   </property>
+                  </item>
+                 </widget>
+                </item>
+               </layout>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="groupBox_2">
+             <property name="title">
+              <string>Contact Information</string>
+             </property>
+             <layout class="QFormLayout" name="formLayout">
+              <property name="fieldGrowthPolicy">
+               <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+              </property>
+              <property name="horizontalSpacing">
+               <number>-1</number>
+              </property>
+              <property name="verticalSpacing">
+               <number>-1</number>
+              </property>
+              <property name="leftMargin">
+               <number>8</number>
+              </property>
+              <property name="topMargin">
+               <number>8</number>
+              </property>
+              <property name="rightMargin">
+               <number>8</number>
+              </property>
+              <property name="bottomMargin">
+               <number>8</number>
+              </property>
+              <item row="0" column="0">
+               <widget class="QLabel" name="label_9">
+                <property name="text">
+                 <string>Address</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="QTextEdit" name="addressEdit">
+                <property name="tabChangesFocus">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0">
+               <widget class="QLabel" name="label_11">
+                <property name="text">
+                 <string>Email</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1">
+               <widget class="QLineEdit" name="emailEdit"/>
+              </item>
+              <item row="3" column="0">
+               <widget class="QLabel" name="label_12">
+                <property name="text">
+                 <string>Phone</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="1">
+               <widget class="QLineEdit" name="phoneEdit"/>
+              </item>
+              <item row="4" column="1">
+               <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>
+           </item>
+          </layout>
+         </widget>
+         <widget class="QWidget" name="cpapPage">
+          <layout class="QVBoxLayout" name="verticalLayout_7">
+           <property name="spacing">
+            <number>-1</number>
+           </property>
+           <property name="leftMargin">
+            <number>8</number>
+           </property>
+           <property name="topMargin">
+            <number>8</number>
+           </property>
+           <property name="rightMargin">
+            <number>8</number>
+           </property>
+           <property name="bottomMargin">
+            <number>8</number>
+           </property>
+           <item>
+            <widget class="QGroupBox" name="groupBox_4">
+             <property name="title">
+              <string>CPAP Treatment Information</string>
+             </property>
+             <layout class="QFormLayout" name="formLayout_4">
+              <property name="fieldGrowthPolicy">
+               <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+              </property>
+              <property name="horizontalSpacing">
+               <number>-1</number>
+              </property>
+              <property name="verticalSpacing">
+               <number>-1</number>
+              </property>
+              <property name="leftMargin">
+               <number>8</number>
+              </property>
+              <property name="topMargin">
+               <number>8</number>
+              </property>
+              <property name="rightMargin">
+               <number>8</number>
+              </property>
+              <property name="bottomMargin">
+               <number>8</number>
+              </property>
+              <item row="0" column="0">
+               <widget class="QLabel" name="label_16">
+                <property name="text">
+                 <string>Date Diagnosed</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="QDateEdit" name="dateDiagnosedEdit">
+                <property name="calendarPopup">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0">
+               <widget class="QLabel" name="label_4">
+                <property name="text">
+                 <string>Untreated AHI</string>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1">
+               <widget class="QDoubleSpinBox" name="untreatedAHIEdit">
+                <property name="maximum">
+                 <double>999.990000000000009</double>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0">
+               <widget class="QLabel" name="label_20">
+                <property name="text">
+                 <string>CPAP Mode</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="1">
+               <widget class="QComboBox" name="cpapModeCombo">
+                <item>
+                 <property name="text">
+                  <string>CPAP</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>APAP</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>Bi-Level</string>
+                 </property>
+                </item>
+                <item>
+                 <property name="text">
+                  <string>ASV</string>
+                 </property>
+                </item>
+               </widget>
+              </item>
+              <item row="3" column="0">
+               <widget class="QLabel" name="label_21">
+                <property name="text">
+                 <string>RX Pressure</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="1">
+               <layout class="QHBoxLayout" name="horizontalLayout_4">
+                <item>
+                 <widget class="QDoubleSpinBox" name="minPressureEdit"/>
+                </item>
+                <item>
+                 <widget class="QDoubleSpinBox" name="maxPressureEdit"/>
+                </item>
+               </layout>
+              </item>
+              <item row="4" column="0" colspan="2">
+               <widget class="QPlainTextEdit" name="cpapNotes">
+                <property name="tabChangesFocus">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+           </item>
+          </layout>
+         </widget>
+         <widget class="QWidget" name="doctorPage">
+          <layout class="QVBoxLayout" name="verticalLayout_6">
+           <property name="spacing">
+            <number>-1</number>
+           </property>
+           <property name="leftMargin">
+            <number>8</number>
+           </property>
+           <property name="topMargin">
+            <number>8</number>
+           </property>
+           <property name="rightMargin">
+            <number>8</number>
+           </property>
+           <property name="bottomMargin">
+            <number>8</number>
+           </property>
+           <item>
+            <widget class="QGroupBox" name="groupBox_5">
+             <property name="title">
+              <string>Doctors / Clinic Information</string>
+             </property>
+             <layout class="QFormLayout" name="formLayout_5">
+              <property name="fieldGrowthPolicy">
+               <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+              </property>
+              <property name="horizontalSpacing">
+               <number>-1</number>
+              </property>
+              <property name="verticalSpacing">
+               <number>-1</number>
+              </property>
+              <property name="leftMargin">
+               <number>8</number>
+              </property>
+              <property name="topMargin">
+               <number>8</number>
+              </property>
+              <property name="rightMargin">
+               <number>8</number>
+              </property>
+              <property name="bottomMargin">
+               <number>8</number>
+              </property>
+              <item row="0" column="0">
+               <widget class="QLabel" name="label_17">
+                <property name="text">
+                 <string>Doctors Name</string>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="1">
+               <widget class="QLineEdit" name="doctorNameEdit"/>
+              </item>
+              <item row="1" column="0" colspan="2">
+               <widget class="Line" name="line">
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0">
+               <widget class="QLabel" name="label_23">
+                <property name="text">
+                 <string>Practice Name</string>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="1">
+               <widget class="QLineEdit" name="doctorPracticeEdit"/>
+              </item>
+              <item row="3" column="0">
+               <widget class="QLabel" name="label_24">
+                <property name="text">
+                 <string>Patient ID</string>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="1">
+               <widget class="QLineEdit" name="doctorPatientIDEdit"/>
+              </item>
+              <item row="4" column="0" colspan="2">
+               <widget class="Line" name="line_7">
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+               </widget>
+              </item>
+              <item row="5" column="0">
+               <widget class="QLabel" name="label_22">
+                <property name="text">
+                 <string>Address</string>
+                </property>
+               </widget>
+              </item>
+              <item row="5" column="1">
+               <widget class="QTextEdit" name="doctorAddressEdit">
+                <property name="tabChangesFocus">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="6" column="0" colspan="2">
+               <widget class="Line" name="line_2">
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+               </widget>
+              </item>
+              <item row="7" column="0">
+               <widget class="QLabel" name="label_18">
+                <property name="text">
+                 <string>Phone</string>
+                </property>
+               </widget>
+              </item>
+              <item row="7" column="1">
+               <widget class="QLineEdit" name="doctorPhoneEdit"/>
+              </item>
+              <item row="8" column="0">
+               <widget class="QLabel" name="label_19">
+                <property name="text">
+                 <string>Email</string>
+                </property>
+               </widget>
+              </item>
+              <item row="8" column="1">
+               <widget class="QLineEdit" name="doctorEmailEdit"/>
+              </item>
+              <item row="9" column="1">
+               <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>
+           </item>
+          </layout>
+         </widget>
+        </widget>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QVBoxLayout" name="verticalLayout">
+       <item>
+        <widget class="QLabel" name="AppTitle">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="font">
+          <font>
+           <pointsize>14</pointsize>
+           <weight>75</weight>
+           <italic>false</italic>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="text">
+          <string>SleepyHead</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignHCenter|Qt::AlignTop</set>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="releaseStatus">
+         <property name="font">
+          <font>
+           <italic>true</italic>
+          </font>
+         </property>
+         <property name="text">
+          <string>TextLabel</string>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignCenter</set>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="label_2">
+         <property name="text">
+          <string/>
+         </property>
+         <property name="pixmap">
+          <pixmap resource="Resources.qrc">:/docs/sheep.png</pixmap>
+         </property>
+         <property name="scaledContents">
+          <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>
+      </layout>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <property name="spacing">
+      <number>16</number>
+     </property>
+     <property name="leftMargin">
+      <number>8</number>
+     </property>
+     <property name="topMargin">
+      <number>8</number>
+     </property>
+     <property name="rightMargin">
+      <number>8</number>
+     </property>
+     <property name="bottomMargin">
+      <number>8</number>
+     </property>
+     <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="QPushButton" name="cancelButton">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>&Cancel</string>
+       </property>
+       <property name="autoDefault">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="backButton">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="text">
+        <string>&Back</string>
+       </property>
+       <property name="autoDefault">
+        <bool>false</bool>
+       </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="text">
+        <string>&Next</string>
+       </property>
+       <property name="autoDefault">
+        <bool>false</bool>
+       </property>
+       <property name="default">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>cancelButton</sender>
+   <signal>clicked()</signal>
+   <receiver>NewProfile</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>425</x>
+     <y>373</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>288</x>
+     <y>197</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/sleepyhead/overview.cpp b/sleepyhead/overview.cpp
new file mode 100644
index 0000000..172e4d3
--- /dev/null
+++ b/sleepyhead/overview.cpp
@@ -0,0 +1,803 @@
+/* Overview GUI Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QCalendarWidget>
+#include <QTextCharFormat>
+//#include <QSystemLocale>
+#include <QDebug>
+#include <QDateTimeEdit>
+#include <QCalendarWidget>
+#include <QFileDialog>
+#include <QMessageBox>
+//#include <QProgressBar>
+
+#include "SleepLib/profiles.h"
+#include "overview.h"
+#include "ui_overview.h"
+#include "common_gui.h"
+#include "Graphs/gXAxis.h"
+#include "Graphs/gLineChart.h"
+#include "Graphs/gYAxis.h"
+
+#include "mainwindow.h"
+extern MainWindow *mainwin;
+//extern QProgressBar * qprogress;
+
+Overview::Overview(QWidget *parent, gGraphView *shared) :
+    QWidget(parent),
+    ui(new Ui::Overview),
+    m_shared(shared)
+{
+    ui->setupUi(this);
+
+    // Set Date controls locale to 4 digit years
+    QLocale locale = QLocale::system();
+    QString shortformat = locale.dateFormat(QLocale::ShortFormat);
+
+    if (!shortformat.toLower().contains("yyyy")) {
+        shortformat.replace("yy", "yyyy");
+    }
+
+    ui->dateStart->setDisplayFormat(shortformat);
+    ui->dateEnd->setDisplayFormat(shortformat);
+
+    Qt::DayOfWeek dow = firstDayOfWeekFromLocale();
+
+    ui->dateStart->calendarWidget()->setFirstDayOfWeek(dow);
+    ui->dateEnd->calendarWidget()->setFirstDayOfWeek(dow);
+
+
+    // Stop both calendar drop downs highlighting weekends in red
+    QTextCharFormat format = ui->dateStart->calendarWidget()->weekdayTextFormat(Qt::Saturday);
+    format.setForeground(QBrush(COLOR_Black, Qt::SolidPattern));
+    ui->dateStart->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format);
+    ui->dateStart->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format);
+    ui->dateEnd->calendarWidget()->setWeekdayTextFormat(Qt::Saturday, format);
+    ui->dateEnd->calendarWidget()->setWeekdayTextFormat(Qt::Sunday, format);
+
+    // Connect the signals to update which days have CPAP data when the month is changed
+    connect(ui->dateStart->calendarWidget(), SIGNAL(currentPageChanged(int, int)),
+            SLOT(dateStart_currentPageChanged(int, int)));
+    connect(ui->dateEnd->calendarWidget(), SIGNAL(currentPageChanged(int, int)),
+            SLOT(dateEnd_currentPageChanged(int, int)));
+
+    QVBoxLayout *framelayout = new QVBoxLayout;
+    ui->graphArea->setLayout(framelayout);
+
+    QFrame *border = new QFrame(ui->graphArea);
+
+    framelayout->setMargin(1);
+    border->setFrameShape(QFrame::StyledPanel);
+    framelayout->addWidget(border,1);
+
+    // Create the horizontal layout to hold the GraphView object and it's scrollbar
+    layout = new QHBoxLayout(border);
+    layout->setSpacing(0); // remove the ugly margins/spacing
+    layout->setMargin(0);
+    layout->setContentsMargins(0, 0, 0, 0);
+    border->setLayout(layout);
+    border->setAutoFillBackground(false);
+
+    // Create the GraphView Object
+    GraphView = new gGraphView(ui->graphArea, m_shared);
+    GraphView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    GraphView->setEmptyText(STR_Empty_NoData);
+
+    // Create the custom scrollbar and attach to GraphView
+    scrollbar = new MyScrollBar(ui->graphArea);
+    scrollbar->setOrientation(Qt::Vertical);
+    scrollbar->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
+    scrollbar->setMaximumWidth(20);
+    GraphView->setScrollBar(scrollbar);
+
+
+    // Add the graphView and scrollbar to the layout.
+    layout->addWidget(GraphView, 1);
+    layout->addWidget(scrollbar, 0);
+    layout->layout();
+
+    dateLabel = new MyLabel(this);
+    dateLabel->setAlignment(Qt::AlignVCenter);
+    dateLabel->setText("[Date Widget]");
+    QFont font = dateLabel->font();
+    font.setPointSizeF(font.pointSizeF()*1.3F);
+    dateLabel->setFont(font);
+    QPalette palette = dateLabel->palette();
+    palette.setColor(QPalette::Base, Qt::blue);
+    dateLabel->setPalette(palette);
+
+    ui->dateLayout->addWidget(dateLabel,1);
+
+
+
+//    uc = new SummaryChart(STR_UNIT_Hours, GT_BAR);
+//    uc->addSlice(NoChannel, COLOR_Green, ST_HOURS);
+//    UC->AddLayer(uc);
+
+  /*  return;
+
+    // TODO: Automate graph creation process
+
+
+
+
+
+    float percentile = p_profile->general->prefCalcPercentile() / 100.0;
+    int mididx = p_profile->general->prefCalcMiddle();
+    SummaryType ST_mid;
+
+    if (mididx == 0) { ST_mid = ST_PERC; }
+    if (mididx == 1) { ST_mid = ST_WAVG; }
+    if (mididx == 2) { ST_mid = ST_AVG; }
+
+    SummaryType ST_max = p_profile->general->prefCalcMax() ? ST_PERC : ST_MAX;
+    const EventDataType maxperc = 0.995F;
+
+    US = createGraph(STR_GRAPH_SessionTimes, tr("Session Times"), tr("Session Times\n(hours)"), YT_Time);
+    SET = createGraph("Settings", STR_TR_Settings, STR_TR_Settings);
+
+
+    TGMV = createGraph(schema::channel[CPAP_TgMV].code(), schema::channel[CPAP_TgMV].label(), tr("Target\nVentilation\n(L/min)"));
+    PTB = createGraph(schema::channel[CPAP_PTB].code(), schema::channel[CPAP_PTB].label(), tr("Patient\nTriggered\nBreaths\n(%)"));
+    SES = createGraph(STR_GRAPH_Sessions, STR_TR_Sessions, STR_TR_Sessions + tr("\n(count)"));
+
+
+    ahihr = new SummaryChart(STR_UNIT_EventsPerHour, GT_POINTS);
+    ahihr->addSlice(ahicode, COLOR_Blue, ST_MAX);
+    ahihr->addSlice(ahicode, COLOR_Orange, ST_WAVG);
+    AHIHR->AddLayer(ahihr);
+
+    weight = new SummaryChart(STR_TR_Weight, GT_POINTS);
+    weight->setMachineType(MT_JOURNAL);
+    weight->addSlice(Journal_Weight, COLOR_Black, ST_SETAVG);
+    WEIGHT->AddLayer(weight);
+
+    bmi = new SummaryChart(STR_TR_BMI, GT_POINTS);
+    bmi->setMachineType(MT_JOURNAL);
+    bmi->addSlice(Journal_BMI, COLOR_DarkBlue, ST_SETAVG);
+    BMI->AddLayer(bmi);
+
+    zombie = new SummaryChart(tr("Zombie Meter"), GT_POINTS);
+    zombie->setMachineType(MT_JOURNAL);
+    zombie->addSlice(Journal_ZombieMeter, COLOR_DarkRed, ST_SETAVG);
+    ZOMBIE->AddLayer(zombie);
+
+    pulse = new SummaryChart(STR_TR_PulseRate, GT_POINTS);
+    pulse->setMachineType(MT_OXIMETER);
+    pulse->addSlice(OXI_Pulse, COLOR_Red, ST_mid, 0.5);
+    pulse->addSlice(OXI_Pulse, COLOR_Pink, ST_MIN);
+    pulse->addSlice(OXI_Pulse, COLOR_Orange, ST_MAX);
+    PULSE->AddLayer(pulse);
+
+    spo2 = new SummaryChart(STR_TR_SpO2, GT_POINTS);
+    spo2->setMachineType(MT_OXIMETER);
+    spo2->addSlice(OXI_SPO2, COLOR_Cyan, ST_mid, 0.5);
+    spo2->addSlice(OXI_SPO2, COLOR_LightBlue, ST_PERC, percentile);
+    spo2->addSlice(OXI_SPO2, COLOR_Blue, ST_MIN);
+    SPO2->AddLayer(spo2);
+
+
+    fl = new SummaryChart(STR_TR_FL, GT_POINTS);
+    fl->addSlice(CPAP_FlowLimit, COLOR_Brown, ST_CPH);
+    FL->AddLayer(fl);
+
+    sa = new SummaryChart(STR_TR_SA, GT_POINTS);
+    sa->addSlice(CPAP_SensAwake, COLOR_Brown, ST_CNT);
+    SA->AddLayer(sa);
+
+    us = new SummaryChart(STR_UNIT_Hours, GT_SESSIONS);
+    us->addSlice(NoChannel, COLOR_DarkBlue, ST_HOURS);
+    us->addSlice(NoChannel, COLOR_Blue, ST_SESSIONS);
+    US->AddLayer(us);
+
+    ses = new SummaryChart(STR_TR_Sessions, GT_POINTS);
+    ses->addSlice(NoChannel, COLOR_Blue, ST_SESSIONS);
+    SES->AddLayer(ses);
+
+    if (ahicode == CPAP_RDI) {
+        bc = new SummaryChart(STR_TR_RDI, GT_BAR);
+    } else {
+        bc = new SummaryChart(STR_TR_AHI, GT_BAR);
+    }
+
+    bc->addSlice(CPAP_ClearAirway, COLOR_ClearAirway, ST_CPH);
+    bc->addSlice(CPAP_Obstructive, COLOR_Obstructive, ST_CPH);
+    bc->addSlice(CPAP_Apnea, COLOR_Apnea, ST_CPH);
+    bc->addSlice(CPAP_Hypopnea, COLOR_Hypopnea, ST_CPH);
+
+    if (p_profile->general->calculateRDI()) {
+        bc->addSlice(CPAP_RERA, COLOR_RERA, ST_CPH);
+    }
+//    bc->addSlice(CPAP_UserFlag1, COLOR_UserFlag1, ST_CPH);
+//    bc->addSlice(CPAP_UserFlag2, COLOR_UserFlag2, ST_CPH);
+
+
+    AHI->AddLayer(bc);
+
+    set = new SummaryChart("", GT_POINTS);
+    //set->addSlice(PRS1_SysOneResistSet,COLOR_Gray,ST_SETAVG);
+    set->addSlice(CPAP_HumidSetting, COLOR_Blue, ST_SETWAVG);
+    set->addSlice(CPAP_PresReliefLevel, COLOR_Red, ST_SETWAVG);
+    set->addSlice(CPAP_PresReliefMode, COLOR_Red, ST_SETWAVG);
+//    set->addSlice(RMS9_EPRLevel,COLOR_Green,ST_SETWAVG);
+    //set->addSlice(INTP_SmartFlex,COLOR_Purple,ST_SETWAVG);
+    SET->AddLayer(set);
+
+    rr = new SummaryChart(tr("breaths/min"), GT_POINTS);
+    rr->addSlice(CPAP_RespRate, COLOR_LightBlue, ST_MIN);
+    rr->addSlice(CPAP_RespRate, COLOR_Blue, ST_mid, 0.5);
+    rr->addSlice(CPAP_RespRate, COLOR_LightGreen, ST_PERC, percentile);
+    rr->addSlice(CPAP_RespRate, COLOR_Green, ST_max, maxperc);
+    // rr->addSlice(CPAP_RespRate,COLOR_Green,ST_MAX);
+    RR->AddLayer(rr);
+
+    tv = new SummaryChart(tr("L/b"), GT_POINTS);
+    tv->addSlice(CPAP_TidalVolume, COLOR_LightBlue, ST_MIN);
+    tv->addSlice(CPAP_TidalVolume, COLOR_Blue, ST_mid, 0.5);
+    tv->addSlice(CPAP_TidalVolume, COLOR_LightGreen, ST_PERC, percentile);
+    tv->addSlice(CPAP_TidalVolume, COLOR_Green, ST_max, maxperc);
+    TV->AddLayer(tv);
+
+    mv = new SummaryChart(STR_UNIT_LPM, GT_POINTS);
+    mv->addSlice(CPAP_MinuteVent, COLOR_LightBlue, ST_MIN);
+    mv->addSlice(CPAP_MinuteVent, COLOR_Blue, ST_mid, 0.5);
+    mv->addSlice(CPAP_MinuteVent, COLOR_LightGreen, ST_PERC, percentile);
+    mv->addSlice(CPAP_MinuteVent, COLOR_Green, ST_max, maxperc);
+    MV->AddLayer(mv);
+
+    // should merge...
+    tgmv = new SummaryChart(STR_UNIT_LPM, GT_POINTS);
+    tgmv->addSlice(CPAP_TgMV, COLOR_LightBlue, ST_MIN);
+    tgmv->addSlice(CPAP_TgMV, COLOR_Blue, ST_mid, 0.5);
+    tgmv->addSlice(CPAP_TgMV, COLOR_LightGreen, ST_PERC, percentile);
+    tgmv->addSlice(CPAP_TgMV, COLOR_Green, ST_max, maxperc);
+    TGMV->AddLayer(tgmv);
+
+    ptb = new SummaryChart(tr("%PTB"), GT_POINTS);
+    ptb->addSlice(CPAP_PTB, COLOR_Yellow, ST_MIN);
+    ptb->addSlice(CPAP_PTB, COLOR_Blue, ST_mid, 0.5);
+    ptb->addSlice(CPAP_PTB, COLOR_LightGray, ST_PERC, percentile);
+    ptb->addSlice(CPAP_PTB, COLOR_Orange, ST_WAVG);
+    PTB->AddLayer(ptb);
+
+    pr = new SummaryChart(STR_TR_Pressure, GT_POINTS);
+    // Added in summarychart.. Slightly annoying..
+    PR->AddLayer(pr);
+
+
+    totlk = new SummaryChart(STR_TR_TotalLeaks, GT_POINTS);
+    totlk->addSlice(CPAP_LeakTotal, COLOR_LightBlue, ST_mid, 0.5);
+    totlk->addSlice(CPAP_LeakTotal, COLOR_DarkGray, ST_PERC, percentile);
+    totlk->addSlice(CPAP_LeakTotal, COLOR_Gray, ST_max, maxperc);
+    //tot->addSlice(CPAP_Leak, COLOR_DarkBlue, ST_WAVG);
+    //tot->addSlice(CPAP_Leak, COLOR_DarkYellow);
+    TOTLK->AddLayer(totlk);
+
+
+    NLL->AddLayer(nll = new SummaryChart(tr("% %1").arg(schema::channel[CPAP_LargeLeak].fullname()), GT_POINTS));
+    nll->addSlice(CPAP_LargeLeak, schema::channel[CPAP_LargeLeak].defaultColor(), ST_SPH);
+    // <--- The code to the previous marker is crap
+
+    AHI->setPinned(false);
+    SES->setRecMinY(1);
+    SET->setRecMinY(0);
+
+    //SET->setRecMaxY(5);
+
+    */
+    RebuildGraphs(false);
+
+    ui->rangeCombo->setCurrentIndex(p_profile->general->lastOverviewRange());
+
+    icon_on = new QIcon(":/icons/session-on.png");
+    icon_off = new QIcon(":/icons/session-off.png");
+
+    GraphView->resetLayout();
+    GraphView->LoadSettings("Overview"); //no trans
+
+    GraphView->setEmptyImage(QPixmap(":/docs/sheep.png"));
+
+    connect(GraphView, SIGNAL(updateCurrentTime(double)), this, SLOT(on_LineCursorUpdate(double)));
+    connect(GraphView, SIGNAL(updateRange(double,double)), this, SLOT(on_RangeUpdate(double,double)));
+
+    connect(GraphView, SIGNAL(GraphsChanged()), this, SLOT(updateGraphCombo()));
+}
+Overview::~Overview()
+{
+    delete ui;
+//    delete icon_on;
+//    delete icon_off;
+}
+
+void Overview::RebuildGraphs(bool reset)
+{
+    qint64 minx, maxx;
+    if (reset) {
+        GraphView->GetXBounds(minx, maxx);
+    }
+
+    GraphView->trashGraphs(true);
+    ChannelID ahicode = p_profile->general->calculateRDI() ? CPAP_RDI : CPAP_AHI;
+
+    if (ahicode == CPAP_RDI) {
+        AHI = createGraph("AHIBreakdown", STR_TR_RDI, tr("Respiratory\nDisturbance\nIndex"));
+    } else {
+        AHI = createGraph("AHIBreakdown", STR_TR_AHI, tr("Apnea\nHypopnea\nIndex"));
+    }
+
+
+    ahi = new gAHIChart();
+    AHI->AddLayer(ahi);
+
+    UC = createGraph(STR_GRAPH_Usage, tr("Usage"), tr("Usage\n(hours)"));
+    UC->AddLayer(uc = new gUsageChart());
+
+    STG = createGraph("New Session", tr("Session Times"), tr("Session Times"),  YT_Time);
+    stg = new gSessionTimesChart();
+    STG->AddLayer(stg);
+
+    PR = createGraph("Pressure Settings", STR_TR_Pressure, STR_TR_Pressure + "\n(" + STR_UNIT_CMH2O + ")");
+    pres = new gPressureChart();
+    PR->AddLayer(pres);
+
+    TTIA = createGraph("TTIA", tr("Total Time in Apnea"), tr("Total Time in Apnea\n(Minutes)"));
+    ttia = new gTTIAChart();
+    TTIA->AddLayer(ttia);
+
+//    LK = createGraph("Leaks", STR_TR_Leaks, STR_TR_UnintentionalLeaks + "\n(" + STR_UNIT_LPM + ")");
+//    LK->AddLayer(new gSummaryChart(CPAP_Leak, MT_CPAP));
+
+//    TOTLK = createGraph("TotalLeaks", STR_TR_TotalLeaks, STR_TR_TotalLeaks + "\n(" + STR_UNIT_LPM + ")");
+//    TOTLK->AddLayer(new gSummaryChart(CPAP_LeakTotal, MT_CPAP));
+
+//    NLL = createGraph("TimeInLL", tr("% in %1").arg(schema::channel[CPAP_LargeLeak].label()), tr("Large Leaks\n(% of night)"));
+//    NLL->AddLayer(nll = new gSummaryChart("TimeInLL", MT_CPAP));
+//    nll->addCalc(CPAP_LargeLeak, ST_SPH);
+
+//    RR = createGraph(schema::channel[CPAP_RespRate].code(), schema::channel[CPAP_RespRate].label(), schema::channel[CPAP_RespRate].fullname()+"\n"+schema::channel[CPAP_RespRate].units());
+//    RR->AddLayer(new gSummaryChart(CPAP_RespRate, MT_CPAP));
+//    TV = createGraph(schema::channel[CPAP_TidalVolume].code(),schema::channel[CPAP_TidalVolume].label(), tr("Tidal\nVolume\n(ml)"));
+//    TV->AddLayer(new gSummaryChart(CPAP_TidalVolume, MT_CPAP));
+//    MV = createGraph(schema::channel[CPAP_MinuteVent].code(), schema::channel[CPAP_MinuteVent].label(), tr("Minute\nVentilation\n(L/min)"));
+//    MV->AddLayer(new gSummaryChart(CPAP_MinuteVent, MT_CPAP));
+//    FL = createGraph(schema::channel[CPAP_FLG].code(), schema::channel[CPAP_FLG].label(), STR_TR_FlowLimit);
+//    FL->AddLayer(new gSummaryChart(CPAP_FLG, MT_CPAP));
+//    SN = createGraph(schema::channel[CPAP_Snore].code(), schema::channel[CPAP_Snore].label(), schema::channel[CPAP_Snore].fullname()+"\n"+schema::channel[CPAP_Snore].units());
+//    SN->AddLayer(new gSummaryChart(CPAP_Snore, MT_CPAP));
+
+    QHash<ChannelID, schema::Channel *>::iterator chit;
+    QHash<ChannelID, schema::Channel *>::iterator chit_end = schema::channel.channels.end();
+    for (chit = schema::channel.channels.begin(); chit != chit_end; ++chit) {
+        schema::Channel * chan = chit.value();
+
+        if (chan->showInOverview()) {
+            ChannelID code = chan->id();
+            QString name = chan->fullname();
+            if (name.length() > 16) name = chan->label();
+            gGraph *G = createGraph(chan->code(), name, chan->description());
+            if ((chan->type() == schema::FLAG) || (chan->type() == schema::MINOR_FLAG)) {
+                gSummaryChart * sc = new gSummaryChart(chan->code(), MT_CPAP);
+                sc->addCalc(code, ST_CPH, schema::channel[code].defaultColor());
+                G->AddLayer(sc);
+            } else if (chan->type() == schema::SPAN) {
+                gSummaryChart * sc = new gSummaryChart(chan->code(), MT_CPAP);
+                sc->addCalc(code, ST_SPH, schema::channel[code].defaultColor());
+                G->AddLayer(sc);
+            } else if (chan->type() == schema::WAVEFORM) {
+                G->AddLayer(new gSummaryChart(code, chan->machtype()));
+            } else if (chan->type() == schema::UNKNOWN) {
+                gSummaryChart * sc = new gSummaryChart(chan->code(), MT_CPAP);
+                sc->addCalc(code, ST_CPH, schema::channel[code].defaultColor());
+                G->AddLayer(sc);
+            }
+        }
+
+    }
+
+/*    PULSE = createGraph(schema::channel[OXI_Pulse].code(), schema::channel[OXI_Pulse].label(), STR_TR_PulseRate + "\n(" + STR_UNIT_BPM + ")");
+    PULSE->AddLayer(new gSummaryChart(OXI_Pulse, MT_OXIMETER));
+
+    SPO2 = createGraph(schema::channel[OXI_SPO2].code(), schema::channel[OXI_SPO2].label(), tr("Oxygen Saturation\n(%)"));
+    SPO2->AddLayer(new gSummaryChart(OXI_SPO2, MT_OXIMETER));
+
+
+    NPB = createGraph("TimeInPB", tr("% in %1").arg(schema::channel[CPAP_CSR].label()), tr("%1\n(% of night)").arg(schema::channel[CPAP_LargeLeak].description()));
+    NPB->AddLayer(npb = new gSummaryChart(tr("% PB"), MT_CPAP));
+    npb->addCalc(CPAP_CSR, ST_SPH);
+
+    if (ahicode == CPAP_RDI) {
+        AHIHR = createGraph(STR_GRAPH_PeakAHI, tr("Peak RDI"), tr("Peak RDI\nShows RDI Clusters\n(RDI/hr)"));
+        AHIHR->AddLayer(new gSummaryChart(CPAP_RDI, MT_CPAP));
+    } else {
+        AHIHR = createGraph(STR_GRAPH_PeakAHI, tr("Peak AHI"), tr("Peak AHI\nShows AHI Clusters\n(AHI/hr)"));
+        AHIHR->AddLayer(new gSummaryChart(CPAP_AHI, MT_CPAP));
+    } */
+
+    WEIGHT = createGraph(STR_GRAPH_Weight, STR_TR_Weight, STR_TR_Weight, YT_Weight);
+    BMI = createGraph(STR_GRAPH_BMI, STR_TR_BMI, tr("Body\nMass\nIndex"));
+    ZOMBIE = createGraph(STR_GRAPH_Zombie, STR_TR_Zombie, tr("How you felt\n(0-10)"));
+
+    if (reset) {
+//        GraphView->setDay(nullptr);
+        GraphView->resetLayout();
+        GraphView->setDay(nullptr);
+//        GraphView->resetLayout();
+        GraphView->SetXBounds(minx, maxx, 0, false);
+        GraphView->resetLayout();
+        updateGraphCombo();
+    }
+
+
+}
+
+void Overview::closeEvent(QCloseEvent *event)
+{
+    GraphView->SaveSettings("Overview");//no trans
+    disconnect(this, SLOT(dateStart_currentPageChanged(int, int)));
+    disconnect(this, SLOT(dateEnd_currentPageChanged(int, int)));
+    QWidget::closeEvent(event);
+}
+
+gGraph *Overview::createGraph(QString code, QString name, QString units, YTickerType yttype)
+{
+    int default_height = p_profile->appearance->graphHeight();
+    gGraph *g = new gGraph(code, GraphView, name, units, default_height, 0);
+
+    gYAxis *yt;
+
+    switch (yttype) {
+    case YT_Time:
+        yt = new gYAxisTime(true); // Time scale
+        break;
+
+    case YT_Weight:
+        yt = new gYAxisWeight(p_profile->general->unitSystem());
+        break;
+
+    default:
+        yt = new gYAxis(); // Plain numeric scale
+        break;
+    }
+
+    g->AddLayer(yt, LayerLeft, gYAxis::Margin);
+    gXAxisDay *x = new gXAxisDay();
+    g->AddLayer(x, LayerBottom, 0, gXAxisDay::Margin);
+    g->AddLayer(new gXGrid());
+    return g;
+}
+
+void Overview::on_LineCursorUpdate(double time)
+{
+    if (time > 1) {
+        QDateTime dt = QDateTime::fromMSecsSinceEpoch(time,Qt::UTC);
+        QString txt = dt.toString("dd MMM yyyy (dddd)");
+        dateLabel->setText(txt);
+    } else dateLabel->setText(QString(GraphView->emptyText()));
+}
+
+void Overview::on_RangeUpdate(double minx, double /* maxx */)
+{
+    if (minx > 1) {
+        dateLabel->setText(GraphView->getRangeString());
+    } else {
+        dateLabel->setText(QString(GraphView->emptyText()));
+    }
+}
+
+void Overview::ReloadGraphs()
+{
+    GraphView->setDay(nullptr);
+    updateCube();
+
+    on_rangeCombo_activated(ui->rangeCombo->currentIndex());
+}
+
+void Overview::updateGraphCombo()
+{
+    ui->graphCombo->clear();
+    gGraph *g;
+    //    ui->graphCombo->addItem("Show All Graphs");
+    //    ui->graphCombo->addItem("Hide All Graphs");
+    //    ui->graphCombo->addItem("---------------");
+
+    for (int i = 0; i < GraphView->size(); i++) {
+        g = (*GraphView)[i];
+
+        if (g->isEmpty()) { continue; }
+
+        if (g->visible()) {
+            ui->graphCombo->addItem(*icon_on, g->title(), true);
+        } else {
+            ui->graphCombo->addItem(*icon_off, g->title(), false);
+        }
+    }
+
+    ui->graphCombo->setCurrentIndex(0);
+    updateCube();
+}
+
+void Overview::ResetGraphs()
+{
+    //qint64 st,et;
+    //GraphView->GetXBounds(st,et);
+    QDate start = ui->dateStart->date();
+    QDate end = ui->dateEnd->date();
+    GraphView->setDay(nullptr);
+    updateCube();
+
+    if (start.isValid() && end.isValid()) {
+        setRange(start, end);
+    }
+
+    //GraphView->SetXBounds(st,et);
+}
+
+void Overview::ResetGraph(QString name)
+{
+    gGraph *g = GraphView->findGraph(name);
+
+    if (!g) { return; }
+
+    g->setDay(nullptr);
+    GraphView->redraw();
+}
+
+void Overview::RedrawGraphs()
+{
+    GraphView->redraw();
+}
+
+void Overview::UpdateCalendarDay(QDateEdit *dateedit, QDate date)
+{
+    QCalendarWidget *calendar = dateedit->calendarWidget();
+    QTextCharFormat bold;
+    QTextCharFormat cpapcol;
+    QTextCharFormat normal;
+    QTextCharFormat oxiday;
+    bold.setFontWeight(QFont::Bold);
+    cpapcol.setForeground(QBrush(Qt::blue, Qt::SolidPattern));
+    cpapcol.setFontWeight(QFont::Bold);
+    oxiday.setForeground(QBrush(Qt::red, Qt::SolidPattern));
+    oxiday.setFontWeight(QFont::Bold);
+    bool hascpap = p_profile->FindDay(date, MT_CPAP) != nullptr;
+    bool hasoxi = p_profile->FindDay(date, MT_OXIMETER) != nullptr;
+    //bool hasjournal=p_profile->GetDay(date,MT_JOURNAL)!=nullptr;
+
+    if (hascpap) {
+        if (hasoxi) {
+            calendar->setDateTextFormat(date, oxiday);
+        } else {
+            calendar->setDateTextFormat(date, cpapcol);
+        }
+    } else if (p_profile->GetDay(date)) {
+        calendar->setDateTextFormat(date, bold);
+    } else {
+        calendar->setDateTextFormat(date, normal);
+    }
+
+    calendar->setHorizontalHeaderFormat(QCalendarWidget::ShortDayNames);
+}
+void Overview::dateStart_currentPageChanged(int year, int month)
+{
+    QDate d(year, month, 1);
+    int dom = d.daysInMonth();
+
+    for (int i = 1; i <= dom; i++) {
+        d = QDate(year, month, i);
+        UpdateCalendarDay(ui->dateStart, d);
+    }
+}
+void Overview::dateEnd_currentPageChanged(int year, int month)
+{
+    QDate d(year, month, 1);
+    int dom = d.daysInMonth();
+
+    for (int i = 1; i <= dom; i++) {
+        d = QDate(year, month, i);
+        UpdateCalendarDay(ui->dateEnd, d);
+    }
+}
+
+
+void Overview::on_dateEnd_dateChanged(const QDate &date)
+{
+    qint64 d1 = qint64(QDateTime(ui->dateStart->date(), QTime(0, 10, 0), Qt::UTC).toTime_t()) * 1000L;
+    qint64 d2 = qint64(QDateTime(date, QTime(23, 0, 0), Qt::UTC).toTime_t()) * 1000L;
+    GraphView->SetXBounds(d1, d2);
+    ui->dateStart->setMaximumDate(date);
+}
+
+void Overview::on_dateStart_dateChanged(const QDate &date)
+{
+    qint64 d1 = qint64(QDateTime(date, QTime(0, 10, 0), Qt::UTC).toTime_t()) * 1000L;
+    qint64 d2 = qint64(QDateTime(ui->dateEnd->date(), QTime(23, 0, 0), Qt::UTC).toTime_t()) * 1000L;
+    GraphView->SetXBounds(d1, d2);
+    ui->dateEnd->setMinimumDate(date);
+}
+
+void Overview::on_toolButton_clicked()
+{
+    qint64 d1 = qint64(QDateTime(ui->dateStart->date(), QTime(0, 10, 0), Qt::UTC).toTime_t()) * 1000L;
+    qint64 d2 = qint64(QDateTime(ui->dateEnd->date(), QTime(23, 00, 0), Qt::UTC).toTime_t()) * 1000L;
+    GraphView->SetXBounds(d1, d2);
+}
+
+//void Overview::on_printButton_clicked()
+//{
+//    mainwin->PrintReport(GraphView,STR_TR_Overview); // Must be translated the same as PrintReport checks.
+//}
+
+void Overview::ResetGraphLayout()
+{
+    GraphView->resetLayout();
+}
+
+
+/*void Overview::on_printDailyButton_clicked()
+{
+    qint64 st,et;
+    GraphView->GetXBounds(st,et);
+
+    QDate s1=QDateTime::fromTime_t(st/1000L).date();
+    QDate s2=QDateTime::fromTime_t(et/1000L).date();
+
+    int len=p_profile->countDays(MT_UNKNOWN,s1,s2);
+    if (len>7) {
+        if (QMessageBox::question(this, "Woah!", "Do you really want to print "+QString::number(len)+" days worth of Daily reports,\n from "+s1.toString(Qt::SystemLocaleShortDate)+" to "+s2.toString(Qt::SystemLocaleShortDate)+"?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) {
+            return;
+        }
+        if (len>14) {
+            int weeks=len/7;
+            if (QMessageBox::question(this, "Hold Up!", "We are talking about over "+QString::number(weeks)+" weeks of information.\n\nThis will likely take a very long time, and a heck of a lot of paper if your not printing to a PDF file.\n\nAre you really sure?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) {
+                return;
+            }
+            if (len>31) {
+                if (QMessageBox::question(this, "Are you serious!!??", "We are talking about printing a lot of information.\n\nIf your not printing to a PDF file, you must really hate trees.\n\nAre you really REALLY sure?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) {
+                    return;
+                }
+            }
+        }
+
+        mainwin->Notify("I'm not going to nag you any more, but it would probably help if I implemented this feature.. ;)");
+
+
+    } else mainwin->Notify("If this was implemented yet, You'd be able to print multiple daily reports right now.");
+
+}*/
+
+void Overview::on_rangeCombo_activated(int index)
+{
+    p_profile->general->setLastOverviewRange(index);
+    ui->dateStart->setMinimumDate(p_profile->FirstDay());
+    ui->dateEnd->setMaximumDate(p_profile->LastDay());
+
+    QDate end = p_profile->LastDay();
+    QDate start;
+
+    if (index == 8) { // Custom
+        ui->dateStartLabel->setEnabled(true);
+        ui->dateEndLabel->setEnabled(true);
+        ui->dateEnd->setEnabled(true);
+        ui->dateStart->setEnabled(true);
+
+        ui->dateStart->setMaximumDate(ui->dateEnd->date());
+        ui->dateEnd->setMinimumDate(ui->dateStart->date());
+        return;
+    }
+
+    ui->dateEnd->setEnabled(false);
+    ui->dateStart->setEnabled(false);
+    ui->dateStartLabel->setEnabled(false);
+    ui->dateEndLabel->setEnabled(false);
+
+    if (index == 0) {
+        start = end.addDays(-6);
+    } else if (index == 1) {
+        start = end.addDays(-13);
+    } else if (index == 2) {
+        start = end.addMonths(-1).addDays(1);
+    } else if (index == 3) {
+        start = end.addMonths(-2).addDays(1);
+    } else if (index == 4) {
+        start = end.addMonths(-3).addDays(1);
+    } else if (index == 5) {
+        start = end.addMonths(-6).addDays(1);
+    } else if (index == 6) {
+        start = end.addYears(-1).addDays(1);
+    } else if (index == 7) { // Everything
+        start = p_profile->FirstDay();
+    }
+
+    if (start < p_profile->FirstDay()) { start = p_profile->FirstDay(); }
+
+    setRange(start, end);
+}
+void Overview::setRange(QDate start, QDate end)
+{
+    ui->dateEnd->blockSignals(true);
+    ui->dateStart->blockSignals(true);
+    ui->dateStart->setMaximumDate(end);
+    ui->dateEnd->setMinimumDate(start);
+    ui->dateStart->setDate(start);
+    ui->dateEnd->setDate(end);
+    ui->dateEnd->blockSignals(false);
+    ui->dateStart->blockSignals(false);
+    this->on_toolButton_clicked();
+    updateGraphCombo();
+
+}
+
+void Overview::on_graphCombo_activated(int index)
+{
+    if (index < 0) {
+        return;
+    }
+
+    gGraph *g;
+    QString s;
+    s = ui->graphCombo->currentText();
+    bool b = !ui->graphCombo->itemData(index, Qt::UserRole).toBool();
+    ui->graphCombo->setItemData(index, b, Qt::UserRole);
+
+    if (b) {
+        ui->graphCombo->setItemIcon(index, *icon_on);
+    } else {
+        ui->graphCombo->setItemIcon(index, *icon_off);
+    }
+
+    g = GraphView->findGraphTitle(s);
+    g->setVisible(b);
+
+    updateCube();
+    GraphView->updateScale();
+    GraphView->redraw();
+}
+void Overview::updateCube()
+{
+    if ((GraphView->visibleGraphs() == 0)) {
+        ui->toggleVisibility->setArrowType(Qt::UpArrow);
+        ui->toggleVisibility->setToolTip(tr("Show all graphs"));
+        ui->toggleVisibility->blockSignals(true);
+        ui->toggleVisibility->setChecked(true);
+        ui->toggleVisibility->blockSignals(false);
+
+        if (ui->graphCombo->count() > 0) {
+            GraphView->setEmptyText(STR_Empty_NoGraphs);
+
+        } else {
+            GraphView->setEmptyText(STR_Empty_NoData);
+        }
+    } else {
+        ui->toggleVisibility->setArrowType(Qt::DownArrow);
+        ui->toggleVisibility->setToolTip(tr("Hide all graphs"));
+        ui->toggleVisibility->blockSignals(true);
+        ui->toggleVisibility->setChecked(false);
+        ui->toggleVisibility->blockSignals(false);
+    }
+}
+
+void Overview::on_toggleVisibility_clicked(bool checked)
+{
+    gGraph *g;
+    QString s;
+    QIcon *icon = checked ? icon_off : icon_on;
+
+    //ui->toggleVisibility->setArrowType(checked ? Qt::UpArrow : Qt::DownArrow);
+    for (int i = 0; i < ui->graphCombo->count(); i++) {
+        s = ui->graphCombo->itemText(i);
+        ui->graphCombo->setItemIcon(i, *icon);
+        ui->graphCombo->setItemData(i, !checked, Qt::UserRole);
+        g = GraphView->findGraphTitle(s);
+        g->setVisible(!checked);
+    }
+
+    updateCube();
+    GraphView->updateScale();
+    GraphView->redraw();
+}
diff --git a/sleepyhead/overview.h b/sleepyhead/overview.h
new file mode 100644
index 0000000..0d72292
--- /dev/null
+++ b/sleepyhead/overview.h
@@ -0,0 +1,142 @@
+/* Overview GUI Headers
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef OVERVIEW_H
+#define OVERVIEW_H
+
+#include <QWidget>
+#include <QGLContext>
+#include <QHBoxLayout>
+#include <QDateEdit>
+#include "SleepLib/profiles.h"
+#include "Graphs/gGraphView.h"
+#include "Graphs/gSummaryChart.h"
+#include "Graphs/gSessionTimesChart.h"
+
+namespace Ui {
+class Overview;
+}
+
+class Report;
+
+enum YTickerType { YT_Number, YT_Time, YT_Weight };
+
+/*! \class Overview
+    \author Mark Watkins <jedimark_at_users.sourceforge.net>
+    \brief Overview tab, showing overall summary data
+    */
+class Overview : public QWidget
+{
+    Q_OBJECT
+
+  public:
+    explicit Overview(QWidget *parent, gGraphView *shared = nullptr);
+    ~Overview();
+    void closeEvent(QCloseEvent *);
+
+    //! \brief Returns Overview gGraphView object containing it's graphs
+    gGraphView *graphView() { return GraphView; }
+
+    //! \brief Recalculates Overview chart info
+    void ReloadGraphs();
+
+    //! \brief Recalculates Overview chart info, but keeps the date set
+    void ResetGraphs();
+
+    //! \brief Reset graphs to uniform heights
+    void ResetGraphLayout();
+
+    //! \brief Calls updateGL to redraw the overview charts
+    void RedrawGraphs();
+
+    //! \brief Sets the currently selected date range of the overview display
+    void setRange(QDate start, QDate end);
+
+    /*! \brief Create an overview graph, adding it to the overview gGraphView object
+        \param QString name  The title of the graph
+        \param QString units The units of measurements to show in the popup */
+    gGraph *createGraph(QString code, QString name, QString units = "", YTickerType yttype = YT_Number);
+    gGraph *AHI, *AHIHR, *UC, *FL, *SA, *US, *PR, *LK, *NPB, *SET, *SES, *RR, *MV, *TV, *PTB, *PULSE, *SPO2, *NLL,
+           *WEIGHT, *ZOMBIE, *BMI, *TGMV, *TOTLK, *STG, *SN, *TTIA;
+    SummaryChart *bc, *sa, *us, *pr,  *set, *ses,  *ptb, *pulse, *spo2,
+                 *weight, *zombie, *bmi, *ahihr, *tgmv, *totlk;
+
+    gSummaryChart * stg, *uc, *ahi, * pres, *lk, *npb, *rr, *mv, *tv, *nll, *sn, *ttia;
+
+    //! \breif List of SummaryCharts shown on the overview page
+    QVector<SummaryChart *> OverviewCharts;
+
+    void ResetGraph(QString name);
+
+    void RebuildGraphs(bool reset = true);
+
+  public slots:
+    void onRebuildGraphs() { RebuildGraphs(true); }
+    // ! \brief Print button down the bottom, does the same as File->Print
+    //void on_printButton_clicked();
+
+  private slots:
+    /*    void on_drStart_dateChanged(const QDate &date);
+        void on_drEnd_dateChanged(const QDate &date);
+        void on_rbDateRange_toggled(bool checked);
+        void on_rbLastWeek_clicked();
+        void on_rbLastMonth_clicked();
+        void on_rbEverything_clicked();
+        void on_rbDateRange_clicked(); */
+    void updateGraphCombo();
+
+    //! \brief Resets the graph view because the Start date has been changed
+    void on_dateStart_dateChanged(const QDate &date);
+
+    //! \brief Resets the graph view because the End date has been changed
+    void on_dateEnd_dateChanged(const QDate &date);
+
+    //! \brief Updates the calendar highlighting when changing to a new month
+    void dateStart_currentPageChanged(int year, int month);
+
+    //! \brief Updates the calendar highlighting when changing to a new month
+    void dateEnd_currentPageChanged(int year, int month);
+
+    //! \brief Resets view to currently shown start & end dates
+    void on_toolButton_clicked();
+
+    //void on_printDailyButton_clicked();
+
+    void on_rangeCombo_activated(int index);
+
+    void on_graphCombo_activated(int index);
+
+    void on_toggleVisibility_clicked(bool checked);
+
+    void on_LineCursorUpdate(double time);
+    void on_RangeUpdate(double minx, double maxx);
+
+  private:
+    Ui::Overview *ui;
+    gGraphView *GraphView;
+    MyScrollBar *scrollbar;
+    QHBoxLayout *layout;
+    gGraphView *m_shared;
+    QIcon *icon_on;
+    QIcon *icon_off;
+    MyLabel *dateLabel;
+
+    //! \brief Updates the calendar highlighting for the calendar object for this date.
+    void UpdateCalendarDay(QDateEdit *calendar, QDate date);
+    void updateCube();
+
+    //SessionTimes *session_times;
+    //,*PRESSURE,*LEAK,*SESSTIMES;
+
+    //Layer *prmax,*prmin,*iap,*eap,*pr,*sesstime;
+
+    Day *day; // dummy in this case
+
+};
+
+#endif // OVERVIEW_H
diff --git a/sleepyhead/overview.ui b/sleepyhead/overview.ui
new file mode 100644
index 0000000..a1db829
--- /dev/null
+++ b/sleepyhead/overview.ui
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Overview</class>
+ <widget class="QWidget" name="Overview">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>760</width>
+    <height>392</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QWidget" name="graphArea" native="true"/>
+   </item>
+   <item>
+    <widget class="QFrame" name="frame">
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>45</height>
+      </size>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout">
+      <property name="spacing">
+       <number>4</number>
+      </property>
+      <property name="leftMargin">
+       <number>4</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>4</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <widget class="QLabel" name="label_3">
+        <property name="text">
+         <string>Range:</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QComboBox" name="rangeCombo">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <item>
+         <property name="text">
+          <string>Last Week</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Last Two Weeks</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Last Month</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Last Two Months</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Last Three Months</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Last 6 Months</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Last Year</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Everything</string>
+         </property>
+        </item>
+        <item>
+         <property name="text">
+          <string>Custom</string>
+         </property>
+        </item>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="dateStartLabel">
+        <property name="text">
+         <string>Start:</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QDateEdit" name="dateStart">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="calendarPopup">
+         <bool>true</bool>
+        </property>
+        <property name="timeSpec">
+         <enum>Qt::UTC</enum>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="dateEndLabel">
+        <property name="text">
+         <string>End:</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QDateEdit" name="dateEnd">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="calendarPopup">
+         <bool>true</bool>
+        </property>
+        <property name="timeSpec">
+         <enum>Qt::UTC</enum>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QToolButton" name="toolButton">
+        <property name="toolTip">
+         <string>Reset view to selected date range</string>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">QToolButton {
+ background: transparent;
+ border-radius: 8px;
+ border: 2px solid transparent;
+}
+
+QToolButton:hover {
+ border: 2px solid #456789;
+}
+
+QToolButton:pressed {
+ border: 2px solid #456789;
+ background-color: #89abcd;
+}</string>
+        </property>
+        <property name="text">
+         <string>...</string>
+        </property>
+        <property name="icon">
+         <iconset resource="Resources.qrc">
+          <normaloff>:/icons/refresh.png</normaloff>:/icons/refresh.png</iconset>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <spacer name="horizontalSpacer">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeType">
+         <enum>QSizePolicy::Fixed</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>4</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="dateLayout"/>
+      </item>
+      <item>
+       <widget class="QToolButton" name="toggleVisibility">
+        <property name="toolTip">
+         <string>Toggle Graph Visibility</string>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">QToolButton {
+ background: transparent;
+ border-radius: 8px;
+ border: 2px solid transparent;
+}
+
+QToolButton:hover {
+ border: 2px solid #456789;
+}
+
+QToolButton:pressed {
+ border: 2px solid #456789;
+ background-color: #89abcd;
+}</string>
+        </property>
+        <property name="text">
+         <string>...</string>
+        </property>
+        <property name="checkable">
+         <bool>true</bool>
+        </property>
+        <property name="autoRaise">
+         <bool>true</bool>
+        </property>
+        <property name="arrowType">
+         <enum>Qt::DownArrow</enum>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QComboBox" name="graphCombo">
+        <property name="toolTip">
+         <string>Drop down to see list of graphs to switch on/off.</string>
+        </property>
+        <item>
+         <property name="text">
+          <string>Graphs</string>
+         </property>
+        </item>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/sleepyhead/oximeterimport.cpp b/sleepyhead/oximeterimport.cpp
new file mode 100644
index 0000000..da00760
--- /dev/null
+++ b/sleepyhead/oximeterimport.cpp
@@ -0,0 +1,1147 @@
+/* Oximeter Import Wizard Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QThread>
+#include <QMessageBox>
+#include <QFileDialog>
+#include <QStandardPaths>
+
+#include "Graphs/gYAxis.h"
+#include "Graphs/gXAxis.h"
+
+#include "oximeterimport.h"
+#include "ui_oximeterimport.h"
+#include "SleepLib/calcs.h"
+#include "mainwindow.h"
+
+extern MainWindow * mainwin;
+
+#include "SleepLib/loader_plugins/cms50_loader.h"
+#include "SleepLib/loader_plugins/cms50f37_loader.h"
+#include "SleepLib/loader_plugins/md300w1_loader.h"
+
+Qt::DayOfWeek firstDayOfWeekFromLocale();
+QList<SerialOximeter *> GetOxiLoaders();
+
+OximeterImport::OximeterImport(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::OximeterImport)
+{
+    ui->setupUi(this);
+    setWindowTitle(tr("Oximeter Import Wizard"));
+    ui->stackedWidget->setCurrentIndex(0);
+    oximodule = nullptr;
+    liveView = new gGraphView(this);
+    liveView->setVisible(false);
+    liveView->setShowAuthorMessage(false);
+    ui->retryButton->setVisible(false);
+    ui->stopButton->setVisible(false);
+    ui->saveButton->setVisible(false);
+    ui->syncButton->setVisible(false);
+    ui->chooseSessionButton->setVisible(false);
+
+    importMode = IM_UNDEFINED;
+
+    QVBoxLayout * lvlayout = new QVBoxLayout;
+    lvlayout->setMargin(0);
+    ui->liveViewFrame->setLayout(lvlayout);
+    lvlayout->addWidget(liveView);
+    plethyGraph = new gGraph("Plethy", liveView, STR_TR_Plethy, STR_UNIT_Hz);
+
+    plethyGraph->AddLayer(new gYAxis(), LayerLeft, gYAxis::Margin);
+    plethyGraph->AddLayer(new gXAxis(), LayerBottom, 0, 20);
+    plethyGraph->AddLayer(plethyChart = new gLineChart(OXI_Plethy));
+    plethyGraph->setVisible(true);
+    plethyGraph->setRecMinY(0);
+    plethyGraph->setRecMaxY(128);
+
+    ui->calendarWidget->setFirstDayOfWeek(Qt::Sunday);
+    QTextCharFormat format = ui->calendarWidget->weekdayTextFormat(Qt::Saturday);
+    format.setForeground(QBrush(Qt::black, Qt::SolidPattern));
+    ui->calendarWidget->setWeekdayTextFormat(Qt::Saturday, format);
+    ui->calendarWidget->setWeekdayTextFormat(Qt::Sunday, format);
+    ui->calendarWidget->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);
+    Qt::DayOfWeek dow=firstDayOfWeekFromLocale();
+    ui->calendarWidget->setFirstDayOfWeek(dow);
+
+    ui->dateTimeEdit->setMinimumHeight(ui->dateTimeEdit->height() + 10);
+    ui->syncCPAPGroup->setVisible(false);
+
+    QVBoxLayout * layout = new QVBoxLayout;
+    layout->setMargin(0);
+    ui->sessBarFrame->setLayout(layout);
+    sessbar = new SessionBar(this);
+    sessbar->setSelectMode(true);
+    sessbar->setMouseTracking(true);
+    sessbar->setMinimumHeight(40);
+    connect(sessbar, SIGNAL(sessionClicked(Session*)), this, SLOT(onSessionSelected(Session*)));
+    layout->addWidget(sessbar, 1);
+
+    dummyday = nullptr;
+    session = nullptr;
+    ELplethy = nullptr;
+
+    pulse = spo2 = -1;
+
+
+    ui->skipWelcomeCheckbox->setChecked(p_profile->oxi->skipOxiIntroScreen());
+    if (p_profile->oxi->skipOxiIntroScreen()) {
+        ui->stackedWidget->setCurrentWidget(ui->importSelectionPage);
+        ui->nextButton->setVisible(false);
+        ui->informationButton->setVisible(true);
+    } else {
+        ui->stackedWidget->setCurrentWidget(ui->welcomePage);
+        ui->nextButton->setVisible(true);
+        ui->informationButton->setVisible(false);
+    }
+
+    ui->dateTimeEdit->setMinimumHeight(ui->dateTimeEdit->height()+10);
+    setInformation();
+
+    ui->cms50DeviceName->setText(p_profile->oxi->defaultDevice());
+    int oxitype = p_profile->oxi->oximeterType();
+    ui->oximeterType->setCurrentIndex(oxitype);
+    on_oximeterType_currentIndexChanged(oxitype);
+    ui->cms50DeviceName->setEnabled(false);
+    ui->cms50SyncTime->setChecked(p_profile->oxi->syncOximeterClock());
+
+
+}
+
+OximeterImport::~OximeterImport()
+{
+    if (!dummyday) {
+        delete dummyday;
+    }
+    if (!session) {
+        delete session;
+    }
+
+    disconnect(sessbar, SIGNAL(sessionClicked(Session*)), this, SLOT(onSessionSelected(Session*)));
+    delete ui;
+}
+
+void OximeterImport::on_nextButton_clicked()
+{
+    int i = ui->stackedWidget->currentIndex();
+    i++;
+    if (i >= ui->stackedWidget->count()) i = 0;
+
+    switch (i) {
+    case 0:
+        ui->nextButton->setVisible(true);
+        ui->nextButton->setText("&Start");
+        break;
+    case 1:
+        ui->nextButton->setVisible(false);
+        ui->informationButton->setVisible(true);
+
+        break;
+    default:
+        ui->informationButton->setVisible(true);
+
+        ui->nextButton->setVisible(true);
+
+
+    }
+    ui->stackedWidget->setCurrentIndex(i);
+}
+
+void OximeterImport::updateStatus(QString msg)
+{
+    ui->logBox->appendPlainText(msg);
+    ui->directImportStatus->setText(msg);
+    ui->liveStatusLabel->setText(msg);
+}
+
+
+SerialOximeter * OximeterImport::detectOximeter()
+{
+    const int PORTSCAN_TIMEOUT=30000;
+    const int delay=100;
+
+
+    ui->retryButton->setVisible(false);
+
+    QList<SerialOximeter *> loaders; //= GetOxiLoaders();
+
+    if (ui->oximeterType->currentIndex() == 0) { // CMS50F3.7
+        SerialOximeter * oxi = qobject_cast<SerialOximeter *>(lookupLoader(cms50f37_class_name));
+        loaders.push_back(oxi);
+    } else if (ui->oximeterType->currentIndex() == 1) { // CMS50D+/E/F
+        SerialOximeter * oxi = qobject_cast<SerialOximeter *>(lookupLoader(cms50_class_name));
+        loaders.push_back(oxi);
+    } else if (ui->oximeterType->currentIndex() == 2) { // ChoiceMed
+        SerialOximeter * oxi = qobject_cast<SerialOximeter *>(lookupLoader(md300w1_class_name));
+        loaders.push_back(oxi);
+    } else return nullptr;
+
+
+    updateStatus(tr("Scanning for compatible oximeters"));
+
+    ui->progressBar->setMaximum(PORTSCAN_TIMEOUT);
+
+    QTime time;
+    time.start();
+
+    oximodule = nullptr;
+    int elapsed=0;
+    do {
+        for (int i=0; i < loaders.size(); ++i) {
+            SerialOximeter * oxi = loaders[i];
+            if (oxi->openDevice()) {
+                oximodule = oxi;
+                break;
+            }
+         }
+
+         if (oximodule)
+            break;
+
+        QThread::msleep(delay);
+        elapsed = time.elapsed();
+        ui->progressBar->setValue(elapsed);
+        QApplication::processEvents();
+        if (!isVisible()) {
+            return oximodule = nullptr;
+        }
+
+    } while (elapsed < PORTSCAN_TIMEOUT);
+
+    if (!oximodule) {
+        updateStatus(tr("Could not detect any connected oximeter devices."));
+        ui->retryButton->setVisible(true);
+        return nullptr;
+    }
+
+    QString devicename = oximodule->getDeviceString();
+    if (devicename.isEmpty()) oximodule->loaderName();
+
+    updateStatus(tr("Connecting to %1 Oximeter").arg(devicename));
+
+    return oximodule;
+}
+
+
+
+void OximeterImport::on_directImportButton_clicked()
+{
+    ui->informationButton->setVisible(false);
+    ui->stackedWidget->setCurrentWidget(ui->directImportPage);
+
+    oximodule = detectOximeter();
+    if (!oximodule)
+        return;
+
+    if (p_profile->oxi->syncOximeterClock()) {
+        oximodule->syncClock();
+    }
+
+    QString model = oximodule->getModel();
+    QString user = oximodule->getUser();
+    QString devid = oximodule->getDeviceID();
+
+    if (oximodule->commandDriven()) {
+        if (devid != ui->cms50DeviceName->text()) {
+            if (ui->cms50CheckName->isChecked()) {
+                mainwin->Notify(STR_MessageBox_Information, tr("Renaming this oximeter from '%1' to '%2'").arg(devid).arg(ui->cms50DeviceName->text()));
+                oximodule->setDeviceID(ui->cms50DeviceName->text());
+            } else {
+                QMessageBox::information(this, STR_MessageBox_Information, tr("Oximeter name is different.. If you only have one and are sharing it between profiles, set the name to the same on both profiles."), QMessageBox::Ok);
+            }
+        }
+    }
+
+    oximodule->resetDevice();
+    int session_count = oximodule->getSessionCount();
+
+    if (session_count > 1) {
+        ui->stackedWidget->setCurrentWidget(ui->chooseSessionPage);
+        ui->syncButton->setVisible(false);
+        ui->chooseSessionButton->setVisible(true);
+
+        ui->tableOxiSessions->clearContents();
+        QTableWidgetItem * item;
+
+        ui->tableOxiSessions->setRowCount(session_count);
+        ui->tableOxiSessions->setSelectionBehavior(QAbstractItemView::SelectRows);
+
+        ui->tableOxiSessions->setColumnWidth(0,150);
+
+        int h, m, s;
+        for (int i=0; i< session_count; ++i) {
+            int duration = oximodule->getDuration(i);
+            QDateTime datetime = oximodule->getDateTime(i);
+            h = duration / 3600;
+            m = (duration / 60) % 60;
+            s = duration % 60;
+
+            item = new QTableWidgetItem(datetime.date().toString(Qt::SystemLocaleShortDate)+" "+datetime.time().toString("HH:mm:ss"));
+            ui->tableOxiSessions->setItem(i, 0, item);
+            item->setData(Qt::UserRole+1, datetime);
+            item->setData(Qt::UserRole, i);
+            item->setData(Qt::UserRole+2, duration);
+            item->setFlags(item->flags() & ~Qt::ItemIsEditable);
+
+            item = new QTableWidgetItem(QString(). sprintf("%02i:%02i:%02i", h,m,s));
+            ui->tableOxiSessions->setItem(i, 1, item);
+            item->setFlags(item->flags() & ~Qt::ItemIsEditable);
+
+            item = new QTableWidgetItem(tr("\"%1\", session %2").arg(user).arg(i+1, 0));
+            ui->tableOxiSessions->setItem(i, 2, item);
+            item->setFlags(item->flags() & ~Qt::ItemIsEditable);
+        }
+
+        selecting_session = true;
+        ui->tableOxiSessions->selectRow(0);
+        return;
+    } else if (session_count > 0) {
+        chosen_sessions.push_back(0);
+        oximodule->getDuration(0);
+        oximodule->setStartTime(oximodule->getDateTime(0));
+    }
+    doImport();
+}
+
+void OximeterImport::doImport()
+{
+    if (oximodule->commandDriven()) {
+        if (chosen_sessions.size() == 0) {
+            ui->connectLabel->setText("<h2>"+tr("Nothing to import")+"</h2>");
+
+            updateStatus(tr("Your oximeter did not have any valid sessions."));
+            ui->cancelButton->setText(tr("Close"));
+            return;
+        }
+        ui->connectLabel->setText("<h2>"+tr("Waiting for %1 to start").arg(oximodule->getModel())+"</h2>");
+        updateStatus(tr("Waiting for the device to start the upload process..."));
+    } else {
+        ui->connectLabel->setText("<h2>"+tr("Select upload option on %1").arg(oximodule->loaderName())+"</h2>");
+        ui->logBox->appendPlainText(tr("You need to tell your oximeter to begin sending data to the computer."));
+
+        updateStatus(tr("Please connect your oximeter, enter it's menu and select upload to commence data transfer..."));
+    }
+
+    connect(oximodule, SIGNAL(updateProgress(int,int)), this, SLOT(doUpdateProgress(int,int)));
+
+    oximodule->Open("import");
+
+    if (oximodule->commandDriven()) {
+        int chosen = chosen_sessions.at(0);
+        oximodule->getSessionData(chosen);
+    }
+
+    // Wait to start import streaming..
+    while (!oximodule->isImporting() && !oximodule->isAborted()) {
+//        QThread::msleep(10);
+        QApplication::processEvents();
+        if (!isVisible()) {
+            disconnect(oximodule, SIGNAL(updateProgress(int,int)), this, SLOT(doUpdateProgress(int,int)));
+            oximodule->abort();
+            break;
+        }
+
+    }
+
+    if (!oximodule->isStreaming()) {
+        disconnect(oximodule, SIGNAL(updateProgress(int,int)), this, SLOT(doUpdateProgress(int,int)));
+        ui->retryButton->setVisible(true);
+        ui->progressBar->setValue(0);
+        oximodule->abort();
+        return;
+    }
+    ui->connectLabel->setText("<h2>"+tr("%1 device is uploading data...").arg(oximodule->loaderName())+"</h2>");
+    updateStatus(tr("Please wait until oximeter upload process completes. Do not unplug your oximeter."));
+
+    importMode = IM_RECORDING;
+
+    // Can't abort this bit or the oximeter will get confused...
+    ui->cancelButton->setVisible(false);
+
+    connect(oximodule, SIGNAL(importComplete(SerialOximeter*)), this, SLOT(finishedImport(SerialOximeter*)));
+}
+
+void OximeterImport::finishedImport(SerialOximeter * oxi)
+{
+    Q_UNUSED(oxi);
+
+    connect(oximodule, SIGNAL(importComplete(SerialOximeter*)), this, SLOT(finishedImport(SerialOximeter*)));
+    ui->cancelButton->setVisible(true);
+    disconnect(oximodule, SIGNAL(updateProgress(int,int)), this, SLOT(doUpdateProgress(int,int)));
+    updateStatus(tr("Oximeter import completed.."));
+
+    if (oximodule->oxisessions.size() > 1) {
+        chooseSession();
+    } else {
+        on_syncButton_clicked();
+    }
+}
+
+void OximeterImport::doUpdateProgress(int v, int t)
+{
+    ui->progressBar->setMaximum(t);
+    ui->progressBar->setValue(v);
+    QApplication::processEvents();
+}
+
+
+void OximeterImport::on_fileImportButton_clicked()
+{
+
+#if QT_VERSION  < QT_VERSION_CHECK(5,0,0)
+        const QString documentsFolder = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation);
+#else
+        const QString documentsFolder = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
+#endif
+
+
+    QString filename = QFileDialog::getOpenFileName(nullptr , tr("Select a valid oximetry data file"), documentsFolder, tr("Oximetry Files (*.spo *.spor *.spo2 *.dat)"));
+
+    if (filename.isEmpty())
+        return;
+
+
+
+    // Make sure filename dialog had time to close properly..
+    QApplication::processEvents();
+
+    QList<SerialOximeter *> loaders = GetOxiLoaders();
+
+    bool success = false;
+
+    oximodule = nullptr;
+    Q_FOREACH(SerialOximeter * loader, loaders) {
+        if (loader->Open(filename)) {
+            success = true;
+            oximodule = loader;
+            break;
+        }
+    }
+    if (!success) {
+        QMessageBox::warning(this, STR_MessageBox_Warning, tr("No Oximetery module could parse the given file:")+QString("\n\n%1").arg(filename), QMessageBox::Ok);
+        return;
+    }
+    ui->informationButton->setVisible(false);
+    importMode = IM_FILE;
+
+
+    if (oximodule->oxisessions.size() > 1) {
+        chooseSession();
+    } else {
+        on_syncButton_clicked();
+    }
+}
+
+void OximeterImport::on_liveImportButton_clicked()
+{
+    ui->informationButton->setVisible(false);
+
+    ui->stackedWidget->setCurrentWidget(ui->liveImportPage);
+    ui->liveImportPage->layout()->addWidget(ui->progressBar);
+    QApplication::processEvents();
+
+    liveView->setEmptyText(tr("Oximeter not detected"));
+    liveView->setVisible(true);
+    QApplication::processEvents();
+
+    SerialOximeter * oximodule = detectOximeter();
+
+    if (!oximodule) {
+        updateStatus(tr("Couldn't access oximeter"));
+        ui->retryButton->setVisible(true);
+        ui->progressBar->setValue(0);
+
+        return;
+    }
+
+    MachineInfo info = oximodule->newInfo();
+    Machine *mach = oximodule->CreateMachine(info);
+
+    connect(oximodule, SIGNAL(updatePlethy(QByteArray)), this, SLOT(on_updatePlethy(QByteArray)));
+    ui->liveConnectLabel->setText(tr("Live Oximetery Mode"));
+
+
+    liveView->setEmptyText(tr("Starting up..."));
+    updateStatus(tr("If you can still read this after a few seconds, cancel and try again"));
+    ui->progressBar->hide();
+    liveView->update();
+    oximodule->Open("live");
+    ui->stopButton->setVisible(true);
+
+    dummyday = new Day();
+
+    quint32 starttime = oximodule->startTime().toTime_t();
+    ti = qint64(starttime) * 1000L;
+    start_ti = ti;
+
+    session = new Session(mach, starttime);
+
+    ELplethy = session->AddEventList(OXI_Plethy, EVL_Waveform, 1.0, 0.0, 0.0, 0.0, 20);
+
+    ELplethy->setFirst(start_ti);
+    session->really_set_first(start_ti);
+    session->setOpened(true);
+
+    dummyday->addSession(session);
+
+    plethyChart->setMinX(start_ti);
+    plethyGraph->SetMinX(start_ti);
+
+    liveView->setDay(dummyday);
+
+    updateTimer.setParent(this);
+    updateTimer.setInterval(50);
+    updateTimer.start();
+    connect(&updateTimer, SIGNAL(timeout()), this, SLOT(updateLiveDisplay()));
+    connect(ui->stopButton, SIGNAL(clicked()), this, SLOT(finishedRecording()));
+
+    importMode = IM_LIVE;
+
+}
+
+void OximeterImport::finishedRecording()
+{
+    updateTimer.stop();
+    oximodule->closeDevice();
+    disconnect(&updateTimer, SIGNAL(timeout()), this, SLOT(updateLiveDisplay()));
+    disconnect(ui->stopButton, SIGNAL(clicked()), this, SLOT(finishedRecording()));
+
+    ui->stopButton->setVisible(false);
+    ui->liveConnectLabel->setText(tr("Live Import Stopped"));
+    liveView->setEmptyText(tr("Live Oximetery Stopped"));
+    updateStatus(tr("Live Oximetery import has been stopped"));
+
+    disconnect(oximodule, SIGNAL(updatePlethy(QByteArray)), this, SLOT(on_updatePlethy(QByteArray)));
+
+    ui->syncButton->setVisible(true);
+
+    plethyGraph->SetMinX(start_ti);
+    liveView->SetXBounds(start_ti, ti, 0, true);
+
+    plethyGraph->setBlockZoom(false);
+}
+
+void OximeterImport::on_retryButton_clicked()
+{
+    if (ui->stackedWidget->currentWidget() == ui->directImportPage) {
+        on_directImportButton_clicked();
+    } else if (ui->stackedWidget->currentWidget() == ui->liveImportPage) {
+        on_liveImportButton_clicked();
+    }
+}
+
+void OximeterImport::on_stopButton_clicked()
+{
+    if (oximodule) {
+        oximodule->abort();
+    }
+}
+
+void OximeterImport::on_calendarWidget_clicked(const QDate &date)
+{
+    if (ui->radioSyncCPAP->isChecked()) {
+        Day * day = p_profile->GetGoodDay(date, MT_CPAP);
+
+        sessbar->clear();
+        if (day) {
+            QDateTime time=QDateTime::fromMSecsSinceEpoch(day->first());
+            sessbar->clear();
+            QList<QColor> colors;
+            colors.push_back("#ffffe0");
+            colors.push_back("#ffe0ff");
+            colors.push_back("#e0ffff");
+            QList<Session *>::iterator i;
+            int j=0;
+            for (i=day->begin(); i != day->end(); ++i) {
+                sessbar->add((*i),colors.at(j++ % colors.size()));
+            }
+            sessbar->setVisible(true);
+            ui->sessbarLabel->setText(tr("%1 session(s) on %2, starting at %3").arg(day->size()).arg(time.date().toString(Qt::SystemLocaleLongDate)).arg(time.time().toString("hh:mm:ssap")));
+            sessbar->setSelected(0);
+            ui->dateTimeEdit->setDateTime(time);
+        } else {
+            ui->sessbarLabel->setText(tr("No CPAP data available on %1").arg(date.toString(Qt::SystemLocaleLongDate)));
+            ui->dateTimeEdit->setDateTime(QDateTime(date,oximodule->startTime().time()));
+        }
+
+        sessbar->update();
+    } else if (ui->radioSyncOximeter) {
+        ui->sessbarLabel->setText(tr("%1").arg(date.toString(Qt::SystemLocaleLongDate)));
+        ui->dateTimeEdit->setDateTime(QDateTime(date, ui->dateTimeEdit->dateTime().time()));
+    }
+}
+
+void OximeterImport::on_calendarWidget_selectionChanged()
+{
+    on_calendarWidget_clicked(ui->calendarWidget->selectedDate());
+}
+void OximeterImport::onSessionSelected(Session * session)
+{
+    QDateTime time=QDateTime::fromMSecsSinceEpoch(session->first());
+    ui->dateTimeEdit->setDateTime(time);
+}
+
+void OximeterImport::on_sessionBackButton_clicked()
+{
+    int idx = (sessbar->selected()-1);
+    if (idx >= 0) {
+        sessbar->setSelected(idx);
+        QDateTime datetime = QDateTime::fromMSecsSinceEpoch(sessbar->session(idx)->first());
+        ui->dateTimeEdit->setDateTime(datetime);
+        sessbar->update();
+    }
+}
+
+void OximeterImport::on_sessionForwardButton_clicked()
+{
+    int idx = (sessbar->selected()+1);
+    if (idx < sessbar->count()) {
+        sessbar->setSelected(idx);
+        QDateTime datetime = QDateTime::fromMSecsSinceEpoch(sessbar->session(idx)->first());
+        ui->dateTimeEdit->setDateTime(datetime);
+        sessbar->update();
+    }
+}
+
+void OximeterImport::on_radioSyncCPAP_clicked()
+{
+    on_calendarWidget_clicked(oximodule->startTime().date());
+
+    ui->syncCPAPGroup->setVisible(true);
+
+}
+
+void OximeterImport::on_radioSyncOximeter_clicked()
+{
+    ui->syncCPAPGroup->setVisible(false);
+    if (oximodule && oximodule->isStartTimeValid()) {
+        ui->calendarWidget->setSelectedDate(oximodule->startTime().date());
+        ui->dateTimeEdit->setDateTime(oximodule->startTime());
+    }
+}
+
+void OximeterImport::on_updatePlethy(QByteArray plethy)
+{
+    if (!session) {
+        return;
+    }
+    int size = plethy.size();
+    quint64 dur = qint64(size) * 20L;
+    ELplethy->AddWaveform(ti, plethy.data(), size, dur);
+    ti += dur;
+}
+
+void OximeterImport::updateLiveDisplay()
+{
+    if (!session) {
+        return;
+    }
+
+    if (ui->showLiveGraphs->isChecked()) {
+        qint64 sti = ti - 20000;
+        plethyChart->setMinY(ELplethy->Min());
+        plethyChart->setMaxY(ELplethy->Max());
+        plethyGraph->SetMinY(ELplethy->Min());
+        plethyGraph->SetMaxY(ELplethy->Max());
+        plethyGraph->SetMinX(sti);
+        plethyGraph->SetMaxX(ti);
+        plethyGraph->setBlockZoom(true);
+        ELplethy->setLast(ti);
+        session->really_set_last(ti);
+
+
+        //liveView->SetXBounds(sti, ti, 0, true);
+        session->setMin(OXI_Plethy, ELplethy->Min());
+        session->setMax(OXI_Plethy, ELplethy->Max());
+        session->setLast(OXI_Plethy, ti);
+        session->setCount(OXI_Plethy, ELplethy->count());
+
+        for (int i = 0; i < liveView->size(); i++) {
+            (*liveView)[i]->SetXBounds(sti, ti);
+        }
+
+        liveView->updateScale();
+        liveView->redraw();
+    }
+
+    if (!oximodule->oxirec) return;
+    int size = oximodule->oxirec->size();
+
+    if (size > 0) {
+        int i = oximodule->startTime().secsTo(QDateTime::currentDateTime());
+
+        int seconds = i % 60;
+        int minutes = (i / 60) % 60;
+        int hours = i / 3600;
+
+        size--;
+
+        bool datagood = (*(oximodule->oxirec))[size].pulse > 0;
+
+
+        if (datagood & (pulse <= 0)) {
+            QString STR_recording = tr("Recording...");
+            updateStatus(STR_recording);
+            liveView->setEmptyText(STR_recording);
+            if (!ui->showLiveGraphs->isChecked()) {
+                liveView->redraw();
+            }
+        } else if (!datagood & (pulse != 0)) {
+            QString STR_nofinger = tr("Finger not detected");
+            updateStatus(STR_nofinger);
+            liveView->setEmptyText(STR_nofinger);
+            if (!ui->showLiveGraphs->isChecked()) {
+                liveView->redraw();
+            }
+        }
+        pulse = (*(oximodule->oxirec))[size].pulse;
+        spo2 = (*(oximodule->oxirec))[size].spo2;
+        if (pulse > 0) {
+            ui->pulseDisplay->display(QString().sprintf("%3i", pulse));
+        } else {
+            ui->pulseDisplay->display("---");
+        }
+        if (spo2 > 0) {
+            ui->spo2Display->display(QString().sprintf("%2i", spo2));
+        } else {
+            ui->spo2Display->display("--");
+        }
+
+        ui->lcdDuration->display(QString().sprintf("%02i:%02i:%02i",hours, minutes, seconds));
+
+    }
+}
+
+
+void OximeterImport::on_cancelButton_clicked()
+{
+    if (oximodule && oximodule->isStreaming()) {
+        oximodule->closeDevice();
+        oximodule->trashRecords();
+    }
+    reject();
+}
+
+void OximeterImport::on_showLiveGraphs_clicked(bool checked)
+{
+    if (checked) {
+        updateTimer.setInterval(50);
+    } else {
+        // Don't need to call the timer so often.. Save a little CPU..
+        updateTimer.setInterval(500);
+    }
+    plethyGraph->setVisible(checked);
+    liveView->redraw();
+}
+
+void OximeterImport::on_skipWelcomeCheckbox_clicked(bool checked)
+{
+    p_profile->oxi->setSkipOxiIntroScreen(checked);
+}
+
+void OximeterImport::on_informationButton_clicked()
+{
+    ui->stackedWidget->setCurrentWidget(ui->welcomePage);
+    ui->nextButton->setVisible(true);
+    ui->informationButton->setVisible(false);
+}
+
+void OximeterImport::on_syncButton_clicked()
+{
+    Q_ASSERT(oximodule != nullptr);
+
+    ui->stackedWidget->setCurrentWidget(ui->syncPage);
+
+    ui->syncButton->setVisible(false);
+    ui->saveButton->setVisible(true);
+
+    QDate first = p_profile->FirstDay();
+    QDate last = p_profile->LastDay();
+
+    QDate oxidate = oximodule->startTime().date();
+
+
+    if ((oxidate >= first) && (oxidate <= last)) {
+        // TODO: think this through better.. do I need to pick the day before?
+        ui->calendarWidget->setMinimumDate(first);
+        ui->calendarWidget->setMaximumDate(last);
+        ui->calendarWidget->setCurrentPage(oxidate.year(), oxidate.month());
+        ui->calendarWidget->setSelectedDate(oxidate);
+        on_calendarWidget_clicked(oximodule->startTime().date());
+    } else {
+        // No CPAP sessions to sync it to.. kill the CPAP sync option
+        on_calendarWidget_clicked(last);
+        ui->calendarWidget->setCurrentPage(oxidate.year(), oxidate.month());
+        ui->calendarWidget->setSelectedDate(oxidate);
+    }
+
+    ui->radioSyncOximeter->setChecked(true);
+    on_radioSyncOximeter_clicked();
+
+    if (importMode == IM_LIVE) {
+        // Live Recording
+        ui->labelSyncOximeter->setText(tr("I want to use the time my computer recorded for this live oximetry session."));
+    } else if (!oximodule->isStartTimeValid()) {
+        // Oximeter doesn't provide a clock
+        ui->labelSyncOximeter->setText(tr("I need to set the time manually, because my oximeter doesn't have an internal clock."));
+    }
+}
+
+void OximeterImport::on_saveButton_clicked()
+{
+    if (!oximodule) return;
+
+    QVector<OxiRecord> * oxirec = nullptr;
+
+    if (!oximodule->oxisessions.contains(oximodule->startTime())) {
+        QMessageBox::warning(this, STR_MessageBox_Error, tr("Something went wrong getting session data"), QMessageBox::Ok);
+        reject();
+        return;
+    }
+    oxirec = oximodule->oxisessions[oximodule->startTime()];
+    if (oxirec->size() < 10)
+        return;
+
+
+    // this can move to SerialOximeter class process function...
+    MachineInfo info = oximodule->newInfo();
+    Machine * mach = oximodule->CreateMachine(info);
+    SessionID sid = ui->dateTimeEdit->dateTime().toUTC().toTime_t();
+    quint64 start = quint64(sid) * 1000L;
+
+
+    if (!session) {
+        session = new Session(mach, sid);
+        session->really_set_first(start);
+    } else {
+        // Live recording...
+        if (dummyday) {
+            dummyday->removeSession(session);
+            delete dummyday;
+            dummyday = nullptr;
+        }
+        session->SetSessionID(sid);
+        session->really_set_first(start);
+        ELplethy->setFirst(start);
+        session->setFirst(OXI_Plethy, start);
+        quint64 duration = start + (ELplethy->count() * ELplethy->rate());
+        quint64 end = start + duration;
+        session->setLast(OXI_Plethy, end);
+
+        session->count(OXI_Plethy);
+        session->Min(OXI_Plethy);
+        session->Max(OXI_Plethy);
+    }
+    EventList * ELpulse = nullptr;
+    EventList * ELspo2 = nullptr;
+    EventList * ELperf = nullptr;
+
+    quint16 lastpulse = 0;
+    quint16 lastspo2 = 0;
+    quint16 lastperf = 0;
+    quint16 lastgoodpulse = 0;
+    quint16 lastgoodspo2 = 0;
+    quint16 lastgoodperf = 0;
+
+    bool haveperf = oximodule->havePerfIndex();
+
+    quint64 ti = start;
+
+
+    qint64 step = (importMode == IM_LIVE) ? oximodule->liveResolution() : oximodule->importResolution();
+    int size = oxirec->size();
+
+    // why was I skipping the first sample? not priming it anymore..
+    for (int i=0; i < size; ++i) {
+        OxiRecord * rec = &(*oxirec)[i];
+
+        if (rec->pulse > 0) {
+            if (lastpulse == 0) {
+                ELpulse = session->AddEventList(OXI_Pulse, EVL_Event);
+            }
+            if (lastpulse != rec->pulse) {
+                if (lastpulse > 0) {
+                    ELpulse->AddEvent(ti, lastpulse);
+                }
+                ELpulse->AddEvent(ti, rec->pulse);
+            }
+            lastgoodpulse = rec->pulse;
+        } else {
+            // end section properly
+            if (lastgoodpulse > 0) {
+                ELpulse->AddEvent(ti, lastpulse);
+                session->setLast(OXI_Pulse, ti);
+                lastgoodpulse = 0;
+            }
+        }
+
+        lastpulse = rec->pulse;
+
+        if (rec->spo2 > 0) {
+            if (lastspo2 == 0) {
+                ELspo2 = session->AddEventList(OXI_SPO2, EVL_Event);
+            }
+            if (lastspo2 != rec->spo2) {
+                if (lastspo2 > 0) {
+                    ELspo2->AddEvent(ti, lastspo2);
+                }
+                ELspo2->AddEvent(ti, rec->spo2);
+            }
+            lastgoodspo2 = rec->spo2;
+        } else {
+            // end section properly
+            if (lastgoodspo2 > 0) {
+                ELspo2->AddEvent(ti, lastspo2);
+                session->setLast(OXI_SPO2, ti);
+                lastgoodspo2 = 0;
+            }
+        }
+        lastspo2 = rec->spo2;
+
+        if (haveperf) {
+            // Perfusion Index
+            if (rec->perf > 0) {
+                if (lastperf == 0) {
+                    ELperf = session->AddEventList(OXI_Perf, EVL_Event, 0.01);
+                }
+                if (lastperf != rec->perf) {
+                    if (lastperf > 0) {
+                        ELperf->AddEvent(ti, lastperf);
+                    }
+                    ELperf->AddEvent(ti, rec->perf);
+                }
+                lastgoodperf = rec->perf;
+            } else {
+                // end section properly
+                if (lastgoodperf > 0) {
+                    ELperf->AddEvent(ti, lastperf);
+                    session->setLast(OXI_Perf, ti);
+                    lastgoodperf = 0;
+                }
+            }
+            lastperf = rec->perf;
+        }
+
+        ti += step;
+    }
+    ti -= step;
+    if (ELpulse && (lastpulse > 0)) {
+        ELpulse->AddEvent(ti, lastpulse);
+        session->setLast(OXI_Pulse, ti);
+    }
+
+    if (ELspo2 && (lastspo2 > 0)) {
+        ELspo2->AddEvent(ti, lastspo2);
+        session->setLast(OXI_SPO2, ti);
+    }
+
+
+    if (haveperf && ELperf && lastperf > 0) {
+        ELperf->AddEvent(ti, lastperf);
+        session->setLast(OXI_Perf, ti);
+    }
+
+    if (haveperf) {
+        session->first(OXI_Perf);
+        session->last(OXI_Perf);
+        session->count(OXI_Perf);
+        session->Min(OXI_Perf);
+        session->Max(OXI_Perf);
+    }
+
+    calcSPO2Drop(session);
+    calcPulseChange(session);
+
+    mach->setModel(oximodule->getModel());
+    mach->setBrand(oximodule->getVendor());
+
+    session->first(OXI_Pulse);
+    session->first(OXI_SPO2);
+    session->last(OXI_Pulse);
+    session->last(OXI_SPO2);
+
+    session->first(OXI_PulseChange);
+    session->first(OXI_SPO2Drop);
+    session->last(OXI_PulseChange);
+    session->last(OXI_SPO2Drop);
+
+    session->cph(OXI_PulseChange);
+    session->sph(OXI_PulseChange);
+
+    session->cph(OXI_SPO2Drop);
+    session->sph(OXI_SPO2Drop);
+
+    session->count(OXI_Pulse);
+    session->count(OXI_SPO2);
+    session->count(OXI_PulseChange);
+    session->count(OXI_SPO2Drop);
+    session->Min(OXI_Pulse);
+    session->Min(OXI_SPO2);
+    session->Max(OXI_Pulse);
+    session->Max(OXI_SPO2);
+
+    session->really_set_last(ti);
+    session->SetChanged(true);
+
+    session->setOpened(true);
+
+    mach->AddSession(session);
+    mach->Save();
+    mach->SaveSummary();
+    p_profile->StoreMachines();
+
+    mainwin->getDaily()->LoadDate(mainwin->getDaily()->getDate());
+    mainwin->getOverview()->ReloadGraphs();
+
+    ELplethy = nullptr;
+    session = nullptr;
+
+    oximodule->trashRecords();
+    accept();
+}
+
+void OximeterImport::chooseSession()
+{
+    selecting_session = false;
+
+    ui->stackedWidget->setCurrentWidget(ui->chooseSessionPage);
+    ui->syncButton->setVisible(false);
+    ui->chooseSessionButton->setVisible(true);
+    QMap<QDateTime, QVector<OxiRecord> *>::iterator it;
+
+    ui->tableOxiSessions->clearContents();
+    int row = 0;
+    QTableWidgetItem * item;
+    QVector<OxiRecord> * oxirec;
+
+    ui->tableOxiSessions->setRowCount(oximodule->oxisessions.size());
+    ui->tableOxiSessions->setSelectionBehavior(QAbstractItemView::SelectRows);
+
+    for (it = oximodule->oxisessions.begin(); it != oximodule->oxisessions.end(); ++it) {
+        const QDateTime & key = it.key();
+        oxirec = it.value();
+        item = new QTableWidgetItem(key.toString(Qt::ISODate));
+        ui->tableOxiSessions->setItem(row, 0, item);
+        item->setFlags(item->flags() & ~Qt::ItemIsEditable);
+
+        item = new QTableWidgetItem(QString(). sprintf("%lli", oxirec->size() * oximodule->importResolution() / 1000L));
+        ui->tableOxiSessions->setItem(row, 1, item);
+        item->setFlags(item->flags() & ~Qt::ItemIsEditable);
+
+        item = new QTableWidgetItem(tr("CMS50 Session %1").arg(row+1, 0));
+        ui->tableOxiSessions->setItem(row, 2, item);
+        item->setFlags(item->flags() & ~Qt::ItemIsEditable);
+
+        row++;
+    }
+
+    ui->tableOxiSessions->selectRow(0);
+}
+
+void OximeterImport::on_chooseSessionButton_clicked()
+{
+    ui->chooseSessionButton->setVisible(false);
+
+    QTableWidgetItem * item = ui->tableOxiSessions->item(ui->tableOxiSessions->currentRow(),0);
+
+    if (!item) return;
+    QDateTime datetime = item->data(Qt::UserRole+1).toDateTime();
+    oximodule->setStartTime(datetime);
+    oximodule->setDuration(item->data(Qt::UserRole+2).toInt());
+
+    if (selecting_session) {
+        ui->stackedWidget->setCurrentWidget(ui->directImportPage);
+        chosen_sessions.push_back(item->data(Qt::UserRole).toInt());
+
+        // go back and start import
+        doImport();
+    } else {
+        on_syncButton_clicked();
+    }
+}
+
+void OximeterImport::setInformation()
+{
+    QString html="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">"
+    "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">"
+    "p, li { white-space: pre-wrap; }"
+    "</style></head><body style=\" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;\">"
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:18pt;\">"
+            +tr("Welcome to the Oximeter Import Wizard")+"</span></p>"
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+            +tr("Pulse Oximeters are medical devices used to measure blood oxygen saturation. During extended Apnea events and abnormal breathing patterns, blood oxygen saturation levels can drop significantly, and can indicate issues that need medical attention.")+"</p>"
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+            +tr("SleepyHead gives you the ability to track Oximetry data alongside CPAP session data, which can give valuable insight into the effectiveness of CPAP treatment. It will also work standalone with your Pulse Oximeter, allowing you to store, track and review your recorded data.")+"</p>"
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+            +tr("SleepyHead is currently compatible with Contec CMS50D+, CMS50E, CMS50F and CMS50I serial oximeters.<br/>(Note: Direct importing from bluetooth models is <span style=\" font-weight:600;\">probaby not</span> possible yet)")+"</p>"
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+        +tr("You may wish to note, other companies, such as Pulox, simply rebadge Contec CMS50's under new names, such as the Pulox PO-200, PO-300, PO-400. These should also work.")+"</p>"
+
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+            +tr("It also can read from ChoiceMMed MD300W1 oximeter .dat files.")+"</p>"
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+            "<span style=\" font-weight:600;\">"+tr("Please remember:")+" </span>"
+            "<span style=\" font-weight:600; font-style:italic;\">"
+            +tr("If you are trying to sync oximetery and CPAP data, please make sure you imported your CPAP sessions first before proceeding!")+"</span></p>"
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+            "<span style=\" font-weight:600;\">"+tr("Important Notes:")+" </span>"
+            +tr("For SleepyHead to be able to locate and read directly from your Oximeter device, you need to ensure the correct device drivers (eg. USB to Serial UART) have been installed on your computer. For more information about this, %1click here%2.").arg("<a href=\"http://sleepyhead.sf.net/\"><span style=\" text-decoration: underline; color:#0000ff;\">").arg("</span></a>")+"</p>"
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+            +tr("Contec CMS50D+ devices do not have an internal clock, and do not record a starting time. If you do not have a CPAP session to link a recording to, you will have to enter the start time manually after the import process is completed.")+"</p>"
+    "<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">"
+            +tr("Even for devices with an internal clock, it is still recommended to get into the habit of starting oximeter records at the same time as CPAP sessions, because CPAP internal clocks tend to drift over time, and not all can be reset easily.")+"</p></body></html>";
+    ui->textBrowser->setHtml(html);
+    ui->textBrowser->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+}
+
+void OximeterImport::on_oximeterType_currentIndexChanged(int index)
+{
+    switch (index) {
+    case 0: //New CMS50's
+        ui->directImportButton->setEnabled(true);
+        ui->liveImportButton->setEnabled(false);
+        ui->fileImportButton->setEnabled(true);
+        ui->oldCMS50specific->setVisible(false);
+        ui->newCMS50settingsPanel->setVisible(true);
+        break;
+    case 1:
+        ui->directImportButton->setEnabled(true);
+        ui->liveImportButton->setEnabled(true);
+        ui->fileImportButton->setEnabled(true);
+        ui->oldCMS50specific->setVisible(true);
+        ui->newCMS50settingsPanel->setVisible(false);
+        break;
+    default:
+        ui->directImportButton->setEnabled(false);
+        ui->liveImportButton->setEnabled(false);
+        ui->fileImportButton->setEnabled(true);
+        ui->oldCMS50specific->setVisible(false);
+        ui->newCMS50settingsPanel->setVisible(false);
+    }
+    p_profile->oxi->setOximeterType(index);
+
+}
+
+void OximeterImport::on_cms50CheckName_clicked(bool checked)
+{
+    ui->cms50DeviceName->setEnabled(checked);
+    if (checked) {
+        ui->cms50DeviceName->setFocus();
+        ui->cms50DeviceName->setCursorPosition(0);
+    }
+}
+
+void OximeterImport::on_cms50SyncTime_clicked(bool checked)
+{
+    p_profile->oxi->setSyncOximeterClock(checked);
+}
+
+void OximeterImport::on_cms50DeviceName_textEdited(const QString &arg1)
+{
+    p_profile->oxi->setDefaultDevice(arg1);
+}
diff --git a/sleepyhead/oximeterimport.h b/sleepyhead/oximeterimport.h
new file mode 100644
index 0000000..90e1b95
--- /dev/null
+++ b/sleepyhead/oximeterimport.h
@@ -0,0 +1,121 @@
+/* Oximeter Import Wizard Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef OXIMETERIMPORT_H
+#define OXIMETERIMPORT_H
+
+#include <QDialog>
+
+#include "Graphs/gGraphView.h"
+#include "Graphs/gLineChart.h"
+#include "SleepLib/serialoximeter.h"
+#include "sessionbar.h"
+
+namespace Ui {
+class OximeterImport;
+}
+
+enum OximeterImportMode {
+    IM_UNDEFINED = 0, IM_LIVE, IM_RECORDING, IM_FILE
+};
+
+class OximeterImport : public QDialog
+{
+    Q_OBJECT
+
+public:
+    explicit OximeterImport(QWidget *parent = 0);
+    ~OximeterImport();
+
+
+private slots:
+    void on_nextButton_clicked();
+
+    void on_directImportButton_clicked();
+
+    void doUpdateProgress(int, int);
+    void on_fileImportButton_clicked();
+
+    void on_liveImportButton_clicked();
+
+    void on_retryButton_clicked();
+
+    void on_stopButton_clicked();
+
+    void on_calendarWidget_clicked(const QDate &date);
+
+    void on_calendarWidget_selectionChanged();
+
+    void onSessionSelected(Session * session);
+
+    void on_sessionBackButton_clicked();
+
+    void on_sessionForwardButton_clicked();
+
+    void on_radioSyncCPAP_clicked();
+
+    void on_radioSyncOximeter_clicked();
+
+    void on_cancelButton_clicked();
+
+    void on_showLiveGraphs_clicked(bool checked);
+
+    void on_skipWelcomeCheckbox_clicked(bool checked);
+
+    void on_informationButton_clicked();
+
+    void on_syncButton_clicked();
+
+    void on_saveButton_clicked();
+
+    void chooseSession();
+
+    void on_chooseSessionButton_clicked();
+
+    void on_oximeterType_currentIndexChanged(int index);
+
+    void on_cms50CheckName_clicked(bool checked);
+
+    void on_cms50SyncTime_clicked(bool checked);
+
+    void on_cms50DeviceName_textEdited(const QString &arg1);
+
+protected slots:
+    void on_updatePlethy(QByteArray plethy);
+    void finishedRecording();
+    void finishedImport(SerialOximeter*);
+    void updateLiveDisplay();
+
+protected:
+    SerialOximeter * detectOximeter();
+    void updateStatus(QString msg);
+    void doImport();
+    void setInformation();
+
+private:
+    Ui::OximeterImport *ui;
+    SerialOximeter * oximodule;
+    gGraphView * liveView;
+    gGraph * plethyGraph;
+    Session * session;
+    Day * dummyday;
+    gLineChart * plethyChart;
+    SessionBar * sessbar;
+    EventList * ELplethy;
+    qint64 start_ti, ti;
+    QTimer updateTimer;
+    OximeterImportMode importMode;
+
+    int pulse;
+    int spo2;
+
+    bool selecting_session;
+    QList<int> chosen_sessions;
+};
+
+#endif // OXIMETERIMPORT_H
diff --git a/sleepyhead/oximeterimport.ui b/sleepyhead/oximeterimport.ui
new file mode 100644
index 0000000..23a2784
--- /dev/null
+++ b/sleepyhead/oximeterimport.ui
@@ -0,0 +1,2243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OximeterImport</class>
+ <widget class="QDialog" name="OximeterImport">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>1312</width>
+    <height>638</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Dialog</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_5">
+   <property name="leftMargin">
+    <number>12</number>
+   </property>
+   <property name="topMargin">
+    <number>12</number>
+   </property>
+   <property name="rightMargin">
+    <number>12</number>
+   </property>
+   <property name="bottomMargin">
+    <number>12</number>
+   </property>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="leftMargin">
+      <number>0</number>
+     </property>
+     <property name="topMargin">
+      <number>0</number>
+     </property>
+     <item>
+      <spacer name="horizontalSpacer_8">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeType">
+        <enum>QSizePolicy::Fixed</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>200</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QLabel" name="label_2">
+       <property name="font">
+        <font>
+         <pointsize>24</pointsize>
+        </font>
+       </property>
+       <property name="text">
+        <string>Oximeter Import Wizard</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_3">
+     <property name="spacing">
+      <number>4</number>
+     </property>
+     <item>
+      <widget class="QFrame" name="frame">
+       <property name="palette">
+        <palette>
+         <active>
+          <colorrole role="WindowText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Button">
+           <brush brushstyle="LinearGradientPattern">
+            <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+             <gradientstop position="0.000000000000000">
+              <color alpha="255">
+               <red>255</red>
+               <green>255</green>
+               <blue>255</blue>
+              </color>
+             </gradientstop>
+             <gradientstop position="1.000000000000000">
+              <color alpha="255">
+               <red>120</red>
+               <green>154</green>
+               <blue>188</blue>
+              </color>
+             </gradientstop>
+            </gradient>
+           </brush>
+          </colorrole>
+          <colorrole role="Light">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>153</red>
+             <green>174</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Midlight">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>103</red>
+             <green>132</green>
+             <blue>243</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Dark">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>27</red>
+             <green>45</green>
+             <blue>116</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Mid">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>36</red>
+             <green>60</green>
+             <blue>155</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Text">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="BrightText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>255</red>
+             <green>255</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="ButtonText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Base">
+           <brush brushstyle="LinearGradientPattern">
+            <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+             <gradientstop position="0.000000000000000">
+              <color alpha="255">
+               <red>255</red>
+               <green>255</green>
+               <blue>255</blue>
+              </color>
+             </gradientstop>
+             <gradientstop position="1.000000000000000">
+              <color alpha="255">
+               <red>120</red>
+               <green>154</green>
+               <blue>188</blue>
+              </color>
+             </gradientstop>
+            </gradient>
+           </brush>
+          </colorrole>
+          <colorrole role="Window">
+           <brush brushstyle="LinearGradientPattern">
+            <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+             <gradientstop position="0.000000000000000">
+              <color alpha="255">
+               <red>255</red>
+               <green>255</green>
+               <blue>255</blue>
+              </color>
+             </gradientstop>
+             <gradientstop position="1.000000000000000">
+              <color alpha="255">
+               <red>120</red>
+               <green>154</green>
+               <blue>188</blue>
+              </color>
+             </gradientstop>
+            </gradient>
+           </brush>
+          </colorrole>
+          <colorrole role="Shadow">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="AlternateBase">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>154</red>
+             <green>172</green>
+             <blue>243</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="ToolTipBase">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>255</red>
+             <green>255</green>
+             <blue>220</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="ToolTipText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+         </active>
+         <inactive>
+          <colorrole role="WindowText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Button">
+           <brush brushstyle="LinearGradientPattern">
+            <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+             <gradientstop position="0.000000000000000">
+              <color alpha="255">
+               <red>255</red>
+               <green>255</green>
+               <blue>255</blue>
+              </color>
+             </gradientstop>
+             <gradientstop position="1.000000000000000">
+              <color alpha="255">
+               <red>120</red>
+               <green>154</green>
+               <blue>188</blue>
+              </color>
+             </gradientstop>
+            </gradient>
+           </brush>
+          </colorrole>
+          <colorrole role="Light">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>153</red>
+             <green>174</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Midlight">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>103</red>
+             <green>132</green>
+             <blue>243</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Dark">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>27</red>
+             <green>45</green>
+             <blue>116</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Mid">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>36</red>
+             <green>60</green>
+             <blue>155</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Text">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="BrightText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>255</red>
+             <green>255</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="ButtonText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Base">
+           <brush brushstyle="LinearGradientPattern">
+            <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+             <gradientstop position="0.000000000000000">
+              <color alpha="255">
+               <red>255</red>
+               <green>255</green>
+               <blue>255</blue>
+              </color>
+             </gradientstop>
+             <gradientstop position="1.000000000000000">
+              <color alpha="255">
+               <red>120</red>
+               <green>154</green>
+               <blue>188</blue>
+              </color>
+             </gradientstop>
+            </gradient>
+           </brush>
+          </colorrole>
+          <colorrole role="Window">
+           <brush brushstyle="LinearGradientPattern">
+            <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+             <gradientstop position="0.000000000000000">
+              <color alpha="255">
+               <red>255</red>
+               <green>255</green>
+               <blue>255</blue>
+              </color>
+             </gradientstop>
+             <gradientstop position="1.000000000000000">
+              <color alpha="255">
+               <red>120</red>
+               <green>154</green>
+               <blue>188</blue>
+              </color>
+             </gradientstop>
+            </gradient>
+           </brush>
+          </colorrole>
+          <colorrole role="Shadow">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="AlternateBase">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>154</red>
+             <green>172</green>
+             <blue>243</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="ToolTipBase">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>255</red>
+             <green>255</green>
+             <blue>220</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="ToolTipText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+         </inactive>
+         <disabled>
+          <colorrole role="WindowText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>27</red>
+             <green>45</green>
+             <blue>116</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Button">
+           <brush brushstyle="LinearGradientPattern">
+            <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+             <gradientstop position="0.000000000000000">
+              <color alpha="255">
+               <red>255</red>
+               <green>255</green>
+               <blue>255</blue>
+              </color>
+             </gradientstop>
+             <gradientstop position="1.000000000000000">
+              <color alpha="255">
+               <red>120</red>
+               <green>154</green>
+               <blue>188</blue>
+              </color>
+             </gradientstop>
+            </gradient>
+           </brush>
+          </colorrole>
+          <colorrole role="Light">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>153</red>
+             <green>174</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Midlight">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>103</red>
+             <green>132</green>
+             <blue>243</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Dark">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>27</red>
+             <green>45</green>
+             <blue>116</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Mid">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>36</red>
+             <green>60</green>
+             <blue>155</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Text">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>27</red>
+             <green>45</green>
+             <blue>116</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="BrightText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>255</red>
+             <green>255</green>
+             <blue>255</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="ButtonText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>27</red>
+             <green>45</green>
+             <blue>116</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="Base">
+           <brush brushstyle="LinearGradientPattern">
+            <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+             <gradientstop position="0.000000000000000">
+              <color alpha="255">
+               <red>255</red>
+               <green>255</green>
+               <blue>255</blue>
+              </color>
+             </gradientstop>
+             <gradientstop position="1.000000000000000">
+              <color alpha="255">
+               <red>120</red>
+               <green>154</green>
+               <blue>188</blue>
+              </color>
+             </gradientstop>
+            </gradient>
+           </brush>
+          </colorrole>
+          <colorrole role="Window">
+           <brush brushstyle="LinearGradientPattern">
+            <gradient startx="0.000000000000000" starty="0.000000000000000" endx="1.000000000000000" endy="0.000000000000000" type="LinearGradient" spread="PadSpread" coordinatemode="ObjectBoundingMode">
+             <gradientstop position="0.000000000000000">
+              <color alpha="255">
+               <red>255</red>
+               <green>255</green>
+               <blue>255</blue>
+              </color>
+             </gradientstop>
+             <gradientstop position="1.000000000000000">
+              <color alpha="255">
+               <red>120</red>
+               <green>154</green>
+               <blue>188</blue>
+              </color>
+             </gradientstop>
+            </gradient>
+           </brush>
+          </colorrole>
+          <colorrole role="Shadow">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="AlternateBase">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>54</red>
+             <green>90</green>
+             <blue>232</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="ToolTipBase">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>255</red>
+             <green>255</green>
+             <blue>220</blue>
+            </color>
+           </brush>
+          </colorrole>
+          <colorrole role="ToolTipText">
+           <brush brushstyle="SolidPattern">
+            <color alpha="255">
+             <red>0</red>
+             <green>0</green>
+             <blue>0</blue>
+            </color>
+           </brush>
+          </colorrole>
+         </disabled>
+        </palette>
+       </property>
+       <property name="styleSheet">
+        <string notr="true">QFrame {
+background: qlineargradient( x1:0 y1:0, x2:1 y2:0, stop:0 white, stop:1 #789abc);
+border: 1px solid gray;
+border-radius: 15px;
+}</string>
+       </property>
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Raised</enum>
+       </property>
+       <layout class="QVBoxLayout" name="verticalLayout_4">
+        <property name="leftMargin">
+         <number>0</number>
+        </property>
+        <property name="topMargin">
+         <number>0</number>
+        </property>
+        <property name="rightMargin">
+         <number>0</number>
+        </property>
+        <property name="bottomMargin">
+         <number>0</number>
+        </property>
+        <item>
+         <spacer name="verticalSpacer_7">
+          <property name="orientation">
+           <enum>Qt::Vertical</enum>
+          </property>
+          <property name="sizeType">
+           <enum>QSizePolicy::Preferred</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>20</width>
+            <height>10</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QLabel" name="label_5">
+          <property name="styleSheet">
+           <string notr="true">border: 0px solid gray;
+border-radius: 0px;</string>
+          </property>
+          <property name="text">
+           <string/>
+          </property>
+          <property name="pixmap">
+           <pixmap resource="Resources.qrc">:/icons/oximeter.png</pixmap>
+          </property>
+          <property name="scaledContents">
+           <bool>false</bool>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignHCenter|Qt::AlignTop</set>
+          </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>40</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <widget class="QStackedWidget" name="stackedWidget">
+       <property name="currentIndex">
+        <number>1</number>
+       </property>
+       <widget class="QWidget" name="welcomePage">
+        <layout class="QVBoxLayout" name="verticalLayout">
+         <property name="leftMargin">
+          <number>4</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>4</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
+         <item>
+          <widget class="QFrame" name="frame_4">
+           <property name="styleSheet">
+            <string notr="true">background: white;
+border: 1px solid gray;
+border-radius: 15px;</string>
+           </property>
+           <property name="frameShape">
+            <enum>QFrame::StyledPanel</enum>
+           </property>
+           <property name="frameShadow">
+            <enum>QFrame::Raised</enum>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_15">
+            <item>
+             <widget class="QTextBrowser" name="textBrowser">
+              <property name="styleSheet">
+               <string notr="true">border: 0px;
+border-radius: 0px;</string>
+              </property>
+              <property name="frameShape">
+               <enum>QFrame::NoFrame</enum>
+              </property>
+              <property name="lineWidth">
+               <number>0</number>
+              </property>
+              <property name="verticalScrollBarPolicy">
+               <enum>Qt::ScrollBarAlwaysOn</enum>
+              </property>
+              <property name="sizeAdjustPolicy">
+               <enum>QAbstractScrollArea::AdjustToContents</enum>
+              </property>
+              <property name="autoFormatting">
+               <set>QTextEdit::AutoAll</set>
+              </property>
+              <property name="lineWrapMode">
+               <enum>QTextEdit::WidgetWidth</enum>
+              </property>
+              <property name="lineWrapColumnOrWidth">
+               <number>1</number>
+              </property>
+              <property name="html">
+               <string notr="true"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string>
+              </property>
+              <property name="placeholderText">
+               <string notr="true"/>
+              </property>
+              <property name="openExternalLinks">
+               <bool>true</bool>
+              </property>
+              <property name="openLinks">
+               <bool>false</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_2">
+           <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="QCheckBox" name="skipWelcomeCheckbox">
+             <property name="text">
+              <string>Skip this page next time.</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="importSelectionPage">
+        <property name="styleSheet">
+         <string notr="true">QPushButton {
+background: qlineargradient( x1:0 y1:0, x2:1 y2:0, stop:0 white, stop:1 #eeeeee);
+border: 1px solid gray; border-radius: 10px;
+}
+
+QPushButton:hover {
+border: 2px solid #56789a; border-radius: 10px;
+background: white;
+}
+
+QPushButton:pressed {
+border: 2px solid #56789a; border-radius: 10px;
+background: qlineargradient( x1:0 y1:0, x2:1 y2:0, stop:0 white, stop:1 #cccccc);
+}</string>
+        </property>
+        <layout class="QVBoxLayout" name="verticalLayout_6">
+         <property name="spacing">
+          <number>4</number>
+         </property>
+         <property name="leftMargin">
+          <number>12</number>
+         </property>
+         <property name="topMargin">
+          <number>4</number>
+         </property>
+         <property name="rightMargin">
+          <number>12</number>
+         </property>
+         <property name="bottomMargin">
+          <number>4</number>
+         </property>
+         <item>
+          <widget class="QLabel" name="label_3">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="font">
+            <font>
+             <pointsize>14</pointsize>
+            </font>
+           </property>
+           <property name="text">
+            <string><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Please note: </span><span style=" font-style:italic;">Make sure your correct oximeter type is selected otherwise import will fail.</span></p></body></html></string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignHCenter|Qt::AlignTop</set>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_10">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Fixed</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>0</width>
+             <height>10</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="label">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="font">
+            <font>
+             <pointsize>18</pointsize>
+            </font>
+           </property>
+           <property name="frameShape">
+            <enum>QFrame::NoFrame</enum>
+           </property>
+           <property name="text">
+            <string>Where would you like to import from?</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_6">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Fixed</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>10</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_4">
+           <property name="topMargin">
+            <number>0</number>
+           </property>
+           <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>
+           <item>
+            <widget class="QLabel" name="label_13">
+             <property name="text">
+              <string>Select Oximeter Type:</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QComboBox" name="oximeterType">
+             <property name="sizeAdjustPolicy">
+              <enum>QComboBox::AdjustToContents</enum>
+             </property>
+             <item>
+              <property name="text">
+               <string>CMS50Fv3.7+/H/I, Pulox PO-400/500</string>
+              </property>
+             </item>
+             <item>
+              <property name="text">
+               <string>CMS50D+/E/F, Pulox PO-200/300</string>
+              </property>
+             </item>
+             <item>
+              <property name="text">
+               <string>ChoiceMMed MD300W1</string>
+              </property>
+             </item>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_5">
+             <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>
+          <widget class="QLabel" name="oldCMS50specific">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <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>CMS50E/F users, when importing directly, please don't select upload on your device until SleepyHead prompts you to.</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="newCMS50settingsPanel">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="mouseTracking">
+            <bool>true</bool>
+           </property>
+           <property name="title">
+            <string/>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_6">
+            <property name="leftMargin">
+             <number>4</number>
+            </property>
+            <property name="topMargin">
+             <number>4</number>
+            </property>
+            <property name="rightMargin">
+             <number>4</number>
+            </property>
+            <property name="bottomMargin">
+             <number>4</number>
+            </property>
+            <item>
+             <widget class="QCheckBox" name="cms50SyncTime">
+              <property name="toolTip">
+               <string><html><head/><body><p>If enabled, SleepyHead will automatically reset your CMS50's internal clock using your computers current time.</p></body></html></string>
+              </property>
+              <property name="text">
+               <string>Set device date/time</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="cms50CheckName">
+              <property name="toolTip">
+               <string><html><head/><body><p>Check to enable updating the device identifier next import, which is useful for those who have multiple oximeters lying around.</p></body></html></string>
+              </property>
+              <property name="text">
+               <string>Set device identifier</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLineEdit" name="cms50DeviceName">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="maximumSize">
+               <size>
+                <width>100</width>
+                <height>16777215</height>
+               </size>
+              </property>
+              <property name="toolTip">
+               <string><html><head/><body><p>Here you can enter a 7 character pet name for this oximeter.</p></body></html></string>
+              </property>
+              <property name="inputMask">
+               <string notr="true">nnnnnnn</string>
+              </property>
+              <property name="text">
+               <string notr="true"/>
+              </property>
+              <property name="frame">
+               <bool>true</bool>
+              </property>
+              <property name="cursorPosition">
+               <number>0</number>
+              </property>
+              <property name="placeholderText">
+               <string notr="true"/>
+              </property>
+              <property name="cursorMoveStyle">
+               <enum>Qt::LogicalMoveStyle</enum>
+              </property>
+              <property name="clearButtonEnabled">
+               <bool>false</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_11">
+              <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="QCheckBox" name="cms50EraseAfterwards">
+              <property name="toolTip">
+               <string><html><head/><body><p>This option will erase the imported session from your oximeter after import has completed. </p><p>Use with caution,  becauseif something goes wrong before SleepyHead saves your session, you won't get it back.</p></body></html></string>
+              </property>
+              <property name="text">
+               <string>Erase session after successful upload</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_8">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Fixed</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>10</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="directImportButton">
+           <property name="toolTip">
+            <string><html><head/><body><p>This option allows you to import (via cable) from your oximeters internal recordings.</p><p>After selecting on this option, some oximeters will require you to do something in the devices menu to initiate the upload.</p></body></html></string>
+           </property>
+           <property name="styleSheet">
+            <string notr="true"/>
+           </property>
+           <property name="text">
+            <string>Import directly from a recording on a device</string>
+           </property>
+           <property name="icon">
+            <iconset resource="Resources.qrc">
+             <normaloff>:/icons/oximeter.png</normaloff>:/icons/oximeter.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>64</width>
+             <height>64</height>
+            </size>
+           </property>
+           <property name="autoDefault">
+            <bool>false</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_2">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Fixed</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>10</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="liveImportButton">
+           <property name="toolTip">
+            <string><html><head/><body><p>If you don't mind a being attached to a running computer overnight, this option provide a useful plethysomogram graph, which gives an indication of heart rhythm, on top of the normal oximetry readings.</p></body></html></string>
+           </property>
+           <property name="styleSheet">
+            <string notr="true"/>
+           </property>
+           <property name="text">
+            <string>Record attached to computer overnight (provides plethysomogram)</string>
+           </property>
+           <property name="icon">
+            <iconset resource="Resources.qrc">
+             <normaloff>:/icons/cms50f.png</normaloff>:/icons/cms50f.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>64</width>
+             <height>64</height>
+            </size>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_5">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Fixed</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>10</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="fileImportButton">
+           <property name="toolTip">
+            <string><html><head/><body><p>This option allows you to import from data files created by software that came with your Pulse Oximeter, such as SpO2Review.</p></body></html></string>
+           </property>
+           <property name="styleSheet">
+            <string notr="true"/>
+           </property>
+           <property name="text">
+            <string>Import from a datafile saved by another program, like SpO2Review</string>
+           </property>
+           <property name="icon">
+            <iconset resource="Resources.qrc">
+             <normaloff>:/icons/save.png</normaloff>:/icons/save.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>64</width>
+             <height>64</height>
+            </size>
+           </property>
+           <property name="autoDefault">
+            <bool>false</bool>
+           </property>
+           <property name="flat">
+            <bool>false</bool>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="verticalSpacer_9">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Expanding</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QLabel" name="label_6">
+           <property name="font">
+            <font>
+             <pointsize>14</pointsize>
+            </font>
+           </property>
+           <property name="text">
+            <string><html><head/><body><p><span style=" font-weight:600; font-style:italic;">Reminder for CPAP users: </span><span style=" color:#fb0000;">Did you remember to import your CPAP sessions first?<br/></span>If you forget, you won't have a valid time to sync this oximetry session to.<br/>To a ensure good sync between devices, always try to start both at the same time.</p></body></htm [...]
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignHCenter|Qt::AlignTop</set>
+           </property>
+           <property name="wordWrap">
+            <bool>true</bool>
+           </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>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="directImportPage">
+        <layout class="QVBoxLayout" name="verticalLayout_2">
+         <item>
+          <widget class="QLabel" name="connectLabel">
+           <property name="font">
+            <font>
+             <pointsize>21</pointsize>
+            </font>
+           </property>
+           <property name="text">
+            <string>Please connect your oximeter device</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QPlainTextEdit" name="logBox"/>
+         </item>
+         <item>
+          <widget class="QLabel" name="directImportStatus">
+           <property name="font">
+            <font>
+             <pointsize>15</pointsize>
+            </font>
+           </property>
+           <property name="text">
+            <string>If you can read this, you likely have your oximeter type set wrong in preferences.</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QProgressBar" name="progressBar">
+           <property name="maximum">
+            <number>0</number>
+           </property>
+           <property name="value">
+            <number>0</number>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="liveImportPage">
+        <layout class="QVBoxLayout" name="verticalLayout_7">
+         <item>
+          <widget class="QLabel" name="liveConnectLabel">
+           <property name="font">
+            <font>
+             <pointsize>21</pointsize>
+            </font>
+           </property>
+           <property name="text">
+            <string>Please connect your oximeter device</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QFrame" name="liveViewFrame">
+           <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>
+          <widget class="QLabel" name="liveStatusLabel">
+           <property name="text">
+            <string>Press Start to commence recording</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QFrame" name="frame_3">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="frameShape">
+            <enum>QFrame::StyledPanel</enum>
+           </property>
+           <property name="frameShadow">
+            <enum>QFrame::Raised</enum>
+           </property>
+           <layout class="QHBoxLayout" name="horizontalLayout_5">
+            <property name="spacing">
+             <number>6</number>
+            </property>
+            <property name="leftMargin">
+             <number>6</number>
+            </property>
+            <property name="topMargin">
+             <number>6</number>
+            </property>
+            <property name="rightMargin">
+             <number>6</number>
+            </property>
+            <property name="bottomMargin">
+             <number>6</number>
+            </property>
+            <item>
+             <widget class="QCheckBox" name="showLiveGraphs">
+              <property name="font">
+               <font>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Show Live Graphs</string>
+              </property>
+              <property name="checked">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_7">
+              <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>
+             <layout class="QVBoxLayout" name="verticalLayout_8">
+              <item>
+               <widget class="QLabel" name="label_4">
+                <property name="font">
+                 <font>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Duration</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignHCenter|Qt::AlignTop</set>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLCDNumber" name="lcdDuration">
+                <property name="minimumSize">
+                 <size>
+                  <width>200</width>
+                  <height>50</height>
+                 </size>
+                </property>
+                <property name="frameShape">
+                 <enum>QFrame::StyledPanel</enum>
+                </property>
+                <property name="digitCount">
+                 <number>8</number>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <layout class="QVBoxLayout" name="verticalLayout_9">
+              <item>
+               <widget class="QLabel" name="label_7">
+                <property name="font">
+                 <font>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>SpO2 %</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignHCenter|Qt::AlignTop</set>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLCDNumber" name="spo2Display">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="minimumSize">
+                 <size>
+                  <width>60</width>
+                  <height>50</height>
+                 </size>
+                </property>
+                <property name="palette">
+                 <palette>
+                  <active>
+                   <colorrole role="WindowText">
+                    <brush brushstyle="SolidPattern">
+                     <color alpha="255">
+                      <red>0</red>
+                      <green>106</green>
+                      <blue>255</blue>
+                     </color>
+                    </brush>
+                   </colorrole>
+                  </active>
+                  <inactive>
+                   <colorrole role="WindowText">
+                    <brush brushstyle="SolidPattern">
+                     <color alpha="255">
+                      <red>0</red>
+                      <green>106</green>
+                      <blue>255</blue>
+                     </color>
+                    </brush>
+                   </colorrole>
+                  </inactive>
+                  <disabled>
+                   <colorrole role="WindowText">
+                    <brush brushstyle="SolidPattern">
+                     <color alpha="255">
+                      <red>127</red>
+                      <green>127</green>
+                      <blue>127</blue>
+                     </color>
+                    </brush>
+                   </colorrole>
+                  </disabled>
+                 </palette>
+                </property>
+                <property name="layoutDirection">
+                 <enum>Qt::LeftToRight</enum>
+                </property>
+                <property name="frameShape">
+                 <enum>QFrame::StyledPanel</enum>
+                </property>
+                <property name="digitCount">
+                 <number>2</number>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item>
+             <layout class="QVBoxLayout" name="verticalLayout_14">
+              <item>
+               <widget class="QLabel" name="label_8">
+                <property name="font">
+                 <font>
+                  <weight>75</weight>
+                  <bold>true</bold>
+                 </font>
+                </property>
+                <property name="text">
+                 <string>Pulse Rate</string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignHCenter|Qt::AlignTop</set>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLCDNumber" name="pulseDisplay">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="minimumSize">
+                 <size>
+                  <width>80</width>
+                  <height>50</height>
+                 </size>
+                </property>
+                <property name="palette">
+                 <palette>
+                  <active>
+                   <colorrole role="WindowText">
+                    <brush brushstyle="SolidPattern">
+                     <color alpha="255">
+                      <red>255</red>
+                      <green>0</green>
+                      <blue>0</blue>
+                     </color>
+                    </brush>
+                   </colorrole>
+                  </active>
+                  <inactive>
+                   <colorrole role="WindowText">
+                    <brush brushstyle="SolidPattern">
+                     <color alpha="255">
+                      <red>255</red>
+                      <green>0</green>
+                      <blue>0</blue>
+                     </color>
+                    </brush>
+                   </colorrole>
+                  </inactive>
+                  <disabled>
+                   <colorrole role="WindowText">
+                    <brush brushstyle="SolidPattern">
+                     <color alpha="255">
+                      <red>159</red>
+                      <green>0</green>
+                      <blue>85</blue>
+                     </color>
+                    </brush>
+                   </colorrole>
+                  </disabled>
+                 </palette>
+                </property>
+                <property name="frameShape">
+                 <enum>QFrame::StyledPanel</enum>
+                </property>
+                <property name="smallDecimalPoint">
+                 <bool>false</bool>
+                </property>
+                <property name="digitCount">
+                 <number>3</number>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="chooseSessionPage">
+        <layout class="QVBoxLayout" name="verticalLayout_3">
+         <item>
+          <widget class="QLabel" name="liveConnectLabel_2">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="font">
+            <font>
+             <pointsize>21</pointsize>
+            </font>
+           </property>
+           <property name="text">
+            <string>Multiple Sessions Detected</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="label_12">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Please choose which one you want to import into SleepyHead</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QTableWidget" name="tableOxiSessions">
+           <property name="alternatingRowColors">
+            <bool>true</bool>
+           </property>
+           <property name="selectionMode">
+            <enum>QAbstractItemView::SingleSelection</enum>
+           </property>
+           <property name="selectionBehavior">
+            <enum>QAbstractItemView::SelectRows</enum>
+           </property>
+           <attribute name="horizontalHeaderStretchLastSection">
+            <bool>true</bool>
+           </attribute>
+           <column>
+            <property name="text">
+             <string>Start Time</string>
+            </property>
+           </column>
+           <column>
+            <property name="text">
+             <string>Duration</string>
+            </property>
+           </column>
+           <column>
+            <property name="text">
+             <string>Details</string>
+            </property>
+           </column>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+       <widget class="QWidget" name="syncPage">
+        <layout class="QVBoxLayout" name="verticalLayout_10">
+         <item>
+          <widget class="QLabel" name="cpapSyncLabel">
+           <property name="font">
+            <font>
+             <pointsize>21</pointsize>
+            </font>
+           </property>
+           <property name="text">
+            <string>Import Completed. When did the recording start?</string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignCenter</set>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_10">
+           <item>
+            <widget class="QGroupBox" name="groupBox_2">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="minimumSize">
+              <size>
+               <width>0</width>
+               <height>200</height>
+              </size>
+             </property>
+             <property name="title">
+              <string>Day recording (normally would of) started</string>
+             </property>
+             <layout class="QVBoxLayout" name="verticalLayout_12">
+              <property name="spacing">
+               <number>-1</number>
+              </property>
+              <property name="leftMargin">
+               <number>0</number>
+              </property>
+              <property name="topMargin">
+               <number>2</number>
+              </property>
+              <property name="rightMargin">
+               <number>0</number>
+              </property>
+              <property name="bottomMargin">
+               <number>0</number>
+              </property>
+              <item>
+               <widget class="QCalendarWidget" name="calendarWidget">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Minimum" vsizetype="MinimumExpanding">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+           </item>
+           <item>
+            <widget class="QGroupBox" name="groupBox_3">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+               <horstretch>1</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="minimumSize">
+              <size>
+               <width>0</width>
+               <height>200</height>
+              </size>
+             </property>
+             <property name="title">
+              <string>Oximeter Starting time</string>
+             </property>
+             <layout class="QGridLayout" name="gridLayout">
+              <item row="2" column="1">
+               <widget class="QLabel" name="labelSyncOximeter">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>I want to use the time reported by my oximeter's built in clock.</string>
+                </property>
+                <property name="wordWrap">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="1">
+               <widget class="QLabel" name="labelSyncCPAP">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>I started this oximeter recording at (or near) the same time as a session on my CPAP machine.</string>
+                </property>
+                <property name="wordWrap">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="1" column="0">
+               <widget class="QRadioButton" name="radioSyncCPAP">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string/>
+                </property>
+               </widget>
+              </item>
+              <item row="0" column="0" colspan="2">
+               <widget class="QLabel" name="label_9">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string><html><head/><body><p>SleepyHead needs a starting time to know where to save this oximetry session to.</p><p>Choose one of the following options:</p></body></html></string>
+                </property>
+                <property name="alignment">
+                 <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+                </property>
+                <property name="wordWrap">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+              <item row="2" column="0">
+               <widget class="QRadioButton" name="radioSyncOximeter">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string/>
+                </property>
+               </widget>
+              </item>
+              <item row="3" column="0" colspan="2">
+               <widget class="QLabel" name="label_11">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string><html><head/><body><p>Note: Syncing to CPAP session starting time will always be more accurate.</p></body></html></string>
+                </property>
+                <property name="wordWrap">
+                 <bool>true</bool>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </widget>
+           </item>
+          </layout>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="syncCPAPGroup">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="title">
+            <string>Choose CPAP session to sync to:</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_11">
+            <property name="leftMargin">
+             <number>6</number>
+            </property>
+            <property name="topMargin">
+             <number>6</number>
+            </property>
+            <property name="rightMargin">
+             <number>6</number>
+            </property>
+            <property name="bottomMargin">
+             <number>6</number>
+            </property>
+            <item>
+             <widget class="QLabel" name="sessbarLabel">
+              <property name="text">
+               <string/>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <layout class="QHBoxLayout" name="horizontalLayout_11">
+              <property name="spacing">
+               <number>0</number>
+              </property>
+              <item>
+               <widget class="QToolButton" name="sessionBackButton">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>...</string>
+                </property>
+                <property name="icon">
+                 <iconset resource="Resources.qrc">
+                  <normaloff>:/icons/back.png</normaloff>:/icons/back.png</iconset>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QFrame" name="sessBarFrame">
+                <property name="minimumSize">
+                 <size>
+                  <width>0</width>
+                  <height>40</height>
+                 </size>
+                </property>
+                <property name="maximumSize">
+                 <size>
+                  <width>16777215</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="QToolButton" name="sessionForwardButton">
+                <property name="sizePolicy">
+                 <sizepolicy hsizetype="Fixed" vsizetype="Expanding">
+                  <horstretch>0</horstretch>
+                  <verstretch>0</verstretch>
+                 </sizepolicy>
+                </property>
+                <property name="text">
+                 <string>...</string>
+                </property>
+                <property name="icon">
+                 <iconset resource="Resources.qrc">
+                  <normaloff>:/icons/forward.png</normaloff>:/icons/forward.png</iconset>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_9">
+           <item>
+            <spacer name="horizontalSpacer_3">
+             <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_10">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="font">
+              <font>
+               <pointsize>14</pointsize>
+              </font>
+             </property>
+             <property name="text">
+              <string>You can manually adjust the time here if required:</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <widget class="QDateTimeEdit" name="dateTimeEdit">
+             <property name="sizePolicy">
+              <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+               <horstretch>0</horstretch>
+               <verstretch>0</verstretch>
+              </sizepolicy>
+             </property>
+             <property name="font">
+              <font>
+               <pointsize>40</pointsize>
+              </font>
+             </property>
+             <property name="buttonSymbols">
+              <enum>QAbstractSpinBox::UpDownArrows</enum>
+             </property>
+             <property name="displayFormat">
+              <string>HH:mm:ssap</string>
+             </property>
+            </widget>
+           </item>
+           <item>
+            <spacer name="horizontalSpacer_4">
+             <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>
+          <spacer name="verticalSpacer_3">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+           <property name="sizeType">
+            <enum>QSizePolicy::Expanding</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>20</width>
+             <height>40</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+        </layout>
+       </widget>
+      </widget>
+     </item>
+    </layout>
+   </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="QHBoxLayout" name="buttonLayout">
+      <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="QPushButton" name="informationButton">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>160</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>&Information Page</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="cancelButton">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>160</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>&Cancel</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="retryButton">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>160</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>&Retry</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="chooseSessionButton">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>160</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>&Choose Session</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="stopButton">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>160</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>&End Recording</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="syncButton">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>160</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>&Sync and Save</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="saveButton">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>160</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>&Save and Finish</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="nextButton">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="minimumSize">
+         <size>
+          <width>160</width>
+          <height>0</height>
+         </size>
+        </property>
+        <property name="text">
+         <string>&Start</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/sleepyhead/oximetry.ui b/sleepyhead/oximetry.ui
new file mode 100644
index 0000000..652ef5f
--- /dev/null
+++ b/sleepyhead/oximetry.ui
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Oximetry</class>
+ <widget class="QWidget" name="Oximetry">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>791</width>
+    <height>373</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="leftMargin">
+    <number>0</number>
+   </property>
+   <property name="topMargin">
+    <number>0</number>
+   </property>
+   <property name="rightMargin">
+    <number>0</number>
+   </property>
+   <property name="bottomMargin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QWidget" name="graphArea" native="true">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QFrame" name="frame">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Raised</enum>
+     </property>
+     <layout class="QVBoxLayout" name="verticalLayout_2">
+      <property name="spacing">
+       <number>0</number>
+      </property>
+      <property name="leftMargin">
+       <number>2</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>2</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout">
+        <property name="spacing">
+         <number>4</number>
+        </property>
+        <property name="leftMargin">
+         <number>0</number>
+        </property>
+        <item>
+         <widget class="QLabel" name="label_4">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Date</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QDateTimeEdit" name="dateEdit">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="displayFormat">
+           <string>d/MM/yy h:mm:ss AP</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QToolButton" name="resetTimeButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">QToolButton {
+ background: transparent;
+ border-radius: 8px;
+ border: 2px solid transparent;
+}
+
+QToolButton:hover {
+ border: 2px solid #456789;
+}
+
+QToolButton:pressed {
+ border: 2px solid #456789;
+ background-color: #89abcd;
+}</string>
+          </property>
+          <property name="text">
+           <string>R&eset</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <spacer name="horizontalSpacer_3">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeType">
+           <enum>QSizePolicy::Fixed</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>10</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QLabel" name="label_3">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>SpO2</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLCDNumber" name="spo2LCD">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="palette">
+           <palette>
+            <active>
+             <colorrole role="WindowText">
+              <brush brushstyle="SolidPattern">
+               <color alpha="255">
+                <red>85</red>
+                <green>0</green>
+                <blue>255</blue>
+               </color>
+              </brush>
+             </colorrole>
+            </active>
+            <inactive>
+             <colorrole role="WindowText">
+              <brush brushstyle="SolidPattern">
+               <color alpha="255">
+                <red>85</red>
+                <green>0</green>
+                <blue>255</blue>
+               </color>
+              </brush>
+             </colorrole>
+            </inactive>
+            <disabled>
+             <colorrole role="WindowText">
+              <brush brushstyle="SolidPattern">
+               <color alpha="255">
+                <red>118</red>
+                <green>118</green>
+                <blue>117</blue>
+               </color>
+              </brush>
+             </colorrole>
+            </disabled>
+           </palette>
+          </property>
+          <property name="frameShadow">
+           <enum>QFrame::Sunken</enum>
+          </property>
+          <property name="digitCount">
+           <number>3</number>
+          </property>
+          <property name="segmentStyle">
+           <enum>QLCDNumber::Flat</enum>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <spacer name="horizontalSpacer_4">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeType">
+           <enum>QSizePolicy::Fixed</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>5</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QLabel" name="label_2">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Pulse</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLCDNumber" name="pulseLCD">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="palette">
+           <palette>
+            <active>
+             <colorrole role="WindowText">
+              <brush brushstyle="SolidPattern">
+               <color alpha="255">
+                <red>255</red>
+                <green>0</green>
+                <blue>0</blue>
+               </color>
+              </brush>
+             </colorrole>
+            </active>
+            <inactive>
+             <colorrole role="WindowText">
+              <brush brushstyle="SolidPattern">
+               <color alpha="255">
+                <red>255</red>
+                <green>0</green>
+                <blue>0</blue>
+               </color>
+              </brush>
+             </colorrole>
+            </inactive>
+            <disabled>
+             <colorrole role="WindowText">
+              <brush brushstyle="SolidPattern">
+               <color alpha="255">
+                <red>118</red>
+                <green>118</green>
+                <blue>117</blue>
+               </color>
+              </brush>
+             </colorrole>
+            </disabled>
+           </palette>
+          </property>
+          <property name="frameShape">
+           <enum>QFrame::Box</enum>
+          </property>
+          <property name="frameShadow">
+           <enum>QFrame::Sunken</enum>
+          </property>
+          <property name="digitCount">
+           <number>3</number>
+          </property>
+          <property name="segmentStyle">
+           <enum>QLCDNumber::Flat</enum>
+          </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="QToolButton" name="saveButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">QToolButton {
+ background: transparent;
+ border-radius: 8px;
+ border: 2px solid transparent;
+}
+
+QToolButton:hover {
+ border: 2px solid #456789;
+}
+
+QToolButton:pressed {
+ border: 2px solid #456789;
+ background-color: #89abcd;
+}</string>
+          </property>
+          <property name="text">
+           <string>...</string>
+          </property>
+          <property name="icon">
+           <iconset resource="Resources.qrc">
+            <normaloff>:/icons/save.png</normaloff>:/icons/save.png</iconset>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="openButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="styleSheet">
+           <string notr="true"/>
+          </property>
+          <property name="text">
+           <string>&Open .spo/R File</string>
+          </property>
+          <property name="checkable">
+           <bool>false</bool>
+          </property>
+          <property name="flat">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="ImportButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Serial &Import</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="RunButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>&Start Live</string>
+          </property>
+          <property name="checkable">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </item>
+      <item>
+       <layout class="QHBoxLayout" name="horizontalLayout_2">
+        <property name="sizeConstraint">
+         <enum>QLayout::SetMinimumSize</enum>
+        </property>
+        <item>
+         <widget class="QLabel" name="label">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>Serial Port</string>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QComboBox" name="SerialPortsCombo">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>120</width>
+            <height>0</height>
+           </size>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QToolButton" name="RefreshPortsButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="text">
+           <string>&Rescan Ports</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>
+       </layout>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/sleepyhead/preferencesdialog.cpp b/sleepyhead/preferencesdialog.cpp
new file mode 100644
index 0000000..2d4c432
--- /dev/null
+++ b/sleepyhead/preferencesdialog.cpp
@@ -0,0 +1,1137 @@
+/* SleepyHead Preferences Dialog Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QLabel>
+#include <QColorDialog>
+#include <QMessageBox>
+#include <QStatusBar>
+#include <QProcess>
+#include <QDesktopServices>
+#include <QFileDialog>
+#include <QTextStream>
+#include <QCalendarWidget>
+#include <QMenuBar>
+
+#include "preferencesdialog.h"
+#include "common_gui.h"
+
+#include <Graphs/gGraphView.h>
+#include <mainwindow.h>
+#include "ui_preferencesdialog.h"
+#include "SleepLib/machine_common.h"
+
+extern QFont *defaultfont;
+extern QFont *mediumfont;
+extern QFont *bigfont;
+extern MainWindow *mainwin;
+
+typedef QMessageBox::StandardButton StandardButton;
+typedef QMessageBox::StandardButtons StandardButtons;
+
+QHash<schema::ChanType, QString> channeltype;
+
+PreferencesDialog::PreferencesDialog(QWidget *parent, Profile *_profile) :
+    QDialog(parent),
+    ui(new Ui::PreferencesDialog),
+    profile(_profile)
+{
+    ui->setupUi(this);
+
+    channeltype.clear();
+    channeltype[schema::FLAG] = tr("Flag");
+    channeltype[schema::MINOR_FLAG] = tr("Minor Flag");
+    channeltype[schema::SPAN] = tr("Span");
+    channeltype[schema::UNKNOWN] = tr("Always Minor");
+
+//#ifdef LOCK_RESMED_SESSIONS
+//    QList<Machine *> machines = p_profile->GetMachines(MT_CPAP);
+//    for (QList<Machine *>::iterator it = machines.begin(); it != machines.end(); ++it) {
+//        const QString & mclass=(*it)->loaderName();
+//        if (mclass == STR_MACH_ResMed) {
+//            ui->combineSlider->setEnabled(false);
+//            ui->IgnoreSlider->setEnabled(false);
+//            ui->timeEdit->setEnabled(false);
+//            break;
+//        }
+//    }
+//#endif
+
+    QLocale locale = QLocale::system();
+    QString shortformat = locale.dateFormat(QLocale::ShortFormat);
+
+    if (!shortformat.toLower().contains("yyyy")) {
+        shortformat.replace("yy", "yyyy");
+    }
+
+//    Qt::DayOfWeek dow = firstDayOfWeekFromLocale();
+
+//    QTextCharFormat format = ui->startedUsingMask->calendarWidget()->weekdayTextFormat(Qt::Saturday);
+//    format.setForeground(QBrush(Qt::black, Qt::SolidPattern));
+
+    Q_ASSERT(profile != nullptr);
+    ui->tabWidget->setCurrentIndex(0);
+
+    //i=ui->timeZoneCombo->findText((*profile)["TimeZone"].toString());
+    //ui->timeZoneCombo->setCurrentIndex(i);
+
+    ui->showLeakRedline->setChecked(profile->cpap->showLeakRedline());
+    ui->leakRedlineSpinbox->setValue(profile->cpap->leakRedline());
+
+    ui->oxiDesaturationThreshold->setValue(schema::channel[OXI_SPO2].lowerThreshold());
+    ui->flagPulseAbove->setValue(schema::channel[OXI_Pulse].upperThreshold());
+    ui->flagPulseBelow->setValue(schema::channel[OXI_Pulse].lowerThreshold());
+
+    ui->spo2Drop->setValue(profile->oxi->spO2DropPercentage());
+    ui->spo2DropTime->setValue(profile->oxi->spO2DropDuration());
+    ui->pulseChange->setValue(profile->oxi->pulseChangeBPM());
+    ui->pulseChangeTime->setValue(profile->oxi->pulseChangeDuration());
+    ui->oxiDiscardThreshold->setValue(profile->oxi->oxiDiscardThreshold());
+
+    ui->eventIndexCombo->setCurrentIndex(profile->general->calculateRDI() ? 1 : 0);
+    ui->automaticImport->setChecked(profile->cpap->autoImport());
+
+    ui->timeEdit->setTime(profile->session->daySplitTime());
+    int val = profile->session->combineCloseSessions();
+    ui->combineSlider->setValue(val);
+
+    if (val > 0) {
+        ui->combineLCD->display(val);
+    } else { ui->combineLCD->display(STR_GEN_Off); }
+
+    val = profile->session->ignoreShortSessions();
+    ui->IgnoreSlider->setValue(val);
+
+    if (val > 0) {
+        ui->IgnoreLCD->display(val);
+    } else { ui->IgnoreLCD->display(STR_GEN_Off); }
+
+    ui->LockSummarySessionSplitting->setChecked(profile->session->lockSummarySessions());
+
+    ui->applicationFont->setCurrentFont(QApplication::font());
+    //ui->applicationFont->setFont(QApplication::font());
+    ui->applicationFontSize->setValue(QApplication::font().pointSize());
+    ui->applicationFontBold->setChecked(QApplication::font().weight() == QFont::Bold);
+    ui->applicationFontItalic->setChecked(QApplication::font().italic());
+
+    ui->graphFont->setCurrentFont(*defaultfont);
+    //ui->graphFont->setFont(*defaultfont);
+    ui->graphFontSize->setValue(defaultfont->pointSize());
+    ui->graphFontBold->setChecked(defaultfont->weight() == QFont::Bold);
+    ui->graphFontItalic->setChecked(defaultfont->italic());
+
+    ui->titleFont->setCurrentFont(*mediumfont);
+    //ui->titleFont->setFont(*mediumfont);
+    ui->titleFontSize->setValue(mediumfont->pointSize());
+    ui->titleFontBold->setChecked(mediumfont->weight() == QFont::Bold);
+    ui->titleFontItalic->setChecked(mediumfont->italic());
+
+    ui->bigFont->setCurrentFont(*bigfont);
+    //ui->bigFont->setFont(*bigfont);
+    ui->bigFontSize->setValue(bigfont->pointSize());
+    ui->bigFontBold->setChecked(bigfont->weight() == QFont::Bold);
+    ui->bigFontItalic->setChecked(bigfont->italic());
+
+    ui->lineThicknessSlider->setValue(profile->appearance->lineThickness()*2);
+
+    ui->resyncMachineDetectedEvents->setChecked(profile->cpap->resyncFromUserFlagging());
+
+    ui->useAntiAliasing->setChecked(profile->appearance->antiAliasing());
+    ui->usePixmapCaching->setChecked(profile->appearance->usePixmapCaching());
+    ui->useSquareWavePlots->setChecked(profile->appearance->squareWavePlots());
+    ui->enableGraphSnapshots->setChecked(profile->appearance->graphSnapshots());
+    ui->graphTooltips->setChecked(profile->appearance->graphTooltips());
+    ui->allowYAxisScaling->setChecked(profile->appearance->allowYAxisScaling());
+
+    ui->skipLoginScreen->setChecked(PREF[STR_GEN_SkipLogin].toBool());
+    ui->allowEarlyUpdates->setChecked(PREF[STR_PREF_AllowEarlyUpdates].toBool());
+
+    int s = profile->cpap->clockDrift();
+    int m = (s / 60) % 60;
+    int h = (s / 3600);
+    s %= 60;
+    ui->clockDriftHours->setValue(h);
+    ui->clockDriftMinutes->setValue(m);
+    ui->clockDriftSeconds->setValue(s);
+
+    ui->skipEmptyDays->setChecked(profile->general->skipEmptyDays());
+    ui->showUnknownFlags->setChecked(profile->general->showUnknownFlags());
+    ui->enableMultithreading->setChecked(profile->session->multithreading());
+    ui->cacheSessionData->setChecked(profile->session->cacheSessions());
+    ui->preloadSummaries->setChecked(profile->session->preloadSummaries());
+    ui->animationsAndTransitionsCheckbox->setChecked(profile->appearance->animations());
+    ui->complianceCheckBox->setChecked(profile->cpap->showComplianceInfo());
+    ui->complianceHours->setValue(profile->cpap->complianceHours());
+
+    ui->prefCalcMiddle->setCurrentIndex(profile->general->prefCalcMiddle());
+    ui->prefCalcMax->setCurrentIndex(profile->general->prefCalcMax());
+    float f = profile->general->prefCalcPercentile();
+    ui->prefCalcPercentile->setValue(f);
+
+    ui->tooltipTimeoutSlider->setValue(profile->general->tooltipTimeout() / 50);
+    ui->tooltipMS->display(profile->general->tooltipTimeout());
+
+    ui->scrollDampeningSlider->setValue(profile->general->scrollDampening() / 10);
+
+    if (profile->general->scrollDampening() > 0) {
+        ui->scrollDampDisplay->display(profile->general->scrollDampening());
+    } else { ui->scrollDampDisplay->display(STR_TR_Off); }
+
+    bool bcd = profile->session->backupCardData();
+    ui->createSDBackups->setChecked(bcd);
+    ui->compressSDBackups->setEnabled(bcd);
+    ui->compressSDBackups->setChecked(profile->session->compressBackupData());
+    ui->compressSessionData->setChecked(profile->session->compressSessionData());
+    ui->ignoreOlderSessionsCheck->setChecked(profile->session->ignoreOlderSessions());
+    ui->ignoreOlderSessionsDate->setDate(profile->session->ignoreOlderSessionsDate().date());
+
+    ui->graphHeight->setValue(profile->appearance->graphHeight());
+
+    ui->automaticallyCheckUpdates->setChecked(PREF[STR_GEN_UpdatesAutoCheck].toBool());
+
+    ui->updateCheckEvery->setValue(PREF[STR_GEN_UpdateCheckFrequency].toInt());
+
+    if (PREF.contains(STR_GEN_UpdatesLastChecked)) {
+        RefreshLastChecked();
+    } else { ui->updateLastChecked->setText("Never"); }
+
+
+    ui->overlayFlagsCombo->setCurrentIndex(profile->appearance->overlayType());
+    ui->overviewLinecharts->setCurrentIndex(profile->appearance->overviewLinechartMode());
+
+    ui->ahiGraphWindowSize->setEnabled(false);
+    ui->ahiGraphWindowSize->setValue(profile->cpap->AHIWindow());
+    ui->ahiGraphZeroReset->setChecked(profile->cpap->AHIReset());
+
+    ui->customEventGroupbox->setChecked(profile->cpap->userEventFlagging());
+    ui->apneaDuration->setValue(profile->cpap->userEventDuration());
+    ui->apneaFlowRestriction->setValue(profile->cpap->userFlowRestriction());
+    ui->apneaDuration2->setValue(profile->cpap->userEventDuration2());
+    ui->apneaFlowRestriction2->setValue(profile->cpap->userFlowRestriction2());
+    ui->userEventDuplicates->setChecked(profile->cpap->userEventDuplicates());
+    ui->userEventDuplicates->setVisible(false);
+
+    ui->showUserFlagsInPie->setChecked(profile->cpap->userEventPieChart());
+
+    /*    QLocale locale=QLocale::system();
+        QString shortformat=locale.dateFormat(QLocale::ShortFormat);
+        if (!shortformat.toLower().contains("yyyy")) {
+            shortformat.replace("yy","yyyy");
+        }*/
+
+    chanFilterModel = new MySortFilterProxyModel(this);
+    chanModel = new QStandardItemModel(this);
+    chanFilterModel->setSourceModel(chanModel);
+    chanFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
+    chanFilterModel->setFilterKeyColumn(0);
+    ui->chanView->setModel(chanFilterModel);
+
+    InitChanInfo();
+
+    waveFilterModel = new MySortFilterProxyModel(this);
+    waveModel = new QStandardItemModel(this);
+    waveFilterModel->setSourceModel(waveModel);
+    waveFilterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
+    waveFilterModel->setFilterKeyColumn(0);
+    ui->waveView->setModel(waveFilterModel);
+    InitWaveInfo();
+
+    ui->waveView->setSortingEnabled(true);
+    ui->chanView->setSortingEnabled(true);
+
+    ui->waveView->sortByColumn(0, Qt::AscendingOrder);
+    ui->chanView->sortByColumn(0, Qt::AscendingOrder);
+
+}
+
+#include <QItemDelegate>
+class SpinBoxDelegate : public QItemDelegate
+{
+
+public:
+    SpinBoxDelegate(QObject *parent = 0):QItemDelegate(parent) {}
+
+    virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+
+    virtual void setEditorData(QWidget *editor, const QModelIndex &index) const;
+    virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
+    virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+};
+
+QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
+{
+    QDoubleSpinBox *editor = new QDoubleSpinBox(parent);
+    //editor->setMinimum(0);
+    //editor->setMaximum(100.0);
+
+    return editor;
+}
+
+void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+    double value = index.model()->data(index, Qt::EditRole).toDouble();
+
+    QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
+    spinBox->setMinimum(-9999999.0);
+    spinBox->setMaximum(9999999.0);
+
+    spinBox->setValue(value);
+}
+
+void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
+{
+    QDoubleSpinBox *spinBox = static_cast<QDoubleSpinBox*>(editor);
+    spinBox->interpretText();
+    double value = spinBox->value();
+
+    model->setData(index, value, Qt::EditRole);
+}
+void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
+{
+    editor->setGeometry(option.rect);
+}
+
+
+#include <QItemDelegate>
+class ComboBoxDelegate : public QItemDelegate
+{
+
+public:
+    ComboBoxDelegate(QObject *parent = 0):QItemDelegate(parent) {}
+
+    virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+
+    virtual void setEditorData(QWidget *editor, const QModelIndex &index) const;
+    virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
+    virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
+};
+
+QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const
+{
+    QComboBox *combo = new QComboBox(parent);
+
+    QHash<schema::ChanType, QString>::iterator it;
+    for (it = channeltype.begin(); it != channeltype.end(); ++it) {
+        if (it.key() == schema::UNKNOWN) continue;
+        combo->addItem(it.value());
+    }
+    //editor->setMinimum(0);
+    //editor->setMaximum(100.0);
+
+    return combo;
+}
+
+void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
+{
+    QString value = index.model()->data(index, Qt::EditRole).toString();
+
+    QComboBox *combo = static_cast<QComboBox*>(editor);
+
+    combo->setCurrentText(value);
+}
+
+void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
+{
+    QComboBox *combo = static_cast<QComboBox*>(editor);
+
+    model->setData(index, combo->currentText(), Qt::EditRole);
+}
+void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
+{
+    editor->setGeometry(option.rect);
+}
+
+
+void PreferencesDialog::InitChanInfo()
+{
+    QHash<MachineType, int> toprows;
+
+    chanModel->clear();
+    toplevel.clear();
+    toprows.clear();
+    QStringList headers;
+    headers.append(tr("Name"));
+    headers.append(tr("Color"));
+    headers.append(tr("Overview"));
+    headers.append(tr("Flag Type"));
+    headers.append(tr("Label"));
+    headers.append(tr("Details"));
+    chanModel->setHorizontalHeaderLabels(headers);
+    ui->chanView->setColumnWidth(0, 200);
+    ui->chanView->setColumnWidth(1, 40);
+    ui->chanView->setColumnWidth(2, 60);
+    ui->chanView->setColumnWidth(3, 100);
+    ui->chanView->setColumnWidth(4, 100);
+    ui->chanView->setSelectionMode(QAbstractItemView::SingleSelection);
+    ui->chanView->setSelectionBehavior(QAbstractItemView::SelectItems);
+
+    chanModel->setColumnCount(6);
+
+    QStandardItem *hdr = nullptr;
+
+    QMap<MachineType, QString> Section;
+
+    Section[MT_CPAP] = tr("CPAP Events");
+    Section[MT_OXIMETER] = tr("Oximeter Events");
+    Section[MT_POSITION] = tr("Positional Events");
+    Section[MT_SLEEPSTAGE] = tr("Sleep Stage Events");
+    Section[MT_UNCATEGORIZED] = tr("Unknown Events");
+
+    QMap<MachineType, QString>::iterator it;
+
+    QHash<QString, schema::Channel *>::iterator ci;
+
+    for (it = Section.begin(); it != Section.end(); ++it) {
+        toplevel[it.key()] = hdr = new QStandardItem(it.value());
+        hdr->setEditable(false);
+        QList<QStandardItem *> list;
+        list.append(hdr);
+        for (int i=0; i<5; i++) {
+            QStandardItem *it = new QStandardItem();
+            it->setEnabled(false);
+            list.append(it);
+        }
+        chanModel->appendRow(list);
+    }
+
+    ui->chanView->setAlternatingRowColors(true);
+
+    // ui->graphView->setFirstColumnSpanned(0,daily->index(),true); // Crashes on windows.. Why do I need this again?
+
+
+    ComboBoxDelegate * combobox = new ComboBoxDelegate(ui->waveView);
+
+    ui->chanView->setItemDelegateForColumn(3,combobox);
+
+    int row = 0;
+    for (ci = schema::channel.names.begin(); ci != schema::channel.names.end(); ci++) {
+        schema::Channel * chan = ci.value();
+        if ((chan->type() == schema::DATA) || (chan->type() == schema::SETTING) || chan->type() == schema::WAVEFORM) continue;
+
+        QList<QStandardItem *> items;
+        QStandardItem *it = new QStandardItem(chan->fullname());
+        it->setCheckable(true);
+        it->setCheckState(chan->enabled() ? Qt::Checked : Qt::Unchecked);
+        it->setEditable(true);
+        it->setData(chan->id(), Qt::UserRole);
+
+        // Dear translators: %1 is a unique ascii english string used to indentify channels in the code, I'd like feedback on how this goes..
+        // It's here in case users mess up which field is which.. it will always show the Channel Code underneath in the tooltip.
+        it->setToolTip(tr("Double click to change the descriptive name the '%1' channel.").arg(chan->code()));
+        items.push_back(it);
+
+
+        it = new QStandardItem();
+        it->setBackground(QBrush(chan->defaultColor()));
+        it->setEditable(false);
+        it->setData(chan->defaultColor().rgba(), Qt::UserRole);
+        it->setToolTip(tr("Double click to change the default color for this channel plot/flag/data."));
+        it->setSelectable(false);
+        items.push_back(it);
+
+        it = new QStandardItem(QString());
+        it->setToolTip(tr("Whether this flag has a dedicated overview chart."));
+        it->setCheckable(true);
+        it->setCheckState(chan->showInOverview() ? Qt::Checked : Qt::Unchecked);
+        it->setTextAlignment(Qt::AlignCenter);
+        it->setData(chan->id(), Qt::UserRole);
+        items.push_back(it);
+
+        schema::ChanType type = chan->type();
+
+        it = new QStandardItem(channeltype[type]);
+        it->setToolTip(tr("Here you can change the type of flag shown for this event"));
+        it->setEditable(type != schema::UNKNOWN);
+        items.push_back(it);
+
+        it = new QStandardItem(chan->label());
+        it->setToolTip(tr("This is the short-form label to indicate this channel on screen."));
+
+        it->setEditable(true);
+        items.push_back(it);
+
+        it = new QStandardItem(chan->description());
+        it->setToolTip(tr("This is a description of what this channel does."));
+
+        it->setEditable(true);
+        items.push_back(it);
+
+        MachineType mt = chan->machtype();
+        if (chan->type() == schema::UNKNOWN) mt = MT_UNCATEGORIZED;
+        row = toprows[mt]++;
+        toplevel[mt]->insertRow(row, items);
+    }
+
+
+    for(QHash<MachineType, QStandardItem *>::iterator i = toplevel.begin(); i != toplevel.end(); ++i) {
+        if (i.value()->rowCount() == 0) {
+            chanModel->removeRow(i.value()->row());
+        }
+    }
+
+    ui->chanView->expandAll();
+    ui->chanView->setSortingEnabled(true);
+}
+
+void PreferencesDialog::InitWaveInfo()
+{
+    QHash<MachineType, int> toprows;
+
+    waveModel->clear();
+    machlevel.clear();
+    toprows.clear();
+    QStringList headers;
+    headers.append(tr("Name"));
+    headers.append(tr("Color"));
+    headers.append(tr("Overview"));
+    headers.append(tr("Lower"));
+    headers.append(tr("Upper"));
+    headers.append(tr("Label"));
+    headers.append(tr("Details"));
+    waveModel->setHorizontalHeaderLabels(headers);
+    ui->waveView->setColumnWidth(0, 200);
+    ui->waveView->setColumnWidth(1, 40);
+    ui->waveView->setColumnWidth(2, 60);
+    ui->waveView->setColumnWidth(3, 50);
+    ui->waveView->setColumnWidth(4, 50);
+    ui->waveView->setColumnWidth(5, 100);
+    ui->waveView->setSelectionMode(QAbstractItemView::SingleSelection);
+    ui->waveView->setSelectionBehavior(QAbstractItemView::SelectItems);
+
+    waveModel->setColumnCount(7);
+
+    QStandardItem *hdr = nullptr;
+
+    QMap<MachineType, QString> Section;
+
+    Section[MT_CPAP] = tr("CPAP Waveforms");
+    Section[MT_OXIMETER] = tr("Oximeter Waveforms");
+    Section[MT_POSITION] = tr("Positional Waveforms");
+    Section[MT_SLEEPSTAGE] = tr("Sleep Stage Waveforms");
+
+    QMap<MachineType, QString>::iterator it;
+
+    for (it = Section.begin(); it != Section.end(); ++it) {
+        machlevel[it.key()] = hdr = new QStandardItem(it.value());
+        hdr->setEditable(false);
+        QList<QStandardItem *> list;
+        list.append(hdr);
+        for (int i=0; i<6; i++) {
+            QStandardItem *it = new QStandardItem();
+            it->setEnabled(false);
+            list.append(it);
+        }
+        waveModel->appendRow(list);
+    }
+
+    ui->waveView->setAlternatingRowColors(true);
+
+    // ui->graphView->setFirstColumnSpanned(0,daily->index(),true); // Crashes on windows.. Why do I need this again?
+
+    QHash<QString, schema::Channel *>::iterator ci;
+
+    SpinBoxDelegate * spinbox = new SpinBoxDelegate(ui->waveView);
+
+    ui->waveView->setItemDelegateForColumn(3,spinbox);
+    ui->waveView->setItemDelegateForColumn(4,spinbox);
+
+    int row = 0;
+    for (ci = schema::channel.names.begin(); ci != schema::channel.names.end(); ci++) {
+        schema::Channel * chan = ci.value();
+        if (chan->type() != schema::WAVEFORM) continue;
+
+        QList<QStandardItem *> items;
+        QStandardItem *it = new QStandardItem(chan->fullname());
+
+        it->setCheckable(true);
+        it->setCheckState(chan->enabled() ? Qt::Checked : Qt::Unchecked);
+        it->setEditable(true);
+        it->setData(chan->id(), Qt::UserRole);
+        it->setToolTip(tr("Double click to change the descriptive name this channel."));
+        items.push_back(it);
+
+        it = new QStandardItem();
+        it->setBackground(QBrush(chan->defaultColor()));
+        it->setEditable(false);
+        it->setData(chan->defaultColor().rgba(), Qt::UserRole);
+        it->setToolTip(tr("Double click to change the default color for this channel plot/flag/data."));
+        it->setSelectable(false);
+        items.push_back(it);
+
+        it = new QStandardItem();
+        it->setCheckable(true);
+        it->setCheckState(chan->showInOverview() ? Qt::Checked : Qt::Unchecked);
+        it->setEditable(true);
+        it->setData(chan->id(), Qt::UserRole);
+        it->setToolTip(tr("Whether a breakdown of this waveform displays in overview."));
+        items.push_back(it);
+
+
+        it = new QStandardItem(QString::number(chan->lowerThreshold(),'f',1));
+        it->setToolTip(tr("Here you can set the <b>lower</b> threshold used for certain calculations on the %1 waveform").arg(chan->fullname()));
+        it->setEditable(true);
+        items.push_back(it);
+
+        it = new QStandardItem(QString::number(chan->upperThreshold(),'f',1));
+        it->setToolTip(tr("Here you can set the <b>upper</b> threshold used for certain calculations on the %1 waveform").arg(chan->fullname()));
+        it->setEditable(true);
+        items.push_back(it);
+
+        it = new QStandardItem(chan->label());
+        it->setToolTip(tr("This is the short-form label to indicate this channel on screen."));
+
+        it->setEditable(true);
+        items.push_back(it);
+
+        it = new QStandardItem(chan->description());
+        it->setToolTip(tr("This is a description of what this channel does."));
+
+        it->setEditable(true);
+        items.push_back(it);
+
+        row = toprows[chan->machtype()]++;
+        machlevel[chan->machtype()]->insertRow(row, items);
+    }
+
+    for(QHash<MachineType, QStandardItem *>::iterator i = machlevel.begin(); i != machlevel.end(); ++i) {
+        if (i.value()->rowCount() == 0) {
+            waveModel->removeRow(i.value()->row());
+        }
+    }
+
+    ui->waveView->expandAll();
+    ui->waveView->setSortingEnabled(true);
+}
+
+
+PreferencesDialog::~PreferencesDialog()
+{
+    delete ui;
+}
+
+bool PreferencesDialog::Save()
+{
+    bool recalc_events = false;
+    bool needs_restart = false;
+
+    if (ui->ahiGraphZeroReset->isChecked() != profile->cpap->AHIReset()) { recalc_events = true; }
+
+    if (ui->useSquareWavePlots->isChecked() != profile->appearance->squareWavePlots()) {
+        needs_restart = true;
+    }
+
+    if ((profile->session->daySplitTime() != ui->timeEdit->time()) ||
+            (profile->session->combineCloseSessions() != ui->combineSlider->value()) ||
+            (profile->session->ignoreShortSessions() != ui->IgnoreSlider->value())) {
+        needs_restart = true;
+    }
+
+    if (profile->session->lockSummarySessions() != ui->LockSummarySessionSplitting->isChecked()) {
+        needs_restart = true;
+    }
+
+    if (profile->cpap->userEventPieChart() != ui->showUserFlagsInPie->isChecked()) {
+        // lazy.. fix me
+        needs_restart = true;
+    }
+
+    int rdi_set = profile->general->calculateRDI() ? 1 : 0;
+    if (rdi_set != ui->eventIndexCombo->currentIndex()) {
+        //recalc_events=true;
+        needs_restart = true;
+    }
+
+    if ((profile->general->prefCalcMiddle() != ui->prefCalcMiddle->currentIndex())
+            || (profile->general->prefCalcMax() != ui->prefCalcMax->currentIndex())
+            || (profile->general->prefCalcPercentile() != ui->prefCalcPercentile->value())) {
+        needs_restart = true;
+    }
+
+    if (profile->cpap->leakRedline() != ui->leakRedlineSpinbox->value()) {
+        recalc_events = true;
+    }
+
+
+    if (profile->cpap->userEventFlagging() &&
+            (profile->cpap->userEventDuration() != ui->apneaDuration->value() ||
+             profile->cpap->userEventDuration2() != ui->apneaDuration2->value() ||
+             profile->cpap->userEventDuplicates() != ui->userEventDuplicates->isChecked() ||
+             profile->cpap->userFlowRestriction2() != ui->apneaFlowRestriction2->value() ||
+             profile->cpap->userFlowRestriction() != ui->apneaFlowRestriction->value())) {
+        recalc_events = true;
+    }
+
+    // Restart if turning user event flagging on/off
+    if (profile->cpap->userEventFlagging() != ui->customEventGroupbox->isChecked()) {
+        // if (profile->cpap->userEventFlagging()) {
+        // Don't bother recalculating, just switch off
+        needs_restart = true;
+        //} else
+        recalc_events = true;
+    }
+
+    if (profile->session->compressSessionData() != ui->compressSessionData->isChecked()) {
+        recalc_events = true;
+    }
+
+    if (recalc_events) {
+        if (p_profile->countDays(MT_CPAP, p_profile->FirstDay(), p_profile->LastDay()) > 0) {
+            if (QMessageBox::question(this, tr("Data Reindex Required"),
+                                      tr("A data reindexing proceedure is required to apply these changes. This operation may take a couple of minutes to complete.\n\nAre you sure you want to make these changes?"),
+                                      QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) {
+                return false;
+            }
+        } else { recalc_events = false; }
+    } else if (needs_restart) {
+        if (QMessageBox::question(this, tr("Restart Required"),
+                                  tr("One or more of the changes you have made will require this application to be restarted,\nin order for these changes to come into effect.\n\nWould you like do this now?"),
+                                  QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) {
+            return false;
+        }
+    }
+
+    schema::channel[OXI_SPO2].setLowerThreshold(ui->oxiDesaturationThreshold->value());
+    schema::channel[OXI_Pulse].setLowerThreshold(ui->flagPulseBelow->value());
+    schema::channel[OXI_Pulse].setUpperThreshold(ui->flagPulseAbove->value());
+
+
+    profile->cpap->setUserEventPieChart(ui->showUserFlagsInPie->isChecked());
+    profile->session->setLockSummarySessions(ui->LockSummarySessionSplitting->isChecked());
+
+    profile->appearance->setAllowYAxisScaling(ui->allowYAxisScaling->isChecked());
+    profile->appearance->setGraphTooltips(ui->graphTooltips->isChecked());
+
+    profile->appearance->setAntiAliasing(ui->useAntiAliasing->isChecked());
+    profile->appearance->setUsePixmapCaching(ui->usePixmapCaching->isChecked());
+    profile->appearance->setSquareWavePlots(ui->useSquareWavePlots->isChecked());
+    profile->appearance->setGraphSnapshots(ui->enableGraphSnapshots->isChecked());
+    profile->appearance->setLineThickness(float(ui->lineThicknessSlider->value()) / 2.0);
+
+    profile->general->setSkipEmptyDays(ui->skipEmptyDays->isChecked());
+
+    profile->general->setTooltipTimeout(ui->tooltipTimeoutSlider->value() * 50);
+    profile->general->setScrollDampening(ui->scrollDampeningSlider->value() * 10);
+
+    profile->general->setShowUnknownFlags(ui->showUnknownFlags->isChecked());
+    profile->session->setMultithreading(ui->enableMultithreading->isChecked());
+    profile->session->setCacheSessions(ui->cacheSessionData->isChecked());
+    profile->session->setPreloadSummaries(ui->preloadSummaries->isChecked());
+    profile->appearance->setAnimations(ui->animationsAndTransitionsCheckbox->isChecked());
+
+    profile->cpap->setShowLeakRedline(ui->showLeakRedline->isChecked());
+    profile->cpap->setLeakRedline(ui->leakRedlineSpinbox->value());
+
+    profile->cpap->setShowComplianceInfo(ui->complianceCheckBox->isChecked());
+    profile->cpap->setComplianceHours(ui->complianceHours->value());
+
+    if (ui->graphHeight->value() != profile->appearance->graphHeight()) {
+        profile->appearance->setGraphHeight(ui->graphHeight->value());
+        mainwin->getDaily()->ResetGraphLayout();
+        mainwin->getOverview()->ResetGraphLayout();
+    }
+
+    profile->general->setPrefCalcMiddle(ui->prefCalcMiddle->currentIndex());
+    profile->general->setPrefCalcMax(ui->prefCalcMax->currentIndex());
+    profile->general->setPrefCalcPercentile(ui->prefCalcPercentile->value());
+
+    profile->general->setCalculateRDI((ui->eventIndexCombo->currentIndex() == 1));
+    profile->session->setBackupCardData(ui->createSDBackups->isChecked());
+    profile->session->setCompressBackupData(ui->compressSDBackups->isChecked());
+    profile->session->setCompressSessionData(ui->compressSessionData->isChecked());
+
+    profile->session->setCombineCloseSessions(ui->combineSlider->value());
+    profile->session->setIgnoreShortSessions(ui->IgnoreSlider->value());
+    profile->session->setDaySplitTime(ui->timeEdit->time());
+    profile->session->setIgnoreOlderSessions(ui->ignoreOlderSessionsCheck->isChecked());
+    profile->session->setIgnoreOlderSessionsDate(ui->ignoreOlderSessionsDate->date());
+
+    int s = ui->clockDriftHours->value() * 3600 + ui->clockDriftMinutes->value() * 60 + ui->clockDriftSeconds->value();
+    profile->cpap->setClockDrift(s);
+
+    profile->appearance->setOverlayType((OverlayDisplayType)ui->overlayFlagsCombo->currentIndex());
+    profile->appearance->setOverviewLinechartMode((OverviewLinechartModes)ui->overviewLinecharts->currentIndex());
+
+    profile->oxi->setSpO2DropPercentage(ui->spo2Drop->value());
+    profile->oxi->setSpO2DropDuration(ui->spo2DropTime->value());
+    profile->oxi->setPulseChangeBPM(ui->pulseChange->value());
+    profile->oxi->setPulseChangeDuration(ui->pulseChangeTime->value());
+    profile->oxi->setOxiDiscardThreshold(ui->oxiDiscardThreshold->value());
+
+    profile->cpap->setAHIWindow(ui->ahiGraphWindowSize->value());
+    profile->cpap->setAHIReset(ui->ahiGraphZeroReset->isChecked());
+
+    profile->cpap->setAutoImport(ui->automaticImport->isChecked());
+
+    profile->cpap->setUserEventFlagging(ui->customEventGroupbox->isChecked());
+
+    profile->cpap->setResyncFromUserFlagging(ui->resyncMachineDetectedEvents->isChecked());
+    profile->cpap->setUserEventDuration(ui->apneaDuration->value());
+    profile->cpap->setUserFlowRestriction(ui->apneaFlowRestriction->value());
+    profile->cpap->setUserEventDuration2(ui->apneaDuration2->value());
+    profile->cpap->setUserFlowRestriction2(ui->apneaFlowRestriction2->value());
+
+    profile->cpap->setUserEventDuplicates(ui->userEventDuplicates->isChecked());
+
+    PREF[STR_GEN_SkipLogin] = ui->skipLoginScreen->isChecked();
+
+    PREF[STR_GEN_UpdatesAutoCheck] = ui->automaticallyCheckUpdates->isChecked();
+    PREF[STR_GEN_UpdateCheckFrequency] = ui->updateCheckEvery->value();
+    PREF[STR_PREF_AllowEarlyUpdates] = ui->allowEarlyUpdates->isChecked();
+
+    PREF["Fonts_Application_Name"] = ui->applicationFont->currentText();
+    PREF["Fonts_Application_Size"] = ui->applicationFontSize->value();
+    PREF["Fonts_Application_Bold"] = ui->applicationFontBold->isChecked();
+    PREF["Fonts_Application_Italic"] = ui->applicationFontItalic->isChecked();
+
+
+    PREF["Fonts_Graph_Name"] = ui->graphFont->currentText();
+    PREF["Fonts_Graph_Size"] = ui->graphFontSize->value();
+    PREF["Fonts_Graph_Bold"] = ui->graphFontBold->isChecked();
+    PREF["Fonts_Graph_Italic"] = ui->graphFontItalic->isChecked();
+
+    PREF["Fonts_Title_Name"] = ui->titleFont->currentText();
+    PREF["Fonts_Title_Size"] = ui->titleFontSize->value();
+    PREF["Fonts_Title_Bold"] = ui->titleFontBold->isChecked();
+    PREF["Fonts_Title_Italic"] = ui->titleFontItalic->isChecked();
+
+    PREF["Fonts_Big_Name"] = ui->bigFont->currentText();
+    PREF["Fonts_Big_Size"] = ui->bigFontSize->value();
+    PREF["Fonts_Big_Bold"] = ui->bigFontBold->isChecked();
+    PREF["Fonts_Big_Italic"] = ui->bigFontItalic->isChecked();
+
+    QFont font = ui->applicationFont->currentFont();
+    font.setPointSize(ui->applicationFontSize->value());
+    font.setWeight(ui->applicationFontBold->isChecked() ? QFont::Bold : QFont::Normal);
+    font.setItalic(ui->applicationFontItalic->isChecked());
+    QApplication::setFont(font);
+    mainwin->menuBar()->setFont(font);
+
+    *defaultfont = ui->graphFont->currentFont();
+    defaultfont->setPointSize(ui->graphFontSize->value());
+    defaultfont->setWeight(ui->graphFontBold->isChecked() ? QFont::Bold : QFont::Normal);
+    defaultfont->setItalic(ui->graphFontItalic->isChecked());
+
+    *mediumfont = ui->titleFont->currentFont();
+    mediumfont->setPointSize(ui->titleFontSize->value());
+    mediumfont->setWeight(ui->titleFontBold->isChecked() ? QFont::Bold : QFont::Normal);
+    mediumfont->setItalic(ui->titleFontItalic->isChecked());
+
+    *bigfont = ui->bigFont->currentFont();
+    bigfont->setPointSize(ui->bigFontSize->value());
+    bigfont->setWeight(ui->bigFontBold->isChecked() ? QFont::Bold : QFont::Normal);
+    bigfont->setItalic(ui->bigFontItalic->isChecked());
+
+
+    saveChanInfo();
+    saveWaveInfo();
+    //qDebug() << "TODO: Save channels.xml to update channel data";
+
+    PREF.Save();
+    p_profile->Save();
+
+    if (recalc_events) {
+        // send a signal instead?
+        mainwin->reprocessEvents(needs_restart);
+    } else if (needs_restart) {
+        p_profile->removeLock();
+        mainwin->RestartApplication();
+    } else {
+        mainwin->getDaily()->LoadDate(mainwin->getDaily()->getDate());
+        // Save early.. just in case..
+        mainwin->getDaily()->graphView()->SaveSettings("Daily");
+        mainwin->getOverview()->graphView()->SaveSettings("Overview");
+    }
+
+    return true;
+}
+
+void PreferencesDialog::saveChanInfo()
+{
+    // Change focus to force save of any open editors..
+    ui->channelSearch->setFocus();
+
+    int toprows = chanModel->rowCount();
+    bool ok;
+
+    for (int i=0; i < toprows; i++) {
+        QStandardItem * topitem = chanModel->item(i,0);
+
+        if (!topitem) continue;
+        int rows = topitem->rowCount();
+        for (int j=0; j< rows; ++j) {
+            QStandardItem * item = topitem->child(j, 0);
+            if (!item) continue;
+
+            ChannelID id = item->data(Qt::UserRole).toUInt(&ok);
+            schema::Channel & chan = schema::channel[id];
+            if (chan.isNull()) continue;
+            chan.setEnabled(item->checkState() == Qt::Checked ? true : false);
+            chan.setFullname(item->text());
+            chan.setDefaultColor(QColor(topitem->child(j,1)->data(Qt::UserRole).toUInt()));
+            chan.setShowInOverview(topitem->child(j,2)->checkState() == Qt::Checked);
+            QString ts = topitem->child(j,3)->text();
+            schema::ChanType type = schema::MINOR_FLAG;
+            for (QHash<schema::ChanType, QString>::iterator it = channeltype.begin(); it!= channeltype.end(); ++it) {
+                if (it.value() == ts) {
+                    type = it.key();
+                    break;
+                }
+            }
+            chan.setType(type);
+            chan.setLabel(topitem->child(j,4)->text());
+            chan.setDescription(topitem->child(j,5)->text());
+        }
+    }
+}
+void PreferencesDialog::saveWaveInfo()
+{
+    // Change focus to force save of any open editors..
+    ui->waveSearch->setFocus();
+
+    int toprows = waveModel->rowCount();
+
+    bool ok;
+    for (int i=0; i < toprows; i++) {
+        QStandardItem * topitem = waveModel->item(i,0);
+
+        if (!topitem) continue;
+        int rows = topitem->rowCount();
+        for (int j=0; j< rows; ++j) {
+            QStandardItem * item = topitem->child(j, 0);
+            if (!item) continue;
+
+            ChannelID id = item->data(Qt::UserRole).toUInt(&ok);
+            schema::Channel & chan = schema::channel[id];
+            if (chan.isNull()) continue;
+            chan.setEnabled(item->checkState() == Qt::Checked ? true : false);
+            chan.setFullname(item->text());
+            chan.setDefaultColor(QColor(topitem->child(j,1)->data(Qt::UserRole).toUInt()));
+            chan.setShowInOverview(topitem->child(j,2)->checkState() == Qt::Checked);
+            chan.setLowerThreshold(topitem->child(j,3)->text().toDouble());
+            chan.setUpperThreshold(topitem->child(j,4)->text().toDouble());
+            chan.setLabel(topitem->child(j,5)->text());
+            chan.setDescription(topitem->child(j,6)->text());
+        }
+    }
+}
+
+void PreferencesDialog::on_combineSlider_valueChanged(int position)
+{
+    if (position > 0) {
+        ui->combineLCD->display(position);
+    } else { ui->combineLCD->display(STR_GEN_Off); }
+}
+
+void PreferencesDialog::on_IgnoreSlider_valueChanged(int position)
+{
+    if (position > 0) {
+        ui->IgnoreLCD->display(position);
+    } else { ui->IgnoreLCD->display(STR_GEN_Off); }
+}
+
+#include "mainwindow.h"
+extern MainWindow *mainwin;
+void PreferencesDialog::RefreshLastChecked()
+{
+    ui->updateLastChecked->setText(PREF[STR_GEN_UpdatesLastChecked].toDateTime().toString(
+                                       Qt::SystemLocaleLongDate));
+}
+
+void PreferencesDialog::on_checkForUpdatesButton_clicked()
+{
+    mainwin->CheckForUpdates();
+}
+
+MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent)
+    : QSortFilterProxyModel(parent)
+{
+
+}
+
+bool MySortFilterProxyModel::filterAcceptsRow(int source_row,
+        const QModelIndex &source_parent) const
+{
+    if (source_parent == qobject_cast<QStandardItemModel *>
+            (sourceModel())->invisibleRootItem()->index()) {
+        // always accept children of rootitem, since we want to filter their children
+        return true;
+    }
+
+    return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
+}
+
+// Might still be useful..
+//void PreferencesDialog::on_resetGraphButton_clicked()
+//{
+//    QString title = tr("Confirmation");
+//    QString text  = tr("Are you sure you want to reset your graph preferences to the defaults?");
+//    StandardButtons buttons = QMessageBox::Yes | QMessageBox::No;
+//    StandardButton  defaultButton = QMessageBox::No;
+
+//    // Display confirmation dialog.
+//    StandardButton choice = QMessageBox::question(this, title, text, buttons, defaultButton);
+
+//    if (choice == QMessageBox::No) {
+//        return;
+//    }
+
+//    gGraphView *views[3] = {0};
+//    views[0] = mainwin->getDaily()->graphView();
+//    views[1] = mainwin->getOverview()->graphView();
+
+//    // Iterate over all graph containers.
+//    for (unsigned j = 0; j < 3; j++) {
+//        gGraphView *view = views[j];
+
+//        if (!view) {
+//            continue;
+//        }
+
+//        // Iterate over all contained graphs.
+//        for (int i = 0; i < view->size(); i++) {
+//            gGraph *g = (*view)[i];
+//            g->setRecMaxY(0); // FIXME: should be g->reset(), but need other patches to land.
+//            g->setRecMinY(0);
+//            g->setVisible(true);
+//        }
+
+//        view->updateScale();
+//    }
+
+//    resetGraphModel();
+//    ui->graphView->update();
+//}
+
+void PreferencesDialog::on_createSDBackups_toggled(bool checked)
+{
+    if (profile->session->backupCardData() && !checked) {
+        QList<Machine *> mach = p_profile->GetMachines(MT_CPAP);
+        bool haveS9 = false;
+
+        for (int i = 0; i < mach.size(); i++) {
+            if (mach[i]->loaderName() == STR_MACH_ResMed) {
+                haveS9 = true;
+                break;
+            }
+        }
+
+        if (haveS9
+                && QMessageBox::question(this, tr("This may not be a good idea"),
+                                         tr("ResMed S9 machines routinely delete certain data from your SD card older than 7 and 30 days (depending on resolution).")
+                                         + " " + tr("If you ever need to reimport this data again (whether in SleepyHead or ResScan) this data won't come back.")
+                                         + " " + tr("If you need to conserve disk space, please remember to carry out manual backups.") +
+                                         " " + tr("Are you sure you want to disable these backups?"), QMessageBox::Yes,
+                                         QMessageBox::No) == QMessageBox::No) {
+            ui->createSDBackups->setChecked(true);
+            return;
+        }
+    }
+
+    if (!checked) { ui->compressSDBackups->setChecked(false); }
+
+    ui->compressSDBackups->setEnabled(checked);
+}
+
+void PreferencesDialog::on_okButton_clicked()
+{
+    if (Save()) {
+        accept();
+    }
+}
+
+void PreferencesDialog::on_scrollDampeningSlider_valueChanged(int value)
+{
+    if (value > 0) {
+        ui->scrollDampDisplay->display(value * 10);
+    } else { ui->scrollDampDisplay->display(STR_TR_Off); }
+}
+
+void PreferencesDialog::on_tooltipTimeoutSlider_valueChanged(int value)
+{
+    ui->tooltipMS->display(value * 50);
+}
+
+void PreferencesDialog::on_resetChannelDefaults_clicked()
+{
+    if (QMessageBox::question(this, STR_MessageBox_Warning, QObject::tr("Are you sure you want to reset all your channel colors and settings to defaults?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) {
+        schema::resetChannels();
+        saveWaveInfo();
+        InitChanInfo();
+    }
+}
+
+void PreferencesDialog::on_createSDBackups_clicked(bool checked)
+{
+    if (!checked && p_profile->session->backupCardData()) {
+        if (QMessageBox::question(this, STR_MessageBox_Warning, tr("Switching off automatic backups is not a good idea, because SleepyHead needs these to rebuild the database if errors are found.")+"\n\n"+
+                              tr("Are you really sure you want to do this?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) {
+        } else {
+            ui->createSDBackups->setChecked(true);
+        }
+    }
+}
+
+void PreferencesDialog::on_channelSearch_textChanged(const QString &arg1)
+{
+    chanFilterModel->setFilterFixedString(arg1);
+}
+
+void PreferencesDialog::on_chanView_doubleClicked(const QModelIndex &index)
+{
+    if (index.column() == 1) {
+        QColorDialog a;
+
+        if (!(index.flags() & Qt::ItemIsEnabled)) return;
+        quint32 color = index.data(Qt::UserRole).toUInt();
+
+        a.setCurrentColor(QColor((QRgb)color));
+
+        if (a.exec() == QColorDialog::Accepted) {
+            quint32 cv = a.currentColor().rgba();
+
+            chanFilterModel->setData(index, cv, Qt::UserRole);
+            chanFilterModel->setData(index, a.currentColor(), Qt::BackgroundRole);
+
+        }
+
+    }
+}
+
+void PreferencesDialog::on_waveSearch_textChanged(const QString &arg1)
+{
+    waveFilterModel->setFilterFixedString(arg1);
+}
+
+void PreferencesDialog::on_resetWaveformChannels_clicked()
+{
+    if (QMessageBox::question(this, STR_MessageBox_Warning, QObject::tr("Are you sure you want to reset all your waveform channel colors and settings to defaults?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) {
+        schema::resetChannels();
+        saveChanInfo(); // reset clears EVERYTHING, so have to put these back in case they cancel.
+        InitWaveInfo();
+    }
+}
+
+void PreferencesDialog::on_waveView_doubleClicked(const QModelIndex &index)
+{
+    if (index.column() == 1) {
+        QColorDialog a;
+
+        if (!(index.flags() & Qt::ItemIsEnabled)) return;
+        quint32 color = index.data(Qt::UserRole).toUInt();
+
+        a.setCurrentColor(QColor((QRgb)color));
+
+        if (a.exec() == QColorDialog::Accepted) {
+            quint32 cv = a.currentColor().rgba();
+
+            waveFilterModel->setData(index, cv, Qt::UserRole);
+            waveFilterModel->setData(index, a.currentColor(), Qt::BackgroundRole);
+
+        }
+
+    }
+}
diff --git a/sleepyhead/preferencesdialog.h b/sleepyhead/preferencesdialog.h
new file mode 100644
index 0000000..51bf0c2
--- /dev/null
+++ b/sleepyhead/preferencesdialog.h
@@ -0,0 +1,115 @@
+/* SleepyHead Preferences Dialog Headers
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef PREFERENCESDIALOG_H
+#define PREFERENCESDIALOG_H
+
+#include <QDialog>
+#include <QModelIndex>
+#include <QListWidgetItem>
+#include <QStringListModel>
+#include <QSortFilterProxyModel>
+#include <QStandardItemModel>
+#include "SleepLib/profiles.h"
+
+namespace Ui {
+class PreferencesDialog;
+}
+
+
+/*! \class MySortFilterProxyModel
+    \brief Enables the Graph tabs view to be filtered
+    */
+class MySortFilterProxyModel: public QSortFilterProxyModel
+{
+    Q_OBJECT
+  public:
+    MySortFilterProxyModel(QObject *parent = 0);
+
+  protected:
+    //! \brief Simply extends filterAcceptRow to scan children as well
+    bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
+
+};
+
+/*! \class PreferencesDialog
+    \brief SleepyHead's Main Preferences Window
+
+    This provides the Preferences form and logic to alter Preferences for SleepyHead
+*/
+class PreferencesDialog : public QDialog
+{
+    Q_OBJECT
+
+  public:
+    explicit PreferencesDialog(QWidget *parent, Profile *_profile);
+    ~PreferencesDialog();
+
+    //! \brief Save the current preferences, called when Ok button is clicked on.
+    bool Save();
+
+    //! \brief Updates the date text of the last time updates where checked
+    void RefreshLastChecked();
+
+  private slots:
+    void on_combineSlider_valueChanged(int value);
+
+    void on_IgnoreSlider_valueChanged(int value);
+
+    void on_checkForUpdatesButton_clicked();
+
+    //void on_genOpWidget_itemActivated(QListWidgetItem *item);
+
+    void on_createSDBackups_toggled(bool checked);
+
+    void on_okButton_clicked();
+
+    void on_scrollDampeningSlider_valueChanged(int value);
+
+    void on_tooltipTimeoutSlider_valueChanged(int value);
+
+    void on_createSDBackups_clicked(bool checked);
+
+    void on_resetChannelDefaults_clicked();
+
+    void on_channelSearch_textChanged(const QString &arg1);
+
+    void on_chanView_doubleClicked(const QModelIndex &index);
+
+    void on_waveSearch_textChanged(const QString &arg1);
+
+    void on_resetWaveformChannels_clicked();
+
+    void on_waveView_doubleClicked(const QModelIndex &index);
+
+private:
+    void InitChanInfo();
+    void InitWaveInfo();
+
+    void saveChanInfo();
+    void saveWaveInfo();
+
+    QHash<MachineType, QStandardItem *> toplevel;
+    QHash<MachineType, QStandardItem *> machlevel;
+
+    Ui::PreferencesDialog *ui;
+    Profile *profile;
+    QHash<ChannelID, QColor> m_new_colors;
+
+    QStringList importLocations;
+    QStringListModel *importModel;
+
+    MySortFilterProxyModel * chanFilterModel;
+    QStandardItemModel *chanModel;
+
+    MySortFilterProxyModel * waveFilterModel;
+    QStandardItemModel *waveModel;
+};
+
+
+#endif // PREFERENCESDIALOG_H
diff --git a/sleepyhead/preferencesdialog.ui b/sleepyhead/preferencesdialog.ui
new file mode 100644
index 0000000..ba2429d
--- /dev/null
+++ b/sleepyhead/preferencesdialog.ui
@@ -0,0 +1,2781 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PreferencesDialog</class>
+ <widget class="QDialog" name="PreferencesDialog">
+  <property name="windowModality">
+   <enum>Qt::ApplicationModal</enum>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>824</width>
+    <height>610</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Preferences</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="Resources.qrc">
+    <normaloff>:/icons/preferences.png</normaloff>:/icons/preferences.png</iconset>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <property name="modal">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>4</number>
+   </property>
+   <property name="leftMargin">
+    <number>4</number>
+   </property>
+   <property name="topMargin">
+    <number>4</number>
+   </property>
+   <property name="rightMargin">
+    <number>4</number>
+   </property>
+   <property name="bottomMargin">
+    <number>4</number>
+   </property>
+   <item>
+    <widget class="QTabWidget" name="tabWidget">
+     <property name="currentIndex">
+      <number>1</number>
+     </property>
+     <widget class="QWidget" name="importTab">
+      <attribute name="title">
+       <string>&Import</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_5">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>4</number>
+       </property>
+       <property name="topMargin">
+        <number>4</number>
+       </property>
+       <property name="rightMargin">
+        <number>4</number>
+       </property>
+       <property name="bottomMargin">
+        <number>4</number>
+       </property>
+       <item>
+        <widget class="QGroupBox" name="groupBox_6">
+         <property name="title">
+          <string>Session Splitting Settings</string>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_10">
+          <property name="spacing">
+           <number>4</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>4</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <item>
+           <widget class="QLabel" name="label_8">
+            <property name="text">
+             <string><html><head/><body><p><span style=" font-weight:600;">Attention ResMed users:</span> There are some pitfalls you may want to consider before trying to split sessions away from ResMed's 12:00 noon day model, click <a href="http://sleepyhead.sf.net/wiki/index.php/Resmed_Session_Splitting">here</a> for more information.</p></body></html></string>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+            <property name="openExternalLinks">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_4">
+            <item>
+             <widget class="QLabel" name="label">
+              <property name="text">
+               <string>Combine Close Sessions </string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_4">
+              <property name="text">
+               <string>Minutes</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_2">
+            <item>
+             <widget class="QSlider" name="combineSlider">
+              <property name="minimumSize">
+               <size>
+                <width>0</width>
+                <height>0</height>
+               </size>
+              </property>
+              <property name="toolTip">
+               <string>Multiple sessions closer together than this value will be kept on the same day.
+</string>
+              </property>
+              <property name="minimum">
+               <number>0</number>
+              </property>
+              <property name="maximum">
+               <number>240</number>
+              </property>
+              <property name="singleStep">
+               <number>10</number>
+              </property>
+              <property name="pageStep">
+               <number>30</number>
+              </property>
+              <property name="value">
+               <number>0</number>
+              </property>
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="invertedAppearance">
+               <bool>false</bool>
+              </property>
+              <property name="invertedControls">
+               <bool>false</bool>
+              </property>
+              <property name="tickPosition">
+               <enum>QSlider::TicksAbove</enum>
+              </property>
+              <property name="tickInterval">
+               <number>10</number>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLCDNumber" name="combineLCD">
+              <property name="frameShape">
+               <enum>QFrame::Box</enum>
+              </property>
+              <property name="digitCount">
+               <number>5</number>
+              </property>
+              <property name="segmentStyle">
+               <enum>QLCDNumber::Flat</enum>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_5">
+            <item>
+             <widget class="QLabel" name="label_3">
+              <property name="text">
+               <string>Ignore Short Sessions</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_5">
+              <property name="text">
+               <string>Minutes</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_3">
+            <item>
+             <widget class="QSlider" name="IgnoreSlider">
+              <property name="toolTip">
+               <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Cantarell'; font-size:11pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Sessions shorter in duration than this will not be displayed<span style=" font-style:italic;">.</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-style:italic;"></p></body></html></string>
+              </property>
+              <property name="maximum">
+               <number>90</number>
+              </property>
+              <property name="pageStep">
+               <number>5</number>
+              </property>
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="tickPosition">
+               <enum>QSlider::TicksAbove</enum>
+              </property>
+              <property name="tickInterval">
+               <number>5</number>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLCDNumber" name="IgnoreLCD">
+              <property name="frameShape">
+               <enum>QFrame::Box</enum>
+              </property>
+              <property name="segmentStyle">
+               <enum>QLCDNumber::Flat</enum>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout">
+            <item>
+             <widget class="QLabel" name="label_2">
+              <property name="text">
+               <string>Day Split Time</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QTimeEdit" name="timeEdit">
+              <property name="toolTip">
+               <string>Sessions starting before this time will go to the previous calendar day.</string>
+              </property>
+              <property name="buttonSymbols">
+               <enum>QAbstractSpinBox::UpDownArrows</enum>
+              </property>
+              <property name="dateTime">
+               <datetime>
+                <hour>12</hour>
+                <minute>0</minute>
+                <second>0</second>
+                <year>2000</year>
+                <month>1</month>
+                <day>1</day>
+               </datetime>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_7">
+              <property name="orientation">
+               <enum>Qt::Horizontal</enum>
+              </property>
+              <property name="sizeType">
+               <enum>QSizePolicy::Minimum</enum>
+              </property>
+              <property name="sizeHint" stdset="0">
+               <size>
+                <width>10</width>
+                <height>20</height>
+               </size>
+              </property>
+             </spacer>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="LockSummarySessionSplitting">
+              <property name="toolTip">
+               <string><html><head/><body><p><span style=" font-weight:600;">This setting should be used with caution...</span> Switching it off comes with consequences involving accuracy of summary only days, as certain calculations only work properly provided summary only sessions that came from individual day records are kept together. </p><p><span style=" font-weight:600;">ResMed users:</span> Just becaus [...]
+              </property>
+              <property name="text">
+               <string>Don't Split Summary Days (Warning: read the tooltip!)</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>
+           </layout>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="groupBox_7">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="title">
+          <string>Session Storage Options</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_9">
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>9</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>0</number>
+          </property>
+          <property name="horizontalSpacing">
+           <number>0</number>
+          </property>
+          <property name="verticalSpacing">
+           <number>4</number>
+          </property>
+          <item row="5" column="0">
+           <widget class="QLabel" name="label_41">
+            <property name="text">
+             <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Changing SD Backup compression options doesn't automatically recompress backup data.  </span></p></body></html></string>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="0">
+           <widget class="QCheckBox" name="compressSDBackups">
+            <property name="toolTip">
+             <string>Compress ResMed (EDF) backups to save disk space.
+Backed up EDF files are stored in the .gz format, 
+which is common on Mac & Linux platforms.. 
+
+SleepyHead can import from this compressed backup directory natively.. 
+To use with ResScan will require the .gz files to be uncompressed first..</string>
+            </property>
+            <property name="text">
+             <string>Compress SD Card Backups (slower first import, but makes backups smaller)</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QLabel" name="label_32">
+            <property name="font">
+             <font>
+              <italic>true</italic>
+             </font>
+            </property>
+            <property name="text">
+             <string>The following options affect the amount of disk space SleepyHead uses, and all have an effect on how long import takes.</string>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="4" column="0">
+           <widget class="QCheckBox" name="compressSessionData">
+            <property name="toolTip">
+             <string>This makes SleepyHead's data take around half as much space.
+But it makes import and day changing take longer.. 
+If you've got a new computer with a small solid state disk, this is a good option.</string>
+            </property>
+            <property name="text">
+             <string>Compress Session Data (makes SleepyHead data smaller, but day changing slower.)</string>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="0">
+           <widget class="QCheckBox" name="createSDBackups">
+            <property name="toolTip">
+             <string>This maintains a backup of SD-card data for ResMed machines, 
+
+ResMed machines delete high resolution data older than 7 days, 
+and graph data older than 30 days..
+
+SleepyHead can keep a copy of this data if you ever need to reinstall. 
+(Highly recomended, unless your short on disk space or don't care about the graph data)</string>
+            </property>
+            <property name="text">
+             <string>Create SD Card Backups during Import (Turn this off at your own peril!)</string>
+            </property>
+           </widget>
+          </item>
+          <item row="6" column="0">
+           <layout class="QHBoxLayout" name="horizontalLayout_18">
+            <property name="leftMargin">
+             <number>0</number>
+            </property>
+            <property name="topMargin">
+             <number>0</number>
+            </property>
+            <property name="bottomMargin">
+             <number>0</number>
+            </property>
+            <item>
+             <widget class="QCheckBox" name="ignoreOlderSessionsCheck">
+              <property name="text">
+               <string>Do not import sessions older than:</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QDateEdit" name="ignoreOlderSessionsDate">
+              <property name="toolTip">
+               <string>Sessions older than this date will not be imported</string>
+              </property>
+              <property name="wrapping">
+               <bool>true</bool>
+              </property>
+              <property name="frame">
+               <bool>true</bool>
+              </property>
+              <property name="maximumDate">
+               <date>
+                <year>2099</year>
+                <month>12</month>
+                <day>31</day>
+               </date>
+              </property>
+              <property name="minimumDate">
+               <date>
+                <year>1970</year>
+                <month>1</month>
+                <day>2</day>
+               </date>
+              </property>
+              <property name="currentSection">
+               <enum>QDateTimeEdit::DaySection</enum>
+              </property>
+              <property name="displayFormat">
+               <string>dd MMMM yyyy</string>
+              </property>
+              <property name="calendarPopup">
+               <bool>true</bool>
+              </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>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="groupBox_8">
+         <property name="title">
+          <string>Memory and Startup Options</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_14">
+          <item row="0" column="0">
+           <widget class="QCheckBox" name="preloadSummaries">
+            <property name="toolTip">
+             <string><html><head/><body><p>Makes starting SleepyHead a bit slower, by pre-loading all the summary data in advance, which speeds up overview browsing and a few other calculations later on. </p><p>If you have a large amount of data, it might be worth keeping this switched off, but if you typically like to view <span style=" font-style:italic;">everything</span> in overview, all the summary data still has to be loaded [...]
+            </property>
+            <property name="text">
+             <string>Pre-Load all summary data at startup</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QCheckBox" name="cacheSessionData">
+            <property name="toolTip">
+             <string><html><head/><body><p>This setting keeps waveform and event data in memory after use to speed up revisiting days.</p><p>This is not really a necessary option, as your operating system caches previously used files too.</p><p>Recommendation is to leave it switched off, unless your computer has a ton of memory.</p></body></html></string>
+            </property>
+            <property name="text">
+             <string>Keep Waveform/Event data in memory</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1">
+           <widget class="QCheckBox" name="automaticImport">
+            <property name="toolTip">
+             <string><html><head/><body><p>Cuts down on any unimportant confirmation dialogs during import.</p></body></html></string>
+            </property>
+            <property name="text">
+             <string>Import without asking for confirmation</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QCheckBox" name="skipLoginScreen">
+            <property name="toolTip">
+             <string>Bypass the login screen and load the most recent User Profile</string>
+            </property>
+            <property name="text">
+             <string>Skip user selection screen</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </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>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="tabCPAP">
+      <attribute name="title">
+       <string>&CPAP</string>
+      </attribute>
+      <layout class="QGridLayout" name="gridLayout_8">
+       <property name="leftMargin">
+        <number>4</number>
+       </property>
+       <property name="topMargin">
+        <number>4</number>
+       </property>
+       <property name="rightMargin">
+        <number>4</number>
+       </property>
+       <property name="bottomMargin">
+        <number>4</number>
+       </property>
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <item row="0" column="2">
+        <widget class="QGroupBox" name="groupBox_5">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="title">
+          <string>General CPAP and Related Settings</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout">
+          <item row="1" column="2">
+           <widget class="QDoubleSpinBox" name="complianceHours">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="toolTip">
+             <string>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</string>
+            </property>
+            <property name="suffix">
+             <string> hours</string>
+            </property>
+            <property name="decimals">
+             <number>1</number>
+            </property>
+            <property name="maximum">
+             <double>8.000000000000000</double>
+            </property>
+            <property name="value">
+             <double>4.000000000000000</double>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="2">
+           <widget class="QDoubleSpinBox" name="leakRedlineSpinbox">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="toolTip">
+             <string>User definable threshold considered large leak</string>
+            </property>
+            <property name="suffix">
+             <string> L/min</string>
+            </property>
+            <property name="decimals">
+             <number>1</number>
+            </property>
+           </widget>
+          </item>
+          <item row="7" column="0">
+           <widget class="QCheckBox" name="showUnknownFlags">
+            <property name="toolTip">
+             <string>Show flags for machine detected events that haven't been identified yet.</string>
+            </property>
+            <property name="text">
+             <string>Enable Unknown Events Channels</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="2">
+           <widget class="QComboBox" name="eventIndexCombo">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <item>
+             <property name="text">
+              <string extracomment="Apnea Hypopnea Index">AHI</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string extracomment="Respiratory Disturbance Index">RDI</string>
+             </property>
+            </item>
+           </widget>
+          </item>
+          <item row="5" column="0" colspan="2">
+           <widget class="QLabel" name="label_27">
+            <property name="text">
+             <string>AHI/Hour Graph Time Window</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="0">
+           <widget class="QLabel" name="label_28">
+            <property name="text">
+             <string>Preferred major event index</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QCheckBox" name="complianceCheckBox">
+            <property name="text">
+             <string>Compliance defined as</string>
+            </property>
+           </widget>
+          </item>
+          <item row="5" column="2">
+           <widget class="QSpinBox" name="ahiGraphWindowSize">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="toolTip">
+             <string>Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.</string>
+            </property>
+            <property name="suffix">
+             <string> minutes</string>
+            </property>
+            <property name="minimum">
+             <number>5</number>
+            </property>
+            <property name="maximum">
+             <number>999</number>
+            </property>
+            <property name="value">
+             <number>60</number>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="0">
+           <widget class="QCheckBox" name="showLeakRedline">
+            <property name="font">
+             <font>
+              <weight>50</weight>
+              <bold>false</bold>
+             </font>
+            </property>
+            <property name="toolTip">
+             <string>Whether to show the leak redline in the leak graph</string>
+            </property>
+            <property name="text">
+             <string>Flag leaks over threshold</string>
+            </property>
+           </widget>
+          </item>
+          <item row="6" column="2">
+           <widget class="QCheckBox" name="ahiGraphZeroReset">
+            <property name="toolTip">
+             <string>Reset the counter to zero at beginning of each (time) window.</string>
+            </property>
+            <property name="text">
+             <string>Zero Reset</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item row="2" column="0" colspan="3">
+        <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 row="0" column="0" colspan="2">
+        <widget class="QGroupBox" name="groupBox_9">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Expanding" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="title">
+          <string>CPAP Clock Drift</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_15">
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>4</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
+          <property name="spacing">
+           <number>4</number>
+          </property>
+          <item row="1" column="1">
+           <widget class="QSpinBox" name="clockDriftMinutes">
+            <property name="minimum">
+             <number>-59</number>
+            </property>
+            <property name="maximum">
+             <number>59</number>
+            </property>
+            <property name="value">
+             <number>0</number>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QSpinBox" name="clockDriftHours">
+            <property name="minimum">
+             <number>-99</number>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="2">
+           <widget class="QLabel" name="label_31">
+            <property name="text">
+             <string>Seconds</string>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="0" colspan="3">
+           <widget class="QLabel" name="label_7">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="text">
+             <string><html><head/><body><p>Note: This is not intended for timezone corrections! Make sure your operating system clock and timezone is set correctly.</p></body></html></string>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="2">
+           <widget class="QSpinBox" name="clockDriftSeconds">
+            <property name="minimum">
+             <number>-9999</number>
+            </property>
+            <property name="maximum">
+             <number>9999</number>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="1">
+           <widget class="QLabel" name="label_17">
+            <property name="text">
+             <string>Minutes</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="0">
+           <widget class="QLabel" name="label_9">
+            <property name="text">
+             <string>Hours</string>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="0">
+           <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>
+       </item>
+       <item row="1" column="2">
+        <widget class="QGroupBox" name="PreferredCalcs">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="toolTip">
+          <string>Changes to the following settings needs a restart, but not a recalc.</string>
+         </property>
+         <property name="title">
+          <string>Preferred Calculation Methods</string>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_7">
+          <item row="2" column="0">
+           <widget class="QLabel" name="label_42">
+            <property name="text">
+             <string>Upper Percentile</string>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="0">
+           <widget class="QLabel" name="label_43">
+            <property name="text">
+             <string>Maximum Calcs</string>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="1">
+           <widget class="QSpinBox" name="prefCalcPercentile">
+            <property name="toolTip">
+             <string>For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.</string>
+            </property>
+            <property name="suffix">
+             <string notr="true">%</string>
+            </property>
+            <property name="minimum">
+             <number>1</number>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="0">
+           <widget class="QLabel" name="label_37">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="text">
+             <string>Middle Calculations</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="1">
+           <widget class="QComboBox" name="prefCalcMiddle">
+            <property name="toolTip">
+             <string>Median is recommended for ResMed users.</string>
+            </property>
+            <item>
+             <property name="text">
+              <string>Median</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>Weighted Average</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>Normal Average</string>
+             </property>
+            </item>
+           </widget>
+          </item>
+          <item row="3" column="1">
+           <widget class="QComboBox" name="prefCalcMax">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>140</width>
+              <height>0</height>
+             </size>
+            </property>
+            <property name="toolTip">
+             <string><html><head/><body><p>True maximum is the maximum of the data set.</p><p>99th percentile filters out the rarest outliers.</p></body></html></string>
+            </property>
+            <item>
+             <property name="text">
+              <string>True Maximum</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>99% Percentile</string>
+             </property>
+            </item>
+           </widget>
+          </item>
+          <item row="4" column="1">
+           <widget class="QComboBox" name="culminativeIndices">
+            <item>
+             <property name="text">
+              <string>Combined Count divided by Total Hours</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>Time Weighted average of Indice</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>Standard average of indice</string>
+             </property>
+            </item>
+            <item>
+             <property name="text">
+              <string>Median</string>
+             </property>
+            </item>
+           </widget>
+          </item>
+          <item row="4" column="0">
+           <widget class="QLabel" name="label_29">
+            <property name="text">
+             <string>Culminative Indices</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+       <item row="1" column="0" colspan="2">
+        <widget class="QGroupBox" name="customEventGroupbox">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="toolTip">
+          <string>Enable/disable experimental event flagging enhancements. 
+It allows detecting borderline events, and some the machine missed.
+This option must be enabled before import, otherwise a purge is required.</string>
+         </property>
+         <property name="title">
+          <string>Custom CPAP User Event Flagging</string>
+         </property>
+         <property name="flat">
+          <bool>false</bool>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_6">
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>9</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
+          <property name="spacing">
+           <number>4</number>
+          </property>
+          <item row="3" column="2">
+           <widget class="QDoubleSpinBox" name="apneaDuration2">
+            <property name="suffix">
+             <string>s</string>
+            </property>
+            <property name="value">
+             <double>10.000000000000000</double>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="1">
+           <widget class="QDoubleSpinBox" name="apneaFlowRestriction2">
+            <property name="suffix">
+             <string>%</string>
+            </property>
+            <property name="value">
+             <double>10.000000000000000</double>
+            </property>
+           </widget>
+          </item>
+          <item row="6" column="0" colspan="4">
+           <widget class="QCheckBox" name="resyncMachineDetectedEvents">
+            <property name="toolTip">
+             <string>This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.</string>
+            </property>
+            <property name="text">
+             <string>Resync Machine Detected Events (Experimental)</string>
+            </property>
+           </widget>
+          </item>
+          <item row="3" column="0">
+           <widget class="QLabel" name="label_50">
+            <property name="text">
+             <string>#2</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="label_35">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Fixed" vsizetype="Minimum">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="text">
+             <string>Flow Restriction</string>
+            </property>
+           </widget>
+          </item>
+          <item row="0" column="0" colspan="4">
+           <widget class="QLabel" name="label_34">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="font">
+             <font>
+              <italic>true</italic>
+             </font>
+            </property>
+            <property name="text">
+             <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html></string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+            </property>
+            <property name="wordWrap">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="1">
+           <widget class="QDoubleSpinBox" name="apneaFlowRestriction">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="toolTip">
+             <string>Percentage of restriction in airflow from the median value. 
+A value of 20% works well for detecting apneas. </string>
+            </property>
+            <property name="suffix">
+             <string>%</string>
+            </property>
+            <property name="value">
+             <double>10.000000000000000</double>
+            </property>
+           </widget>
+          </item>
+          <item row="5" column="0" colspan="4">
+           <widget class="QCheckBox" name="showUserFlagsInPie">
+            <property name="text">
+             <string>Show in Event Breakdown Piechart</string>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="2">
+           <widget class="QDoubleSpinBox" name="apneaDuration">
+            <property name="toolTip">
+             <string>Duration of airflow restriction</string>
+            </property>
+            <property name="suffix">
+             <string>s</string>
+            </property>
+            <property name="minimum">
+             <double>1.000000000000000</double>
+            </property>
+            <property name="value">
+             <double>10.000000000000000</double>
+            </property>
+           </widget>
+          </item>
+          <item row="2" column="0">
+           <widget class="QLabel" name="label_49">
+            <property name="text">
+             <string>#1</string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+            </property>
+           </widget>
+          </item>
+          <item row="4" column="0" colspan="4">
+           <widget class="QCheckBox" name="userEventDuplicates">
+            <property name="text">
+             <string>Allow duplicates near machine events.</string>
+            </property>
+           </widget>
+          </item>
+          <item row="1" column="2">
+           <widget class="QLabel" name="label_38">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="text">
+             <string>Event Duration</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="oximetryTab">
+      <attribute name="title">
+       <string>&Oximetry</string>
+      </attribute>
+      <layout class="QHBoxLayout" name="horizontalLayout_12">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>2</number>
+       </property>
+       <property name="topMargin">
+        <number>2</number>
+       </property>
+       <property name="rightMargin">
+        <number>2</number>
+       </property>
+       <property name="bottomMargin">
+        <number>2</number>
+       </property>
+       <item>
+        <widget class="QGroupBox" name="oximetryGroupBox">
+         <property name="title">
+          <string>Oximetery Settings</string>
+         </property>
+         <property name="checkable">
+          <bool>false</bool>
+         </property>
+         <layout class="QGridLayout" name="gridLayout_2">
+          <property name="leftMargin">
+           <number>4</number>
+          </property>
+          <property name="topMargin">
+           <number>8</number>
+          </property>
+          <property name="rightMargin">
+           <number>4</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
+          <property name="spacing">
+           <number>5</number>
+          </property>
+          <item row="2" column="0" colspan="2">
+           <widget class="QGroupBox" name="groupBox_3">
+            <property name="title">
+             <string>Other oximetry options</string>
+            </property>
+            <layout class="QGridLayout" name="gridLayout_13">
+             <item row="0" column="1">
+              <widget class="QSpinBox" name="oxiDesaturationThreshold">
+               <property name="suffix">
+                <string>%</string>
+               </property>
+              </widget>
+             </item>
+             <item row="2" column="1">
+              <widget class="QSpinBox" name="flagPulseBelow">
+               <property name="suffix">
+                <string> bpm</string>
+               </property>
+              </widget>
+             </item>
+             <item row="3" column="1">
+              <widget class="QSpinBox" name="oxiDiscardThreshold">
+               <property name="toolTip">
+                <string>Small chunks of oximetry data under this amount will be discarded.</string>
+               </property>
+               <property name="suffix">
+                <string>s</string>
+               </property>
+               <property name="maximum">
+                <number>300</number>
+               </property>
+              </widget>
+             </item>
+             <item row="3" column="0">
+              <widget class="QLabel" name="label_33">
+               <property name="text">
+                <string>Discard segments under</string>
+               </property>
+               <property name="alignment">
+                <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+               </property>
+              </widget>
+             </item>
+             <item row="1" column="1">
+              <widget class="QSpinBox" name="flagPulseAbove">
+               <property name="suffix">
+                <string> bpm</string>
+               </property>
+              </widget>
+             </item>
+             <item row="0" column="0">
+              <widget class="QLabel" name="label_52">
+               <property name="text">
+                <string>Flag SPO2 Desaturations Below</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_54">
+               <property name="text">
+                <string>Flag Pulse Rate Below</string>
+               </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_53">
+               <property name="text">
+                <string>Flag Pulse Rate Above</string>
+               </property>
+               <property name="alignment">
+                <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </widget>
+          </item>
+          <item row="1" column="0" colspan="2">
+           <widget class="QGroupBox" name="groupBox_4">
+            <property name="title">
+             <string>Flag rapid changes in oximetry stats</string>
+            </property>
+            <layout class="QGridLayout" name="gridLayout_4">
+             <item row="1" column="0">
+              <widget class="QLabel" name="label_24">
+               <property name="sizePolicy">
+                <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
+               <property name="text">
+                <string>SPO2</string>
+               </property>
+              </widget>
+             </item>
+             <item row="1" column="2">
+              <widget class="QDoubleSpinBox" name="spo2DropTime">
+               <property name="toolTip">
+                <string>Minimum duration of drop in oxygen saturation</string>
+               </property>
+               <property name="suffix">
+                <string>s</string>
+               </property>
+               <property name="decimals">
+                <number>0</number>
+               </property>
+              </widget>
+             </item>
+             <item row="3" column="1">
+              <widget class="QDoubleSpinBox" name="pulseChange">
+               <property name="toolTip">
+                <string>Sudden change in Pulse Rate of at least this amount</string>
+               </property>
+               <property name="suffix">
+                <string> bpm</string>
+               </property>
+               <property name="decimals">
+                <number>0</number>
+               </property>
+               <property name="minimum">
+                <double>1.000000000000000</double>
+               </property>
+              </widget>
+             </item>
+             <item row="3" column="2">
+              <widget class="QDoubleSpinBox" name="pulseChangeTime">
+               <property name="toolTip">
+                <string>Minimum duration of pulse change event.</string>
+               </property>
+               <property name="suffix">
+                <string>s</string>
+               </property>
+               <property name="decimals">
+                <number>0</number>
+               </property>
+              </widget>
+             </item>
+             <item row="3" column="0">
+              <widget class="QLabel" name="label_25">
+               <property name="sizePolicy">
+                <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                 <horstretch>0</horstretch>
+                 <verstretch>0</verstretch>
+                </sizepolicy>
+               </property>
+               <property name="text">
+                <string>Pulse</string>
+               </property>
+              </widget>
+             </item>
+             <item row="1" column="1">
+              <widget class="QDoubleSpinBox" name="spo2Drop">
+               <property name="toolTip">
+                <string>Percentage drop in oxygen saturation</string>
+               </property>
+               <property name="suffix">
+                <string>%</string>
+               </property>
+               <property name="decimals">
+                <number>0</number>
+               </property>
+               <property name="minimum">
+                <double>1.000000000000000</double>
+               </property>
+              </widget>
+             </item>
+            </layout>
+           </widget>
+          </item>
+          <item row="3" column="0" colspan="2">
+           <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>
+       </item>
+       <item>
+        <widget class="QTextBrowser" name="textBrowser">
+         <property name="minimumSize">
+          <size>
+           <width>300</width>
+           <height>0</height>
+          </size>
+         </property>
+         <property name="html">
+          <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:' [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">Live view mode (using a serial cable) is one way to acheive an accurate sync on CMS50 oximeters, but does not counter for CPAP clock drift.</span></p>
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">If you start your Oximeters recording mode at </span><span style=" font-family:'Sans'; font-size:10pt; font-style:italic;">exactly </span><span style=" font-family:'Sans'; font-size:10pt;">the same time you start your CP [...]
+<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
+<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">The serial import process takes the starting time from last nights first CPAP session. (Remember to import your CPAP data first!)</span></p></body></html></string>
+         </property>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="colourTab">
+      <attribute name="title">
+       <string>Events</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_3">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_19">
+         <item>
+          <widget class="QLabel" name="label_6">
+           <property name="text">
+            <string>Search</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="channelSearch"/>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QTreeView" name="chanView"/>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_20">
+         <item>
+          <widget class="QPushButton" name="resetChannelDefaults">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Reset &Defaults</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="label_51">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="waveforms">
+      <attribute name="title">
+       <string>Waveforms</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_8">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>0</number>
+       </property>
+       <property name="topMargin">
+        <number>0</number>
+       </property>
+       <property name="rightMargin">
+        <number>0</number>
+       </property>
+       <property name="bottomMargin">
+        <number>0</number>
+       </property>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_21">
+         <item>
+          <widget class="QLabel" name="label_55">
+           <property name="text">
+            <string>Search</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLineEdit" name="waveSearch"/>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="QTreeView" name="waveView"/>
+       </item>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_22">
+         <item>
+          <widget class="QPushButton" name="resetWaveformChannels">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string>Reset &Defaults</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QLabel" name="label_56">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="text">
+            <string><html><head/><body><p><span style=" font-weight:600;">Warning: </span>Just because you can, does not mean it's good practice.</p></body></html></string>
+           </property>
+           <property name="alignment">
+            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="generalTab">
+      <attribute name="title">
+       <string>&General</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_6">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>4</number>
+       </property>
+       <property name="topMargin">
+        <number>4</number>
+       </property>
+       <property name="rightMargin">
+        <number>4</number>
+       </property>
+       <property name="bottomMargin">
+        <number>4</number>
+       </property>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_14">
+         <item>
+          <widget class="QGroupBox" name="GeneralSettings">
+           <property name="title">
+            <string>General Settings</string>
+           </property>
+           <layout class="QGridLayout" name="gridLayout_10">
+            <property name="leftMargin">
+             <number>4</number>
+            </property>
+            <property name="topMargin">
+             <number>4</number>
+            </property>
+            <property name="rightMargin">
+             <number>4</number>
+            </property>
+            <property name="bottomMargin">
+             <number>4</number>
+            </property>
+            <property name="spacing">
+             <number>4</number>
+            </property>
+            <item row="1" column="1">
+             <widget class="QCheckBox" name="enableMultithreading">
+              <property name="toolTip">
+               <string>Allow use of multiple CPU cores where available to improve performance. 
+Mainly affects the importer.</string>
+              </property>
+              <property name="text">
+               <string>Enable Multithreading</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="Line" name="line_6">
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="Line" name="line_3">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="automaticallyCheckUpdates">
+         <property name="sizePolicy">
+          <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
+           <horstretch>0</horstretch>
+           <verstretch>0</verstretch>
+          </sizepolicy>
+         </property>
+         <property name="title">
+          <string>Automatically Check For Updates</string>
+         </property>
+         <property name="checkable">
+          <bool>true</bool>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_2">
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_7">
+            <item>
+             <widget class="QLabel" name="label_22">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Check for new version every</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QSpinBox" name="updateCheckEvery">
+              <property name="toolTip">
+               <string>Sourceforge hosts this project for free.. Please be considerate of their resources..</string>
+              </property>
+              <property name="maximum">
+               <number>90</number>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="label_23">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>days.</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="QToolButton" name="checkForUpdatesButton">
+              <property name="palette">
+               <palette>
+                <active>
+                 <colorrole role="ButtonText">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>0</red>
+                    <green>0</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                </active>
+                <inactive>
+                 <colorrole role="ButtonText">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>0</red>
+                    <green>0</green>
+                    <blue>255</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                </inactive>
+                <disabled>
+                 <colorrole role="ButtonText">
+                  <brush brushstyle="SolidPattern">
+                   <color alpha="255">
+                    <red>118</red>
+                    <green>118</green>
+                    <blue>117</blue>
+                   </color>
+                  </brush>
+                 </colorrole>
+                </disabled>
+               </palette>
+              </property>
+              <property name="font">
+               <font>
+                <weight>50</weight>
+                <italic>false</italic>
+                <bold>false</bold>
+                <underline>true</underline>
+               </font>
+              </property>
+              <property name="text">
+               <string>&Check for Updates now</string>
+              </property>
+              <property name="toolButtonStyle">
+               <enum>Qt::ToolButtonTextOnly</enum>
+              </property>
+              <property name="autoRaise">
+               <bool>true</bool>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </item>
+          <item>
+           <layout class="QHBoxLayout" name="horizontalLayout_8">
+            <item>
+             <widget class="QLabel" name="label_21">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Last Checked For Updates: </string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QLabel" name="updateLastChecked">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>TextLabel</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <spacer name="horizontalSpacer_3">
+              <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>
+           <widget class="QCheckBox" name="allowEarlyUpdates">
+            <property name="toolTip">
+             <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If your interested in helping test new features and bugfixes early, click here.</p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">But please be warned this will sometimes mean breaky code..</span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html></string>
+            </property>
+            <property name="text">
+             <string>I want to try experimental and test builds (Advanced users only please.)</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </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>
+      </layout>
+     </widget>
+     <widget class="QWidget" name="appearanceTab">
+      <attribute name="title">
+       <string>&Appearance</string>
+      </attribute>
+      <layout class="QVBoxLayout" name="verticalLayout_11">
+       <property name="spacing">
+        <number>4</number>
+       </property>
+       <property name="leftMargin">
+        <number>2</number>
+       </property>
+       <property name="topMargin">
+        <number>2</number>
+       </property>
+       <property name="rightMargin">
+        <number>2</number>
+       </property>
+       <property name="bottomMargin">
+        <number>2</number>
+       </property>
+       <item>
+        <layout class="QHBoxLayout" name="horizontalLayout_13">
+         <property name="spacing">
+          <number>8</number>
+         </property>
+         <item>
+          <widget class="QGroupBox" name="groupBox">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="title">
+            <string>Graph Settings</string>
+           </property>
+           <layout class="QGridLayout" name="gridLayout_5">
+            <item row="2" column="1" colspan="2">
+             <widget class="QComboBox" name="overviewLinecharts">
+              <item>
+               <property name="text">
+                <string>Bar Tops</string>
+               </property>
+              </item>
+              <item>
+               <property name="text">
+                <string>Line Chart</string>
+               </property>
+              </item>
+             </widget>
+            </item>
+            <item row="2" column="0">
+             <widget class="QLabel" name="label_47">
+              <property name="text">
+               <string>Overview Linecharts</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item row="7" 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="1" colspan="2">
+             <layout class="QHBoxLayout" name="horizontalLayout_16">
+              <item>
+               <widget class="QSlider" name="scrollDampeningSlider">
+                <property name="toolTip">
+                 <string><html><head/><body><p>This makes scrolling when zoomed in easier on sensitive bidirectional TouchPads</p><p>50ms is recommended value.</p></body></html></string>
+                </property>
+                <property name="maximum">
+                 <number>25</number>
+                </property>
+                <property name="singleStep">
+                 <number>1</number>
+                </property>
+                <property name="pageStep">
+                 <number>5</number>
+                </property>
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+                <property name="invertedAppearance">
+                 <bool>false</bool>
+                </property>
+                <property name="tickPosition">
+                 <enum>QSlider::TicksBelow</enum>
+                </property>
+                <property name="tickInterval">
+                 <number>1</number>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLCDNumber" name="scrollDampDisplay">
+                <property name="toolTip">
+                 <string>milliseconds</string>
+                </property>
+                <property name="frameShape">
+                 <enum>QFrame::StyledPanel</enum>
+                </property>
+                <property name="digitCount">
+                 <number>3</number>
+                </property>
+                <property name="segmentStyle">
+                 <enum>QLCDNumber::Flat</enum>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item row="5" column="1" colspan="2">
+             <layout class="QHBoxLayout" name="horizontalLayout_17">
+              <item>
+               <widget class="QSlider" name="tooltipTimeoutSlider">
+                <property name="toolTip">
+                 <string>How long you want the tooltips to stay visible.</string>
+                </property>
+                <property name="minimum">
+                 <number>1</number>
+                </property>
+                <property name="maximum">
+                 <number>150</number>
+                </property>
+                <property name="singleStep">
+                 <number>10</number>
+                </property>
+                <property name="pageStep">
+                 <number>50</number>
+                </property>
+                <property name="value">
+                 <number>1</number>
+                </property>
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+                <property name="tickPosition">
+                 <enum>QSlider::TicksBelow</enum>
+                </property>
+                <property name="tickInterval">
+                 <number>10</number>
+                </property>
+               </widget>
+              </item>
+              <item>
+               <widget class="QLCDNumber" name="tooltipMS">
+                <property name="frameShape">
+                 <enum>QFrame::StyledPanel</enum>
+                </property>
+                <property name="digitCount">
+                 <number>5</number>
+                </property>
+                <property name="segmentStyle">
+                 <enum>QLCDNumber::Flat</enum>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+            <item row="6" column="0">
+             <widget class="QLabel" name="label_46">
+              <property name="text">
+               <string>Scroll Dampening</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item row="5" column="0">
+             <widget class="QLabel" name="label_45">
+              <property name="text">
+               <string>Tooltip Timeout</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="1">
+             <widget class="QSpinBox" name="graphHeight">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="toolTip">
+               <string>Default display height of graphs in pixels</string>
+              </property>
+              <property name="minimum">
+               <number>50</number>
+              </property>
+              <property name="maximum">
+               <number>600</number>
+              </property>
+              <property name="singleStep">
+               <number>10</number>
+              </property>
+              <property name="value">
+               <number>180</number>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="2">
+             <widget class="QCheckBox" name="graphTooltips">
+              <property name="text">
+               <string>Graph Tooltips</string>
+              </property>
+             </widget>
+            </item>
+            <item row="0" column="1" colspan="2">
+             <widget class="QComboBox" name="overlayFlagsCombo">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="toolTip">
+               <string>The visual method of displaying waveform overlay flags.
+</string>
+              </property>
+              <item>
+               <property name="text">
+                <string>Standard Bars</string>
+               </property>
+              </item>
+              <item>
+               <property name="text">
+                <string>Top Markers</string>
+               </property>
+              </item>
+             </widget>
+            </item>
+            <item row="3" column="0">
+             <widget class="QLabel" name="label_26">
+              <property name="text">
+               <string>Graph Height</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item row="0" column="0">
+             <widget class="QLabel" name="label_18">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Overlay Flags</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item row="4" column="0">
+             <widget class="QLabel" name="label_48">
+              <property name="text">
+               <string>Line Thickness</string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item row="4" column="1" colspan="2">
+             <layout class="QHBoxLayout" name="horizontalLayout_10">
+              <item>
+               <widget class="QSlider" name="lineThicknessSlider">
+                <property name="toolTip">
+                 <string>The pixel thickness of line plots</string>
+                </property>
+                <property name="minimum">
+                 <number>2</number>
+                </property>
+                <property name="maximum">
+                 <number>8</number>
+                </property>
+                <property name="pageStep">
+                 <number>1</number>
+                </property>
+                <property name="orientation">
+                 <enum>Qt::Horizontal</enum>
+                </property>
+                <property name="tickPosition">
+                 <enum>QSlider::TicksBelow</enum>
+                </property>
+               </widget>
+              </item>
+             </layout>
+            </item>
+           </layout>
+          </widget>
+         </item>
+         <item>
+          <widget class="Line" name="line_2">
+           <property name="frameShadow">
+            <enum>QFrame::Sunken</enum>
+           </property>
+           <property name="lineWidth">
+            <number>1</number>
+           </property>
+           <property name="midLineWidth">
+            <number>0</number>
+           </property>
+           <property name="orientation">
+            <enum>Qt::Vertical</enum>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QGroupBox" name="groupBox_2">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="title">
+            <string>Other Visual Settings</string>
+           </property>
+           <layout class="QVBoxLayout" name="verticalLayout_7">
+            <item>
+             <widget class="QCheckBox" name="useAntiAliasing">
+              <property name="toolTip">
+               <string>Anti-Aliasing applies smoothing to graph plots.. 
+Certain plots look more attractive with this on. 
+This also affects printed reports.
+
+Try it and see if you like it.</string>
+              </property>
+              <property name="text">
+               <string>Use Anti-Aliasing</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="useSquareWavePlots">
+              <property name="toolTip">
+               <string>Makes certain plots look more "square waved".</string>
+              </property>
+              <property name="text">
+               <string>Square Wave Plots</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="enableGraphSnapshots">
+              <property name="toolTip">
+               <string>Allows graphs to be "screenshotted" for display purposes.
+The Event Breakdown PIE chart uses this method, as does
+the printing code.
+Unfortunately some older computers/versions of Qt can cause
+this application to be unstable with this feature enabled.</string>
+              </property>
+              <property name="text">
+               <string>Show event breakdown pie chart</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="usePixmapCaching">
+              <property name="toolTip">
+               <string>Pixmap caching is an graphics acceleration technique. May cause problems with font drawing in graph display area on your platform.</string>
+              </property>
+              <property name="text">
+               <string>Use Pixmap Caching</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="animationsAndTransitionsCheckbox">
+              <property name="toolTip">
+               <string><html><head/><body><p>These features have recently been pruned. They will come back later. </p></body></html></string>
+              </property>
+              <property name="text">
+               <string>Animations && Fancy Stuff</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="skipEmptyDays">
+              <property name="toolTip">
+               <string>Daily view navigation buttons will skip over days without data records</string>
+              </property>
+              <property name="text">
+               <string>Skip over Empty Days</string>
+              </property>
+             </widget>
+            </item>
+            <item>
+             <widget class="QCheckBox" name="allowYAxisScaling">
+              <property name="toolTip">
+               <string>Whether to allow changing yAxis scales by double clicking on yAxis labels</string>
+              </property>
+              <property name="text">
+               <string>Allow YAxis Scaling</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item>
+        <widget class="Line" name="line_5">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QGroupBox" name="fontGroupBox">
+         <property name="title">
+          <string>Fonts (Application wide settings)</string>
+         </property>
+         <property name="flat">
+          <bool>false</bool>
+         </property>
+         <layout class="QVBoxLayout" name="verticalLayout_12">
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>4</number>
+          </property>
+          <property name="rightMargin">
+           <number>0</number>
+          </property>
+          <property name="bottomMargin">
+           <number>4</number>
+          </property>
+          <item>
+           <layout class="QGridLayout" name="gridLayout_3">
+            <item row="0" column="1">
+             <widget class="QLabel" name="label_19">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="font">
+               <font>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Font</string>
+              </property>
+             </widget>
+            </item>
+            <item row="0" column="2">
+             <widget class="QLabel" name="label_14">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="font">
+               <font>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Size</string>
+              </property>
+             </widget>
+            </item>
+            <item row="0" column="3">
+             <widget class="QLabel" name="label_15">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="font">
+               <font>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Bold  </string>
+              </property>
+              <property name="alignment">
+               <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+              </property>
+             </widget>
+            </item>
+            <item row="0" column="4">
+             <widget class="QLabel" name="label_16">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="font">
+               <font>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Italic</string>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="0">
+             <widget class="QLabel" name="label_10">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Application</string>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="1">
+             <widget class="QFontComboBox" name="applicationFont"/>
+            </item>
+            <item row="1" column="2">
+             <widget class="QSpinBox" name="applicationFontSize">
+              <property name="maximumSize">
+               <size>
+                <width>80</width>
+                <height>16777215</height>
+               </size>
+              </property>
+              <property name="minimum">
+               <number>6</number>
+              </property>
+              <property name="maximum">
+               <number>30</number>
+              </property>
+              <property name="value">
+               <number>10</number>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="3">
+             <widget class="QCheckBox" name="applicationFontBold">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="layoutDirection">
+               <enum>Qt::LeftToRight</enum>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+             </widget>
+            </item>
+            <item row="1" column="4">
+             <widget class="QCheckBox" name="applicationFontItalic">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="0">
+             <widget class="QLabel" name="label_11">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Graph Text</string>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="1">
+             <widget class="QFontComboBox" name="graphFont"/>
+            </item>
+            <item row="2" column="2">
+             <widget class="QSpinBox" name="graphFontSize">
+              <property name="maximumSize">
+               <size>
+                <width>80</width>
+                <height>16777215</height>
+               </size>
+              </property>
+              <property name="minimum">
+               <number>6</number>
+              </property>
+              <property name="maximum">
+               <number>40</number>
+              </property>
+              <property name="value">
+               <number>11</number>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="3">
+             <widget class="QCheckBox" name="graphFontBold">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+             </widget>
+            </item>
+            <item row="2" column="4">
+             <widget class="QCheckBox" name="graphFontItalic">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="0">
+             <widget class="QLabel" name="label_12">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Graph Titles</string>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="1">
+             <widget class="QFontComboBox" name="titleFont"/>
+            </item>
+            <item row="3" column="2">
+             <widget class="QSpinBox" name="titleFontSize">
+              <property name="maximumSize">
+               <size>
+                <width>80</width>
+                <height>16777215</height>
+               </size>
+              </property>
+              <property name="minimum">
+               <number>6</number>
+              </property>
+              <property name="maximum">
+               <number>40</number>
+              </property>
+              <property name="value">
+               <number>14</number>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="3">
+             <widget class="QCheckBox" name="titleFontBold">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+             </widget>
+            </item>
+            <item row="3" column="4">
+             <widget class="QCheckBox" name="titleFontItalic">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+             </widget>
+            </item>
+            <item row="4" column="0">
+             <widget class="QLabel" name="label_13">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string>Big  Text</string>
+              </property>
+             </widget>
+            </item>
+            <item row="4" column="1">
+             <widget class="QFontComboBox" name="bigFont"/>
+            </item>
+            <item row="4" column="2">
+             <widget class="QSpinBox" name="bigFontSize">
+              <property name="maximumSize">
+               <size>
+                <width>80</width>
+                <height>16777215</height>
+               </size>
+              </property>
+              <property name="minimum">
+               <number>6</number>
+              </property>
+              <property name="maximum">
+               <number>72</number>
+              </property>
+              <property name="value">
+               <number>18</number>
+              </property>
+             </widget>
+            </item>
+            <item row="4" column="3">
+             <widget class="QCheckBox" name="bigFontBold">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+             </widget>
+            </item>
+            <item row="4" column="4">
+             <widget class="QCheckBox" name="bigFontItalic">
+              <property name="sizePolicy">
+               <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+                <horstretch>0</horstretch>
+                <verstretch>0</verstretch>
+               </sizepolicy>
+              </property>
+              <property name="text">
+               <string/>
+              </property>
+             </widget>
+            </item>
+            <item row="0" column="0">
+             <widget class="QLabel" name="label_30">
+              <property name="font">
+               <font>
+                <weight>75</weight>
+                <bold>true</bold>
+               </font>
+              </property>
+              <property name="text">
+               <string>Details</string>
+              </property>
+             </widget>
+            </item>
+           </layout>
+          </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>
+   </item>
+   <item>
+    <widget class="QWidget" name="widget_2" native="true">
+     <layout class="QHBoxLayout" name="horizontalLayout_9">
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
+       <number>0</number>
+      </property>
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <item>
+       <spacer name="horizontalSpacer_5">
+        <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="cancelButton">
+        <property name="text">
+         <string>&Cancel</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QPushButton" name="okButton">
+        <property name="text">
+         <string>&Ok</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>cancelButton</sender>
+   <signal>clicked()</signal>
+   <receiver>PreferencesDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>757</x>
+     <y>605</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/sleepyhead/profileselect.cpp b/sleepyhead/profileselect.cpp
new file mode 100644
index 0000000..f3a2b4b
--- /dev/null
+++ b/sleepyhead/profileselect.cpp
@@ -0,0 +1,402 @@
+/* Profile Select Implementation (Login Screen)
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include "profileselect.h"
+#include <QDebug>
+#include <QStringListModel>
+#include <QStandardItem>
+#include <QDialog>
+#include <QLineEdit>
+#include <QVBoxLayout>
+#include <QCryptographicHash>
+#include <QMessageBox>
+#include <QHostInfo>
+#include <QTimer>
+#include <QFontMetrics>
+#include <QDir>
+#include "ui_profileselect.h"
+#include "SleepLib/profiles.h"
+#include "newprofile.h"
+#include "mainwindow.h"
+
+ProfileSelect::ProfileSelect(QWidget *parent) :
+    QDialog(parent),
+    ui(new Ui::ProfileSelect)
+{
+    ui->setupUi(this);
+    QStringList str;
+    model = new QStandardItemModel(0, 0);
+
+    int i = 0;
+    int sel = -1;
+    QString name;
+
+    QIcon icon(":/icons/moon.png");
+
+    int w=0;
+    QFont font("Sans Serif", 18, QFont::Bold, false);
+    ui->listView->setFont(font);
+
+    QFontMetrics fm(font);
+    for (QMap<QString, Profile *>::iterator p = Profiles::profiles.begin();
+            p != Profiles::profiles.end(); p++) {
+        name = p.key();
+
+        if (PREF.contains(STR_GEN_Profile) && (name == PREF[STR_GEN_Profile].toString())) {
+            sel = i;
+        }
+
+        QStandardItem *item = new QStandardItem(name);
+
+        item->setData(p.key(), Qt::UserRole+2);
+        item->setEditable(false);
+
+        if (!(*p)->checkLock().isEmpty()) {
+            item->setForeground(QBrush(Qt::red));
+            item->setText(name+" (open)");
+        }
+
+        QRect rect = fm.boundingRect(name);
+        if (rect.width() > w) w = rect.width();
+
+        // Profile fonts arern't loaded yet.. Using generic font.
+        item->setFont(font);
+        model->appendRow(item);
+        i++;
+    }
+    w+=20;
+    ui->listView->setMinimumWidth(w);
+
+    proxy = new QSortFilterProxyModel(this);
+    proxy->setSourceModel(model);
+    proxy->setSortCaseSensitivity(Qt::CaseInsensitive);
+
+    ui->listView->setModel(proxy);
+    ui->listView->setSelectionBehavior(QAbstractItemView::SelectRows);
+    ui->listView->setSelectionMode(QAbstractItemView::SingleSelection);
+
+    if (sel >= 0) { ui->listView->setCurrentIndex(proxy->index(sel,0)); } //model->item(sel)->index()); }
+
+    proxy->sort(0, Qt::AscendingOrder);
+
+    m_tries = 0;
+
+    /*PREF["SkipLogin"]=false;
+    if ((i==1) && PREF["SkipLogin"].toBool()) {
+        if (!Profiles::profiles.contains(name))
+            PREF[STR_GEN_Profile]=name;
+        QTimer::singleShot(0,this,SLOT(earlyExit()));
+        hide();
+    } */
+    popupMenu = new QMenu(this);
+    popupMenu->addAction(tr("Open Profile"), this, SLOT(openProfile()));
+    popupMenu->addAction(tr("Edit Profile"), this, SLOT(editProfile()));
+    popupMenu->addSeparator();
+    popupMenu->addAction(tr("Delete Profile"), this, SLOT(deleteProfile()));
+
+    ui->labelAppName->setText(STR_TR_SleepyHead);
+    ui->labelVersion->setText("v" + VersionString + " " + ReleaseStatus);
+    //    if (GIT_BRANCH!="master")
+    //        ui->labelBuild->setText(GIT_BRANCH);
+    //    else ui->labelBuild->setText(QString());
+    ui->labelFolder->setText(GetAppRoot());
+    ui->labelFolder->setToolTip("Current SleepyHead data folder\n" + GetAppRoot());
+
+    ui->listView->verticalScrollBar()->setStyleSheet("QScrollBar:vertical {border: 0px solid grey; background: transparent; }"
+    "QScrollBar::handle:vertical {"
+    "    background: qlineargradient(x1:0, y1:0, x2:1, y2:0,"
+    "    stop: 0  rgb(230, 230, 230), stop: 0.5 rgb(255, 255, 255),  stop:1 rgb(230, 230, 230));"
+    "    min-height: 0px;"
+    "    border: 1px solid gray;"
+    "   border-radius: 5px;"
+    "}");
+}
+
+ProfileSelect::~ProfileSelect()
+{
+    delete model; // why is this not being cleaned up by Qt?
+    delete popupMenu;
+    delete ui;
+}
+void ProfileSelect::earlyExit()
+{
+    accept();
+}
+void ProfileSelect::editProfile()
+{
+    QString name = ui->listView->currentIndex().data(Qt::UserRole+2).toString();
+    Profile *profile = Profiles::Get(name);
+
+    if (!profile) { return; }
+    if (!profile->isOpen()) {
+        profile->Open();
+    }
+
+    bool reallyEdit = false;
+
+    if (profile->user->hasPassword()) {
+        QDialog dialog(this, Qt::Dialog);
+        QLineEdit *e = new QLineEdit(&dialog);
+        e->setEchoMode(QLineEdit::Password);
+        dialog.connect(e, SIGNAL(returnPressed()), &dialog, SLOT(accept()));
+        dialog.setWindowTitle(tr("Enter Password for %1").arg(name));
+        dialog.setMinimumWidth(300);
+        QVBoxLayout *lay = new QVBoxLayout();
+        dialog.setLayout(lay);
+        lay->addWidget(e);
+        int tries = 0;
+
+        do {
+            e->setText("");
+
+            if (dialog.exec() != QDialog::Accepted) { break; }
+
+            tries++;
+
+            if (profile->user->checkPassword(e->text())) {
+                reallyEdit = true;
+                break;
+            } else {
+                if (tries < 3) {
+                    QMessageBox::warning(this, STR_MessageBox_Error, tr("Incorrect Password"), QMessageBox::Ok);
+                } else {
+                    QMessageBox::warning(this, STR_MessageBox_Error, tr("You entered the password wrong too many times."),
+                                         QMessageBox::Ok);
+                    reject();
+                }
+            }
+        } while (tries < 3);
+    } else { reallyEdit = true; }
+
+    if (reallyEdit) {
+        NewProfile newprof(this);
+        newprof.edit(name);
+        newprof.exec();
+    }
+
+    //qDebug() << "edit" << name;
+}
+void ProfileSelect::deleteProfile()
+{
+    QString name = ui->listView->currentIndex().data(Qt::UserRole+2).toString();
+
+    QDialog confirmdlg;
+    QVBoxLayout layout(&confirmdlg);
+    QLabel message(QString("<b>"+STR_MessageBox_Warning+":</b> "+tr("You are about to destroy profile '%1'.")+"<br/><br/>"+tr("Enter the word DELETE below to confirm.")).arg(name), &confirmdlg);
+    layout.insertWidget(0,&message,1);
+    QLineEdit lineedit(&confirmdlg);
+    layout.insertWidget(1, &lineedit, 1);
+    QHBoxLayout layout2;
+    layout.insertLayout(2,&layout2,1);
+    QPushButton cancel(QString("&Cancel"), &confirmdlg);
+    QPushButton accept(QString("&Delete Profile"), &confirmdlg);
+    layout2.addWidget(&cancel);
+    layout2.addStretch(1);
+    layout2.addWidget(&accept);
+    confirmdlg.connect(&cancel, SIGNAL(clicked()), &confirmdlg, SLOT(reject()));
+    confirmdlg.connect(&accept, SIGNAL(clicked()), &confirmdlg, SLOT(accept()));
+    confirmdlg.connect(&lineedit, SIGNAL(returnPressed()), &confirmdlg, SLOT(accept()));
+
+    if (confirmdlg.exec() != QDialog::Accepted)
+        return;
+
+    if (lineedit.text().compare("DELETE")!=0) {
+        QMessageBox::information(NULL, tr("Sorry"), tr("You need to enter DELETE in capital letters."), QMessageBox::Ok);
+        return;
+    }
+
+    Profile * profile = Profiles::profiles[name];
+    p_profile = profile;
+    if (!profile->Open()) {
+        QMessageBox::warning(this, STR_MessageBox_Error,
+            QString(tr("Could not open profile.. You will need to delete this profile directory manually")+
+            "\n\n"+tr("You will find it under the following location:")+"\n\n%1").arg(QDir::toNativeSeparators(GetAppRoot() + "/Profiles/" + profile->user->userName())), QMessageBox::Ok);
+            return;
+    }
+    bool reallydelete = false;
+    if (profile->user->hasPassword()) {
+        QDialog dialog(this, Qt::Dialog);
+        QLineEdit *e = new QLineEdit(&dialog);
+        e->setEchoMode(QLineEdit::Password);
+        dialog.connect(e, SIGNAL(returnPressed()), &dialog, SLOT(accept()));
+        dialog.setWindowTitle(tr("Enter Password for %1").arg(name));
+        dialog.setMinimumWidth(300);
+        QVBoxLayout *lay = new QVBoxLayout();
+        dialog.setLayout(lay);
+        lay->addWidget(e);
+        int tries = 0;
+
+        do {
+            e->setText("");
+
+            if (dialog.exec() != QDialog::Accepted) { break; }
+
+            tries++;
+
+            if (profile->user->checkPassword(e->text())) {
+                reallydelete = true;
+                break;
+            } else {
+                if (tries < 3) {
+                    QMessageBox::warning(this, STR_MessageBox_Error, tr("You entered an incorrect password"), QMessageBox::Ok);
+                } else {
+                    QMessageBox::warning(this, STR_MessageBox_Error,
+                                         tr("If you're trying to delete because you forgot the password, you need to delete it manually."),
+                                         QMessageBox::Ok);
+                }
+            }
+        } while (tries < 3);
+    } else { reallydelete = true; }
+
+    if (reallydelete) {
+        QString path = profile->Get(PrefMacro(STR_GEN_DataFolder));
+
+        if (!path.isEmpty()) {
+            if (!removeDir(path)) {
+                QMessageBox::information(this, STR_MessageBox_Error,
+                                         tr("There was an error deleting the profile directory, you need to manually remove it.")+QString("\n\n%1").arg(path),
+                                         QMessageBox::Ok);
+            }
+            qDebug() << "Delete" << path;
+            QMessageBox::information(this, STR_MessageBox_Information, QString(tr("Profile '%1' was succesfully deleted").arg(name)),QMessageBox::Ok);
+        }
+
+        model->removeRow(ui->listView->currentIndex().row());
+        delete p_profile;
+        p_profile = nullptr;
+    }
+}
+
+//! \fn ProfileSelect::QuickLogin()
+//! \brief For programmatically bypassing the login window
+void ProfileSelect::QuickLogin()
+{
+    on_listView_activated(ui->listView->currentIndex());
+}
+
+void ProfileSelect::on_selectButton_clicked()
+{
+    on_listView_activated(ui->listView->currentIndex());
+}
+void ProfileSelect::openProfile()
+{
+    on_listView_activated(ui->listView->currentIndex());
+}
+
+void ProfileSelect::on_newProfileButton_clicked()
+{
+    NewProfile newprof(this);
+    newprof.skipWelcomeScreen();
+    newprof.setWindowTitle(tr("Create new profile"));
+
+    if (newprof.exec() == NewProfile::Rejected) {
+        //        reject();
+    } else { accept(); }
+}
+
+
+//! \fn ProfileSelect::on_listView_activated(const QModelIndex &index)
+//! \brief Process the selected login, requesting passwords if required.
+void ProfileSelect::on_listView_activated(const QModelIndex &index)
+{
+    QString name = index.data(Qt::UserRole+2).toString();
+    Profile *profile = Profiles::profiles[name];
+
+    if (!profile) { return; }
+    if (!profile->isOpen()) {
+        QString lockhost = profile->checkLock();
+
+        if (!lockhost.isEmpty()) {
+            if (lockhost.compare(QHostInfo::localHostName()) == 0) {
+                // Localhost has it locked..
+                if (QMessageBox::warning(nullptr, STR_MessageBox_Warning,
+                                      QObject::tr("There is a lockfile already present for profile '%1'.").arg(name)+"\n\n"+
+                                      QObject::tr("You can only work with one instance of an individual SleepyHead profile at a time.")+"\n\n"+
+                                      QObject::tr("Please close any other instances of SleepyHead running with this profile before proceeding.")+"\n\n"+
+                                      QObject::tr("If no other instances of SleepyHead are running, (eg, it crashed last time!), it is safe to ignore this message."),
+                                      QMessageBox::Cancel |QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Cancel) {
+                    return;
+                }
+
+            } else {
+                if (QMessageBox::warning(nullptr, STR_MessageBox_Warning,
+                                      QObject::tr("There is a lockfile already present for this profile '%1', claimed on '%2'.").arg(name).arg(lockhost)+"\n\n"+
+                                      QObject::tr("You can only work with one instance of an individual SleepyHead profile at a time.")+"\n\n"+
+                                      QObject::tr("If you are using cloud storage, make sure SleepyHead is closed and syncing has completed first on the other computer before proceeding."),
+                                      QMessageBox::Cancel |QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Cancel) {
+                    return;
+                }
+            }
+
+            profile->removeLock();
+        }
+
+        p_profile = profile;
+        profile->Open();
+        // Do this in case user renames the directory (otherwise it won't load)
+        // Essentially makes the folder name the user name, but whatever..
+        // TODO: Change the profile editor one day to make it rename the actual folder
+        profile->p_preferences[STR_UI_UserName] = name;
+    }
+
+    if (!profile->user->hasPassword()) {
+        m_selectedProfile = name;
+        PREF[STR_GEN_Profile] = name;
+        accept();
+        return;
+    } else {
+        int tries = 0;
+
+        do {
+            QDialog dialog(this, Qt::Dialog);
+            QLineEdit *e = new QLineEdit(&dialog);
+            e->setEchoMode(QLineEdit::Password);
+            dialog.connect(e, SIGNAL(returnPressed()), &dialog, SLOT(accept()));
+            dialog.setWindowTitle(tr("Enter Password"));
+            QVBoxLayout *lay = new QVBoxLayout();
+            dialog.setLayout(lay);
+            lay->addWidget(e);
+            dialog.exec();
+
+            if (profile->user->checkPassword(e->text())) {
+                m_selectedProfile = name;
+                PREF[STR_GEN_Profile] = name;
+                accept();
+                return;
+            }
+
+            tries++;
+
+            if (tries < 3) {
+                QMessageBox::warning(this, STR_MessageBox_Error, tr("Incorrect Password"), QMessageBox::Ok);
+            } else {
+                QMessageBox::warning(this, STR_MessageBox_Error,
+                                     tr("You entered an Incorrect Password too many times. Exiting!"), QMessageBox::Ok);
+            }
+        } while (tries < 3);
+    }
+
+    reject();
+    return;
+}
+
+void ProfileSelect::on_listView_customContextMenuRequested(const QPoint &pos)
+{
+    popupMenu->popup(QWidget::mapToGlobal(pos));
+}
+
+void ProfileSelect::on_pushButton_clicked()
+{
+    MainWindow::RestartApplication(false, true);
+}
+
+void ProfileSelect::on_filter_textChanged(const QString &arg1)
+{
+    QRegExp regExp("*"+arg1+"*", Qt::CaseInsensitive, QRegExp::Wildcard);
+    proxy->setFilterRegExp(regExp);
+}
diff --git a/sleepyhead/profileselect.h b/sleepyhead/profileselect.h
new file mode 100644
index 0000000..1401057
--- /dev/null
+++ b/sleepyhead/profileselect.h
@@ -0,0 +1,62 @@
+/* Profile Select Header (Login Screen)
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef PROFILESELECT_H
+#define PROFILESELECT_H
+
+#include <QDialog>
+#include <QModelIndex>
+#include <QStandardItemModel>
+#include <QSortFilterProxyModel>
+#include <QMenu>
+
+namespace Ui {
+class ProfileSelect;
+}
+
+/*! \class ProfileSelect
+    \brief Simple Login Window providing a list of all profiles to select from
+    */
+class ProfileSelect : public QDialog
+{
+    Q_OBJECT
+
+  public:
+    explicit ProfileSelect(QWidget *parent = 0);
+    ~ProfileSelect();
+
+    QString selectedProfile();
+    void QuickLogin();
+  private slots:
+    void on_selectButton_clicked();
+
+    void on_newProfileButton_clicked();
+
+    void on_listView_activated(const QModelIndex &index);
+    void earlyExit();
+
+    void openProfile();
+    void editProfile();
+    void deleteProfile();
+
+    void on_listView_customContextMenuRequested(const QPoint &pos);
+
+    void on_pushButton_clicked();
+
+    void on_filter_textChanged(const QString &arg1);
+
+private:
+    Ui::ProfileSelect *ui;
+    QString m_selectedProfile;
+    int m_tries;
+    QMenu *popupMenu;
+    QStandardItemModel *model;
+    QSortFilterProxyModel *proxy;
+};
+
+#endif // PROFILESELECT_H
diff --git a/sleepyhead/profileselect.ui b/sleepyhead/profileselect.ui
new file mode 100644
index 0000000..f3bf559
--- /dev/null
+++ b/sleepyhead/profileselect.ui
@@ -0,0 +1,419 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ProfileSelect</class>
+ <widget class="QDialog" name="ProfileSelect">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>418</width>
+    <height>272</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Select Profile</string>
+  </property>
+  <property name="windowIcon">
+   <iconset resource="Resources.qrc">
+    <normaloff>:/icons/bob-v3.0.png</normaloff>:/icons/bob-v3.0.png</iconset>
+  </property>
+  <property name="styleSheet">
+   <string notr="true">QDialog {
+ background:  qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(240, 240, 240, 255), stop:1 rgba(220, 220, 220, 255));
+}
+
+QGroupBox {
+     background-color: white;
+     border: 1px solid gray;
+     border-radius: 5px;
+     margin-top: 3ex; /* leave space at the top for the title */
+ }
+
+ QGroupBox::title {
+     subcontrol-origin: margin;
+     subcontrol-position: top center; /* position at the top center */
+     padding: 2px;
+     background-color: white;
+}
+
+QFrame {
+background:  white;
+border: 1px solid gray;
+border-radius: 10px;
+}
+
+QLabel {
+background: transparent;
+border: 0px;
+}
+
+QPushButton {
+background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(240, 240, 240, 255), stop:1 rgba(255, 255, 255, 255));
+border: 1px solid gray;
+border-radius: 10px;
+padding: 3px;
+padding-left: 20px;
+padding-right: 20px;
+}
+
+QPushButton:hover {
+background: white;
+border: 2px solid gray;
+}
+
+QPushButton:pressed {
+background: gray;
+}
+
+QLineEdit {
+border-radius: 5px;
+border: 1px solid gray;
+background: white;
+}</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout_3">
+   <property name="spacing">
+    <number>6</number>
+   </property>
+   <property name="leftMargin">
+    <number>6</number>
+   </property>
+   <property name="topMargin">
+    <number>6</number>
+   </property>
+   <property name="rightMargin">
+    <number>6</number>
+   </property>
+   <property name="bottomMargin">
+    <number>6</number>
+   </property>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout_2">
+     <property name="spacing">
+      <number>6</number>
+     </property>
+     <item>
+      <widget class="QFrame" name="frame_3">
+       <property name="styleSheet">
+        <string notr="true"/>
+       </property>
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Raised</enum>
+       </property>
+       <layout class="QVBoxLayout" name="verticalLayout">
+        <item>
+         <layout class="QHBoxLayout" name="horizontalLayout">
+          <item>
+           <widget class="QLabel" name="label_2">
+            <property name="styleSheet">
+             <string notr="true">border: 0px;</string>
+            </property>
+            <property name="text">
+             <string>Search:</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLineEdit" name="filter">
+            <property name="styleSheet">
+             <string notr="true"/>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+        <item>
+         <widget class="QListView" name="listView">
+          <property name="contextMenuPolicy">
+           <enum>Qt::CustomContextMenu</enum>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">border: 0px;</string>
+          </property>
+          <property name="frameShape">
+           <enum>QFrame::NoFrame</enum>
+          </property>
+          <property name="sizeAdjustPolicy">
+           <enum>QAbstractScrollArea::AdjustToContents</enum>
+          </property>
+          <property name="verticalScrollMode">
+           <enum>QAbstractItemView::ScrollPerPixel</enum>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+     <item>
+      <widget class="QFrame" name="frame_2">
+       <property name="styleSheet">
+        <string notr="true">QFrame {
+background: qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(255, 255, 255, 255), stop:1 rgba(220, 220, 220, 255));
+};</string>
+       </property>
+       <property name="frameShape">
+        <enum>QFrame::StyledPanel</enum>
+       </property>
+       <property name="frameShadow">
+        <enum>QFrame::Raised</enum>
+       </property>
+       <layout class="QVBoxLayout" name="verticalLayout_2">
+        <property name="spacing">
+         <number>-1</number>
+        </property>
+        <property name="leftMargin">
+         <number>16</number>
+        </property>
+        <property name="topMargin">
+         <number>16</number>
+        </property>
+        <property name="rightMargin">
+         <number>16</number>
+        </property>
+        <property name="bottomMargin">
+         <number>16</number>
+        </property>
+        <item>
+         <widget class="QPushButton" name="selectButton">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="toolTip">
+           <string>Start with the selected user profile.</string>
+          </property>
+          <property name="text">
+           <string>&Select User</string>
+          </property>
+          <property name="icon">
+           <iconset resource="Resources.qrc">
+            <normaloff>:/icons/forward.png</normaloff>:/icons/forward.png</iconset>
+          </property>
+          <property name="autoDefault">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="Line" name="line_2">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="newProfileButton">
+          <property name="toolTip">
+           <string>Create a new user profile.</string>
+          </property>
+          <property name="text">
+           <string>New Profile</string>
+          </property>
+          <property name="autoDefault">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="Line" name="line">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QPushButton" name="pushButton">
+          <property name="toolTip">
+           <string>Choose a different SleepyHead data folder.</string>
+          </property>
+          <property name="styleSheet">
+           <string notr="true"/>
+          </property>
+          <property name="text">
+           <string>&Different Folder</string>
+          </property>
+          <property name="autoDefault">
+           <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>
+        <item>
+         <widget class="QLabel" name="labelAppName">
+          <property name="font">
+           <font>
+            <pointsize>15</pointsize>
+            <weight>75</weight>
+            <bold>true</bold>
+           </font>
+          </property>
+          <property name="styleSheet">
+           <string notr="true">border: 0px;</string>
+          </property>
+          <property name="text">
+           <string>SleepyHead</string>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignCenter</set>
+          </property>
+         </widget>
+        </item>
+        <item>
+         <widget class="QLabel" name="labelVersion">
+          <property name="styleSheet">
+           <string notr="true">border: 0px;</string>
+          </property>
+          <property name="text">
+           <string>[version]</string>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignCenter</set>
+          </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>40</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item>
+         <widget class="QPushButton" name="quitButton">
+          <property name="toolTip">
+           <string>Click here if you didn't want to start SleepyHead.</string>
+          </property>
+          <property name="text">
+           <string>&Quit</string>
+          </property>
+          <property name="autoDefault">
+           <bool>false</bool>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QFrame" name="frame">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="styleSheet">
+      <string notr="true"/>
+     </property>
+     <property name="frameShape">
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow">
+      <enum>QFrame::Plain</enum>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout_3">
+      <property name="spacing">
+       <number>4</number>
+      </property>
+      <property name="leftMargin">
+       <number>4</number>
+      </property>
+      <property name="topMargin">
+       <number>4</number>
+      </property>
+      <property name="rightMargin">
+       <number>4</number>
+      </property>
+      <property name="bottomMargin">
+       <number>4</number>
+      </property>
+      <item>
+       <widget class="QLabel" name="label">
+        <property name="font">
+         <font>
+          <weight>75</weight>
+          <bold>true</bold>
+         </font>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">border: 0px;</string>
+        </property>
+        <property name="text">
+         <string>Folder:</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="QLabel" name="labelFolder">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="toolTip">
+         <string>The current location of SleepyHead data store.</string>
+        </property>
+        <property name="styleSheet">
+         <string notr="true">border: 0px;</string>
+        </property>
+        <property name="text">
+         <string>[data directory]</string>
+        </property>
+        <property name="wordWrap">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources>
+  <include location="Resources.qrc"/>
+ </resources>
+ <connections>
+  <connection>
+   <sender>quitButton</sender>
+   <signal>clicked()</signal>
+   <receiver>ProfileSelect</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>52</x>
+     <y>276</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>199</x>
+     <y>149</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
diff --git a/sleepyhead/report.ui b/sleepyhead/report.ui
new file mode 100644
index 0000000..a158617
--- /dev/null
+++ b/sleepyhead/report.ui
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Report</class>
+ <widget class="QWidget" name="Report">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>549</width>
+    <height>338</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <property name="spacing">
+    <number>0</number>
+   </property>
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QWebView" name="webView">
+     <property name="url">
+      <url>
+       <string>about:blank</string>
+      </url>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>QWebView</class>
+   <extends>QWidget</extends>
+   <header>QtWebKit/QWebView</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/sleepyhead/reports.cpp b/sleepyhead/reports.cpp
new file mode 100644
index 0000000..e6f7841
--- /dev/null
+++ b/sleepyhead/reports.cpp
@@ -0,0 +1,669 @@
+/* Reports/Printing Module
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QMessageBox>
+#include <QtPrintSupport/qprinter.h>
+#include <QtPrintSupport/qprintdialog.h>
+// #include <QPrinter>
+//#include <QPrintDialog>
+#include <QTextDocument>
+#include <QProgressBar>
+#include <QApplication>
+#include <cmath>
+
+#include "reports.h"
+#include "mainwindow.h"
+#include "common_gui.h"
+
+extern QProgressBar *qprogress;
+extern MainWindow *mainwin;
+
+
+Report::Report()
+{
+}
+
+void Report::PrintReport(gGraphView *gv, QString name, QDate date)
+{
+    if (!gv) { return; }
+
+    Session *journal = nullptr;
+    //QDate d=QDate::currentDate();
+
+    int visgraphs = gv->visibleGraphs();
+
+    if (visgraphs == 0) {
+        mainwin->Notify(QObject::tr("There are no graphs visible to print"));
+        return;
+    }
+
+    QString username = p_profile->Get(QString("_{") + QString(STR_UI_UserName) + "}_");
+
+    bool print_bookmarks = false;
+
+    if (name == STR_TR_Daily) {
+        QVariantList book_start;
+        journal = mainwin->getDaily()->GetJournalSession(mainwin->getDaily()->getDate());
+
+        if (journal && journal->settings.contains(Bookmark_Start)) {
+            book_start = journal->settings[Bookmark_Start].toList();
+
+            if (book_start.size() > 0) {
+                if (QMessageBox::question(mainwin, STR_TR_Bookmarks,
+                                          QObject::tr("Would you like to show bookmarked areas in this report?"), QMessageBox::Yes,
+                                          QMessageBox::No) == QMessageBox::Yes) {
+                    print_bookmarks = true;
+                }
+            }
+        }
+    }
+
+    QPrinter *printer;
+
+    bool aa_setting = p_profile->appearance->antiAliasing();
+
+    bool force_antialiasing = aa_setting;
+
+    printer = new QPrinter(QPrinter::HighResolution);
+
+#ifdef Q_WS_X11
+    printer->setPrinterName("Print to File (PDF)");
+    printer->setOutputFormat(QPrinter::PdfFormat);
+    QString filename = PREF.Get("{home}/" + name + username + date.toString(Qt::ISODate) + ".pdf");
+
+    printer->setOutputFileName(filename);
+#endif
+    printer->setPrintRange(QPrinter::AllPages);
+    printer->setOrientation(QPrinter::Portrait);
+    printer->setFullPage(false); // This has nothing to do with scaling
+    printer->setNumCopies(1);
+    printer->setPageMargins(10, 10, 10, 10, QPrinter::Millimeter);
+    QPrintDialog dialog(printer);
+#ifdef Q_OS_MAC
+    // QTBUG-17913
+    QApplication::processEvents();
+#endif
+
+    if (dialog.exec() != QDialog::Accepted) {
+        delete printer;
+        return;
+    }
+
+
+    mainwin->Notify(
+        QObject::tr("This make take some time to complete..\nPlease don't touch anything until it's done."),
+        QObject::tr("Printing %1 Report").arg(name), 20000);
+    QPainter painter;
+    painter.begin(printer);
+
+    GLint gw;
+    gw = 2048; // Rough guess.. No GL_MAX_RENDERBUFFER_SIZE in mingw.. :(
+
+    //QSizeF pxres=printer->paperSize(QPrinter::DevicePixel);
+    QRect prect = printer->pageRect();
+    float ratio = float(prect.height()) / float(prect.width());
+    float virt_width = gw;
+    float virt_height = virt_width * ratio;
+    painter.setWindow(0, 0, virt_width, virt_height);
+    painter.setViewport(0, 0, prect.width(), prect.height());
+    painter.setViewTransformEnabled(true);
+
+    QFont report_font = *defaultfont;
+    QFont medium_font = *mediumfont;
+    QFont title_font = *bigfont;
+    float normal_height = 30; //fm2.ascent();
+    report_font.setPixelSize(normal_height);
+    medium_font.setPixelSize(40);
+    title_font.setPixelSize(90);
+    painter.setFont(report_font);
+
+    //QFontMetrics fm2(*defaultfont);
+
+    qDebug() << "Printer Resolution is" << virt_width << "x" << virt_height;
+
+    const int graphs_per_page = 6;
+    float full_graph_height = (virt_height - (normal_height * graphs_per_page)) / float(
+                                  graphs_per_page);
+
+    QString title = QObject::tr("%1 Report").arg(name);
+    painter.setFont(title_font);
+    int top = 0;
+    QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), title,
+                                         QTextOption(Qt::AlignHCenter | Qt::AlignTop));
+    painter.drawText(bounds, title, QTextOption(Qt::AlignHCenter | Qt::AlignTop));
+    top += bounds.height() + normal_height / 2.0;
+    painter.setFont(report_font);
+
+    int maxy = 0;
+
+    if (!p_profile->user->firstName().isEmpty()) {
+        QString userinfo = STR_TR_Name + QString(":\t %1, %2\n").arg(p_profile->user->lastName()).arg(
+                               p_profile->user->firstName());
+        userinfo += STR_TR_DOB + QString(":\t%1\n").arg(p_profile->user->DOB().toString(
+                        Qt::SystemLocaleShortDate));
+
+        if (!p_profile->doctor->patientID().isEmpty()) { userinfo += STR_TR_PatientID + QString(":\t%1\n").arg(p_profile->doctor->patientID()); }
+
+        userinfo += STR_TR_Phone + QString(":\t%1\n").arg(p_profile->user->phone());
+        userinfo += STR_TR_Email + QString(":\t%1\n").arg(p_profile->user->email());
+
+        if (!p_profile->user->address().isEmpty()) { userinfo += "\n" + STR_TR_Address + QString(":\n%1").arg(p_profile->user->address()); }
+
+        QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), userinfo,
+                                             QTextOption(Qt::AlignLeft | Qt::AlignTop));
+        painter.drawText(bounds, userinfo, QTextOption(Qt::AlignLeft | Qt::AlignTop));
+
+        if (bounds.height() > maxy) { maxy = bounds.height(); }
+    }
+
+    Machine *cpap = nullptr, *oxi = nullptr;
+
+    int graph_slots = 0;
+    Day * day = p_profile->GetGoodDay(mainwin->getDaily()->getDate(), MT_CPAP);
+    if (day) cpap = day->machine(MT_CPAP);
+
+    if (name == STR_TR_Daily) {
+
+        QString cpapinfo = date.toString(Qt::SystemLocaleLongDate) + "\n\n";
+
+
+        if (cpap) {
+            time_t f = day->first(MT_CPAP) / 1000L;
+            time_t l = day->last(MT_CPAP) / 1000L;
+            int tt = qint64(day->total_time(MT_CPAP)) / 1000L;
+            int h = tt / 3600;
+            int m = (tt / 60) % 60;
+            int s = tt % 60;
+
+            cpapinfo += STR_TR_MaskTime + QObject::tr(": %1 hours, %2 minutes, %3 seconds\n").arg(h).arg(
+                            m).arg(s);
+            cpapinfo += STR_TR_BedTime + ": " + QDateTime::fromTime_t(f).time().toString("HH:mm:ss") + " ";
+            cpapinfo += STR_TR_WakeUp + ": " + QDateTime::fromTime_t(l).time().toString("HH:mm:ss") + "\n\n";
+            QString submodel;
+            cpapinfo += STR_TR_Machine + ": ";
+
+//            if (cpap->machine->properties.find(STR_PROP_SubModel) != cpap->machine->properties.end()) {
+//                submodel = "\n" + cpap->machine->info.modeproperties[STR_PROP_SubModel];
+//            }
+
+            cpapinfo += cpap->brand() + " " +
+                        cpap->model() + submodel;
+            CPAPMode mode = (CPAPMode)(int)day->settings_max(CPAP_Mode);
+            cpapinfo += "\n" + STR_TR_Mode + ": ";
+
+            if (mode == MODE_CPAP) {
+                EventDataType min = round(day->settings_wavg(CPAP_Pressure) * 2) / 2.0;
+                cpapinfo += STR_TR_CPAP + " " + QString::number(min) + STR_UNIT_CMH2O;
+            } else if (mode == MODE_APAP) {
+                EventDataType min = day->settings_min(CPAP_PressureMin);
+                EventDataType max = day->settings_max(CPAP_PressureMax);
+                cpapinfo += STR_TR_APAP + " " + QString::number(min) + "-" + QString::number(max) + STR_UNIT_CMH2O;
+            } else if (mode == MODE_BILEVEL_FIXED) {
+                EventDataType epap = day->settings_min(CPAP_EPAP);
+                EventDataType ipap = day->settings_max(CPAP_IPAP);
+                EventDataType ps = day->settings_max(CPAP_PS);
+                cpapinfo += STR_TR_BiLevel +
+                        QString("\n" + STR_TR_EPAP + ": %1 " + STR_TR_IPAP + ": %2 %3\n" + STR_TR_PS + ": %4")
+                            .arg(epap, 0, 'f', 1).arg(ipap, 0, 'f', 1).arg(STR_UNIT_CMH2O).arg(ps, 0, 'f', 1);
+            } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+                EventDataType epap = day->settings_min(CPAP_EPAP);
+                EventDataType ipap = day->settings_max(CPAP_IPAP);
+                EventDataType ps = day->settings_max(CPAP_PS);
+                cpapinfo += STR_TR_BiLevel +
+                        QString("\n" + QObject::tr("Range")+ ": %1-%2 %3 " + QObject::tr("Fixed %1").arg(STR_TR_PS) + ": %4")
+                            .arg(epap, 0, 'f', 1).arg(ipap, 0, 'f', 1).arg(STR_UNIT_CMH2O).arg(ps, 0, 'f', 1);
+            } /*else if (mode == MODE_BILEVEL_AUTO_FIXED_EPAP_VARIABLE_PS) {
+                EventDataType epap = cpap->settings_min(CPAP_EPAP);
+                EventDataType ipap = cpap->settings_max(CPAP_IPAPHi);
+                EventDataType psl = cpap->settings_max(CPAP_PSMin);
+                EventDataType psh = cpap->settings_max(CPAP_PSMax);
+                cpapinfo += STR_TR_BiLevel +
+                        QString("\n" + QObject::tr("Fixed %1").arg(STR_TR_EPAP) + ": %1 %3" + QObject::tr("Max %1").arg(STR_TR_IPAP) + ": %2 %3\n" + QObject::tr("Variable %1").arg(STR_TR_PS) + ": %4-%5")
+                            .arg(epap, 0, 'f', 1).arg(ipap, 0, 'f', 1).arg(STR_UNIT_CMH2O).arg(psl,0,'f',1).arg(psh,0,'f',1);
+            } */else if (mode == MODE_ASV) {
+                EventDataType epap = day->settings_min(CPAP_EPAP);
+                EventDataType low = day->settings_min(CPAP_IPAPLo);
+                EventDataType high = day->settings_max(CPAP_IPAPHi);
+                EventDataType psl = day->settings_min(CPAP_PSMin);
+                EventDataType psh = day->settings_max(CPAP_PSMax);
+                cpapinfo += STR_TR_ASV + QString("\n" + STR_TR_EPAP + ": %1 " + STR_TR_IPAP + ": %2 - %3 %4\n" +
+                                                 STR_TR_PS + ": %5 / %6")
+                            .arg(epap, 0, 'f', 1)
+                            .arg(low, 0, 'f', 1)
+                            .arg(high, 0, 'f', 1)
+                            .arg(STR_UNIT_CMH2O)
+                            .arg(psl, 0, 'f', 1)
+                            .arg(psh, 0, 'f', 1);
+            } else { cpapinfo += STR_TR_Unknown; }
+
+            float ahi = (day->count(CPAP_Obstructive) + day->count(CPAP_Hypopnea) +
+                         day->count(CPAP_ClearAirway) + day->count(CPAP_Apnea));
+
+            if (p_profile->general->calculateRDI()) { ahi += day->count(CPAP_RERA); }
+
+            float hours = day->hours(MT_CPAP);
+            ahi /= hours;
+            float csr = (100.0 / hours) * (day->sum(CPAP_CSR) / 3600.0);
+            float uai = day->count(CPAP_Apnea) / hours;
+            float oai = day->count(CPAP_Obstructive) / hours;
+            float hi = (day->count(CPAP_ExP) + day->count(CPAP_Hypopnea)) / hours;
+            float cai = day->count(CPAP_ClearAirway) / hours;
+            float rei = day->count(CPAP_RERA) / hours;
+            float vsi = day->count(CPAP_VSnore) / hours;
+            float fli = day->count(CPAP_FlowLimit) / hours;
+//            float sai = day->count(CPAP_SensAwake) / hours;
+            float nri = day->count(CPAP_NRI) / hours;
+            float lki = day->count(CPAP_LeakFlag) / hours;
+            float exp = day->count(CPAP_ExP) / hours;
+
+            int piesize = (2048.0 / 8.0) * 1.3; // 1.5" in size
+            //float fscale=font_scale;
+            //if (!highres)
+            //                fscale=1;
+
+            QString stats;
+            painter.setFont(medium_font);
+
+            if (p_profile->general->calculateRDI()) {
+                stats = QObject::tr("RDI\t%1\n").arg(ahi, 0, 'f', 2);
+            } else {
+                stats = QObject::tr("AHI\t%1\n").arg(ahi, 0, 'f', 2);
+            }
+
+            QRectF bounds = painter.boundingRect(QRectF(0, 0, virt_width, 0), stats,
+                                                 QTextOption(Qt::AlignRight));
+            painter.drawText(bounds, stats, QTextOption(Qt::AlignRight));
+
+
+            mainwin->getDaily()->eventBreakdownPie()->setShowTitle(false);
+            mainwin->getDaily()->eventBreakdownPie()->setMargins(0, 0, 0, 0);
+            QPixmap ebp;
+
+            if (ahi > 0) {
+                ebp = mainwin->getDaily()->eventBreakdownPie()->renderPixmap(piesize, piesize, true);
+            } else {
+                ebp = QPixmap(":/icons/smileyface.png");
+            }
+
+            if (!ebp.isNull()) {
+                painter.drawPixmap(virt_width - piesize, bounds.height(), piesize, piesize, ebp);
+            }
+
+            mainwin->getDaily()->eventBreakdownPie()->setShowTitle(true);
+
+            cpapinfo += "\n\n";
+
+            painter.setFont(report_font);
+            //bounds=painter.boundingRect(QRectF((virt_width/2)-(virt_width/6),top,virt_width/2,0),cpapinfo,QTextOption(Qt::AlignLeft));
+            bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), cpapinfo,
+                                          QTextOption(Qt::AlignHCenter));
+            painter.drawText(bounds, cpapinfo, QTextOption(Qt::AlignHCenter));
+
+            int ttop = bounds.height();
+
+            stats = QObject::tr("AI=%1 HI=%2 CAI=%3 ").arg(oai, 0, 'f', 2).arg(hi, 0, 'f', 2).arg(cai, 0, 'f',
+                    2);
+
+            if (cpap->loaderName() == STR_MACH_PRS1) {
+                stats += QObject::tr("REI=%1 VSI=%2 FLI=%3 PB/CSR=%4%%")
+                         .arg(rei, 0, 'f', 2).arg(vsi, 0, 'f', 2)
+                         .arg(fli, 0, 'f', 2).arg(csr, 0, 'f', 2);
+            } else if (cpap->loaderName() == STR_MACH_ResMed) {
+                stats += QObject::tr("UAI=%1 ").arg(uai, 0, 'f', 2);
+            } else if (cpap->loaderName() == STR_MACH_Intellipap) {
+                stats += QObject::tr("NRI=%1 LKI=%2 EPI=%3").arg(nri, 0, 'f', 2).arg(lki, 0, 'f', 2).arg(exp, 0,
+                         'f', 2);
+            }
+
+            bounds = painter.boundingRect(QRectF(0, top + ttop, virt_width, 0), stats,
+                                          QTextOption(Qt::AlignHCenter));
+            painter.drawText(bounds, stats, QTextOption(Qt::AlignHCenter));
+            ttop += bounds.height();
+
+            if (journal) {
+                stats = "";
+
+                if (journal->settings.contains(Journal_Weight)) {
+                    stats += STR_TR_Weight + QString(" %1 ").arg(weightString(
+                                 journal->settings[Journal_Weight].toDouble()));
+                }
+
+                if (journal->settings.contains(Journal_BMI)) {
+                    stats += STR_TR_BMI + QString(" %1 ").arg(journal->settings[Journal_BMI].toDouble(), 0, 'f', 2);
+                }
+
+                if (journal->settings.contains(Journal_ZombieMeter)) {
+                    stats += STR_TR_Zombie + QString(" %1/10 ").arg(journal->settings[Journal_ZombieMeter].toDouble(),
+                             0, 'f', 0);
+                }
+
+                if (!stats.isEmpty()) {
+                    bounds = painter.boundingRect(QRectF(0, top + ttop, virt_width, 0), stats,
+                                                  QTextOption(Qt::AlignHCenter));
+
+                    painter.drawText(bounds, stats, QTextOption(Qt::AlignHCenter));
+                    ttop += bounds.height();
+                }
+
+                ttop += normal_height;
+
+                if (journal->settings.contains(Journal_Notes)) {
+                    QTextDocument doc;
+                    doc.setHtml(journal->settings[Journal_Notes].toString());
+                    stats = doc.toPlainText();
+                    //doc.drawContents(&painter); // doesn't work as intended..
+
+                    bounds = painter.boundingRect(QRectF(0, top + ttop, virt_width, 0), stats,
+                                                  QTextOption(Qt::AlignHCenter));
+                    painter.drawText(bounds, stats, QTextOption(Qt::AlignHCenter));
+                    bounds.setLeft(virt_width / 4);
+                    bounds.setRight(virt_width - (virt_width / 4));
+
+                    QPen pen(Qt::black);
+                    pen.setWidth(4);
+                    painter.setPen(pen);
+                    painter.drawRect(bounds);
+                    ttop += bounds.height() + normal_height;
+                }
+            }
+
+
+            if (ttop > maxy) { maxy = ttop; }
+        } else {
+            bounds = painter.boundingRect(QRectF(0, top + maxy, virt_width, 0), cpapinfo,
+                                          QTextOption(Qt::AlignCenter));
+            painter.drawText(bounds, cpapinfo, QTextOption(Qt::AlignCenter));
+
+            if (maxy + bounds.height() > maxy) { maxy = maxy + bounds.height(); }
+        }
+    } else if (name == STR_TR_Overview) {
+        QDateTime first = QDateTime::fromTime_t((*gv)[0]->min_x / 1000L);
+        QDateTime last = QDateTime::fromTime_t((*gv)[0]->max_x / 1000L);
+        QString ovinfo = QObject::tr("Reporting from %1 to %2").arg(first.date().toString(
+                             Qt::SystemLocaleShortDate)).arg(last.date().toString(Qt::SystemLocaleShortDate));
+        QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), ovinfo,
+                                             QTextOption(Qt::AlignHCenter));
+        painter.drawText(bounds, ovinfo, QTextOption(Qt::AlignHCenter));
+
+        if (bounds.height() > maxy) { maxy = bounds.height(); }
+    } /*else if (name == STR_TR_Oximetry) {
+        QString ovinfo = QObject::tr("Reporting data goes here");
+        QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), ovinfo,
+                                             QTextOption(Qt::AlignHCenter));
+        painter.drawText(bounds, ovinfo, QTextOption(Qt::AlignHCenter));
+
+        if (bounds.height() > maxy) { maxy = bounds.height(); }
+    }*/
+
+    top += maxy;
+
+    graph_slots = graphs_per_page - ((virt_height - top) / (full_graph_height + normal_height));
+
+    bool first = true;
+    QStringList labels;
+    QVector<gGraph *> graphs;
+    QVector<qint64> start, end;
+    qint64 savest, saveet;
+
+    gGraph *g;
+
+    gv->GetXBounds(savest, saveet);
+
+    for (int i=0;i < gv->size(); i++) {
+        g = (*gv)[i];
+
+        if (g->isEmpty() || !g->visible()) continue;
+        if (g->group() == 0) {
+            savest = g->min_x;
+            saveet = g->max_x;
+            break;
+        }
+    }
+    qint64 st = savest, et = saveet;
+
+    bool lineCursorMode = p_profile->appearance->lineCursorMode();
+    p_profile->appearance->setLineCursorMode(false);
+
+    if (name == STR_TR_Daily) {
+        if (!print_bookmarks) {
+            for (int i = 0; i < gv->size(); i++) {
+                g = (*gv)[i];
+
+                if (g->isEmpty()) { continue; }
+
+                if (!g->visible()) { continue; }
+
+                if (cpap && oxi) {
+                    st = qMin(day->first(MT_CPAP), day->first(MT_OXIMETER));
+                    et = qMax(day->last(MT_CPAP), day->last(MT_OXIMETER));
+                } else if (cpap) {
+                    st = day->first(MT_CPAP);
+                    et = day->last(MT_CPAP);
+                } else if (oxi) {
+                    st = day->first(MT_OXIMETER);
+                    et = day->last(MT_OXIMETER);
+                }
+
+                if (!g->isSnapshot() && (g->name() == schema::channel[CPAP_FlowRate].code())) {
+                    if (!((qAbs(g->min_x - st) < 5000) && (qAbs(g->max_x - et) < 60000))) {
+                        qDebug() << "Current Selection difference" << (g->min_x - st) << " bleh " << (g->max_x - et);
+                        start.push_back(st);
+                        end.push_back(et);
+                        graphs.push_back(g);
+                        labels.push_back(QObject::tr("Entire Day's Flow Waveform"));
+                    }
+
+                    start.push_back(g->min_x);
+                    end.push_back(g->max_x);
+                    graphs.push_back(g);
+                    labels.push_back(QObject::tr("Current Selection"));
+                } else {
+                    start.push_back(g->min_x);
+                    end.push_back(g->max_x);
+                    graphs.push_back(g);
+                    labels.push_back("");
+                }
+
+            }
+        } else {
+            const QString EntireDay = QObject::tr("Entire Day");
+
+            if (journal) {
+                if (journal->settings.contains(Bookmark_Start)) {
+                    QVariantList st1 = journal->settings[Bookmark_Start].toList();
+                    QVariantList et1 = journal->settings[Bookmark_End].toList();
+                    QStringList notes = journal->settings[Bookmark_Notes].toStringList();
+                    gGraph *flow = (*gv)[schema::channel[CPAP_FlowRate].code()],
+                            *spo2 = (*gv)[schema::channel[OXI_SPO2].code()],
+                             *pulse = (*gv)[schema::channel[OXI_Pulse].code()];
+
+                    if (cpap && flow && !flow->isEmpty() && flow->visible()) {
+                        labels.push_back(EntireDay);
+                        start.push_back(day->first(MT_CPAP));
+                        end.push_back(day->last(MT_CPAP));
+                        graphs.push_back(flow);
+                    }
+
+                    if (oxi && spo2 && !spo2->isEmpty() && spo2->visible()) {
+                        labels.push_back(EntireDay);
+                        start.push_back(day->first(MT_OXIMETER));
+                        end.push_back(day->last(MT_OXIMETER));
+                        graphs.push_back(spo2);
+                    }
+
+                    if (oxi && pulse && !pulse->isEmpty() && pulse->visible()) {
+                        labels.push_back(EntireDay);
+                        start.push_back(day->first(MT_OXIMETER));
+                        end.push_back(day->last(MT_OXIMETER));
+                        graphs.push_back(pulse);
+                    }
+
+                    for (int i = 0; i < notes.size(); i++) {
+                        if (flow && !flow->isEmpty() && flow->visible()) {
+                            labels.push_back(notes.at(i));
+                            start.push_back(st1.at(i).toLongLong());
+                            end.push_back(et1.at(i).toLongLong());
+                            graphs.push_back(flow);
+                        }
+
+                        if (spo2 && !spo2->isEmpty() && spo2->visible()) {
+                            labels.push_back(notes.at(i));
+                            start.push_back(st1.at(i).toLongLong());
+                            end.push_back(et1.at(i).toLongLong());
+                            graphs.push_back(spo2);
+                        }
+
+                        if (pulse && !pulse->isEmpty() && pulse->visible()) {
+                            labels.push_back(notes.at(i));
+                            start.push_back(st1.at(i).toLongLong());
+                            end.push_back(et1.at(i).toLongLong());
+                            graphs.push_back(pulse);
+                        }
+                    }
+                }
+            }
+
+            for (int i = 0; i < gv->size(); i++) {
+                gGraph *g = (*gv)[i];
+
+                if (g->isEmpty()) { continue; }
+
+                if (!g->visible()) { continue; }
+
+                if ((g->name() != schema::channel[CPAP_FlowRate].code()) && (g->name() != schema::channel[OXI_SPO2].code())
+                        && (g->name() != schema::channel[OXI_Pulse].code())) {
+                    start.push_back(st);
+                    end.push_back(et);
+                    graphs.push_back(g);
+                    labels.push_back("");
+                }
+            }
+        }
+    } else {
+        for (int i = 0; i < gv->size(); i++) {
+            gGraph *g = (*gv)[i];
+
+            if (g->isEmpty()) { continue; }
+
+            if (!g->visible()) { continue; }
+
+            start.push_back(st);
+            end.push_back(et);
+            graphs.push_back(g);
+            labels.push_back(""); // date range?
+        }
+    }
+
+    int pages = ceil(float(graphs.size() + graph_slots) / float(graphs_per_page));
+
+    if (qprogress) {
+        qprogress->setValue(0);
+        qprogress->setMaximum(graphs.size());
+        qprogress->show();
+    }
+
+    int page = 1;
+    int gcnt = 0;
+
+    for (int i = 0; i < graphs.size(); i++) {
+
+        if ((top + full_graph_height + normal_height) > virt_height) {
+            top = 0;
+            gcnt = 0;
+            first = true;
+
+            if (page > pages) {
+                break;
+            }
+
+            if (!printer->newPage()) {
+                qWarning("failed in flushing page to disk, disk full?");
+                break;
+            }
+
+
+        }
+
+        if (first) {
+            QString footer = QObject::tr("SleepyHead v%1 - http://sleepyhead.sourceforge.net").arg(VersionString);
+
+            QRectF bounds = painter.boundingRect(QRectF(0, virt_height, virt_width, normal_height), footer,
+                                                 QTextOption(Qt::AlignHCenter));
+            painter.drawText(bounds, footer, QTextOption(Qt::AlignHCenter));
+
+            QString pagestr = QObject::tr("Page %1 of %2").arg(page).arg(pages);
+            QRectF pagebnds = painter.boundingRect(QRectF(0, virt_height, virt_width, normal_height), pagestr,
+                                                   QTextOption(Qt::AlignRight));
+            painter.drawText(pagebnds, pagestr, QTextOption(Qt::AlignRight));
+            first = false;
+            page++;
+        }
+
+        gGraph *g = graphs[i];
+        if (!g->isSnapshot()) {
+            g->SetXBounds(start[i], end[i]);
+        }
+        g->deselect();
+
+        QString label = labels[i];
+
+        if (!label.isEmpty()) {
+            //label+=":";
+            top += normal_height / 3;
+            QRectF bounds = painter.boundingRect(QRectF(0, top, virt_width, 0), label,
+                                                 QTextOption(Qt::AlignHCenter));
+            //QRectF pagebnds=QRectF(0,top,virt_width,normal_height);
+            painter.drawText(bounds, label, QTextOption(Qt::AlignHCenter));
+            top += bounds.height();
+        } else { top += normal_height / 2; }
+
+        p_profile->appearance->setAntiAliasing(force_antialiasing);
+        int tmb = g->m_marginbottom;
+        g->m_marginbottom = 0;
+
+
+        //painter.beginNativePainting();
+        //g->showTitle(false);
+        int hhh = full_graph_height - normal_height;
+        QPixmap pm2 = g->renderPixmap(virt_width, hhh, 1);
+        QImage pm = pm2.toImage(); //fscale);
+        pm2.detach();
+        //g->showTitle(true);
+        //painter.endNativePainting();
+        g->m_marginbottom = tmb;
+        p_profile->appearance->setAntiAliasing(aa_setting);
+
+
+        if (!pm.isNull()) {
+#if QT_VERSION >= QT_VERSION_CHECK(5,0,0)
+            painter.drawImage(QRect(0, top, pm.width(), pm.height()), pm);
+#else
+            painter.drawImage(0, top, pm);
+#endif
+
+            //painter.drawImage(0,top,virt_width,full_graph_height-normal_height,pm);
+        }
+
+        top += full_graph_height;
+
+        gcnt++;
+
+        if (qprogress) {
+            qprogress->setValue(i);
+            QApplication::processEvents();
+        }
+    }
+
+    gv->SetXBounds(savest, saveet);
+    qprogress->hide();
+    painter.end();
+    delete printer;
+    mainwin->Notify(QObject::tr("SleepyHead has finished sending the job to the printer."));
+    p_profile->appearance->setLineCursorMode(lineCursorMode);
+}
+
diff --git a/sleepyhead/reports.h b/sleepyhead/reports.h
new file mode 100644
index 0000000..0c81b12
--- /dev/null
+++ b/sleepyhead/reports.h
@@ -0,0 +1,27 @@
+/* Reports Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef REPORTS_H
+#define REPORTS_H
+#include "Graphs/gGraphView.h"
+
+class Report
+{
+  public:
+    Report();
+
+    /*! \fn void PrintReport gGraphView *gv,QString name, QDate date=QDate::currentDate());
+        \brief Prepares a report using gGraphView object, and sends to a created QPrinter object
+        \param gGraphView *gv  GraphView Object containing which graph set to print
+        \param QString name   Report Title
+        \param QDate date
+        */
+    static void PrintReport(gGraphView *gv, QString name, QDate date = QDate::currentDate());
+};
+
+#endif // REPORTS_H
diff --git a/sleepyhead/scripts/build_number b/sleepyhead/scripts/build_number
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/sleepyhead/scripts/build_number
@@ -0,0 +1 @@
+0
diff --git a/sleepyhead/scripts/inc_build.sh b/sleepyhead/scripts/inc_build.sh
new file mode 100755
index 0000000..9f8e6ca
--- /dev/null
+++ b/sleepyhead/scripts/inc_build.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+MY_PATH="`dirname \"$0\"`"
+if [ -f "$MY_PATH/build_number" ]
+then
+number=`cat $MY_PATH/build_number`
+else
+number=0
+fi
+
+if [ ! -f $MY_PATH/../build_number.h ]
+then
+# This is needed to build, so make sure it's available
+    echo "const int build_number = ""$number;" | tee $MY_PATH/../build_number.h
+fi
+
+if [ ! -f "$MY_PATH/ReleaseManager" ]
+then
+# Script only needs running by Release Managers
+	exit;
+fi
+
+if [ "$1" == "release" ]
+then
+	echo "Updating build number"
+	let number++
+	echo "$number" > $MY_PATH/build_number
+	echo "const int build_number = ""$number;" | tee $MY_PATH/../build_number.h
+else
+	echo "Skipping build number update"
+fi
diff --git a/sleepyhead/sessionbar.cpp b/sleepyhead/sessionbar.cpp
new file mode 100644
index 0000000..d71880c
--- /dev/null
+++ b/sleepyhead/sessionbar.cpp
@@ -0,0 +1,287 @@
+/* SessionBar Graph Implementation
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QPainter>
+#include <QLinearGradient>
+#include <QBrush>
+#include <QRect>
+#include <QMouseEvent>
+#include <QDebug>
+
+#include "sessionbar.h"
+
+SBSeg::SBSeg()
+{
+    session = nullptr;
+    color = QColor();
+    highlight = false;
+}
+
+SBSeg::SBSeg(Session *sess, QColor col)
+{
+    session = sess;
+    color = col;
+    highlight = false;
+}
+
+//SBSeg::SBSeg(const SBSeg & a)
+//{
+//    session=(Session *)a.session;
+//    color=a.color;
+//    highlight=a.highlight;
+//}
+
+SessionBar::SessionBar(QWidget *parent) :
+    QWidget(parent)
+{
+    timer.setParent(this);
+    m_selectIDX = -1;
+    m_selectColor = Qt::red;
+    m_selectMode = false;
+}
+//SessionBar::SessionBar(const SessionBar & copy)
+//    :QWidget(this)
+//{
+//    timer.setParent(this);
+//    QVector<SBSeg>::const_iterator i;
+//    for (i=copy.segments.begin();i!=copy.segments.end();++i) {
+//        segments.push_back(*i);
+//    }
+//}
+
+SessionBar::~SessionBar()
+{
+}
+void SessionBar::updateTimer()
+{
+    if (!underMouse()) {
+        QVector<SBSeg>::iterator i;
+
+        for (i = segments.begin(); i != segments.end(); ++i) {
+            (*i).highlight = false;
+        }
+    } else {
+        timer.singleShot(50, this, SLOT(updateTimer()));
+    }
+
+    update();
+}
+
+SegType SessionBar::min()
+{
+    if (segments.isEmpty()) {
+        return 0;
+    }
+
+    QVector<SBSeg>::iterator i = segments.begin();
+    SegType min = (*i).session->first();
+    i++;
+
+    qint64 val;
+
+    for (; i != segments.end(); ++i) {
+        val = (*i).session->first();
+
+        if (min > val) {
+            min = val;
+        }
+    }
+
+    return min;
+}
+
+SegType SessionBar::max()
+{
+    if (segments.isEmpty()) {
+        return 0;
+    }
+
+    QVector<SBSeg>::iterator i = segments.begin();
+    SegType max = (*i).session->last();
+    i++;
+    qint64 val;
+
+    for (; i != segments.end(); ++i) {
+        val = (*i).session->last();
+
+        if (max < val) {
+            max = val;
+        }
+    }
+
+    return max;
+}
+
+QColor brighten(QColor, float f=2.0);
+
+void SessionBar::mousePressEvent(QMouseEvent *ev)
+{
+    SegType mn = min();
+    SegType mx = max();
+
+    if (mx < mn) {
+        return;
+    }
+
+    SegType total = mx - mn;
+    double px = double(width() ) / double(total);
+
+    double sx, ex;
+    QVector<SBSeg>::iterator i;
+
+    int cnt = 0;
+
+    for (i = segments.begin(); i != segments.end(); ++i) {
+        Session *sess = (*i).session;
+        sx = double(sess->first() - mn) * px;
+        ex = double(sess->last() - mn) * px;
+
+        if (ex > width()) { ex = width(); }
+
+        //ex-=sx;
+
+        if ((ev->x() >= sx) && (ev->x() < ex)
+                && (ev->y() > 0) && (ev->y() < height())) {
+            m_selectIDX = cnt;
+            emit sessionClicked((*i).session);
+            break;
+        }
+
+        cnt++;
+    }
+
+    if (timer.isActive()) { timer.stop(); }
+
+    timer.singleShot(50, this, SLOT(updateTimer()));
+
+}
+
+void SessionBar::mouseMoveEvent(QMouseEvent *ev)
+{
+    SegType mn = min();
+    SegType mx = max();
+
+    if (mx < mn) {
+        return;
+    }
+
+    SegType total = mx - mn;
+    double px = double(width() - 5) / double(total);
+
+    double sx, ex;
+    QVector<SBSeg>::iterator i;
+
+    for (i = segments.begin(); i != segments.end(); ++i) {
+        SBSeg &seg = *i;
+        sx = double(seg.session->first() - mn) * px;
+        ex = double(seg.session->last() - mn) * px;
+
+        if (ex > width() - 5) { ex = width() - 5; }
+
+        //ex-=sx;
+
+        if ((ev->x() > sx) && (ev->x() < ex)
+                && (ev->y() > 0) && (ev->y() < height())) {
+            seg.highlight = true;
+        } else { seg.highlight = false; }
+    }
+
+    if (timer.isActive()) { timer.stop(); }
+
+    timer.singleShot(50, this, SLOT(updateTimer()));
+}
+
+
+void SessionBar::paintEvent(QPaintEvent *)
+{
+    QPainter painter(this);
+
+    QRect rect(1, 1, width() - 2, height() - 2);
+
+    painter.drawRect(rect);
+
+    SegType mn = min();
+    SegType mx = max();
+
+    if (mx < mn) {
+        return;
+    }
+
+    SegType total = mx - mn;
+    double px = double(width() - 5) / double(total);
+
+    double sx, ex;
+    QVector<SBSeg>::iterator i;
+    QRect selectRect;
+
+    int cnt = 0;
+    for (i = segments.begin(); i != segments.end(); ++i) {
+        SBSeg &seg = *i;
+        qint64 mm = seg.session->first(), MM = seg.session->last(), L = MM - mm;
+        sx = double(mm - mn) * px;
+        ex = double(MM - mn) * px;
+
+        if (ex > width() - 5) { ex = width() - 5; }
+
+        ex -= sx;
+
+        int len = L / 1000L;
+        int h = len / 3600;
+        int m = (len / 60) % 60;
+        //int s=len % 60;
+
+        QString msg = QString("%1h %2m").arg((short)h, 1, 10, QChar('0')).arg((short)m, 1, 10,
+                      QChar('0')); //.arg((short)s,2,10,QChar('0'));
+        //painter.setBrush(QBrush((*i).color);
+        QRect segrect(3 + sx, 3, ex, height() - 6);
+
+        if (seg.session->enabled()) {
+            QLinearGradient linearGrad(QPointF(0, 0), QPointF(0, height() / 2));
+            linearGrad.setSpread(QGradient::ReflectSpread);
+            QColor col = seg.color;
+            if (m_selectMode && (cnt == m_selectIDX)) {
+//                col = m_selectColor;
+            } else if (seg.highlight) { col = brighten(col); }
+
+            linearGrad.setColorAt(0, col);
+            linearGrad.setColorAt(1, brighten(col));
+            QBrush brush(linearGrad);
+            painter.fillRect(segrect, brush);
+        } else {
+            if (seg.highlight) {
+                QColor col = QColor("#f0f0f0");
+                painter.fillRect(segrect, col);
+            }
+
+            //msg="Off";
+        }
+
+        QRect rect = painter.boundingRect(segrect, Qt::AlignCenter, msg);
+
+        if (rect.width() < segrect.width()) {
+            painter.setPen(Qt::black);
+            painter.drawText(segrect, Qt::AlignCenter, msg);
+        }
+
+
+        if (m_selectMode && (cnt == m_selectIDX)) {
+            painter.setPen(QPen(m_selectColor, 3));
+        } else {
+            painter.setPen(QPen(Qt::black, 1));
+        }
+        painter.drawRect(segrect);
+        cnt++;
+
+    }
+    if (!cnt) {
+        QString msg = tr("No Sessions Present");
+        QRect rct = painter.boundingRect(this->rect(), Qt::AlignCenter, msg);
+        painter.setPen(Qt::black);
+        painter.drawText(rct, Qt::AlignCenter, msg);
+    }
+}
diff --git a/sleepyhead/sessionbar.h b/sleepyhead/sessionbar.h
new file mode 100644
index 0000000..9629796
--- /dev/null
+++ b/sleepyhead/sessionbar.h
@@ -0,0 +1,71 @@
+/* SessionBar Graph Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef SESSIONBAR_H
+#define SESSIONBAR_H
+
+#include <QVector>
+#include <QColor>
+#include <QWidget>
+#include <QTimer>
+
+#include "SleepLib/session.h"
+
+typedef qint64 SegType;
+
+class SBSeg
+{
+  public:
+    SBSeg();
+    SBSeg(Session *sess, QColor col);
+    //    SBSeg(const SBSeg & a);
+
+    QColor color;
+    bool highlight;
+    Session *session;
+};
+
+
+class SessionBar : public QWidget
+{
+    Q_OBJECT
+  public:
+    SessionBar(QWidget *parent = 0);
+    //    // Q_DECLARE_METATYPE requires a copy-constructor
+    //  SessionBar(const SessionBar &);
+
+    virtual ~SessionBar();
+    void clear() { segments.clear(); m_selectIDX = -1; }
+    void add(Session *sess, QColor col) { if (sess) { segments.push_back(SBSeg(sess, col)); } }
+    void setSelectMode(bool b) { m_selectMode = b; }
+    void setSelectColor(QColor col) { m_selectColor = col; }
+    int count() { return segments.size(); }
+    int selected() { return m_selectIDX; }
+    Session * session(int idx) { Q_ASSERT(idx < segments.size()); return segments[idx].session; }
+    void setSelected(int idx) { m_selectIDX = idx; }
+
+  protected slots:
+    void updateTimer();
+  signals:
+    void sessionClicked(Session *sess);
+  protected:
+    void paintEvent(QPaintEvent *event);
+    void mouseMoveEvent(QMouseEvent *);
+    void mousePressEvent(QMouseEvent *);
+    SegType min();
+    SegType max();
+
+    QVector<SBSeg> segments;
+    QTimer timer;
+    int m_selectIDX;
+    bool m_selectMode;
+    QColor m_selectColor;
+};
+//Q_DECLARE_METATYPE(SessionBar)
+
+#endif
diff --git a/sleepyhead/sleepyhead.pro b/sleepyhead/sleepyhead.pro
new file mode 100644
index 0000000..512f944
--- /dev/null
+++ b/sleepyhead/sleepyhead.pro
@@ -0,0 +1,324 @@
+#-------------------------------------------------
+#
+# Project created by QtCreator 2011-06-20T22:05:30
+#
+#-------------------------------------------------
+
+QT += core gui network xml printsupport
+
+greaterThan(QT_MAJOR_VERSION,4) {
+    QT += widgets webkitwidgets
+} else { # qt4
+    QT += webkit
+}
+
+#SleepyHead requires OpenGL 2.0 support to run smoothly
+#On platforms where it's not available, it can still be built to work
+#provided the BrokenGL file resides in the SleepyHead source root directory
+contains(DEFINES, BrokenGL) {
+    message("Building with QWidget gGraphView")
+    DEFINES += BROKEN_OPENGL_BUILD
+} else {
+    message("Building with QGLWidget gGraphView")
+    QT += opengl
+}
+
+#The following forces ResMed session locking.. it *may* not be necessary.. I'm still trying to assess this properly.
+DEFINES += LOCK_RESMED_SESSIONS
+
+#CONFIG += c++11
+CONFIG += rtti
+
+
+#static {
+#    CONFIG += static
+#    QTPLUGIN += qsvg qgif qpng
+
+#    DEFINES += STATIC // Equivalent to "#define STATIC" in source code
+#    message("Static build.")
+#}
+
+TARGET = SleepyHead
+unix:!macx {
+    TARGET.path=/usr/bin
+}
+
+TEMPLATE = app
+
+# GIT_VERSION = $$system(git describe --tags --long --abbrev=6 --dirty="*")
+
+exists(../.git):{
+
+    GIT_BRANCH=$$system(git rev-parse --abbrev-ref HEAD)
+    DEFINES += GIT_BRANCH=\\\"$$GIT_BRANCH\\\"
+    DEFINES += GIT_REVISION=\\\"$$system(git rev-parse --short HEAD)\\\"
+
+#    contains(GIT_BRANCH,"testing"):
+
+} else {
+    DEFINES += GIT_BRANCH=\\\"UNKNOWN\\\"
+    DEFINES += GIT_REVISION=\\\"UNKNOWN\\\"
+}
+
+#Comment out for official builds
+DEFINES += TEST_BUILD
+
+
+unix:!macx {
+    LIBS        += -lX11 -lz -lGLU
+    DEFINES         += _TTY_POSIX_
+}
+
+macx {
+  QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6.8
+
+  LIBS             += -lz
+  ICON              = icons/iconfile.icns
+}
+
+win32 {
+    DEFINES          += WINVER=0x0501 # needed for mingw to pull in appropriate dbt business...probably a better way to do this
+    RC_FILE          += win_icon.rc
+    LIBS             += -lsetupapi
+
+    INCLUDEPATH += $$PWD
+    INCLUDEPATH += $$[QT_INSTALL_PREFIX]/../src/qtbase/src/3rdparty/zlib
+
+    if (*-msvc*):!equals(TEMPLATE_PREFIX, "vc") {
+        LIBS += -ladvapi32
+        DEFINES += BUILD_WITH_MSVC=1
+    } else {
+        # MingW needs this
+        LIBS += -lz
+    }
+}
+
+#include(3rdparty/quazip-0.5.1/quazip/quazip.pri)
+
+#include(SleepLib2/sleeplib.pri)
+
+SOURCES += \
+    common_gui.cpp \
+    daily.cpp \
+    exportcsv.cpp \
+    main.cpp \
+    mainwindow.cpp \
+    newprofile.cpp \
+    overview.cpp \
+    preferencesdialog.cpp \
+    profileselect.cpp \
+    reports.cpp \
+    sessionbar.cpp \
+    updateparser.cpp \
+    UpdaterWindow.cpp \
+    Graphs/gFlagsLine.cpp \
+    Graphs/gFooBar.cpp \
+    Graphs/gGraph.cpp \
+    Graphs/gGraphView.cpp \
+    Graphs/glcommon.cpp \
+    Graphs/gLineChart.cpp \
+    Graphs/gLineOverlay.cpp \
+    Graphs/gSegmentChart.cpp \
+    Graphs/gspacer.cpp \
+    Graphs/gStatsLine.cpp \
+    Graphs/gSummaryChart.cpp \
+    Graphs/gXAxis.cpp \
+    Graphs/gYAxis.cpp \
+    Graphs/layer.cpp \
+    SleepLib/calcs.cpp \
+    SleepLib/common.cpp \
+    SleepLib/day.cpp \
+    SleepLib/event.cpp \
+    SleepLib/machine.cpp \
+    SleepLib/machine_loader.cpp \
+    SleepLib/preferences.cpp \
+    SleepLib/profiles.cpp \
+    SleepLib/schema.cpp \
+    SleepLib/session.cpp \
+    SleepLib/loader_plugins/cms50_loader.cpp \
+    SleepLib/loader_plugins/icon_loader.cpp \
+    SleepLib/loader_plugins/intellipap_loader.cpp \
+    SleepLib/loader_plugins/mseries_loader.cpp \
+    SleepLib/loader_plugins/prs1_loader.cpp \
+    SleepLib/loader_plugins/resmed_loader.cpp \
+    SleepLib/loader_plugins/somnopose_loader.cpp \
+    SleepLib/loader_plugins/zeo_loader.cpp \
+    translation.cpp \
+    statistics.cpp \
+    oximeterimport.cpp \
+    SleepLib/serialoximeter.cpp \
+    SleepLib/loader_plugins/md300w1_loader.cpp \
+    Graphs/gSessionTimesChart.cpp \
+    logger.cpp \
+    welcome.cpp \
+    SleepLib/machine_common.cpp \
+    SleepLib/loader_plugins/weinmann_loader.cpp \
+    Graphs/gdailysummary.cpp \
+    Graphs/MinutesAtPressure.cpp \
+    SleepLib/journal.cpp \
+    SleepLib/progressdialog.cpp \
+    SleepLib/loader_plugins/cms50f37_loader.cpp
+
+HEADERS  += \
+    common_gui.h \
+    daily.h \
+    exportcsv.h \
+    mainwindow.h \
+    newprofile.h \
+    overview.h \
+    preferencesdialog.h \
+    profileselect.h \
+    reports.h \
+    sessionbar.h \
+    updateparser.h \
+    UpdaterWindow.h \
+    version.h \
+    Graphs/gFlagsLine.h \
+    Graphs/gFooBar.h \
+    Graphs/gGraph.h \
+    Graphs/gGraphView.h \
+    Graphs/glcommon.h \
+    Graphs/gLineChart.h \
+    Graphs/gLineOverlay.h \
+    Graphs/gSegmentChart.h\
+    Graphs/gspacer.h \
+    Graphs/gStatsLine.h \
+    Graphs/gSummaryChart.h \
+    Graphs/gXAxis.h \
+    Graphs/gYAxis.h \
+    Graphs/layer.h \
+    SleepLib/calcs.h \
+    SleepLib/common.h \
+    SleepLib/day.h \
+    SleepLib/event.h \
+    SleepLib/machine.h \
+    SleepLib/machine_common.h \
+    SleepLib/machine_loader.h \
+    SleepLib/preferences.h \
+    SleepLib/profiles.h \
+    SleepLib/schema.h \
+    SleepLib/session.h \
+    SleepLib/loader_plugins/cms50_loader.h \
+    SleepLib/loader_plugins/icon_loader.h \
+    SleepLib/loader_plugins/intellipap_loader.h \
+    SleepLib/loader_plugins/mseries_loader.h \
+    SleepLib/loader_plugins/prs1_loader.h \
+    SleepLib/loader_plugins/resmed_loader.h \
+    SleepLib/loader_plugins/somnopose_loader.h \
+    SleepLib/loader_plugins/zeo_loader.h \
+    translation.h \
+    statistics.h \
+    oximeterimport.h \
+    SleepLib/serialoximeter.h \
+    SleepLib/loader_plugins/md300w1_loader.h \
+    Graphs/gSessionTimesChart.h \
+    logger.h \
+    SleepLib/loader_plugins/weinmann_loader.h \
+    Graphs/gdailysummary.h \
+    Graphs/MinutesAtPressure.h \
+    SleepLib/journal.h \
+    SleepLib/progressdialog.h \
+    SleepLib/loader_plugins/cms50f37_loader.h \
+    build_number.h
+
+
+FORMS += \
+    daily.ui \
+    overview.ui \
+    mainwindow.ui \
+    oximetry.ui \
+    preferencesdialog.ui \
+    report.ui \
+    profileselect.ui \
+    newprofile.ui \
+    exportcsv.ui \
+    UpdaterWindow.ui \
+    oximeterimport.ui
+
+RESOURCES += \
+    Resources.qrc
+
+OTHER_FILES += \
+    docs/index.html \
+    docs/usage.html \
+    docs/schema.xml \
+    docs/graphs.xml \
+    docs/channels.xml \
+    docs/release_notes.html \
+    docs/startup_tips.txt \
+    docs/countries.txt \
+    docs/tz.txt \
+    ../LICENSE.txt \
+    docs/tooltips.css \
+    docs/script.js \
+    ../update.xml \
+    docs/changelog.txt \
+    docs/intro.html \
+    docs/statistics.xml
+
+win32 {
+    CONFIG(debug, debug|release) {
+        DDIR = $$OUT_PWD/debug/Translations
+    }
+    CONFIG(release, debug|release) {
+        DDIR = $$OUT_PWD/release/Translations
+    }
+    DDIR ~= s,/,\\,g
+
+    TRANS_FILES += $$PWD/../Translations/*.qm
+    TRANS_FILES_WIN = $${TRANS_FILES}
+    TRANS_FILES_WIN ~= s,/,\\,g
+
+    system(mkdir $$quote($$DDIR))
+
+    for(FILE,TRANS_FILES_WIN){
+        system(xcopy /y $$quote($$FILE) $$quote($$DDIR))
+    }
+
+}
+
+mac {
+    TransFiles.files = $$files(../Translations/*.qm)
+    TransFiles.path = Contents/Resources/Translations
+    QMAKE_BUNDLE_DATA += TransFiles
+}
+
+#!win32 {
+#    include(../3rdparty/qtserialport/src/serialport/serialport-lib.pri)
+#    INCLUDEPATH += $$PWD/../3rdparty/qtserialport/include/QtSerialPort/5.3.1/QtSerialPort
+#    DEPENDPATH +=  $$PWD/../3rdparty/qtserialport/include/QtSerialPort/5.3.1/QtSerialPort
+#} else {
+    QT += serialport
+#}
+
+include(../3rdparty/quazip/quazip/quazip.pri)
+INCLUDEPATH += $$PWD/../3rdparty/quazip
+DEPENDPATH += $$PWD/../3rdparty/quazip
+
+#bundlelibs = $$cat($$PWD/../Bundle3rdParty)
+
+#contains(bundlelibs, true) {
+#    include(../3rdparty/quazip/quazip/quazip.pri)
+#    INCLUDEPATH += $$PWD/../3rdparty/quazip
+#    DEPENDPATH += $$PWD/../3rdparty/quazip
+
+# !win32 {
+#    include(../3rdparty/qtserialport/src/serialport/serialport-lib.pri)
+#    INCLUDEPATH += $$PWD/../3rdparty/qtserialport/include/QtSerialPort/5.3.1/QtSerialPort
+#    DEPENDPATH +=  $$PWD/../3rdparty/qtserialport/include/QtSerialPort/5.3.1/QtSerialPort
+# #   DEPENDPATH += $$PWD/../3rdparty/qtserialport/src/serialport/include/QtSerialPort/5.3.1
+#    }
+#} else {
+#    unix {
+#        message("Attempting to build with system quazip.");
+#        QMAKE_LFLAGS += -L/usr/lib -L/usr/local/lib
+#        INCLUDEPATH += /usr/local/include
+#        INCLUDEPATH += /usr/include
+#        DEPENDPATH += /usr/local/include/quazip
+#        DEPENDPATH += /usr/include/quazip
+#    } else {
+#        #Configure it if you need it...
+#        warning("Building with externally linked quazip is unsupported on this platform");
+#    }
+#    LIBS += -lquazip
+#}
diff --git a/sleepyhead/statistics.cpp b/sleepyhead/statistics.cpp
new file mode 100644
index 0000000..32b182d
--- /dev/null
+++ b/sleepyhead/statistics.cpp
@@ -0,0 +1,2092 @@
+/* Statistics Report Generator Implementation
+ *
+ * Copyright (c) 2011 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QApplication>
+#include <QFile>
+#include <QDataStream>
+#include <cmath>
+
+#include "mainwindow.h"
+#include "statistics.h"
+
+extern MainWindow *mainwin;
+
+QString formatTime(float time)
+{
+    int hours = time;
+    int seconds = time * 3600.0;
+    int minutes = (seconds / 60) % 60;
+    seconds %= 60;
+    return QString().sprintf("%02i:%02i", hours, minutes); //,seconds);
+}
+
+QDataStream & operator>>(QDataStream & in, RXItem & rx)
+{
+    in >> rx.start;
+    in >> rx.end;
+    in >> rx.days;
+    in >> rx.ahi;
+    in >> rx.rdi;
+    in >> rx.hours;
+
+    QString loadername;
+    in >> loadername;
+    QString serial;
+    in >> serial;
+
+    MachineLoader * loader = GetLoader(loadername);
+    if (loader) {
+        rx.machine = loader->lookupMachine(serial);
+    } else {
+        qDebug() << "Bad machine object" << loadername << serial;
+        rx.machine = nullptr;
+    }
+
+    in >> rx.relief;
+    in >> rx.mode;
+    in >> rx.pressure;
+
+    QList<QDate> list;
+    in >> list;
+
+    rx.dates.clear();
+    for (int i=0; i<list.size(); ++i) {
+        QDate date = list.at(i);
+        rx.dates[date] = p_profile->FindDay(date, MT_CPAP);
+    }
+
+    in >> rx.s_count;
+    in >> rx.s_sum;
+
+    return in;
+}
+QDataStream & operator<<(QDataStream & out, const RXItem & rx)
+{
+    out << rx.start;
+    out << rx.end;
+    out << rx.days;
+    out << rx.ahi;
+    out << rx.rdi;
+    out << rx.hours;
+
+    out << rx.machine->loaderName();
+    out << rx.machine->serial();
+
+    out << rx.relief;
+    out << rx.mode;
+    out << rx.pressure;
+    out << rx.dates.keys();
+    out << rx.s_count;
+    out << rx.s_sum;
+
+    return out;
+}
+void Statistics::loadRXChanges()
+{
+    QString path = p_profile->Get("{" + STR_GEN_DataFolder + "}/RXChanges.cache" );
+    QFile file(path);
+    if (!file.open(QFile::ReadOnly)) {
+        return;
+    }
+    QDataStream in(&file);
+    in.setByteOrder(QDataStream::LittleEndian);
+
+    quint32 mag32;
+    if (in.version() != QDataStream::Qt_5_0) {
+    }
+
+    in >> mag32;
+
+    if (mag32 != magic) {
+        return;
+    }
+    quint16 version;
+    in >> version;
+
+    in >> rxitems;
+
+}
+void Statistics::saveRXChanges()
+{
+    QString path = p_profile->Get("{" + STR_GEN_DataFolder + "}/RXChanges.cache" );
+    QFile file(path);
+    if (!file.open(QFile::WriteOnly)) {
+        return;
+    }
+    QDataStream out(&file);
+    out.setByteOrder(QDataStream::LittleEndian);
+    out.setVersion(QDataStream::Qt_5_0);
+    out << magic;
+    out << (quint16)0;
+    out << rxitems;
+
+}
+
+bool rxAHILessThan(const RXItem * rx1, const RXItem * rx2)
+{
+
+    return (double(rx1->ahi) / rx1->hours) < (double(rx2->ahi) / rx2->hours);
+}
+
+void Statistics::updateRXChanges()
+{
+    rxitems.clear();
+    loadRXChanges();
+    QMap<QDate, Day *>::iterator di;
+
+    QMap<QDate, Day *>::iterator it;
+    QMap<QDate, Day *>::iterator it_end = p_profile->daylist.end();
+
+    QMap<QDate, RXItem>::iterator ri;
+    QMap<QDate, RXItem>::iterator ri_end = rxitems.end();
+
+
+    quint64 tmp;
+    for (it = p_profile->daylist.begin(); it != it_end; ++it) {
+        const QDate & date = it.key();
+        Day * day = it.value();
+        Machine * mach = day->machine(MT_CPAP);
+        if (mach == nullptr) continue;
+
+        bool fnd = false;
+
+        ri_end = rxitems.end();
+        for (ri = rxitems.begin(); ri != ri_end; ++ri) {
+            RXItem & rx = ri.value();
+
+            if ((date >= rx.start) && (date <= rx.end)) {
+                // Fits in date range
+                if (rx.dates.contains(date)) {
+                    fnd = true;
+                    break;
+                }
+
+                // First up, check if fits in date range, but isn't loaded for some reason
+
+                // Need summaries for this
+                day->OpenSummary();
+                QList<ChannelID> flags = day->getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN);
+
+                QString relief = day->getPressureRelief();
+                QString mode = day->getCPAPMode();
+                QString pressure = day->getPressureSettings();
+
+                if ((rx.relief == relief) && (rx.mode == mode) && (rx.pressure == pressure) && (rx.machine == mach)) {
+                    for (int i=0; i < flags.size(); i++) {
+                        ChannelID code  = flags.at(i);
+                        rx.s_count[code] += day->count(code);
+                        rx.s_sum[code] += day->sum(code);
+                    }
+
+                    tmp = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway);
+                    rx.ahi += tmp;
+                    rx.rdi += tmp + day->count(CPAP_RERA);
+                    rx.hours += day->hours(MT_CPAP);
+
+                    rx.dates[date] = day;
+                    rx.days = rx.dates.size();
+                    fnd = true;
+                    break;
+                } else {
+                    // Bleh.... split the day record!
+
+                    RXItem rx1, rx2;
+
+                    // First create the new day..
+                    rx1.start = date;
+                    rx1.end = date;
+                    rx1.days = 1;
+
+                    tmp = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway);
+                    rx1.ahi = tmp;
+                    rx1.rdi = tmp + day->count(CPAP_RERA);
+                    for (int i=0; i < flags.size(); i++) {
+                        ChannelID code  = flags.at(i);
+                        rx1.s_count[code] = day->count(code);
+                        rx1.s_sum[code] = day->sum(code);
+                    }
+
+                    rx1.hours = day->hours(MT_CPAP);
+                    rx1.relief = relief;
+                    rx1.mode = mode;
+                    rx1.pressure = pressure;
+                    rx1.machine = day->machine(MT_CPAP);
+                    rx1.dates[date] = day;
+                    rxitems.insert(date, rx1);
+
+                    QMap<QDate, Day *> datecopy = rx.dates;
+
+                    rx.dates.clear();
+
+                    rx.end = rx.start;
+                    rx2.start = rx.end;
+                    rx2.end = rx.start;
+                    rx2.ahi = 0;
+                    rx2.rdi = 0;
+                    rx2.hours = 0;
+                    rx.ahi = 0;
+                    rx.rdi = 0;
+                    rx.hours = 0;
+                    rx.s_count.clear();
+                    rx2.s_count.clear();
+                    rx.s_sum.clear();
+                    rx2.s_sum.clear();
+                    for (di = datecopy.begin(); di != datecopy.end(); ++di) {
+                        // Split everything before
+                        if (di.key() < date) {
+                            Day * dy = rx.dates[di.key()] = p_profile->GetDay(di.key(), MT_CPAP);
+                            tmp = dy->count(CPAP_Hypopnea) + dy->count(CPAP_Obstructive) + dy->count(CPAP_Apnea) + dy->count(CPAP_ClearAirway);;
+                            rx.ahi += tmp;
+                            rx.rdi += tmp + dy->count(CPAP_RERA);
+                            QList<ChannelID> flags2 = dy->getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN);
+
+                            for (int i=0; i < flags2.size(); i++) {
+                                ChannelID code  = flags2.at(i);
+                                rx.s_count[code] += dy->count(code);
+                                rx.s_sum[code] += dy->sum(code);
+                            }
+
+                            rx.hours += dy->hours(MT_CPAP);
+                            //rx.days++;
+                            rx.end = qMax(di.key(), rx.end);
+                        }
+                        // Split everything after
+                        if (di.key() > date) {
+                            Day * dy = rx2.dates[di.key()] = p_profile->GetDay(di.key(), MT_CPAP);
+                            tmp = dy->count(CPAP_Hypopnea) + dy->count(CPAP_Obstructive) + dy->count(CPAP_Apnea) + dy->count(CPAP_ClearAirway);;
+                            rx2.ahi += tmp;
+                            rx2.rdi += tmp + dy->count(CPAP_RERA);
+                            QList<ChannelID> flags2 = dy->getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN);
+
+                            for (int i=0; i < flags2.size(); i++) {
+                                ChannelID code  = flags2.at(i);
+                                rx2.s_count[code] += dy->count(code);
+                                rx2.s_sum[code] += dy->sum(code);
+                            }
+
+                            rx2.hours += dy->hours(MT_CPAP);
+                            rx2.end = qMax(di.key(), rx2.end);
+                            rx2.start = qMin(di.key(), rx2.start);
+                        }
+                    }
+                    rx.days = rx.dates.size();
+
+                    rx2.pressure = rx.pressure;
+                    rx2.mode = rx.mode;
+                    rx2.relief = rx.relief;
+                    rx2.machine = rx.machine;
+                    rx2.days = rx2.dates.size();
+
+                    rxitems.insert(rx2.end, rx2);
+                    fnd = true;
+
+                    break;
+                }
+            }
+        }
+        if (fnd) continue;
+
+        day->OpenSummary();
+        QList<ChannelID> flags3 = day->getSortedMachineChannels(MT_CPAP, schema::FLAG | schema::MINOR_FLAG | schema::SPAN);
+
+
+        QString relief = day->getPressureRelief();
+        QString mode = day->getCPAPMode();
+        QString pressure = day->getPressureSettings();
+
+        for (ri = rxitems.begin(); ri != ri_end; ++ri) {
+            RXItem & rx = ri.value();
+
+            if (rx.end.daysTo(date) == 1) {
+
+                if ((rx.relief == relief) && (rx.mode == mode) && (rx.pressure == pressure) && (rx.machine == day->machine(MT_CPAP)) ) {
+
+                    tmp = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway);
+                    rx.ahi += tmp;
+                    rx.rdi += tmp + day->count(CPAP_RERA);
+
+                    for (int i=0; i < flags3.size(); i++) {
+                        ChannelID code  = flags3.at(i);
+                        rx.s_count[code] += day->count(code);
+                        rx.s_sum[code] += day->sum(code);
+                    }
+
+                    rx.hours += day->hours(MT_CPAP);
+
+                    rx.dates[date] = day;
+                    rx.days = rx.dates.size();
+                    rx.end = date;
+                    fnd = true;
+                    break;
+                }
+            }
+        }
+
+        if (!fnd) {
+            RXItem rx;
+            rx.start = date;
+            rx.end = date;
+            rx.days = 1;
+            tmp = day->count(CPAP_Hypopnea) + day->count(CPAP_Obstructive) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway);
+            rx.ahi = tmp;
+            rx.rdi = tmp + day->count(CPAP_RERA);
+            for (int i=0; i < flags3.size(); i++) {
+                ChannelID code  = flags3.at(i);
+                rx.s_count[code] = day->count(code);
+                rx.s_sum[code] = day->sum(code);
+            }
+            rx.hours = day->hours();
+            rx.relief = relief;
+            rx.mode = mode;
+            rx.pressure = pressure;
+            rx.machine = day->machine(MT_CPAP);
+            rx.dates.insert(date, day);
+
+            rxitems.insert(date, rx);
+
+        }
+
+    }
+    saveRXChanges();
+
+
+    QList<RXItem *> list;
+    ri_end = rxitems.end();
+
+    for (ri = rxitems.begin(); ri != ri_end; ++ri) {
+        list.append(&ri.value());
+        ri.value().highlight = 0;
+    }
+
+    qSort(list.begin(), list.end(), rxAHILessThan);
+
+    if (list.size() >= 4) {
+        list[0]->highlight = 1; // best
+        list[1]->highlight = 2; // best
+        int ls = list.size() - 1;
+        list[ls-1]->highlight = 3; // best
+        list[ls]->highlight = 4;
+    } else if (list.size() >= 2) {
+        list[0]->highlight = 1; // best
+        int ls = list.size() - 1;
+        list[ls]->highlight = 4;
+    } else if (list.size() > 0) {
+        list[0]->highlight = 1; // best
+    }
+
+    // update record box info..
+
+}
+
+
+Statistics::Statistics(QObject *parent) :
+    QObject(parent)
+{
+    rows.push_back(StatisticsRow(tr("CPAP Statistics"), SC_HEADING, MT_CPAP));
+    rows.push_back(StatisticsRow("",   SC_DAYS, MT_CPAP));
+    rows.push_back(StatisticsRow("", SC_COLUMNHEADERS, MT_CPAP));
+    rows.push_back(StatisticsRow(tr("CPAP Usage"),  SC_SUBHEADING, MT_CPAP));
+    rows.push_back(StatisticsRow(tr("Average Hours per Night"),      SC_HOURS,     MT_CPAP));
+    rows.push_back(StatisticsRow(tr("Compliance"),  SC_COMPLIANCE,  MT_CPAP));
+
+    rows.push_back(StatisticsRow(tr("Therapy Efficiacy"),  SC_SUBHEADING, MT_CPAP));
+    rows.push_back(StatisticsRow("AHI",        SC_AHI,     MT_CPAP));
+    rows.push_back(StatisticsRow("Obstructive",   SC_CPH,     MT_CPAP));
+    rows.push_back(StatisticsRow("Hypopnea",   SC_CPH,     MT_CPAP));
+    rows.push_back(StatisticsRow("ClearAirway",   SC_CPH,     MT_CPAP));
+    rows.push_back(StatisticsRow("FlowLimit",  SC_CPH,     MT_CPAP));
+    rows.push_back(StatisticsRow("RERA",       SC_CPH,     MT_CPAP));
+    rows.push_back(StatisticsRow("SensAwake",       SC_CPH,     MT_CPAP));
+    rows.push_back(StatisticsRow("CSR", SC_SPH, MT_CPAP));
+
+    rows.push_back(StatisticsRow(tr("Leak Statistics"),  SC_SUBHEADING, MT_CPAP));
+    rows.push_back(StatisticsRow("Leak",       SC_WAVG,    MT_CPAP));
+    rows.push_back(StatisticsRow("Leak",       SC_90P,     MT_CPAP));
+    rows.push_back(StatisticsRow("Leak",       SC_ABOVE,   MT_CPAP));
+
+    rows.push_back(StatisticsRow(tr("Pressure Statistics"),  SC_SUBHEADING, MT_CPAP));
+    rows.push_back(StatisticsRow("Pressure",   SC_WAVG,    MT_CPAP));
+    rows.push_back(StatisticsRow("Pressure",   SC_MIN,     MT_CPAP));
+    rows.push_back(StatisticsRow("Pressure",   SC_MAX,     MT_CPAP));
+    rows.push_back(StatisticsRow("Pressure",   SC_90P,     MT_CPAP));
+    rows.push_back(StatisticsRow("EPAP",       SC_WAVG,    MT_CPAP));
+    rows.push_back(StatisticsRow("EPAP",       SC_MIN,     MT_CPAP));
+    rows.push_back(StatisticsRow("EPAP",       SC_MAX,     MT_CPAP));
+    rows.push_back(StatisticsRow("IPAP",       SC_WAVG,    MT_CPAP));
+    rows.push_back(StatisticsRow("IPAP",       SC_90P,     MT_CPAP));
+    rows.push_back(StatisticsRow("IPAP",       SC_MIN,     MT_CPAP));
+    rows.push_back(StatisticsRow("IPAP",       SC_MAX,     MT_CPAP));
+
+    rows.push_back(StatisticsRow(tr("Oximeter Statistics"), SC_HEADING, MT_OXIMETER));
+    rows.push_back(StatisticsRow("",           SC_DAYS,    MT_OXIMETER));
+    rows.push_back(StatisticsRow("",           SC_COLUMNHEADERS, MT_OXIMETER));
+
+    rows.push_back(StatisticsRow(tr("Blood Oxygen Saturation"),  SC_SUBHEADING, MT_CPAP));
+    rows.push_back(StatisticsRow("SPO2",       SC_WAVG,     MT_OXIMETER));
+    rows.push_back(StatisticsRow("SPO2",       SC_MIN,     MT_OXIMETER));
+    rows.push_back(StatisticsRow("SPO2Drop",   SC_CPH,     MT_OXIMETER));
+    rows.push_back(StatisticsRow("SPO2Drop",   SC_SPH,     MT_OXIMETER));
+    rows.push_back(StatisticsRow(tr("Pulse Rate"),  SC_SUBHEADING, MT_CPAP));
+    rows.push_back(StatisticsRow("Pulse",      SC_WAVG,     MT_OXIMETER));
+    rows.push_back(StatisticsRow("Pulse",      SC_MIN,     MT_OXIMETER));
+    rows.push_back(StatisticsRow("Pulse",      SC_MAX,     MT_OXIMETER));
+    rows.push_back(StatisticsRow("PulseChange",   SC_CPH,     MT_OXIMETER));
+
+    // These are for formatting the headers for the first column
+    calcnames[SC_UNDEFINED] = "";
+    calcnames[SC_MEDIAN] = tr("%1 Median");
+    calcnames[SC_AVG] = tr("Average %1");
+    calcnames[SC_WAVG] = tr("Average %1");
+    calcnames[SC_90P] = tr("90% %1"); // this gets converted to whatever the upper percentile is set to
+    calcnames[SC_MIN] = tr("Min %1");
+    calcnames[SC_MAX] = tr("Max %1");
+    calcnames[SC_CPH] = tr("%1 Index");
+    calcnames[SC_SPH] = tr("% of time in %1");
+    calcnames[SC_ABOVE] = tr("% of time above %1 threshold");
+    calcnames[SC_BELOW] = tr("% of time below %1 threshold");
+
+    machinenames[MT_UNKNOWN] = STR_TR_Unknown;
+    machinenames[MT_CPAP] = STR_TR_CPAP;
+    machinenames[MT_OXIMETER] = STR_TR_Oximetry;
+    machinenames[MT_SLEEPSTAGE] = STR_TR_SleepStage;
+//        { MT_JOURNAL, STR_TR_Journal },
+//        { MT_POSITION, STR_TR_Position },
+
+}
+
+const QString table_width = "width=99%";
+QString htmlHeader(bool showheader)
+{
+
+    QString address = p_profile->user->address();
+    address.replace("\n", "<br/>");
+
+    QString userinfo;
+
+    if (!p_profile->user->firstName().isEmpty()) {
+        userinfo = QString(QObject::tr("Name: %1, %2")).arg(p_profile->user->lastName()).arg(p_profile->user->firstName()) + "<br/>";
+        if (!p_profile->user->DOB().isNull()) {
+            userinfo += QString(QObject::tr("DOB: %1")).arg(p_profile->user->DOB().toString()) + "<br/>";
+        }
+        if (!p_profile->user->phone().isEmpty()) {
+            userinfo += QString(QObject::tr("Phone: %1")).arg(p_profile->user->phone()) + "<br/>";
+        }
+        if (!p_profile->user->email().isEmpty()) {
+            userinfo += QString(QObject::tr("Email: %1")).arg(p_profile->user->email()) + "<br/><br/>";
+        }
+        if (!p_profile->user->address().isEmpty()) {
+            userinfo +=  QObject::tr("Address:")+"<br/>"+address;
+        }
+    }
+
+
+    QString html = QString("<html><head>")+
+    "</head>"
+    "<style type='text/css'>"
+    "p,a,td,body { font-family: '"+QApplication::font().family()+"'; }"
+    "p,a,td,body { font-size: "+QString::number(QApplication::font().pointSize() + 2)+"px; }"
+
+    "table.curved {"
+    "border: 1px solid gray;"
+    "border-radius:10px;"
+    "-moz-border-radius:10px;"
+    "-webkit-border-radius:10px;"
+    "page-break-after:auto;"
+    "-fs-table-paginate: paginate;"
+    "}"
+    "tr.datarow:nth-child(even) {"
+    "background-color: #f8f8f8;"
+    "}"
+    "table { page-break-after:auto; -fs-table-paginate: paginate; }"
+    "tr    { page-break-inside:avoid; page-break-after:auto }"
+    "td    { page-break-inside:avoid; page-break-after:auto }"
+    "thead { display:table-header-group; }"
+    "tfoot { display:table-footer-group; }"
+
+    "</style>"
+    "<link rel='stylesheet' type='text/css' href='qrc:/docs/tooltips.css' />"
+    "<script type='text/javascript'>"
+    "function ChangeColor(tableRow, highLight)"
+    "{ tableRow.style.backgroundColor = highLight; }"
+    "function Go(url) { throw(url); }"
+    "</script>"
+    "</head>"
+    "<body leftmargin=0 topmargin=5 rightmargin=0>";
+    if (showheader) {
+        html += "<div align=center><table class=curved "+table_width+">"
+        "<td>"+userinfo+"</td>"
+        "<td align='right'>"
+        "<font size='+2'>" + STR_TR_SleepyHead + "</font><br/>"
+        "<font size='+1'>" + QObject::tr("Usage Statistics") + "</font>"
+        "</td>"
+        "<td align='right' width=170px><img src='qrc:/icons/bob-v3.0.png' height=140px><br/>"
+        "</td></tr></table>"
+        "</div><br/>";
+    }
+    return html;
+}
+QString htmlFooter(bool showinfo=true)
+{
+    QString html;
+
+    if (showinfo) {
+        html += "<hr/><div align=center><font size='-1'><i>";
+        html += QString(QObject::tr("This report was generated by a pre-release version of SleepyHead (%1), <b>and has not been approved in any way for compliance or medical diagnostic purposes</b>.")).
+                arg(FullVersionString) + "<br/><br/>" +
+           QObject::tr("SleepyHead is free open-source software available from http://sourceforge.net/projects/SleepyHead");
+        html += "</i></font></div>";
+    }
+
+    html += "</body></html>";
+    return html;
+}
+
+
+
+EventDataType calcAHI(QDate start, QDate end)
+{
+    EventDataType val = (p_profile->calcCount(CPAP_Obstructive, MT_CPAP, start, end)
+                         + p_profile->calcCount(CPAP_Hypopnea, MT_CPAP, start, end)
+                         + p_profile->calcCount(CPAP_ClearAirway, MT_CPAP, start, end)
+                         + p_profile->calcCount(CPAP_Apnea, MT_CPAP, start, end));
+
+    if (p_profile->general->calculateRDI()) {
+        val += p_profile->calcCount(CPAP_RERA, MT_CPAP, start, end);
+    }
+
+    EventDataType hours = p_profile->calcHours(MT_CPAP, start, end);
+
+    if (hours > 0) {
+        val /= hours;
+    } else {
+        val = 0;
+    }
+
+    return val;
+}
+
+EventDataType calcFL(QDate start, QDate end)
+{
+    EventDataType val = (p_profile->calcCount(CPAP_FlowLimit, MT_CPAP, start, end));
+    EventDataType hours = p_profile->calcHours(MT_CPAP, start, end);
+
+    if (hours > 0) {
+        val /= hours;
+    } else {
+        val = 0;
+    }
+
+    return val;
+}
+
+EventDataType calcSA(QDate start, QDate end)
+{
+    EventDataType val = (p_profile->calcCount(CPAP_SensAwake, MT_CPAP, start, end));
+    EventDataType hours = p_profile->calcHours(MT_CPAP, start, end);
+
+    if (hours > 0) {
+        val /= hours;
+    } else {
+        val = 0;
+    }
+
+    return val;
+}
+
+
+struct RXChange {
+    RXChange() { highlight = 0; machine = nullptr; }
+    RXChange(const RXChange &copy) {
+        first = copy.first;
+        last = copy.last;
+        days = copy.days;
+        ahi = copy.ahi;
+        fl = copy.fl;
+        mode = copy.mode;
+        min = copy.min;
+        max = copy.max;
+        ps = copy.ps;
+        pshi = copy.pshi;
+        maxipap = copy.maxipap;
+        machine = copy.machine;
+        per1 = copy.per1;
+        per2 = copy.per2;
+        highlight = copy.highlight;
+        weighted = copy.weighted;
+        pressure_string = copy.pressure_string;
+        pr_relief_string = copy.pr_relief_string;
+    }
+    QDate first;
+    QDate last;
+    int days;
+    EventDataType ahi;
+    EventDataType fl;
+    CPAPMode mode;
+    QString pressure_string;
+    QString pr_relief_string;
+    EventDataType min;
+    EventDataType max;
+    EventDataType ps;
+    EventDataType pshi;
+    EventDataType maxipap;
+    EventDataType per1;
+    EventDataType per2;
+    EventDataType weighted;
+    Machine *machine;
+    short highlight;
+};
+
+//enum RXSortMode { RX_first, RX_last, RX_days, RX_ahi, RX_mode, RX_min, RX_max, RX_ps, RX_pshi, RX_maxipap, RX_per1, RX_per2, RX_weighted };
+//RXSortMode RXsort = RX_first;
+//bool RXorder = false;
+
+/*bool operator<(const RXChange &c1, const RXChange &c2)
+{
+    const RXChange *comp1 = &c1;
+    const RXChange *comp2 = &c2;
+
+    if (RXorder) {
+        switch (RXsort) {
+        case RX_ahi:
+            return comp1->ahi < comp2->ahi;
+
+        case RX_days:
+            return comp1->days < comp2->days;
+
+        case RX_first:
+            return comp1->first < comp2->first;
+
+        case RX_last:
+            return comp1->last < comp2->last;
+
+        case RX_mode:
+            return comp1->mode < comp2->mode;
+
+        case RX_min:
+            return comp1->min < comp2->min;
+
+        case RX_max:
+            return comp1->max < comp2->max;
+
+        case RX_ps:
+            return comp1->ps < comp2->ps;
+
+        case RX_pshi:
+            return comp1->pshi < comp2->pshi;
+
+        case RX_maxipap:
+            return comp1->maxipap < comp2->maxipap;
+
+        case RX_per1:
+            return comp1->per1 < comp2->per1;
+
+        case RX_per2:
+            return comp1->per2 < comp2->per2;
+
+        case RX_weighted:
+            return comp1->weighted < comp2->weighted;
+        };
+    } else {
+        switch (RXsort) {
+        case RX_ahi:
+            return comp1->ahi > comp2->ahi;
+
+        case RX_days:
+            return comp1->days > comp2->days;
+
+        case RX_first:
+            return comp1->first > comp2->first;
+
+        case RX_last:
+            return comp1->last > comp2->last;
+
+        case RX_mode:
+            return comp1->mode > comp2->mode;
+
+        case RX_min:
+            return comp1->min > comp2->min;
+
+        case RX_max:
+            return comp1->max > comp2->max;
+
+        case RX_ps:
+            return comp1->ps > comp2->ps;
+
+        case RX_pshi:
+            return comp1->pshi > comp2->pshi;
+
+        case RX_maxipap:
+            return comp1->maxipap > comp2->maxipap;
+
+        case RX_per1:
+            return comp1->per1 > comp2->per1;
+
+        case RX_per2:
+            return comp1->per2 > comp2->per2;
+
+        case RX_weighted:
+            return comp1->weighted > comp2->weighted;
+        };
+    }
+
+    return true;
+}
+
+bool RXSort(const RXChange *comp1, const RXChange *comp2)
+{
+    if (RXorder) {
+        switch (RXsort) {
+        case RX_ahi:
+            return comp1->ahi < comp2->ahi;
+
+        case RX_days:
+            return comp1->days < comp2->days;
+
+        case RX_first:
+            return comp1->first < comp2->first;
+
+        case RX_last:
+            return comp1->last < comp2->last;
+
+        case RX_mode:
+            return comp1->mode < comp2->mode;
+
+        case RX_min:
+            return comp1->min < comp2->min;
+
+        case RX_max:
+            return comp1->max < comp2->max;
+
+        case RX_ps:
+            return comp1->ps < comp2->ps;
+
+        case RX_pshi:
+            return comp1->pshi < comp2->pshi;
+
+        case RX_maxipap:
+            return comp1->maxipap < comp2->maxipap;
+
+        case RX_per1:
+            return comp1->per1 < comp2->per1;
+
+        case RX_per2:
+            return comp1->per2 < comp2->per2;
+
+        case RX_weighted:
+            return comp1->weighted < comp2->weighted;
+        };
+    } else {
+        switch (RXsort) {
+        case RX_ahi:
+            return comp1->ahi > comp2->ahi;
+
+        case RX_days:
+            return comp1->days > comp2->days;
+
+        case RX_first:
+            return comp1->first > comp2->first;
+
+        case RX_last:
+            return comp1->last > comp2->last;
+
+        case RX_mode:
+            return comp1->mode > comp2->mode;
+
+        case RX_min:
+            return comp1->min > comp2->min;
+
+        case RX_max:
+            return comp1->max > comp2->max;
+
+        case RX_ps:
+            return comp1->ps > comp2->ps;
+
+        case RX_pshi:
+            return comp1->pshi > comp2->pshi;
+
+        case RX_maxipap:
+            return comp1->maxipap > comp2->maxipap;
+
+        case RX_per1:
+            return comp1->per1 > comp2->per1;
+
+        case RX_per2:
+            return comp1->per2 > comp2->per2;
+
+        case RX_weighted:
+            return comp1->weighted > comp2->weighted;
+        };
+    }
+
+    return true;
+} */
+struct UsageData {
+    UsageData() { ahi = 0; hours = 0; }
+    UsageData(QDate d, EventDataType v, EventDataType h) { date = d; ahi = v; hours = h; }
+    UsageData(const UsageData &copy) { date = copy.date; ahi = copy.ahi; hours = copy.hours; }
+    QDate date;
+    EventDataType ahi;
+    EventDataType hours;
+};
+bool operator <(const UsageData &c1, const UsageData &c2)
+{
+    if (c1.ahi < c2.ahi) {
+        return true;
+    }
+
+    if ((c1.ahi == c2.ahi) && (c1.date > c2.date)) { return true; }
+
+    return false;
+    //return c1.value < c2.value;
+}
+
+struct Period {
+    Period() {
+    }
+    Period(QDate start, QDate end, QString header) {
+        this->start = start;
+        this->end = end;
+        this->header = header;
+    }
+    Period(const Period & copy) {
+        start=copy.start;
+        end=copy.end;
+        header=copy.header;
+    }
+    QDate start;
+    QDate end;
+    QString header;
+};
+
+const QString heading_color="#ffffff";
+const QString subheading_color="#e0e0e0";
+//const int rxthresh = 5;
+
+QString Statistics::GenerateMachineList()
+{
+    QList<Machine *> cpap_machines = p_profile->GetMachines(MT_CPAP);
+    QList<Machine *> oximeters = p_profile->GetMachines(MT_OXIMETER);
+    QList<Machine *> mach;
+
+    mach.append(cpap_machines);
+    mach.append(oximeters);
+
+    QString html;
+    if (mach.size() > 0) {
+        html += "<div align=center><br/>";
+
+        html += QString("<table class=curved style=\"page-break-before:auto;\" "+table_width+">");
+
+        html += "<thead>";
+        html += "<tr bgcolor='"+heading_color+"'><th colspan=7 align=center><font size=+2>" + tr("Machine Information") + "</font></th></tr>";
+
+        html += QString("<tr><td><b>%1</b></td><td><b>%2</b></td><td><b>%3</b></td><td><b>%4</b></td><td><b>%5</b></td><td><b>%6</b></td></tr>")
+                .arg(STR_TR_Brand)
+                .arg(STR_TR_Series)
+                .arg(STR_TR_Model)
+                .arg(STR_TR_Serial)
+                .arg(tr("First Use"))
+                .arg(tr("Last Use"));
+
+        html += "</thead>";
+
+        Machine *m;
+
+        for (int i = 0; i < mach.size(); i++) {
+            m = mach.at(i);
+
+            if (m->type() == MT_JOURNAL) { continue; }
+
+            QDate d1 = m->FirstDay();
+            QDate d2 = m->LastDay();
+            QString mn = m->modelnumber();
+            html += QString("<tr><td>%1</td><td>%2</td><td>%3</td><td>%4</td><td>%5</td><td>%6</td></tr>")
+                    .arg(m->brand())
+                    .arg(m->series())
+                    .arg(m->model() +
+                         (mn.isEmpty() ? "" : QString(" (") + mn + QString(")")))
+                    .arg(m->serial())
+                    .arg(d1.toString(Qt::SystemLocaleShortDate))
+                    .arg(d2.toString(Qt::SystemLocaleShortDate));
+
+        }
+
+        html += "</table>";
+        html += "</div>";
+    }
+    return html;
+}
+QString Statistics::GenerateRXChanges()
+{
+    updateRXChanges();
+
+    QString ahitxt;
+
+    bool rdi = p_profile->general->calculateRDI();
+    if (rdi) {
+        ahitxt = STR_TR_RDI;
+    } else {
+        ahitxt = STR_TR_AHI;
+    }
+
+
+    QString html = "<div align=center><br/>";
+    html += QString("<table class=curved style=\"page-break-before:always;\" "+table_width+">");
+    html += "<thead>";
+    html += "<tr bgcolor='"+heading_color+"'><th colspan=10 align=center><font size=+2>" + tr("Changes to Prescription Settings") + "</font></th></tr>";
+
+    QString extratxt;
+
+    QString tooltip;
+    QStringList hdrlist;
+    hdrlist.push_back(STR_TR_First);
+    hdrlist.push_back(STR_TR_Last);
+    hdrlist.push_back(tr("Days"));
+    hdrlist.push_back(ahitxt);
+    hdrlist.push_back(STR_TR_FL);
+    hdrlist.push_back(STR_TR_Machine);
+    hdrlist.push_back(tr("Pressure Relief"));
+    hdrlist.push_back(STR_TR_Mode);
+    hdrlist.push_back(tr("Pressure Settings"));
+
+    html+="<tr>\n";
+    for (int i=0; i < hdrlist.size(); ++i) {
+        html+=QString(" <th align=left><b>%1</b></th>\n").arg(hdrlist.at(i));
+    }
+    html+="</tr>\n";
+    html += "</thead>";
+//    html += "<tfoot>";
+//    html += "<tr><td colspan=10 align=center>";
+//    html += QString("<i>") +
+//            tr("Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.").
+//            arg(rxthresh) + QString("</i><br/>");
+//    html += "</td></tr>";
+//    html += "</tfoot>";
+
+    QMapIterator<QDate, RXItem> it(rxitems);
+    it.toBack();
+    while (it.hasPrevious()) {
+        it.previous();
+        const RXItem & rx = it.value();
+
+        QString color;
+
+        if (rx.highlight == 1) {
+            color = "#c0ffc0";
+        } else if (rx.highlight == 2) {
+            color = "#e0ffe0";
+        } else if (rx.highlight == 3) {
+            color = "#ffe0e0";
+        } else if (rx.highlight == 4) {
+            color = "#ffc0c0";
+        } else { color = ""; }
+
+        QString datarowclass;
+        if (rx.highlight == 0) datarowclass="class=datarow";
+        html += QString("<tr %4 bgcolor='%1' onmouseover='ChangeColor(this, \"#dddddd\");' onmouseout='ChangeColor(this, \"%1\");' onclick='alert(\"overview=%2,%3\");'>")
+                .arg(color)
+                .arg(rx.start.toString(Qt::ISODate))
+                .arg(rx.end.toString(Qt::ISODate))
+                .arg(datarowclass);
+
+        double ahi = rdi ? (double(rx.rdi) / rx.hours) : (double(rx.ahi) /rx.hours);
+        double fli = double(rx.count(CPAP_FlowLimit)) / rx. hours;
+
+        html += QString("<td>%1</td>").arg(rx.start.toString())+
+                QString("<td>%1</td>").arg(rx.end.toString())+
+                QString("<td>%1</td>").arg(rx.days)+
+                QString("<td>%1</td>").arg(ahi, 0, 'f', 2)+
+                QString("<td>%1</td>").arg(fli, 0, 'f', 2)+
+                QString("<td>%1</td>").arg(rx.machine->loaderName())+
+                QString("<td>%1</td>").arg(rx.relief)+
+                QString("<td>%1</td>").arg(rx.mode)+
+                QString("<td>%1</td>").arg(rx.pressure)+
+                "</tr>";
+    }
+    html+="</table></div>";
+
+    return html;
+}
+
+QString Statistics::GenerateHTML()
+{
+    QList<Machine *> cpap_machines = p_profile->GetMachines(MT_CPAP);
+    QList<Machine *> oximeters = p_profile->GetMachines(MT_OXIMETER);
+    QList<Machine *> mach;
+
+    mach.append(cpap_machines);
+    mach.append(oximeters);
+
+    bool havedata = false;
+    for (int i=0; i < mach.size(); ++i) {
+        int daysize = mach[i]->day.size();
+        if (daysize > 0) {
+            havedata = true;
+            break;
+        }
+    }
+
+
+    QString html = htmlHeader(havedata);
+
+   // return "";
+
+
+    // Find first and last days with valid CPAP data
+    QDate lastcpap = p_profile->LastGoodDay(MT_CPAP);
+    QDate firstcpap = p_profile->FirstGoodDay(MT_CPAP);
+
+
+    QDate cpapweek = lastcpap.addDays(-6);
+    QDate cpapmonth = lastcpap.addDays(-29);
+    QDate cpap6month = lastcpap.addMonths(-6);
+    QDate cpapyear = lastcpap.addMonths(-12);
+
+    if (cpapweek < firstcpap) { cpapweek = firstcpap; }
+    if (cpapmonth < firstcpap) { cpapmonth = firstcpap; }
+    if (cpap6month < firstcpap) { cpap6month = firstcpap; }
+    if (cpapyear < firstcpap) { cpapyear = firstcpap; }
+
+
+    if (!havedata) {
+        html += "<div align=center><table class=curved height=100% "+table_width+">";
+        html += QString("<tr><td colspan=2 align=center>") +
+                "<img src='qrc:/icons/bob-v3.0.png' height=100px>"
+                "<p><font size=+3>" + tr("I can haz data?!?") + "</font></p>"+
+                "<p><i>"+tr("This lonely sleepy sheep has no data :(")+"</i></p>"
+
+        "</table></div>";
+        html += htmlFooter(havedata);
+        return html;
+    }
+
+
+   // int cpapdays = p_profile->countDays(MT_CPAP, firstcpap, lastcpap);
+
+//    CPAPMode cpapmode = (CPAPMode)(int)p_profile->calcSettingsMax(CPAP_Mode, MT_CPAP, firstcpap, lastcpap);
+
+ //   float percentile = p_profile->general->prefCalcPercentile() / 100.0;
+
+    //    int mididx=p_profile->general->prefCalcMiddle();
+    //    SummaryType ST_mid;
+    //    if (mididx==0) ST_mid=ST_PERC;
+    //    if (mididx==1) ST_mid=ST_WAVG;
+    //    if (mididx==2) ST_mid=ST_AVG;
+
+    QString ahitxt;
+
+    if (p_profile->general->calculateRDI()) {
+        ahitxt = STR_TR_RDI;
+    } else {
+        ahitxt = STR_TR_AHI;
+    }
+
+  //  int decimals = 2;
+    html += "<div align=center>";
+    html += QString("<table class=curved "+table_width+">");
+
+    int number_periods = 0;
+    if (p_profile->general->statReportMode() == 1) {
+        number_periods = p_profile->FirstDay().daysTo(p_profile->LastDay()) / 30;
+        if (number_periods > 12) {
+            number_periods = 12;
+        }
+    }
+
+    QDate last = lastcpap, first = lastcpap;
+
+    QList<Period> periods;
+
+
+    bool skipsection = false;;
+    for (QList<StatisticsRow>::iterator i = rows.begin(); i != rows.end(); ++i) {
+        StatisticsRow &row = (*i);
+        QString name;
+
+        if (row.calc == SC_HEADING) {  // All sections begin with a heading
+            last = p_profile->LastGoodDay(row.type);
+            first = p_profile->FirstGoodDay(row.type);
+
+            periods.clear();
+            if (p_profile->general->statReportMode() == 0) {
+                periods.push_back(Period(last,last,tr("Most Recent")));
+                periods.push_back(Period(qMax(last.addDays(-6), first), last, tr("Last Week")));
+                periods.push_back(Period(qMax(last.addDays(-29),first), last, tr("Last 30 Days")));
+                periods.push_back(Period(qMax(last.addMonths(-6), first), last, tr("Last 6 Months")));
+                periods.push_back(Period(qMax(last.addMonths(-12), first), last, tr("Last Year")));
+            } else {
+                QDate l=last,s=last;
+
+                periods.push_back(Period(last,last,tr("Last Session")));
+
+                bool done=false;
+                int j=0;
+                do {
+                    s=QDate(l.year(), l.month(), 1);
+                    if (s < first) {
+                        done = true;
+                        s = first;
+                    }
+                    if (p_profile->countDays(row.type, s, l) > 0) {
+                        periods.push_back(Period(s, l, s.toString("MMMM")));
+                        j++;
+                    }
+                    l = s.addDays(-1);
+                } while ((l > first) && (j < number_periods));
+
+//                for (; j < number_periods; ++j) {
+//                    s=QDate(l.year(), l.month(), 1);
+//                    if (s < first) {
+//                        done = true;
+//                        s = first;
+//                    }
+//                    if (p_profile->countDays(row.type, s, l) > 0) {
+//                        periods.push_back(Period(s, l, s.toString("MMMM")));
+//                    } else {
+//                    }
+//                    l = s.addDays(-1);
+//                    if (done || (l < first)) break;
+//                }
+                for (; j < number_periods; ++j) {
+                    periods.push_back(Period(last,last, ""));
+                }
+            }
+
+            int days = p_profile->countDays(row.type, first, last);
+            skipsection = (days == 0);
+            if (days > 0) {
+                html+=QString("<tr bgcolor='%1'><th colspan=%2 align=center><font size=+2>%3</font></th></tr>\n").
+                        arg(heading_color).arg(periods.size()+1).arg(row.src);
+            }
+            continue;
+        }
+
+        // Bypass this entire section if no data is present
+        if (skipsection) continue;
+
+        if (row.calc == SC_AHI) {
+            name = ahitxt;
+        } else if ((row.calc == SC_HOURS) || (row.calc == SC_COMPLIANCE)) {
+            name = row.src;
+        } else if (row.calc == SC_COLUMNHEADERS) {
+            html += QString("<tr><td><b>%1</b></td>\n").arg(tr("Details"));
+            for (int j=0; j < periods.size(); j++) {
+                html += QString("<td onmouseover='ChangeColor(this, \"#eeeeee\");' onmouseout='ChangeColor(this, \"#ffffff\");' onclick='alert(\"overview=%1,%2\");'><b>%3</b></td>\n").arg(periods.at(j).start.toString(Qt::ISODate)).arg(periods.at(j).end.toString(Qt::ISODate)).arg(periods.at(j).header);
+            }
+            html += "</tr>\n";
+            continue;
+        } else if (row.calc == SC_DAYS) {
+            QDate first=p_profile->FirstGoodDay(row.type);
+            QDate last=p_profile->LastGoodDay(row.type);
+            QString & machine = machinenames[row.type];
+            int value=p_profile->countDays(row.type, first, last);
+
+            if (value == 0) {
+                html+=QString("<tr><td colspan=%1 align=center>%2</td></tr>\n").arg(periods.size()+1).
+                        arg(QString(tr("No %1 data available.")).arg(machine));
+            } else if (value == 1) {
+                html+=QString("<tr><td colspan=%1 align=center>%2</td></tr>\n").arg(periods.size()+1).
+                        arg(QString(tr("%1 day of %2 Data on %3"))
+                            .arg(value)
+                            .arg(machine)
+                            .arg(last.toString()));
+            } else {
+                html+=QString("<tr><td colspan=%1 align=center>%2</td></tr>\n").arg(periods.size()+1).
+                        arg(QString(tr("%1 days of %2 Data, between %3 and %4"))
+                            .arg(value)
+                            .arg(machine)
+                            .arg(first.toString())
+                            .arg(last.toString()));
+            }
+            continue;
+        } else if (row.calc == SC_SUBHEADING) {  // subheading..
+            html+=QString("<tr bgcolor='%1'><td colspan=%2 align=center><b>%3</b></td></tr>\n").
+                    arg(subheading_color).arg(periods.size()+1).arg(row.src);
+            continue;
+        } else if (row.calc == SC_UNDEFINED) {
+            continue;
+        } else {
+            ChannelID id = schema::channel[row.src].id();
+            if ((id == NoChannel) || (!p_profile->channelAvailable(id))) {
+                continue;
+            }
+            name = calcnames[row.calc].arg(schema::channel[id].fullname());
+        }
+        QString line;
+        line += QString("<tr class=datarow><td width=25%>%1</td>").arg(name);
+        int np = periods.size();
+        int width;
+        for (int j=0; j < np; j++) {
+            if (p_profile->general->statReportMode() == 1) {
+                width = j < np-1 ? 6 : 100 - (25 + 6*(np-1));
+            } else {
+                width = 75/np;
+            }
+
+            line += QString("<td width=%1%>").arg(width);
+            if (!periods.at(j).header.isEmpty()) {
+                line += row.value(periods.at(j).start, periods.at(j).end);
+            } else {
+                line +=" ";
+            }
+            line += "</td>";
+        }
+        html += line;
+        html += "</tr>\n";
+    }
+
+    html += "</table>";
+    html += "</div>";
+
+    /*
+    QList<UsageData> AHI;
+
+    if (cpapdays > 0) {
+        QDate first, last = lastcpap;
+        CPAPMode mode = MODE_UNKNOWN, cmode = MODE_UNKNOWN;
+        EventDataType cmin = 0, cmax = 0, cps = 0, cpshi = 0, cmaxipap = 0, min = 0, max = 0, maxipap = 0,
+                      ps = 0, pshi = 0;
+        Machine *mach = nullptr, *lastmach = nullptr;
+        QString last_prel_str, last_pressure_str, prel_str, pressure_str;
+        QDate date = lastcpap;
+        Day *day;
+        bool lastchanged = false;
+        QVector<RXChange> rxchange;
+        EventDataType hours;
+
+        int compliant = 0;
+
+        do {
+            day = p_profile->GetGoodDay(date, MT_CPAP);
+
+
+            CPAPLoader * loader = nullptr;
+
+            if (day) loader = dynamic_cast<CPAPLoader *>(day->machine(MT_CPAP)->loader());
+
+            if (day && loader) {
+                lastchanged = false;
+
+                hours = day->hours(MT_CPAP);
+
+                if (hours > p_profile->cpap->complianceHours()) {
+                    compliant++;
+                }
+
+                EventDataType ahi = day->count(CPAP_Obstructive) + day->count(CPAP_Hypopnea) + day->count(CPAP_Apnea) + day->count(CPAP_ClearAirway);
+
+                if (p_profile->general->calculateRDI()) { ahi += day->count(CPAP_RERA); }
+
+                ahi /= hours;
+                AHI.push_back(UsageData(date, ahi, hours));
+
+                prel_str = day->getPressureRelief();
+                pressure_str = day->getPressureSettings();
+
+                mode = (CPAPMode)(int)round(day->settings_wavg(CPAP_Mode));
+                if (mode ==0) {
+                    mode = (CPAPMode)(int)round(day->settings_wavg(CPAP_Mode));
+                }
+                mach = day->machine(MT_CPAP);
+
+                min = max = ps = pshi = maxipap = 0;
+
+                if (mode == MODE_CPAP) {
+                    min = day->settings_min(CPAP_Pressure);
+                } else if (mode == MODE_APAP) {
+                    min = day->settings_min(CPAP_PressureMin);
+                    max = day->settings_max(CPAP_PressureMax);
+                } else if (mode ==  MODE_BILEVEL_FIXED) {
+                    min = day->settings_min(CPAP_EPAP);
+                    max = day->settings_max(CPAP_IPAP);
+                    ps = max-min;
+                } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+                    min = day->settings_min(CPAP_EPAPLo);
+                    maxipap = max = day->settings_max(CPAP_IPAPHi);
+                    ps = day->settings_min(CPAP_PS);
+                } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) { // Similar pressure control as ASV Variable EPAP
+                    min = day->settings_min(CPAP_EPAPLo);
+                    max = day->settings_min(CPAP_EPAPHi);
+                    ps = day->settings_min(CPAP_PSMin);
+                    pshi = day->settings_max(CPAP_PSMax);
+                    maxipap = max = day->settings_max(CPAP_IPAPHi);
+                } else if (mode ==  MODE_ASV) {
+                    min = day->settings_min(CPAP_EPAP);
+                    ps = day->settings_min(CPAP_PSMin);
+                    pshi = day->settings_max(CPAP_PSMax);
+                    maxipap = min+pshi;
+                } else if (mode == MODE_ASV_VARIABLE_EPAP) {
+                    min = day->settings_min(CPAP_EPAPLo);
+                    max = day->settings_max(CPAP_EPAPHi);
+                    ps = day->settings_min(CPAP_PSMin);
+                    pshi = day->settings_max(CPAP_PSMax);
+                    maxipap = max + pshi;
+
+                }
+
+                if (lastmach == nullptr) {
+                    lastmach = mach;
+                    cmode = mode;
+                    last_pressure_str = pressure_str;
+                    last_prel_str = prel_str;
+
+                }
+
+                if ((mode != cmode) || (pressure_str != last_pressure_str) || (prel_str != last_prel_str) || (mach != lastmach)) {
+                    first = date.addDays(1);
+                    int days = p_profile->countDays(MT_CPAP, first, last);
+                    RXChange rx;
+                    rx.first = first;
+                    rx.last = last;
+                    rx.days = days;
+                    rx.ahi = calcAHI(first, last);
+                    rx.fl = calcFL(first, last);
+                    rx.mode = cmode;
+                    rx.pressure_string = last_pressure_str;
+                    rx.pr_relief_string = last_prel_str;
+                    rx.min = cmin;
+                    rx.max = cmax;
+                    rx.ps = cps;
+                    rx.pshi = cpshi;
+                    rx.maxipap = cmaxipap;
+                    rx.machine = lastmach;
+                    rx.per1 = 0;
+                    rx.per2 = 0;
+
+                    if (mode == MODE_APAP) {
+                        rx.per1 = p_profile->calcPercentile(CPAP_Pressure, percentile, MT_CPAP, first, last);
+                        rx.per2 = 0;
+                    } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+                        rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
+                        rx.per2 = p_profile->calcPercentile(CPAP_IPAP, percentile, MT_CPAP, first, last);
+                    } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
+                        rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
+                        rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
+                    } else if (mode == MODE_ASV) {
+                        rx.per1 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
+                        rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
+                    } else if (mode == MODE_ASV_VARIABLE_EPAP) {
+                        rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
+                        rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
+                    }
+
+                    rx.weighted = float(rx.days) / float(cpapdays) * rx.ahi;
+                    rxchange.push_back(rx);
+
+                    cmode = mode;
+                    cmin = min;
+                    cmax = max;
+                    cps = ps;
+                    cpshi = pshi;
+                    cmaxipap = maxipap;
+                    last_prel_str = prel_str;
+                    last_pressure_str = pressure_str;
+                    last = date;
+                    lastmach = mach;
+                    lastchanged = true;
+                }
+
+            }
+
+            date = date.addDays(-1);
+        } while (date >= firstcpap);
+
+        // Sort list by AHI
+        qSort(AHI);
+
+       lastchanged = false;
+
+        // Add the final entry
+        if (!lastchanged && (mach != nullptr)) {
+            // last=date.addDays(1);
+            first = firstcpap;
+            int days = p_profile->countDays(MT_CPAP, first, last);
+            RXChange rx;
+            rx.first = first;
+            rx.last = last;
+            rx.days = days;
+            rx.ahi = calcAHI(first, last);
+            rx.fl = calcFL(first, last);
+            rx.mode = mode;
+            rx.min = min;
+            rx.max = max;
+            rx.ps = ps;
+            rx.pshi = pshi;
+            rx.maxipap = maxipap;
+            rx.machine = mach;
+            rx.pressure_string = pressure_str;
+            rx.pr_relief_string = prel_str;
+
+            // Todo: Clean up by Calculating this crap later..
+            if (mode == MODE_APAP) {
+                rx.per1 = p_profile->calcPercentile(CPAP_Pressure, percentile, MT_CPAP, first, last);
+                rx.per2 = 0;
+            } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+                rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
+                rx.per2 = p_profile->calcPercentile(CPAP_IPAP, percentile, MT_CPAP, first, last);
+            } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
+                rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
+                rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
+            } else if (mode == MODE_ASV) {
+                rx.per1 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
+                rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
+            } else if (mode == MODE_ASV_VARIABLE_EPAP) {
+                rx.per1 = p_profile->calcPercentile(CPAP_EPAP, percentile, MT_CPAP, first, last);
+                rx.per2 = p_profile->calcPercentile(CPAP_PS, percentile, MT_CPAP, first, last);
+            }
+
+            rx.weighted = float(rx.days) / float(cpapdays);
+            //rx.weighted=float(days)*rx.ahi;
+            rxchange.push_back(rx);
+        }
+
+        int rxthresh = 5;
+        QVector<RXChange *> tmpRX;
+
+        for (int i = 0; i < rxchange.size(); i++) {
+            RXChange &rx = rxchange[i];
+
+            if (rx.days >= rxthresh) {
+                tmpRX.push_back(&rx);
+            }
+        }
+
+        QString recbox = "<html><head><style type='text/css'>"
+                         "p,a,td,body { font-family: '" + QApplication::font().family() + "'; }"
+                         "p,a,td,body { font-size: " + QString::number(QApplication::font().pointSize() + 2) + "px; }"
+                         "a:link,a:visited { color: inherit; text-decoration: none; }" //font-weight: normal;
+                         "a:hover { background-color: inherit; color: white; text-decoration:none; font-weight: bold; }"
+                         "</style></head><body>";
+        recbox += "<table width=100% cellpadding=1 cellspacing=0>";
+        int numdays = AHI.size();
+
+        if (numdays > 1) {
+            int z = numdays / 2;
+
+            if (z > 4) { z = 4; }
+
+            recbox += QString("<tr><td colspan=2 align=center><b>%1</b></td></tr>").arg(
+                          tr("Usage Information"));
+            recbox += QString("<tr><td>%1</td><td align=right>%2</td></tr>").arg(tr("Total Days")).arg(
+                          numdays);
+
+            if (p_profile->cpap->showComplianceInfo()) {
+                recbox += QString("<tr><td>%1</td><td align=right>%2</td></tr>").arg(tr("Compliant Days")).arg(
+                              compliant);
+            }
+
+            int highahi = 0;
+
+            for (int i = 0; i < numdays; i++) {
+                if (AHI.at(i).ahi > 5.0) {
+                    highahi++;
+                }
+            }
+
+            recbox += QString("<tr><td>%1</td><td align=right>%2</td></tr>").arg(tr("Days AHI >5.0")).arg(
+                          highahi);
+
+
+            recbox += QString("<tr><td colspan=2> </td></tr>");
+            recbox += QString("<tr><td colspan=2 align=center><b>%1</b></td></tr>").arg(tr("Best %1").arg(
+                          ahitxt));
+
+            for (int i = 0; i < z; i++) {
+                const UsageData &a = AHI.at(i);
+                recbox += QString("<tr><td><a href='daily=%1'>%2</a></td><td  align=right>%3</td></tr>")
+                          .arg(a.date.toString(Qt::ISODate))
+                          .arg(a.date.toString(Qt::SystemLocaleShortDate))
+                          .arg(a.ahi, 0, 'f', decimals);
+            }
+
+            recbox += QString("<tr><td colspan=2> </td></tr>");
+            recbox += QString("<tr><td colspan=2 align=center><b>%1</b></td></tr>").arg(
+                          tr("Worst %1").arg(ahitxt));
+
+            for (int i = 0; i < z; i++) {
+                const UsageData &a = AHI.at((numdays - 1) - i);
+                recbox += QString("<tr><td><a href='daily=%1'>%2</a></td><td align=right>%3</td></tr>")
+                          .arg(a.date.toString(Qt::ISODate))
+                          .arg(a.date.toString(Qt::SystemLocaleShortDate))
+                          .arg(a.ahi, 0, 'f', decimals);
+            }
+
+            recbox += QString("<tr><td colspan=2> </td></tr>");
+        }
+
+
+        if (tmpRX.size() > 0) {
+            RXsort = RX_ahi;
+            qSort(tmpRX.begin(), tmpRX.end(), RXSort);
+            tmpRX[0]->highlight = 4; // worst
+            int ls = tmpRX.size() - 1;
+            tmpRX[ls]->highlight = 1; //best
+            QString modestr;
+
+            QString idxstr[2];
+            int idx[2];
+            idx[0]=ls;
+            idx[1]=0;
+            idxstr[0]=tr("Best RX Setting");
+            idxstr[1]=tr("Worst RX Setting");
+
+            for (int i=0; i<2; ++i ) {
+                int i2 = idx[i];
+                if ((i==1) && (ls == 0)) break;
+                CPAPMode mode = (CPAPMode)(int)p_profile->calcSettingsMax(CPAP_Mode, MT_CPAP, tmpRX[i2]->first, tmpRX[i2]->last);
+
+                if (mode == MODE_CPAP) {
+                    modestr = STR_TR_CPAP;
+                } else if (mode ==  MODE_APAP) { // is AUTO?
+                    modestr = STR_TR_APAP;
+                } else if (mode == MODE_BILEVEL_FIXED) {
+                    modestr = STR_TR_BiLevel;
+                } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+                    modestr = QObject::tr("Auto Bi-Level");
+                } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
+                    modestr = QObject::tr("Auto Bi-Level");
+                } else if (mode == MODE_ASV) {
+                    modestr = QObject::tr("ASV Fixed EPAP");
+                } else if (mode == MODE_ASV_VARIABLE_EPAP) {
+                    modestr = QObject::tr("ASV Auto EPAP");
+                } else modestr = STR_TR_Unknown;
+
+
+                recbox += QString("<tr><td colspan=2><table width=100% border=0 cellpadding=1 cellspacing=0><tr><td colspan=2 align=center><b>%3</b></td></tr>")
+                          .arg(idxstr[i]);
+                recbox += QString("<tr><td valign=top>") + STR_TR_Start + "<br/>" + STR_TR_End +
+                          QString("</td><td align=right><a href='overview=%1,%2'>%3<br/>%4</a></td></tr>")
+                          .arg(tmpRX[i2]->first.toString(Qt::ISODate))
+                          .arg(tmpRX[i2]->last.toString(Qt::ISODate))
+                          .arg(tmpRX[i2]->first.toString(Qt::SystemLocaleShortDate))
+                          .arg(tmpRX[i2]->last.toString(Qt::SystemLocaleShortDate));
+                recbox += QString("<tr><td><b>%1</b></td><td align=right><b>%2</b></td></tr>").arg(ahitxt).arg(tmpRX[i2]->ahi, 0, 'f', decimals);
+                recbox += QString("<tr><td>%1</td><td align=right>%2</td></tr>").arg(STR_TR_Mode).arg(modestr);
+                if (mode == MODE_CPAP) {
+                    recbox += QString("<tr><td>")+QObject::tr("Fixed")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                } else if (mode == MODE_APAP) {
+                    recbox += QString("<tr><td>")+QObject::tr("Min")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                    recbox += QString("<tr><td>")+QObject::tr("Max")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                } else if (mode == MODE_BILEVEL_FIXED) {
+                    recbox += QString("<tr><td>")+QObject::tr("EPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                    recbox += QString("<tr><td>")+QObject::tr("IPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+                    recbox += QString("<tr><td>")+QObject::tr("Min EPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                    recbox += QString("<tr><td>")+QObject::tr("Max IPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                    recbox += QString("<tr><td>")+QObject::tr("PS")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->ps, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                } else if (mode == MODE_ASV) {
+                    recbox += QString("<tr><td>")+QObject::tr("EPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                    recbox += QString("<tr><td>")+QObject::tr("PS")+QString("</td><td align=right>%1-%2%3</td></tr>").arg(tmpRX[i2]->ps, 0, 'f', 1).arg(tmpRX[i2]->pshi, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+//                    recbox += QString("<tr><td>")+QObject::tr("Max IPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->maxipap, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                } else if (mode == MODE_ASV_VARIABLE_EPAP) {
+                    recbox += QString("<tr><td>")+QObject::tr("EPAP")+QString("</td><td align=right>%1-%2%3</td></tr>").arg(tmpRX[i2]->min, 0, 'f', 1).arg(tmpRX[i2]->max, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                    recbox += QString("<tr><td>")+QObject::tr("PS")+QString("</td><td align=right>%1-%2%3</td></tr>").arg(tmpRX[i2]->ps, 0, 'f', 1).arg(tmpRX[i2]->pshi, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+//                    recbox += QString("<tr><td>")+QObject::tr("Max IPAP")+QString("</td><td align=right>%1%2</td></tr>").arg(tmpRX[i2]->maxipap, 0, 'f', 1).arg(STR_UNIT_CMH2O);
+                }
+                recbox += "</table><br/></td></tr>";
+            }
+        }
+
+        recbox += "</table>";
+        recbox += "</body></html>";
+        mainwin->setRecBoxHTML(recbox); */
+
+        /*RXsort=RX_min;
+        RXorder=true;
+        qSort(rxchange.begin(),rxchange.end());*/
+
+    /*    html += "<div align=center><br/>";
+        html += QString("<table class=curved style=\"page-break-before:always;\" "+table_width+">");
+        html += "<thead>";
+        html += "<tr bgcolor='"+heading_color+"'><th colspan=10 align=center><font size=+2>" + tr("Changes to Prescription Settings") + "</font></th></tr>";
+
+        QString extratxt;
+
+        QString tooltip;
+        QStringList hdrlist;
+        hdrlist.push_back(STR_TR_First);
+        hdrlist.push_back(STR_TR_Last);
+        hdrlist.push_back(tr("Days"));
+        hdrlist.push_back(ahitxt);
+        hdrlist.push_back(STR_TR_FL);
+        if (p_profile->hasChannel(CPAP_SensAwake)) {
+            hdrlist.push_back(STR_TR_SA);
+        }
+        hdrlist.push_back(STR_TR_Machine);
+        hdrlist.push_back(tr("Pressure Relief"));
+        hdrlist.push_back(STR_TR_Mode);
+        hdrlist.push_back(tr("Pressure Settings"));
+
+        html+="<tr>\n";
+        for (int i=0; i < hdrlist.size(); ++i) {
+            html+=QString(" <th align=left><b>%1</b></th>\n").arg(hdrlist.at(i));
+        }
+        html+="</tr>\n";
+        html += "</thead>";
+        html += "<tfoot>";
+        html += "<tr><td colspan=10 align=center>";
+        html += QString("<i>") +
+                tr("Efficacy highlighting ignores prescription settings with less than %1 days of recorded data.").
+                arg(rxthresh) + QString("</i><br/>");
+
+        html += "</td></tr>";
+        html += "</tfoot>";
+
+
+        for (int i = 0; i < rxchange.size(); i++) {
+            RXChange rx = rxchange.at(i);
+            QString color;
+
+            if (rx.highlight == 1) {
+                color = "#c0ffc0";
+            } else if (rx.highlight == 2) {
+                color = "#e0ffe0";
+            } else if (rx.highlight == 3) {
+                color = "#ffe0e0";
+            } else if (rx.highlight == 4) {
+                color = "#ffc0c0";
+            } else { color = ""; }
+
+            QString machstr;
+
+            if (!rx.machine->brand().isEmpty()) {
+                machstr += rx.machine->brand();
+            }
+
+            if (!rx.machine->model().isEmpty()) {
+                machstr += " " + rx.machine->model();
+            }
+
+            if (!rx.machine->serial().isEmpty()) {
+                machstr += " (" + rx.machine->serial() + ")<br/>";
+            }
+
+            mode = rx.mode;
+            extratxt = "<table border=0 width=100%><tr>"; //cellpadding=0 cellspacing=0
+
+            //            tooltip=QString("%1 %2% ").arg(machstr).arg(percentile*100.0)+STR_TR_EPAP+
+            //                    QString("=%1<br/>%2% ").arg(rx.per1,0,'f',decimals).arg(percentile*100.0)+
+            //                    STR_TR_IPAP+QString("=%1").arg(rx.per2,0,'f',decimals);
+            tooltip = QString("%1").arg(machstr);
+
+            extratxt += "<td colspan=2>"+rx.pressure_string+"</td>";
+//            if (mode == MODE_CPAP) {
+//                extratxt += "<td colspan=2>"+QString(tr("Fixed %1 %2")+"</td>").arg(rx.min, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
+//            } else if (mode == MODE_APAP) {
+//                extratxt += "<td colspan=2>"+QString(tr("%1 - %2 %3")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
+//            } else if (mode == MODE_BILEVEL_FIXED) {
+//                extratxt += "<td colspan=2>"+QString(tr("EPAP %1 %3 IPAP %2 %3")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
+//            } else if (mode == MODE_BILEVEL_AUTO_FIXED_PS) {
+//                extratxt += "<td colspan=2>"+QString(tr("PS %4 over %1 - %2 %3")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units()).arg(rx.ps, 4, 'f', 1);
+//            } else if (mode == MODE_BILEVEL_AUTO_VARIABLE_PS) {
+//                extratxt += "<td colspan=2>"+QString(tr("EPAP %1-%2, PS %3-%4 %5")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(rx.ps, 4, 'f', 1).arg(rx.pshi, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
+//            } else if (mode == MODE_ASV) {
+//                extratxt += "<td colspan=2>"+QString(tr("EPAP %1, PS %2-%3 %4")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.ps, 4, 'f', 1).arg(rx.pshi, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
+//                tooltip = QString("%1 %2% ").arg(machstr).arg(percentile * 100.0) +
+//                          STR_TR_EPAP +
+//                          QString("=%1<br/>%2% ").arg(rx.per1, 0, 'f', decimals)
+//                          .arg(percentile * 100.0)
+//                          + STR_TR_IPAP + QString("=%1").arg(rx.per2, 0, 'f', decimals);
+//            } else if (mode == MODE_ASV_VARIABLE_EPAP) {
+//                extratxt += "<td colspan=2>"+QString(tr("EPAP %1-%2, PS %3-%4 %5")+"</td>").arg(rx.min, 4, 'f', 1).arg(rx.max, 4, 'f', 1).arg(rx.ps, 4, 'f', 1).arg(rx.pshi, 4, 'f', 1).arg(schema::channel[CPAP_Pressure].units());
+//                tooltip = QString("%1 %2% ").arg(machstr).arg(percentile * 100.0) +
+//                          STR_TR_EPAP +
+//                          QString("=%1<br/>%2% ").arg(rx.per1, 0, 'f', decimals)
+//                          .arg(percentile * 100.0)
+//                          + STR_TR_IPAP + QString("=%1").arg(rx.per2, 0, 'f', decimals);
+//            } else {
+//                    extratxt += "";
+//                    tooltip = "";
+//            }
+
+            extratxt += "</tr></table>";
+
+            QString tooltipshow, tooltiphide;
+
+            if (!tooltip.isEmpty()) {
+                tooltipshow = QString("tooltip.show(\"%1\");").arg(tooltip);
+                tooltiphide = "tooltip.hide();";
+            }
+
+            QString datarowclass;
+            if (rx.highlight == 0) datarowclass="class=datarow";
+            html += QString("<tr %6 bgcolor='%1' onmouseover='ChangeColor(this, \"#eeeeee\"); %2' onmouseout='ChangeColor(this, \"%1\"); %3' onclick='alert(\"overview=%4,%5\");'>")
+                    .arg(color)
+                    .arg(tooltipshow)
+                    .arg(tooltiphide)
+                    .arg(rx.first.toString(Qt::ISODate))
+                    .arg(rx.last.toString(Qt::ISODate))
+                    .arg(datarowclass);
+
+
+            html += QString("<td>%1</td>").arg(rx.first.toString(Qt::SystemLocaleShortDate));
+            html += QString("<td>%1</td>").arg(rx.last.toString(Qt::SystemLocaleShortDate));
+            html += QString("<td>%1</td>").arg(rx.days);
+            html += QString("<td>%1</td>").arg(rx.ahi, 0, 'f', decimals);
+            html += QString("<td>%1</td>").arg(rx.fl, 0, 'f', decimals); // Not the best way to do this.. Todo: Add an extra field for data..
+
+            if (p_profile->hasChannel(CPAP_SensAwake)) {
+                html += QString("<td>%1</td>").arg(calcSA(rx.first, rx.last), 0, 'f', decimals);
+            }
+            html += QString("<td>%1</td>").arg(rx.machine->loaderName());
+            html += QString("<td>%1</td>").arg(rx.pr_relief_string);
+            html += QString("<td>%1</td>").arg(schema::channel[CPAP_Mode].option(int(rx.mode)));
+            html += QString("<td>%1</td>").arg(extratxt);
+            html += "</tr>";
+        }
+
+        html += "</table>";
+        html += "</div>";
+
+   } */
+    html += GenerateRXChanges();
+    html += GenerateMachineList();
+
+    UpdateRecordsBox();
+
+
+
+    html += "<script type='text/javascript' language='javascript' src='qrc:/docs/script.js'></script>";
+    //updateFavourites();
+    html += htmlFooter();
+    return html;
+}
+
+void Statistics::UpdateRecordsBox()
+{
+    QString html = "<html><head><style type='text/css'>"
+                     "p,a,td,body { font-family: '" + QApplication::font().family() + "'; }"
+                     "p,a,td,body { font-size: " + QString::number(QApplication::font().pointSize() + 2) + "px; }"
+                     "a:link,a:visited { color: inherit; text-decoration: none; }" //font-weight: normal;
+                     "a:hover { background-color: inherit; color: white; text-decoration:none; font-weight: bold; }"
+                     "</style></head><body>";
+
+    Machine * cpap = p_profile->GetMachine(MT_CPAP);
+    if (cpap) {
+        QDate first = p_profile->FirstGoodDay(MT_CPAP);
+        QDate last = p_profile->LastGoodDay(MT_CPAP);
+
+        /////////////////////////////////////////////////////////////////////////////////////
+        /// Compliance and usage information
+        /////////////////////////////////////////////////////////////////////////////////////
+        int totaldays = p_profile->countDays(MT_CPAP, first, last);
+        int compliant = p_profile->countCompliantDays(MT_CPAP, first, last);
+
+        float comperc = (100.0 / float(totaldays)) * float(compliant);
+
+        html += "<b>"+QObject::tr("CPAP Usage")+"</b><br/>";
+        html += QObject::tr("Days Used: %1").arg(totaldays) + "<br/>";
+        html += QObject::tr("Low Use Days: %1").arg(totaldays - compliant) + "<br/>";
+        html += QObject::tr("Compliance: %1%").arg(comperc, 0, 'f', 1)  + "<br/>";
+
+        /////////////////////////////////////////////////////////////////////////////////////
+        /// AHI Records
+        /////////////////////////////////////////////////////////////////////////////////////
+
+        if (p_profile->session->preloadSummaries()) {
+            const int show_records = 5;
+            QMultiMap<float, QDate>::iterator it;
+            QMultiMap<float, QDate>::iterator it_end;
+
+            QMultiMap<float, QDate> ahilist;
+            int baddays = 0;
+
+            for (QDate date = first; date <= last; date = date.addDays(1)) {
+                Day * day = p_profile->GetGoodDay(date, MT_CPAP);
+                if (!day) continue;
+
+                float ahi = day->calcAHI();
+                if (ahi >= 5) {
+                    baddays++;
+                }
+                ahilist.insert(ahi, date);
+            }
+            html += QObject::tr("Days AHI of 5 or greater: %1").arg(baddays) + "<br/><br/>";
+
+
+            if (ahilist.size() > (show_records * 2)) {
+                it = ahilist.begin();
+                it_end = ahilist.end();
+
+                html += "<b>"+QObject::tr("Best AHI")+"</b><br/>";
+
+                for (int i=0; (i<show_records) && (it != it_end); ++i, ++it) {
+                    html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+                            +QObject::tr("Date: %1 AHI: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+
+                }
+
+                html += "<br/>";
+
+                html += "<b>"+QObject::tr("Worst AHI")+"</b><br/>";
+
+                it = ahilist.end() - 1;
+                it_end = ahilist.begin();
+                for (int i=0; (i<show_records) && (it != it_end); ++i, --it) {
+                    html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+                        +QObject::tr("Date: %1 AHI: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+
+                }
+
+                html += "<br/>";
+            }
+
+            /////////////////////////////////////////////////////////////////////////////////////
+            /// Flow Limitation Records
+            /////////////////////////////////////////////////////////////////////////////////////
+
+            ahilist.clear();
+            for (QDate date = first; date <= last; date = date.addDays(1)) {
+                Day * day = p_profile->GetGoodDay(date, MT_CPAP);
+                if (!day) continue;
+
+                float val = 0;
+                if (day->channelHasData(CPAP_FlowLimit)) {
+                    val = day->calcIdx(CPAP_FlowLimit);
+                } else if (day->channelHasData(CPAP_FLG)) {
+                    // Use 90th percentile
+                    val = day->calcPercentile(CPAP_FLG);
+                }
+                ahilist.insert(val, date);
+            }
+
+            int cnt = 0;
+            if (ahilist.size() > (show_records * 2)) {
+                it = ahilist.begin();
+                it_end = ahilist.end();
+
+                html += "<b>"+QObject::tr("Best Flow Limitation")+"</b><br/>";
+
+                for (int i=0; (i<show_records) && (it != it_end); ++i, ++it) {
+                    html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+                        +QObject::tr("Date: %1 FL: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+
+                }
+
+                html += "<br/>";
+
+                html += "<b>"+QObject::tr("Worst Flow Limtation")+"</b><br/>";
+
+                it = ahilist.end() - 1;
+                it_end = ahilist.begin();
+                for (int i=0; (i<show_records) && (it != it_end); ++i, --it) {
+                    if (it.key() > 0) {
+                        html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+                            +QObject::tr("Date: %1 FL: %2").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+                        cnt++;
+                    }
+                }
+                if (cnt == 0) {
+                    html+= "<i>"+QObject::tr("No Flow Limitation on record")+"</i><br/>";
+                }
+
+                html += "<br/>";
+            }
+
+            /////////////////////////////////////////////////////////////////////////////////////
+            /// Large Leak Records
+            /////////////////////////////////////////////////////////////////////////////////////
+
+            ahilist.clear();
+            for (QDate date = first; date <= last; date = date.addDays(1)) {
+                Day * day = p_profile->GetGoodDay(date, MT_CPAP);
+                if (!day) continue;
+
+                float leak = day->calcPON(CPAP_LargeLeak);
+                ahilist.insert(leak, date);
+            }
+
+            cnt = 0;
+            if (ahilist.size() > (show_records * 2)) {
+                html += "<b>"+QObject::tr("Worst Large Leaks")+"</b><br/>";
+
+                it = ahilist.end() - 1;
+                it_end = ahilist.begin();
+
+                for (int i=0; (i<show_records) && (it != it_end); ++i, --it) {
+                    if (it.key() > 0) {
+                        html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+                            +QObject::tr("Date: %1 Leak: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+                        cnt++;
+                    }
+
+                }
+                if (cnt == 0) {
+                    html+= "<i>"+QObject::tr("No Large Leaks on record")+"</i><br/>";
+                }
+
+                html += "<br/>";
+            }
+
+
+            /////////////////////////////////////////////////////////////////////////////////////
+            /// ÇSR Records
+            /////////////////////////////////////////////////////////////////////////////////////
+
+            cnt = 0;
+            if (p_profile->hasChannel(CPAP_CSR)) {
+                ahilist.clear();
+                for (QDate date = first; date <= last; date = date.addDays(1)) {
+                    Day * day = p_profile->GetGoodDay(date, MT_CPAP);
+                    if (!day) continue;
+
+                    float leak = day->calcPON(CPAP_CSR);
+                    ahilist.insert(leak, date);
+                }
+
+                if (ahilist.size() > (show_records * 2)) {
+                    html += "<b>"+QObject::tr("Worst CSR")+"</b><br/>";
+
+                    it = ahilist.end() - 1;
+                    it_end = ahilist.begin();
+                    for (int i=0; (i<show_records) && (it != it_end); ++i, --it) {
+
+                        if (it.key() > 0) {
+                            html += QString("<a href='daily=%1'>").arg(it.value().toString(Qt::ISODate))
+                                +QObject::tr("Date: %1 CSR: %2%").arg(it.value().toString(Qt::SystemLocaleShortDate)).arg(it.key(), 0, 'f', 2) + "</a><br/>";
+                            cnt++;
+                        }
+                    }
+                    if (cnt == 0) {
+                        html+= "<i>"+QObject::tr("No CSR on record")+"</i><br/>";
+                    }
+
+                    html += "<br/>";
+                }
+            }
+
+        } else {
+            html += "<br/><b>"+QObject::tr("Want more information?")+"</b><br/>";
+            html += "<i>"+QObject::tr("SleepyHead needs all summary data loaded to calculate best/worst data for individual days.")+"</i><br/><br/>";
+            html += "<i>"+QObject::tr("Please enable Pre-Load Summaries checkbox in preferences to make sure this data is available.")+"</i><br/><br/>";
+        }
+
+
+        /////////////////////////////////////////////////////////////////////////////////////
+        /// Sort the RX list to get best and worst settings.
+        /////////////////////////////////////////////////////////////////////////////////////
+        QList<RXItem *> list;
+        QMap<QDate, RXItem>::iterator ri_end = rxitems.end();
+        QMap<QDate, RXItem>::iterator ri;
+
+        for (ri = rxitems.begin(); ri != ri_end; ++ri) {
+            list.append(&ri.value());
+            ri.value().highlight = 0;
+        }
+
+        qSort(list.begin(), list.end(), rxAHILessThan);
+
+
+        if (list.size() >= 2) {
+            html += "<b>"+QObject::tr("Best RX Setting")+"</b><br/>";
+            const RXItem & rxbest = *list.at(0);
+            html += QString("<a href='overview=%1,%2'>").arg(rxbest.start.toString(Qt::ISODate)).arg(rxbest.end.toString(Qt::ISODate)) +
+                QObject::tr("Date: %1 - %2").arg(rxbest.start.toString(Qt::SystemLocaleShortDate)).arg(rxbest.end.toString(Qt::SystemLocaleShortDate)) + "</a><br/>";
+            html += QString("%1").arg(rxbest.machine->model()) + "<br/>";
+            html += QString("Serial: %1").arg(rxbest.machine->serial()) + "<br/>";
+            html += QObject::tr("Culminative AHI: %1").arg(double(rxbest.ahi) / rxbest.hours, 0, 'f', 2) + "<br/>";
+            html += QObject::tr("Culminative Hours: %1").arg(rxbest.hours, 0, 'f', 2) + "<br/>";
+            html += QString("%1").arg(rxbest.pressure) + "<br/>";
+            html += QString("%1").arg(rxbest.relief) + "<br/>";
+            html += "<br/>";
+
+            html += "<b>"+QObject::tr("Worst RX Setting")+"</b><br/>";
+            const RXItem & rxworst = *list.at(list.size() -1);
+            html += QString("<a href='overview=%1,%2'>").arg(rxworst.start.toString(Qt::ISODate)).arg(rxworst.end.toString(Qt::ISODate)) +
+                    QObject::tr("Date: %1 - %2").arg(rxworst.start.toString(Qt::SystemLocaleShortDate)).arg(rxworst.end.toString(Qt::SystemLocaleShortDate)) + "</a><br/>";
+            html += QString("%1").arg(rxworst.machine->model()) + "<br/>";
+            html += QString("Serial: %1").arg(rxworst.machine->serial()) + "<br/>";
+            html += QObject::tr("Culminative AHI: %1").arg(double(rxworst.ahi) / rxworst.hours, 0, 'f', 2) + "<br/>";
+            html += QObject::tr("Culminative Hours: %1").arg(rxworst.hours, 0, 'f', 2) + "<br/>";
+
+            html += QString("%1").arg(rxworst.pressure) + "<br/>";
+            html += QString("%1").arg(rxworst.relief) + "<br/>";
+        }
+    }
+
+
+
+    html += "</body></html>";
+    mainwin->setRecBoxHTML(html);
+}
+
+
+
+QString StatisticsRow::value(QDate start, QDate end)
+{
+    const int decimals=2;
+    QString value;
+    float days = p_profile->countDays(type, start, end);
+
+    // Handle special data sources first
+    if (calc == SC_AHI) {
+        value = QString("%1").arg(calcAHI(start, end), 0, 'f', decimals);
+    } else if (calc == SC_HOURS) {
+        value = QString("%1").arg(formatTime(p_profile->calcHours(type, start, end) / days));
+    } else if (calc == SC_COMPLIANCE) {
+        float c = p_profile->countCompliantDays(type, start, end);
+        float p = (100.0 / days) * c;
+        value = QString("%1%").arg(p, 0, 'f', 0);
+    } else if (calc == SC_DAYS) {
+        value = QString("%1").arg(p_profile->countDays(type, start, end));
+    } else if ((calc == SC_COLUMNHEADERS) || (calc == SC_SUBHEADING) || (calc == SC_UNDEFINED))  {
+    } else {
+        //
+        ChannelID code=channel();
+
+        EventDataType val = 0;
+        QString fmt = "%1";
+        if (code != NoChannel) {
+            switch(calc) {
+            case SC_AVG:
+                val = p_profile->calcAvg(code, type, start, end);
+                break;
+            case SC_WAVG:
+                val = p_profile->calcWavg(code, type, start, end);
+                break;
+            case SC_MEDIAN:
+                val = p_profile->calcPercentile(code, 0.5F, type, start, end);
+                break;
+            case SC_90P:
+                val = p_profile->calcPercentile(code, 0.9F, type, start, end);
+                break;
+            case SC_MIN:
+                val = p_profile->calcMin(code, type, start, end);
+                break;
+            case SC_MAX:
+                val = p_profile->calcMax(code, type, start, end);
+                break;
+            case SC_CPH:
+                val = p_profile->calcCount(code, type, start, end) / p_profile->calcHours(type, start, end);
+                break;
+            case SC_SPH:
+                fmt += "%";
+                val = 100.0 / p_profile->calcHours(type, start, end) * p_profile->calcSum(code, type, start, end) / 3600.0;
+                break;
+            case SC_ABOVE:
+                fmt += "%";
+                val = 100.0 / p_profile->calcHours(type, start, end) * (p_profile->calcAboveThreshold(code, schema::channel[code].upperThreshold(), type, start, end) / 60.0);
+                break;
+            case SC_BELOW:
+                fmt += "%";
+                val = 100.0 / p_profile->calcHours(type, start, end) * (p_profile->calcBelowThreshold(code, schema::channel[code].lowerThreshold(), type, start, end) / 60.0);
+                break;
+            default:
+                break;
+            };
+        }
+
+        if ((val == std::numeric_limits<EventDataType>::min()) || (val == std::numeric_limits<EventDataType>::max())) {
+            value = "Err";
+        } else {
+            value = fmt.arg(val, 0, 'f', decimals);
+        }
+    }
+
+    return value;
+}
diff --git a/sleepyhead/statistics.h b/sleepyhead/statistics.h
new file mode 100644
index 0000000..946194a
--- /dev/null
+++ b/sleepyhead/statistics.h
@@ -0,0 +1,183 @@
+/* Statistics Report Generator Header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef SUMMARY_H
+#define SUMMARY_H
+
+#include <QObject>
+#include <QHash>
+#include <QList>
+#include "SleepLib/schema.h"
+#include "SleepLib/machine.h"
+
+enum StatCalcType {
+    SC_UNDEFINED=0, SC_COLUMNHEADERS, SC_HEADING, SC_SUBHEADING, SC_MEDIAN, SC_AVG, SC_WAVG, SC_90P, SC_MIN, SC_MAX, SC_CPH, SC_SPH, SC_AHI, SC_HOURS, SC_COMPLIANCE, SC_DAYS, SC_ABOVE, SC_BELOW
+};
+
+struct StatisticsRow {
+    StatisticsRow() { calc=SC_UNDEFINED; }
+    StatisticsRow(QString src, QString calc, QString type) {
+        this->src = src;
+        this->calc = lookupCalc(calc);
+        this->type = lookupType(type);
+    }
+    StatisticsRow(QString src, StatCalcType calc, MachineType type) {
+        this->src = src;
+        this->calc = calc;
+        this->type = type;
+    }
+    StatisticsRow(const StatisticsRow &copy) {
+        src=copy.src;
+        calc=copy.calc;
+        type=copy.type;
+    }
+    QString src;
+    StatCalcType calc;
+    MachineType type;
+
+    StatCalcType lookupCalc(QString calc)
+    {
+        if (calc.compare("avg",Qt::CaseInsensitive)==0) {
+            return SC_AVG;
+        } else if (calc.compare("w-avg",Qt::CaseInsensitive)==0) {
+            return SC_WAVG;
+        } else if (calc.compare("median",Qt::CaseInsensitive)==0) {
+            return SC_MEDIAN;
+        } else if (calc.compare("90%",Qt::CaseInsensitive)==0) {
+            return SC_90P;
+        } else if (calc.compare("min", Qt::CaseInsensitive)==0) {
+            return SC_MIN;
+        } else if (calc.compare("max", Qt::CaseInsensitive)==0) {
+            return SC_MAX;
+        } else if (calc.compare("cph", Qt::CaseInsensitive)==0) {
+            return SC_CPH;
+        } else if (calc.compare("sph", Qt::CaseInsensitive)==0) {
+            return SC_SPH;
+        } else if (calc.compare("ahi", Qt::CaseInsensitive)==0) {
+            return SC_AHI;
+        } else if (calc.compare("hours", Qt::CaseInsensitive)==0) {
+            return SC_HOURS;
+        } else if (calc.compare("compliance", Qt::CaseInsensitive)==0) {
+            return SC_COMPLIANCE;
+        } else if (calc.compare("days", Qt::CaseInsensitive)==0) {
+            return SC_DAYS;
+        } else if (calc.compare("heading", Qt::CaseInsensitive)==0) {
+            return SC_HEADING;
+        } else if (calc.compare("subheading", Qt::CaseInsensitive)==0) {
+            return SC_SUBHEADING;
+        }
+        return SC_UNDEFINED;
+    }
+
+    MachineType lookupType(QString type)
+    {
+        if (type.compare("cpap", Qt::CaseInsensitive)==0) {
+            return MT_CPAP;
+        } else if (type.compare("oximeter", Qt::CaseInsensitive)==0) {
+            return MT_OXIMETER;
+        } else if (type.compare("sleepstage", Qt::CaseInsensitive)==0) {
+            return MT_SLEEPSTAGE;
+        }
+        return MT_UNKNOWN;
+    }
+
+
+    ChannelID channel() {
+        return schema::channel[src].id();
+    }
+
+    QString value(QDate start, QDate end);
+};
+
+class RXItem {
+public:
+    RXItem() {
+        machine = nullptr;
+        ahi = rdi = 0;
+        highlight = 0;
+        hours = 0;
+    }
+    RXItem(const RXItem & copy) {
+        start = copy.start;
+        end = copy.end;
+        days = copy.days;
+        s_count = copy.s_count;
+        s_sum = copy.s_sum;
+        ahi = copy.ahi;
+        rdi = copy.rdi;
+        hours = copy.hours;
+        machine = copy.machine;
+        relief = copy.relief;
+        mode = copy.mode;
+        pressure = copy.pressure;
+        dates = copy.dates;
+        highlight = copy.highlight;
+    }
+    inline quint64 count(ChannelID id) const {
+        QHash<ChannelID, quint64>::const_iterator it = s_count.find(id);
+        if (it == s_count.end()) return 0;
+        return it.value();
+    }
+    inline double sum(ChannelID id) const{
+        QHash<ChannelID, double>::const_iterator it = s_sum.find(id);
+        if (it == s_sum.end()) return 0;
+        return it.value();
+    }
+    QDate start;
+    QDate end;
+    int days;
+    QHash<ChannelID, quint64> s_count;
+    QHash<ChannelID, double> s_sum;
+    quint64 ahi;
+    quint64 rdi;
+    double hours;
+    Machine * machine;
+    QString relief;
+    QString mode;
+    QString pressure;
+    QMap<QDate, Day *> dates;
+    short highlight;
+};
+
+
+
+class Statistics : public QObject
+{
+    Q_OBJECT
+  public:
+    explicit Statistics(QObject *parent = 0);
+
+    void loadRXChanges();
+    void saveRXChanges();
+    void updateRXChanges();
+
+    QString GenerateHTML();
+    QString GenerateMachineList();
+    QString GenerateRXChanges();
+
+    void UpdateRecordsBox();
+
+
+  protected:
+    // Using a map to maintain order
+    QList<StatisticsRow> rows;
+    QMap<StatCalcType, QString> calcnames;
+    QMap<MachineType, QString> machinenames;
+
+    QMap<QDate, RXItem> rxitems;
+
+    QList<QDate> record_best_ahi;
+    QList<QDate> record_worst_ahi;
+
+  signals:
+
+  public slots:
+
+};
+
+#endif // SUMMARY_H
diff --git a/sleepyhead/translation.cpp b/sleepyhead/translation.cpp
new file mode 100644
index 0000000..73e97be
--- /dev/null
+++ b/sleepyhead/translation.cpp
@@ -0,0 +1,161 @@
+/* Multilingual Support files
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QApplication>
+#include <QDebug>
+#include <QStringList>
+#include <QList>
+#include <QDialog>
+#include <QHBoxLayout>
+#include <QLabel>
+#include <QComboBox>
+#include <QPushButton>
+#include <QDir>
+#include <QSettings>
+#include <QTranslator>
+#include <QListWidget>
+
+#ifndef nullptr
+#define nullptr NULL
+#endif
+
+#include "translation.h"
+
+void initTranslations(QSettings & settings) {
+
+    // (Ordinary character sets will just use the name before the first '.' in the filename.)
+    // (This u8 stuff deliberately kills Qt4.x build support - if you know another way feel free to
+    //  change it, but Qt4 support is still going to die sooner or later)
+    // Add any languages with special character set needs to this list
+    QHash<QString, QString> langNames;
+    langNames["zh"] = "漢語繁體字";
+    langNames["es"] = "Español";
+    langNames["bg"] = "български";
+    langNames["fr"] = "Français";
+    langNames["en_UK"] = "English UK";
+    // CHECK: Will the above break with MS VisualC++ compiler?
+
+    QHash<QString, QString> langFiles;
+
+#ifdef Q_OS_MAC
+    QString transdir = QDir::cleanPath(QCoreApplication::applicationDirPath() +
+                                   "/../Resources/Translations/");
+
+#else
+    const QString transdir = QCoreApplication::applicationDirPath() + "/Translations/";
+#endif
+
+    QDir dir(transdir);
+    qDebug() << "Scanning \"" << transdir << "\" for translations";
+    dir.setFilter(QDir::Files);
+    dir.setNameFilters(QStringList("*.qm"));
+
+    QFileInfoList list = dir.entryInfoList();
+    QString language = settings.value("Settings/Language").toString();
+
+    QString langfile, langname;
+
+    // Add default language (English)
+    const QString en="en_US";
+    langFiles[en]="English.en_US.qm";
+    langNames[en]="English US";
+
+    // Scan through available translations, and add them to the list
+    for (int i = 0; i < list.size(); ++i) {
+        QFileInfo fi = list.at(i);
+        QString name = fi.fileName().section('.', 0, 0);
+        QString code = fi.fileName().section('.', 1, 1);
+
+        qDebug() << "Detected" << name << "Translation";
+
+        if (langNames.contains(code)) {
+            name = langNames[code];
+        } else {
+            langNames[code]=name;
+        }
+
+        langFiles[code]=fi.fileName();
+
+    }
+
+    if (language.isEmpty() || !langNames.contains(language)) {
+        QDialog langsel(nullptr, Qt::CustomizeWindowHint | Qt::WindowTitleHint);
+        QFont font;
+        font.setPointSize(20);
+        langsel.setFont(font);
+        langsel.setWindowTitle("Language / Taal / Sprache / Langue / 语言 / ... ");
+        QHBoxLayout lang_layout(&langsel);
+
+        QLabel img;
+        img.setPixmap(QPixmap(":/docs/sheep.png"));
+
+        // hard coded non translatable
+
+        QPushButton lang_okbtn("->", &langsel);
+
+        QVBoxLayout layout1;
+        QVBoxLayout layout2;
+
+        layout2.setMargin(6);
+        lang_layout.setContentsMargins(4,4,4,4);
+        lang_layout.setMargin(6);
+        layout2.setSpacing(6);
+        QListWidget langlist;
+
+        lang_layout.addLayout(&layout1);
+        lang_layout.addLayout(&layout2);
+
+        layout1.addWidget(&img);
+        layout2.addWidget(&langlist, 1);
+
+        langlist.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+        int row = 0;
+        for (QHash<QString, QString>::iterator it = langNames.begin(); it != langNames.end(); ++it) {
+            const QString & code = it.key();
+            const QString & name = it.value();
+            if (!langFiles.contains(code) || langFiles[code].isEmpty())
+                continue;
+
+            QListWidgetItem *item = new QListWidgetItem(name);
+            item->setData(Qt::UserRole, code);
+            langlist.insertItem(row++, item);
+            // Todo: Use base system language code
+            if (code.compare(en) == 0) {
+                langlist.setCurrentItem(item);
+            }
+        }
+        langlist.sortItems();
+        layout2.addWidget(&lang_okbtn);
+
+        langsel.connect(&langlist, SIGNAL(itemDoubleClicked(QListWidgetItem*)), &langsel, SLOT(close()));
+        langsel.connect(&lang_okbtn, SIGNAL(clicked()), &langsel, SLOT(close()));
+
+        langsel.exec();
+        langsel.disconnect(&lang_okbtn, SIGNAL(clicked()), &langsel, SLOT(close()));
+        langsel.disconnect(&langlist, SIGNAL(itemDoubleClicked(QListWidgetItem*)), &langsel, SLOT(close()));
+        langname = langlist.currentItem()->text();
+        language = langlist.currentItem()->data(Qt::UserRole).toString();
+        settings.setValue("Settings/Language", language);
+    }
+
+    langname=langNames[language];
+    langfile=langFiles[language];
+
+    if (language.compare(en) != 0) {
+        qDebug() << "Loading " << langname << " Translation" << langfile << "from" << transdir;
+        QTranslator * translator = new QTranslator();
+
+        if (!langfile.isEmpty() && !translator->load(langfile, transdir)) {
+            qWarning() << "Could not load translation" << langfile << "reverting to english :(";
+        }
+
+        qApp->installTranslator(translator);
+    } else {
+        qDebug() << "Using in-built english Translation";
+    }
+}
diff --git a/sleepyhead/translation.h b/sleepyhead/translation.h
new file mode 100644
index 0000000..89b9dbc
--- /dev/null
+++ b/sleepyhead/translation.h
@@ -0,0 +1,16 @@
+/* Multilingual Support header
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef TRANSLATION_H
+#define TRANSLATION_H
+
+#include <QSettings>
+
+void initTranslations(QSettings & settings);
+
+#endif // TRANSLATION_H
diff --git a/sleepyhead/updateparser.cpp b/sleepyhead/updateparser.cpp
new file mode 100644
index 0000000..17186ed
--- /dev/null
+++ b/sleepyhead/updateparser.cpp
@@ -0,0 +1,217 @@
+/* UpdateParser Implementation (Autoupdater component)
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#include <QDebug>
+
+#include "updateparser.h"
+
+#ifndef nullptr
+#define nullptr NULL
+#endif
+
+
+Update::Update()
+{
+    size = 0;
+}
+Update::Update(const Update &copy)
+{
+    type = copy.type;
+    version = copy.version;
+    platform = copy.platform;
+    date = copy.date;
+    filename = copy.filename;
+    url = copy.url;
+    hash = copy.hash;
+    size = copy.size;
+    notes = copy.notes;
+    unzipped_path = copy.unzipped_path;
+}
+
+Update::Update(QString _type, QString _version, QString _platform, QDate _date)
+{
+    type = _type;
+    version = _version;
+    platform = _platform;
+    date = _date;
+    size = 0;
+}
+
+bool UpdateParser::startDocument()
+{
+    inRelease = false;
+    inUpdate = false;
+    inNotes = false;
+    inUpdateNotes = false;
+    release = nullptr;
+    update = nullptr;
+    return true;
+}
+
+bool UpdateParser::endElement(const QString &namespaceURI, const QString &localName,
+                              const QString &qName)
+{
+    Q_UNUSED(namespaceURI)
+    Q_UNUSED(localName)
+    QString name = qName.toLower();
+
+    if (name == "release") {
+        inRelease = false;
+        release = nullptr;
+    } else if (inRelease && name == "update") {
+        inUpdate = false;
+        update = nullptr;
+    } else if (inUpdate && name == "notes") {
+        inUpdateNotes = false;
+    } else if (inRelease && name == "notes") {
+        inNotes = false;
+    }
+
+    return true;
+}
+bool UpdateParser::characters(const QString &ch)
+{
+    if (inUpdateNotes) {
+        update->notes = ch;
+    } else if (inNotes) {
+        release->notes[platform] = ch;
+    }
+
+    return true;
+}
+
+UpdateStatus lookupUpdateStatus(QString stat)
+{
+    UpdateStatus status = UPDATE_TESTING;
+
+    if (stat == "testing") { status = UPDATE_TESTING; }
+    else if (stat == "beta") { status = UPDATE_BETA; }
+    else if (stat == "stable") { status = UPDATE_STABLE; }
+    else if (stat == "critical") { status = UPDATE_CRITICAL; }
+
+    return status;
+}
+bool UpdateParser::startElement(const QString &namespaceURI, const QString &localName,
+                                const QString &qName, const QXmlAttributes &atts)
+{
+    Q_UNUSED(namespaceURI)
+    Q_UNUSED(localName)
+    QString name = qName.toLower();
+
+    if (inRelease && name == "update") {
+        QString ver, type;
+        UpdateStatus updatestatus = UPDATE_TESTING;
+
+        for (int i = 0; i < atts.count(); i++) {
+            if (atts.localName(i) == "type") {
+                type = atts.value(i).toLower();
+            }
+
+            if (atts.localName(i) == "version") {
+                ver = atts.value(i).toLower();
+            }
+
+            if (atts.localName(i) == "platform") {
+                platform = atts.value(i).toLower();
+            }
+
+            if (atts.localName(i) == "release_date") {
+                release_date = atts.value(i);
+            }
+
+            if (atts.localName(i) == "status") {
+                updatestatus = lookupUpdateStatus(atts.value(i).toLower());
+            }
+        }
+
+        QDate date = QDate::fromString(release_date, "yyyy-MM-dd");
+
+        if (!date.isValid()) { date = QDate::currentDate(); }
+
+        release->updates[platform].push_back(Update(type, ver, platform, date));
+        update = &release->updates[platform][release->updates[platform].size() - 1];
+        update->status = updatestatus;
+        inUpdate = true;
+    } else if (inRelease && name == "info") {
+        QString tmp = atts.value("url");
+
+        if (tmp.isEmpty()) { return false; }
+
+        release->info_url = tmp;
+    } else if (inUpdate && name == "file") {
+        for (int i = 0; i < atts.count(); i++) {
+            if (atts.localName(i) == "name") {
+                update->filename = atts.value(i);
+            }
+
+            if (atts.localName(i) == "size") {
+                bool ok;
+                update->size = atts.value(i).toLongLong(&ok);
+                //if (!ok) return false;
+            }
+
+            if (atts.localName(i) == "url") {
+                update->url = atts.value(i);
+            }
+
+            if (atts.localName(i) == "hash") {
+                update->hash = atts.value(i).toLower();
+            }
+        }
+    } else if (inUpdate && name == "notes") {
+        inUpdateNotes = true;
+    } else if (inRelease && name == "notes") {
+        platform = "";
+
+        if (atts.count() >= 1) {
+            if (atts.localName(0) == "platform") {
+                platform = atts.value(0);
+            }
+        }
+
+        inNotes = true;
+    } else if (name == "release") {
+        inRelease = true;
+        QString codename;
+        UpdateStatus status = UPDATE_TESTING;
+
+        for (int i = 0; i < atts.count(); i++) {
+            if (atts.localName(i) == "version") {
+                version = atts.value(i).toLower();
+            }
+
+            if (atts.localName(i) == "codename") {
+                codename = atts.value(i);
+            }
+
+            if (atts.localName(i) == "status") {
+                status = lookupUpdateStatus(atts.value(i).toLower());
+            }
+        }
+
+        releases[version] = Release(version, codename, status);
+        release = &releases[version];
+
+        if (version > latest_version) { latest_version = version; }
+    }
+
+    return true;
+}
+bool UpdateParser::endDocument()
+{
+    /*for (QHash<QString,Release>::iterator r=releases.begin();r!=releases.end();r++) {
+        Release & rel=r.value();
+        qDebug() << "New Version" << r.key() << rel.codename << rel.notes;
+        for (QHash<QString,Update>::iterator u=rel.files.begin();u!=rel.files.end();u++) {
+            Update & up=u.value();
+            qDebug() << "Platform:" << u.key() << up.filename << up.date;
+        }
+    }*/
+    return true;
+}
+
diff --git a/sleepyhead/updateparser.h b/sleepyhead/updateparser.h
new file mode 100644
index 0000000..a5c5aaf
--- /dev/null
+++ b/sleepyhead/updateparser.h
@@ -0,0 +1,95 @@
+/* UpdateParser Header (Autoupdater component)
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef UPDATEPARSER_H
+#define UPDATEPARSER_H
+
+#include <QXmlDefaultHandler>
+#include <QMetaType>
+#include <QDate>
+
+enum UpdateStatus { UPDATE_TESTING = 0, UPDATE_BETA, UPDATE_STABLE, UPDATE_CRITICAL };
+
+/*! \struct Update
+    \brief Holds platform specific information about an individual updates
+  */
+class Update
+{
+  public:
+    Update();
+    Update(const Update &copy);
+    Update(QString _type, QString _version, QString _platform, QDate _date);
+    QString type;
+    QString version;
+    QString platform;
+    UpdateStatus status;
+    QDate date;
+    QString filename;
+    QString url;
+    QString hash;
+    qint64 size;
+    QString notes;
+    QString unzipped_path;
+};
+
+/*! \struct Release
+    \brief Holds information about an individual major release
+  */
+struct Release {
+    Release() {}
+    Release(const Release &copy) {
+        version = copy.version;
+        codename = copy.version;
+        notes = copy.notes;
+        info_url = copy.info_url;
+        status = copy.status;
+        updates = copy.updates;
+    }
+
+    Release(QString ver, QString code, UpdateStatus stat) { version = ver; codename = code; status = stat; }
+    QString version;
+    QString codename;
+    UpdateStatus status;
+    QString info_url;
+    QHash<QString, QString> notes; // by platform
+    QHash<QString, QList<Update> > updates;
+};
+
+Q_DECLARE_METATYPE(Update *)
+
+
+/*! \class UpdateParser
+    \brief SAX XML parser for update.xml
+  */
+class UpdateParser: public QXmlDefaultHandler
+{
+  public:
+    bool startDocument();
+    bool endElement(const QString &namespaceURI, const QString &localName, const QString &name);
+    bool characters(const QString &ch);
+    bool startElement(const QString &namespaceURI, const QString &localName, const QString &name,
+                      const QXmlAttributes &atts);
+    bool endDocument();
+    QString latest() { return latest_version; }
+
+    QHash<QString, Release> releases;
+  private:
+    Update *update;
+    Release *release;
+    QString version, platform;
+    QString release_date;
+    QString latest_version;
+    bool inRelease;
+    bool inUpdate;
+    bool inNotes;
+    bool inUpdateNotes;
+};
+
+
+
+#endif // UPDATEPARSER_H
diff --git a/sleepyhead/version.h b/sleepyhead/version.h
new file mode 100644
index 0000000..ec9d2ec
--- /dev/null
+++ b/sleepyhead/version.h
@@ -0,0 +1,39 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * Version
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+#ifndef VERSION_H
+#define VERSION_H
+
+#include <qglobal.h>
+#include "build_number.h"
+
+const int major_version = 0;   // incompatible API changes
+const int minor_version = 9;   // new features that don't break things
+const int revision_number = 8;    // bugfixes, revisions
+
+#ifdef TEST_BUILD
+const QString ReleaseStatus = "testing";
+#else
+const QString ReleaseStatus = "beta";
+#endif
+
+const QString VersionString = QString().sprintf("%i.%i.%i-%i", major_version, minor_version, revision_number, build_number);
+const QString FullVersionString = QString().sprintf("%i.%i.%i-%i", major_version, minor_version, revision_number, build_number)+"-"+ReleaseStatus;
+
+#ifdef Q_OS_MAC
+const QString PlatformString = "MacOSX";
+#elif defined(Q_OS_WIN32)
+const QString PlatformString = "Win32";
+#elif defined(Q_OS_LINUX)
+const QString PlatformString = "Linux";
+#endif
+
+#endif // VERSION_H
diff --git a/sleepyhead/welcome.cpp b/sleepyhead/welcome.cpp
new file mode 100644
index 0000000..2067699
--- /dev/null
+++ b/sleepyhead/welcome.cpp
@@ -0,0 +1,250 @@
+/* Welcome Page Implementation
+ *
+ * Copyright (c) 2011-2014 Mark Watkins <jedimark at users.sourceforge.net>
+ *
+ * This file is subject to the terms and conditions of the GNU General Public
+ * License. See the file COPYING in the main directory of the Linux
+ * distribution for more details. */
+
+
+#include <QString>
+#include <QApplication>
+#include <QFont>
+#include "SleepLib/profiles.h"
+
+
+QString GenerateWelcomeHTML()
+{
+    QList<Machine *> cpap_machines = p_profile->GetMachines(MT_CPAP);
+    QList<Machine *> oximeters = p_profile->GetMachines(MT_OXIMETER);
+    QList<Machine *> mach;
+
+    mach.append(cpap_machines);
+    mach.append(oximeters);
+
+    bool havecpapdata = false;
+    bool haveoximeterdata = false;
+    for (int i=0; i < cpap_machines.size(); ++i) {
+        int daysize = cpap_machines[i]->day.size();
+        if (daysize > 0) {
+            havecpapdata = true;
+            break;
+        }
+    }
+    for (int i=0; i < oximeters.size(); ++i) {
+        int daysize = oximeters[i]->day.size();
+        if (daysize > 0) {
+            haveoximeterdata = true;
+            break;
+        }
+    }
+
+
+    QString html = QString("<html><head>")+
+    "</head>"
+    "<style type='text/css'>"
+    "p,a,td,body { font-family: '"+QApplication::font().family()+"'; }"
+    "p,a,td,body { font-size: "+QString::number(QApplication::font().pointSize() + 2)+"px; }"
+
+    "table.curved {"
+        "border: 1px solid gray;"
+        "border-radius:10px;"
+        "-moz-border-radius:10px;"
+        "-webkit-border-radius:10px;"
+        "page-break-after:auto;"
+        "-fs-table-paginate: paginate;"
+    "}"
+            "table.curved2 {"
+                "border: 1px solid gray;"
+                "border-radius:10px;"
+                "background:#ffffc0;"
+                "-moz-border-radius:10px;"
+                "-webkit-border-radius:10px;"
+                "page-break-after:auto;"
+                "-fs-table-paginate: paginate;"
+            "}"
+    "tr.datarow:nth-child(even) {"
+        "background-color: #f8f8f8;"
+    "}"
+    "table { page-break-after:auto; -fs-table-paginate: paginate; }"
+    "tr    { page-break-inside:avoid; page-break-after:auto }"
+    "td    { page-break-inside:avoid; page-break-after:auto }"
+    "thead { display:table-header-group; }"
+    "tfoot { display:table-footer-group; }"
+
+
+    "</style>"
+    "<link rel='stylesheet' type='text/css' href='qrc:/docs/tooltips.css' />"
+    "<script type='text/javascript'>"
+    "function ChangeColor(tableRow, highLight)"
+    "{ tableRow.style.backgroundColor = highLight; }"
+    "function Go(url) { throw(url); }"
+    "</script>"
+    "</head>"
+    "<body leftmargin=0 topmargin=5 rightmargin=0>";
+
+    html += "<div align=center><table border=0 height=100% width=99%>";
+    html += QString("<tr><td colspan=2 align=center>") +
+    "<img src='qrc:/icons/bob-v3.0.png' height=100px>"
+
+    "<h1>" + QObject::tr("Welcome to SleepyHead") + "</h1>" +
+
+    "<table cellpadding=4 border=0>";
+
+    int cols=2;
+    if (havecpapdata || haveoximeterdata) cols=4;
+
+
+     html+=QString("<tr><td colspan=%1 align=center>").arg(cols)+
+     "<font size=+1>"+((havecpapdata || haveoximeterdata) ? QObject::tr("What would you like to do?") : QObject::tr("Please Import Some Data")) +"</font></td>"
+     "</tr>"
+     "<tr>"
+      "<td align=center>"
+        "<table class=curved cellpadding=4>"
+         "<tr><td align=center onmouseover='ChangeColor(this, \"#eeeeee\");' onmouseout='ChangeColor(this, \"#ffffff\");' onclick='alert(\"import=cpap\");'><font size=+1><img src='qrc:/icons/sdcard.png' width=128px><br/>" + QObject::tr("CPAP<br/>Importer")+"</font></td></tr>"
+        "</table>"
+      "</td>"
+      "<td align=center>"
+       "<table class=curved cellpadding=4>"
+         "<tr><td align=center onmouseover='ChangeColor(this, \"#eeeeee\");' onmouseout='ChangeColor(this, \"#ffffff\");' onclick='alert(\"import=oximeter\");'><font size=+1><img src='qrc:/icons/cms50f.png' width=128px><br/>" + QObject::tr("Oximetery<br/>Wizard")+"</font></td></tr>"
+       "</table>"
+      "</td>";
+      if (havecpapdata || haveoximeterdata) {
+          html += "<td align=center><font size=+2>"+QObject::tr("or")+"</font></td>"
+          "<td align=center>"
+          "<table class=curved cellpadding=4>"
+          "<tr><td align=center onmouseover='ChangeColor(this, \"#eeeeee\");' onmouseout='ChangeColor(this, \"#ffffff\");' onclick='alert(\"statistics=1\");'><font size=+1><img src='qrc:/icons/statistics.png' width=128px><br/>" + QObject::tr("View<br/>Statistics")+"</font></td></tr>"
+          "</table>"
+          "</td>";
+      }
+     html += "</tr></table>";
+    if (!havecpapdata && !haveoximeterdata) {
+        html += "<p>" + QObject::tr("It might be a good idea to check preferences first,</br>as there are some options that affect import.")+"</p>"
+        "<p>" + QObject::tr("First import can take a few minutes.") + "</p>";
+    } else {
+        QDate date = p_profile->LastDay(MT_CPAP);
+        Day *day = p_profile->GetDay(date, MT_CPAP);
+
+        if (havecpapdata && day) {
+            QString cpapimage = "";
+
+            Machine * cpap = day->machine(MT_CPAP);
+            if (cpap) {
+                cpapimage = "qrc"+cpap->getPixmapPath();
+            }
+            html += "<table cellpadding=4><tr><td><img src='"+cpapimage+"' width=160px><br/>";
+
+            html+="</td><td align=center><table cellpadding=4 class=curved2 title=\""+QObject::tr("Click this box to see this in daily view.")+"\"><tr>"+
+                    QString("<td align=center  onmouseover='ChangeColor(this, \"#efefa0\");' onmouseout='ChangeColor(this, \"#ffffc0\");' onclick='alert(\"daily=%1\");'>").arg(date.toString(Qt::ISODate))+"<b>"+
+                    QObject::tr("The last time you used your %1...").arg(cpap->brand()+" "+cpap->model())+"</b><br/>";
+
+            int daysto = date.daysTo(QDate::currentDate());
+            QString daystring;
+            if (daysto == 1) daystring += QObject::tr("last night");
+            else if (daysto == 2) daystring += QObject::tr("yesterday");
+            else daystring += QObject::tr("%2 days ago").arg(date.daysTo(QDate::currentDate()));
+
+            html += QObject::tr("was %1 (on %2)").arg(daystring).arg(date.toString(Qt::SystemLocaleLongDate)) + "<br/>";
+
+
+            EventDataType hours = day->hours();
+
+            EventDataType ahi=(day->count(CPAP_Obstructive) + day->count(CPAP_Hypopnea) + day->count(CPAP_ClearAirway) + day->count(CPAP_Apnea)) / hours;
+
+            QString ahitext;
+            if (ahi < 0.000001) ahitext =  QString("<font color=green>")+QObject::tr("perfect :)")+"</font>";
+            else if (ahi < 1) ahitext = QObject::tr("pretty darn good");
+            else if (ahi < 3) ahitext = QObject::tr("reasonably good");
+            else if (ahi < 5) ahitext = QObject::tr("technically \"treated\"");
+            else if (ahi < 10) ahitext = QString("<font color=red>")+QObject::tr("not very good")+"</font>";
+            else ahitext = QString("<font color=red>")+QObject::tr("horrible, please consult your doctor")+"</font>";
+
+            html += QObject::tr("You had an AHI of %1, which is considered %2").arg(ahi,0,'f',2).arg(ahitext)+"<br/>";
+
+            int seconds = int(hours * 3600.0) % 60;
+            int minutes = int(hours * 60) % 60;
+            int hour = hours;
+            QString timestr = QObject::tr("%1 hours, %2 minutes and %3 seconds").arg(hour).arg(minutes).arg(seconds);
+
+            if (hours > 4) html += QObject::tr("You machine was on for %1.").arg(timestr)+"<br/>";
+            else html += QObject::tr("<font color = red>You only had the mask on for %1.</font>").arg(timestr)+"<br/>";
+
+
+            EventDataType lat = day->timeAboveThreshold(CPAP_Leak, p_profile->cpap->leakRedline())/ 60.0;
+            EventDataType leaks = 1.0/hours * lat;
+            EventDataType leakmax = day->Max(CPAP_Leak);
+            QString leaktext;
+            if (leaks < 0.000001) leaktext=QObject::tr("You had no <i>major</i> mask leaks (maximum was %1 %2).").arg(leakmax,0,'f',2).arg(schema::channel[CPAP_Leak].units());
+            else if (leaks < 0.01) leaktext=QObject::tr("You had a small but acceptable amount of <i>major</i> mask leakage.");
+            else if (leaks < 0.10) leaktext=QObject::tr("You had significant periods of <i>major</i> mask leakage.");
+            else leaktext=QObject::tr("Your mask is leaking way too much.. Talk to your CPAP advisor.");
+            html += leaktext + "<br/>";
+
+            CPAPMode cpapmode = (CPAPMode)(int)day->settings_max(CPAP_Mode);
+            double perc= p_profile->general->prefCalcPercentile();
+
+            if (cpapmode == MODE_CPAP) {
+                EventDataType pressure = day->settings_max(CPAP_Pressure);
+                html += QObject::tr("Your CPAP machine blasted you with a constant %1%2 of air").arg(pressure).arg(schema::channel[CPAP_Pressure].units());
+            } else if (cpapmode == MODE_APAP) {
+                EventDataType pressure = day->percentile(CPAP_Pressure, perc/100.0);
+                html += QObject::tr("Your pressure was under %1%2 for %3% of the time.").arg(pressure).arg(schema::channel[CPAP_Pressure].units()).arg(perc);
+            } else if (cpapmode == MODE_BILEVEL_FIXED) {
+                EventDataType ipap = day->settings_max(CPAP_IPAP);
+                EventDataType epap = day->settings_min(CPAP_EPAP);
+                html += QObject::tr("Your machine blasted you with a constant %1-%2 %3 of air.").arg(epap).arg(ipap).arg(schema::channel[CPAP_Pressure].units());
+            } else if (cpapmode == MODE_BILEVEL_AUTO_FIXED_PS) {
+                EventDataType ipap = day->percentile(CPAP_IPAP, perc/100.0);
+                EventDataType epap = day->percentile(CPAP_EPAP, perc/100.0);
+                html += QObject::tr("Your machine was under %1-%2 %3 for %4% of the time.").arg(epap).arg(ipap).arg(schema::channel[CPAP_Pressure].units()).arg(perc);
+            } else if (cpapmode == MODE_ASV){
+                EventDataType ipap = day->percentile(CPAP_IPAP, perc/100.0);
+                EventDataType epap = qRound(day->settings_wavg(CPAP_EPAP));
+
+                html += QObject::tr("Your EPAP pressure fixed at %1%2.").arg(epap).arg(schema::channel[CPAP_EPAP].units())+"<br/>";
+                html += QObject::tr("Your IPAP pressure was under %1%2 for %3% of the time.").arg(ipap).arg(schema::channel[CPAP_IPAP].units()).arg(perc);
+            } else if (cpapmode == MODE_ASV_VARIABLE_EPAP){
+                EventDataType ipap = day->percentile(CPAP_IPAP, perc/100.0);
+                EventDataType epap = day->percentile(CPAP_EPAP, perc/100.0);
+
+                html += QObject::tr("Your EPAP pressure was under %1%2 for %3% of the time.").arg(epap).arg(schema::channel[CPAP_EPAP].units()).arg(perc)+"<br/>";
+                html += QObject::tr("Your IPAP pressure was under %1%2 for %3% of the time.").arg(ipap).arg(schema::channel[CPAP_IPAP].units()).arg(perc);
+            }
+
+
+            html+="</td></tr></table></td></tr></table>";
+
+        } else {
+            html += "<p>"+QObject::tr("No CPAP data has been imported yet.")+"</p>";
+        }
+        if (haveoximeterdata) {
+            QDate oxidate=p_profile->LastDay(MT_OXIMETER);
+            int daysto = oxidate.daysTo(QDate::currentDate());
+
+            html += "<p>"+QObject::tr("Most recent Oximetery data: <a onclick='alert(\"daily=%2\");'>%1</a> ").arg(oxidate.toString(Qt::SystemLocaleLongDate)).arg(oxidate.toString(Qt::ISODate));
+            if (daysto == 1) html += QObject::tr("(last night)");
+            else if (daysto == 2) html += QObject::tr("(yesterday)");
+            else html += QObject::tr("(%2 day ago)").arg(oxidate.daysTo(QDate::currentDate()));
+            html+="</p>";
+        } else {
+            html += "<p>"+QObject::tr("No oximetery data has been imported yet.")+"</p>";
+        }
+
+    }
+    html += QString("<div align=center><table class=curved cellpadding=3 width=45%>")+
+    "<tr>"
+    "<td align=center colspan=2><font size=+1><b>"+QObject::tr("Very Important Warning")+"</b></font></td></tr>"
+    "<tr><td align=left>"+
+    QObject::tr("<p>ALWAYS <font size=+1 color=red><b>write protect</b></font> CPAP SDCards before inserting them into your computer.")+"</p>"+
+    QObject::tr("<p><span title=\"Mac OSX and Win8.1\"  onmouseover='ChangeColor(this, \"#eeeeee\");' onmouseout='ChangeColor(this, \"#ffffff\");'><font color=blue>Certain operating systems</font></span> write index files to the card without asking, which can render your card unreadable by your cpap machine.")+"</p>"+
+    QObject::tr("<p>As a second line of protection, ALWAYS UNMOUNT the data card properly before removing it!</p>")+
+    "</td>"
+    "<td><img src=\"qrc:/icons/sdcard-lock.png\" width=128px></td>"
+    "</tr>"
+    "</table>"
+    "</td></tr></table></div>"
+    "<script type='text/javascript' language='javascript' src='qrc:/docs/script.js'></script>"
+    "</body></html>";
+    return html;
+}
+
diff --git a/sleepyhead/win_icon.rc b/sleepyhead/win_icon.rc
new file mode 100644
index 0000000..b700a65
--- /dev/null
+++ b/sleepyhead/win_icon.rc
@@ -0,0 +1 @@
+IDI_ICON1		ICON	DISCARDABLE "./icons/bob-v3.0.ico"
diff --git a/version.sh b/version.sh
new file mode 100755
index 0000000..f195d85
--- /dev/null
+++ b/version.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+version=`cat ./sleepyhead/version.h | perl -ne 'my @array = /^const\s*int (major|minor|revision)_(version|number) = (\d+;).*/; print $array[2]' | perl -ne 'my @ar=split(";"); print join(".", @ar);'` 
+buildno=`cat ./sleepyhead/scripts/build_number`
+gitversion=`git rev-parse --short HEAD`
+echo "SleepyHead Source Information"
+echo "Current Version: v${version}-${buildno} (git rev ${gitversion})"
+echo "Last commit: `git log -1 --format=%cd`"
+echo "Use 'git pull' to get up to date"

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



More information about the debian-med-commit mailing list