Description: unclean upstream tarball
 Upstream tarball ships with generated files.
 Upon `dh clean` are those removed
 Then `dpkg-source` detects the difference, reports it and aborts.
 This patch is a workaround for that.
 .
 To find out if this patch is still needed, check by
 uncomment it in debian/patches/series and run
   dpkg-source -b .
Author: Geert Stappers <stappers@debian.org>
Last-Update: 2017-06-03


 Origin: <vendor|upstream|other>, <url of original patch>
 Bug: <url in upstream bugtracker>
 Bug-Debian: https://bugs.debian.org/<bugnumber>
 Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
 Forwarded: <no|not-needed|url proving that it has been forwarded>
 Reviewed-By: <name and email of someone who approved the patch>

--- /dev/null
+++ tellico-3.0.2/doc/advanced.docbook
@@ -0,0 +1,150 @@
+<chapter id="advanced">
+<title>Advanced Usage</title>
+
+<sect1 id="command-line">
+<title>Command Line Options</title>
+
+<para>
+When running &appname; from the command line, there are several options for opening data files. They may be seen by running <userinput>tellico --help</userinput>.
+</para>
+
+<programlisting>
+Usage: tellico [options] [filename]
+
+Tellico - a KDE collection manager
+
+Options:
+  --nofile                  Do not reopen the last open file
+  --bibtex                  Import &lt;filename&gt; as a bibtex file
+  --mods                    Import &lt;filename&gt; as a MODS file
+  --ris                     Import &lt;filename&gt; as a RIS file
+
+Arguments:
+  filename                  File to open
+</programlisting>
+
+</sect1>
+
+<sect1 id="dbus-interface">
+<title>&DBus; Interface</title>
+
+<para>
+&appname; has a minimal &DBus; interface, which can be useful for scripting or interacting with a running application from the command-line. As with all &DBus; calls, you need to specify the service you want to interface with, and the particular interface. The name of the &DBus; service is <constant>org.kde.tellico</constant>.
+</para>
+
+<sect2 id="dbus-commands">
+<title>&DBus; Commands</title>
+
+<para>Two &DBus; primary objects are available in the tellico interface: <constant>Tellico</constant> and <constant>Collections</constant>.</para>
+
+<sect3 id="dbus-tellico">
+<title>The <constant>Tellico</constant> Object</title>
+
+<para>The full list of &DBus; commands in the <constant>tellico</constant> object is shown below:</para>
+
+<programlisting>
+bool importTellico(QString file, QString action)
+bool importBibtex(QString file, QString action)
+bool importMODS(QString file, QString action)
+bool importRIS(QString file, QString action)
+bool exportXML(QString file)
+bool exportZip(QString file)
+bool exportBibtex(QString file)
+bool exportHTML(QString file)
+bool exportCSV(QString file)
+QList&lt;int&gt; selectedEntries()
+QList&lt;int&gt; filteredEntries()
+void openFile(QString file)
+void setFilter(QString text)
+bool showEntry(int id)
+</programlisting>
+
+<para>
+For the four import commands, the first argument is the file to import, and the second is the import action. Three actions are available: <emphasis>replace</emphasis>, <emphasis>append</emphasis>, and <emphasis>merge</emphasis>. Four file formats are supported for importing: Tellico &XML; files, Bibtex files, MODS files, and RIS files.
+</para>
+
+<para>
+The current open collection in &appname; may be exported to a file, in either Tellico &XML; format, Tellico ZIP format, Bibtex, &HTML;, or comma-separated values (CSV).
+</para>
+
+<para>A list of the entry IDs currently selected or being filtered is able to facilitate showing or updating entries in the view.</para>
+
+<para> A new data file may be opened by using the <command>openFile()</command> command. The full path must be specified.</para>
+
+<para>A new filter may be set using the <command>setFilter()</command> command, which is the equivalent of typing in the filter box in the main window.</para>
+
+<para>Given an entry ID, <command>showEntry()</command> will select that entry and show the entry details in the main window.</para>
+</sect3>
+
+<sect3 id="dbus-collection">
+<title>The <constant>Collections</constant> Object</title>
+
+<para>The full list of &DBus; commands in the <constant>Collections</constant> object is shown below:</para>
+
+<programlisting>
+int addEntry()
+bool removeEntry(int entryID)
+QStringList allValues(QString fieldName)
+QStringList entryValues(int entryID, QString fieldName)
+QStringList selectedBibtexKeys()
+QString entryBibtexKey(int entryID)
+bool setEntryValue(int entryID, QString fieldName, QString value)
+bool addEntryValue(int entryID, QString fieldName, QString value)
+</programlisting>
+
+<para>
+A new empty entry may be created in the current collection using the <command>addEntry()</command> command. The return value is the entry ID, which can then be used to set the field values in the entry. An entry can be deleted from the collection by calling <command>removeEntry()</command>.
+</para>
+
+<para>
+Calling <command>allValues()</command> using just a field name will return all the values for that field for the currently selected entries. If no entries are selected, the return list is empty. If an entry ID is included in the command, the field values for that specific entry are returned.
+</para>
+
+<para>
+If the current collection is a bibliography, calling <command>selectedBibtexKeys()</command> will return the Bibtex citation key for all selected entries. The bibtexKey for a specific entry may be found by using the <command>entryBibtexKey()</command> command.
+</para>
+
+<para>
+Entries can be edited directly with the &DBus; interface. Given an entry ID, <command>setEntryValue()</command> will set the field value directly. To add a value, without affecting the existing values, use <command>addEntryValue()</command>. The new value gets appended to the end of the existing list.
+</para>
+</sect3>
+
+</sect2>
+
+<sect2 id="dbus-examples">
+<title>&DBus; Examples</title>
+
+<para>
+Here are some examples for scripting &appname; using the &DBus; interface.
+</para>
+
+<screen width="40">
+<emphasis>Open a Bibtex file</emphasis>
+<prompt>%</prompt> <userinput>qdbus org.kde.tellico /Tellico org.kde.tellico.importBibtex "/home/robby/reference.bib" "replace"</userinput>
+<computeroutput>true</computeroutput>
+</screen>
+
+<screen width="40">
+<emphasis>Export a Bibtex file</emphasis>
+<prompt>%</prompt> <userinput>qdbus org.kde.tellico /Tellico org.kde.tellico.exportBibtex ~/documents/reference.bib</userinput>
+<computeroutput>true</computeroutput>
+</screen>
+
+<screen width="40">
+<emphasis>Echo the citation key of the current selection</emphasis>
+<prompt>%</prompt> <userinput>qdbus org.kde.tellico /Collections org.kde.tellico.selectedBibtexKeys</userinput>
+<computeroutput>stephenson2004</computeroutput>
+</screen>
+
+<screen width="40">
+<emphasis>Add a new entry and set the title</emphasis>
+<prompt>%</prompt> <userinput>myid=`qdbus org.kde.tellico /Collections org.kde.tellico.addEntry`</userinput>
+<prompt>%</prompt> <userinput>qdbus org.kde.tellico /Collections org.kde.tellico.setEntryValue $myid title "My New Book"</userinput>
+<computeroutput>true</computeroutput>
+</screen>
+
+</sect2>
+
+</sect1>
+
+</chapter>
--- /dev/null
+++ tellico-3.0.2/doc/configuration.docbook
@@ -0,0 +1,482 @@
+<chapter id="configuration">
+<title>Configuration</title>
+
+<para>
+The <interface>Configuration Dialog</interface> contains all the options for
+changing some of the default behaviour of &appname;.
+</para>
+
+<para>
+Clicking the <guibutton>Apply</guibutton> button <action>causes the changes to
+take effect immediately</action> without closing the dialog, while
+<guibutton>OK</guibutton> <action>applies the changes and closes the dialog</action>. <guibutton>Cancel</guibutton> closes the dialog, but any changes already made
+and applied will remain. The <guibutton>Defaults</guibutton> button <action>reverts
+the options</action> on the current page of the dialog to their default values,
+while <guibutton>Help</guibutton> <action>opens the &khelpcenter;</action> to
+the relative section of the &appname; manual.
+</para>
+
+<para>
+Some minor settings can only be changed by editing the configuration file itself. See <link linkend="hidden-options">Hidden Options</link>.
+</para>
+
+<sect1 id="general-options">
+<title><guilabel>General Options</guilabel></title>
+
+<screenshot>
+<screeninfo>The General Options Dialog</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="general-options.png"/></imageobject>
+<textobject><phrase>The General Options Dialog</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>
+The <guilabel>General Options</guilabel> control the general behavior. Images may be included
+in the data files, or saved separately in the &appname; application folder. Also, when &appname;
+is started, it can automatically reopen the last data file that was open. The
+<guilabel>Tip of the Day</guilabel> dialog contains helpful hints on using &appname;
+and appears at program startup. You may want to read through some of the hints and
+then disable the dialog.
+</para>
+
+<para>
+The <guilabel>Formatting Options</guilabel> control the level of automatic formatting
+that &appname; does. For examples, see the <link linkend="field-formatting">Field
+Formatting section</link>. Capitalization and formatting are distinct options, since
+a field may be capitalized without having the order of the words changed, and
+vice-versa. The auto-capitalization can be changed to ignore certain words.
+The automatic formatting includes grammatical articles in titles,
+along with prefixes and suffixes for personal names. The values are case-insensitive,
+and should be separated by a semi-colon.
+</para>
+
+<para>
+The formatting rules follow general English usage, which may not work for other languages.
+Articles are appended to the end of the title, with a comma. Personal names are formatted
+to have the last name first, followed by a comma, then the first name. Personal suffixes,
+such as Jr., are kept with the last name. Prefixes, such as <emphasis>von</emphasis>,
+are kept with the last name, but are ignored when the values are being sorted.</para>
+
+<informalexample><para><emphasis>John Q. von Public, III</emphasis> would become
+<emphasis>von Public, III, John Q.</emphasis> and <emphasis>Public</emphasis> would
+be used as the sort key.</para></informalexample>
+
+<para>
+Only single word prefixes are supported. If a name includes <emphasis>van der</emphasis>,
+for example, both <emphasis>van</emphasis> and <emphasis>der</emphasis> should be included
+in the surname prefix list. Articles ending with an apostrophe are supported for sorting
+order, as well.
+</para>
+
+<note><para>The actual values in the collection are <emphasis>not</emphasis> changed,
+only the visible text used for the interface. So the formatting options can be
+changed back and forth without affecting any of the data in the collection.</para></note>
+
+</sect1>
+
+<sect1 id="printing-options">
+<title><guilabel>Printing Options</guilabel></title>
+
+<para>
+&appname; uses an &xslt; template for creating &HTML;
+and then passes that to the &kde; printing service. Only the fields visible in the <link linkend="detailed-view"><interface>Column View</interface></link> are printed. Furthermore, if the collection
+is being filtered, only the visible entries will be printed. Initially, a warning message
+is shown if filtering is active.
+</para>
+
+<screenshot>
+<screeninfo>The Print Options Dialog</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="print-options.png"/></imageobject>
+<textobject><phrase>The Print Options Dialog</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>
+The <guilabel>Printing Options</guilabel> allow you to change some formatting when
+printing a collection. If <guilabel>Format titles and names</guilabel> is checked,
+then the fields are <link linkend="field-formatting">auto-formatted</link> when they
+are printed. Otherwise, they are printed exactly as they were entered.
+</para>
+
+<para>
+The default printing stylesheet prints the collection with the field values in columns.
+<guilabel>Print field headers</guilabel> controls whether the field title is printed
+at the top of the column.
+</para>
+
+<para>
+In the printout, the entries will be sorted as they are in the <link linkend="detailed-view"><interface>Column View</interface></link>. Additionally, they may be grouped as they are in the <link linkend="group-view"><interface>Group View</interface></link>.
+</para>
+
+<para>
+Finally, when image fields are included in the printout, the images may be resized,
+while maintaining their aspect ratio. The maximum image width and height define the
+largest possible size of the image, though it will never be increased.
+</para>
+</sect1>
+
+<sect1 id="template-options">
+<title><guilabel>Template Options</guilabel></title>
+
+<para>
+The <link linkend="entry-view"><interface>Entry View</interface></link> uses templates to show the field
+values. You can specify a different template for each collection type. Some templates,
+such as the <emphasis>Album</emphasis> or <emphasis>Video</emphasis> templates are
+for a specific collection type, and a short error message will appear in the
+<interface>Entry View</interface> if they are used for other types. The
+<guilabel>Preview</guilabel> button pops up a window to show you a preview of what the template looks like.
+Custom fonts and colors may be passed to the template, and all of the default templates
+will honor those settings. However, custom template may choose to ignore them.</para>
+
+<para>
+Additional templates may be installed directly, or downloaded from
+<ulink url="https://store.kde.org/">store.kde.org</ulink> by clicking
+the <guilabel>Download</guilabel> button. Any templates installed by the user may also be deleted.
+Entry templates are saved in <filename class="directory">$<envar>KDEHOME</envar>/share/apps/tellico/entry-templates/</filename>.
+</para>
+
+<para>If you create a new template, please consider submitting it at <ulink url="https://store.kde.org/">store.kde.org</ulink>!</para>
+
+<screenshot>
+<screeninfo>The Template Options Dialog</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="template-options.png"/></imageobject>
+<textobject><phrase>The Template Options Dialog</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+</sect1>
+
+<sect1 id="data-sources-options">
+<title><guilabel>Data Sources Options</guilabel></title>
+
+<para>
+&appname; can use various sources for importing data, which can be configured
+in the Data Sources Dialog. There are many available types and sources. A few of them are listed below.</para>
+
+<itemizedlist>
+<listitem><para><link linkend="amazon-web-services">Amazon.com Web Services</link>,</para></listitem>
+<listitem><para>the <link linkend="imdb">Internet Movie Database</link>,</para></listitem>
+<listitem><para><link linkend="z3950">z39.50 servers</link>,</para></listitem>
+<listitem><para><link linkend="sru">SRU servers</link>,</para></listitem>
+<listitem><para><link linkend="entrez">Entrez (PubMed) databases</link>,</para></listitem>
+<listitem><para><link linkend="animenfo">AnimeNfo.com</link>,</para></listitem>
+<listitem><para><link linkend="ibs">Internet Bookshop Italia</link>,</para></listitem>
+<listitem><para><link linkend="isbndb">ISBNdb.com</link>,</para></listitem>
+<listitem><para><link linkend="bib-sources">arxiv.org</link>,</para></listitem>
+<listitem><para><link linkend="bib-sources">bibsonomy.org</link>,</para></listitem>
+<listitem><para><link linkend="bib-sources">crossref.org</link>,</para></listitem>
+<listitem><para><link linkend="discogs">Discogs.com</link>,</para></listitem>
+<listitem><para><link linkend="winecom">Wine.com</link>,</para></listitem>
+<listitem><para><link linkend="tmdb">TheMovieDB.org</link>,</para></listitem>
+<listitem><para><link linkend="tgdb">TheGamesDB.net</link>,</para></listitem>
+<listitem><para><link linkend="omdb">OMDBAPI.com</link>,</para></listitem>
+<listitem><para><link linkend="musicbrainz">MusicBrainz.org</link>,</para></listitem>
+<listitem><para><link linkend="giantbomb">GiantBomb.com</link>,</para></listitem>
+<listitem><para><link linkend="openlibrary">OpenLibrary.org</link>,</para></listitem>
+<listitem><para><link linkend="externalexec">other external scripts or applications</link>, and</para></listitem>
+<listitem><para><link linkend="multiple-sources">combinations of any of the above sources</link>.</para></listitem>
+</itemizedlist>
+
+<screenshot>
+<screeninfo>The Data Sources Options Dialog</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="source-options.png"/></imageobject>
+<textobject><phrase>The Data Sources Options Dialog</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>
+New sources may be added by clicking the <guibutton>New...</guibutton> button, while
+existing ones may be modified or deleted, using the <guibutton>Modify...</guibutton> or
+<guibutton>Delete</guibutton> buttons. The order of the sources, which shows up in the
+entry updating menus, can also be changed.
+</para>
+
+<para>
+Additional templates may be downloaded from the author's online repository by clicking
+the <guilabel>Download</guilabel> button. Those scripts are gpg-signed by the author to
+guard against dangerous scripts from unknown sources, which could cause damage to your system.
+</para>
+
+<warning>
+<para>
+Never install and run a script from an untrusted source. They are executed with the same permissions as the user,
+and as a result, could modify or delete files or otherwise mess up your system.
+</para>
+</warning>
+
+<para>
+Many of the data sources offer more information than the default fields in &appname;. Those other fields are
+shown on the right of the configuration box. If any of those fields are checked, they will be added
+to the collection when an entry is added from that source.
+</para>
+
+<!-- start book sources -->
+
+<sect2 id="book-sources">
+<title>Book and Bibliographic Data Sources</title>
+
+<sect3 id="z3950">
+<title>z39.50 Servers</title>
+
+<para>
+The <ulink url="http://www.cni.org/pub/NISO/docs/Z39.50-brochure/50.brochure.toc.html">z39.50 protocol</ulink> is used to access libraries and bibliographic information providers around the world. Lists of public z39.50 servers are <ulink url="http://www.indexdata.dk/targettest/">available from indexdata.dk</ulink>, among others. &appname; comes with
+several preset configurations for major libraries, or you can specify the connection information manually.</para>
+
+<para>&appname;
+is able to read data in the <acronym>MODS</acronym>, <acronym>USMARC</acronym>/<acronym>MARC21</acronym>, or <acronym>UNIMARC</acronym> format, using the <ulink url="http://www.indexdata.dk/yaz/">yaz library</ulink>.
+In addition, there is limited support for the <acronym>GRS-1</acronym> format.
+</para>
+
+<screenshot>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="z3950-options.png"/></imageobject>
+</mediaobject>
+</screenshot>
+
+<para>
+To use one of the preset libraries, check the box and then select the library. The other configuration entries will be disabled. If you need to set the information manually, uncheck the preset box.
+</para>
+
+<para>
+The default port for z39.50 access is 210, but some servers may use a different one. &appname; assumes the server uses the MARC-8 character encoding, unless configured otherwise. If an incorrect character encoding is used, an error message may appear on the program output, or possibly no entries are retrieved.
+</para>
+
+<para>
+Some servers require a username and password for access. &appname; can use and save that password, but be aware that is written to the &appname; configuration file in plain text and is not secure. For most public servers, the username and password fields may be left empty.
+</para>
+
+</sect3>
+
+<sect3 id="sru">
+<title>SRU Servers</title>
+
+<para>
+SRU stands for <ulink url="http://www.loc.gov/standards/sru/">Search/Retrieve via &URL;</ulink> and is a standard search protocol for
+Internet searches. Some libraries use it for providing access to their data catalogs. Among them, the <ulink url="http://www.loc.gov/z3950/lcserver.html#oppr">US Library of Congress</ulink> is probably
+the best known.
+</para>
+
+<screenshot>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="sru-options.png"/></imageobject>
+</mediaobject>
+</screenshot>
+
+</sect3>
+
+<sect3 id="entrez">
+<title>Entrez Databases</title>
+<para>
+<ulink url="http://www.ncbi.nlm.nih.gov/Entrez/">Entrez</ulink> is the integrated, text-based search and retrieval system used at the National Center for Biotechnology Information (NCBI). The most well-known Entrez database is <ulink url="http://www.ncbi.nlm.nih.gov/entrez/query.fcgi?db=PubMed">PubMed</ulink>, the database for life science articles from many biological journals. At the moment, the only Entrez database supported by &appname; is PubMed.</para>
+</sect3>
+
+<sect3 id="bib-sources">
+<title>Bibliographic Databases</title>
+<para>
+<ulink url="http://arxiv.org">arXiv.org</ulink>, <ulink url="http://bibsonomy.org">Bibsonomy</ulink>, and <ulink url="http://crossref.org">CrossRef</ulink> are online databases for academic articles and bibliographic information. For access to the CrossRef source, you must <ulink url="http://www.crossref.org/requestaccount/">request an account</ulink> and add your account information to the data source configuration.</para>
+</sect3>
+
+<sect3 id="ibs">
+<title>Internet Bookstore Italia</title>
+<para>
+<ulink url="http://ibs.it">IBS, or Internet Bookstore Italia</ulink>, is an online Italian bookstore.
+</para>
+</sect3>
+
+<sect3 id="isbndb">
+<title>ISBNdb.com</title>
+<para>
+<ulink url="http://isbndb.com">ISBNdb.com</ulink> is an online book database, with data collection libraries around the world.
+</para>
+</sect3>
+
+<sect3 id="openlibrary">
+<title>OpenLibrary.org</title>
+<para>
+<ulink url="http://openlibrary.org">OpenLibrary.org</ulink> is an online book database that aims to have one page for every book.
+</para>
+</sect3>
+
+</sect2>
+<!-- end of books -->
+
+<!-- start of movie sources -->
+<sect2 id="comicbook-sources">
+<title>Comic Book Data Sources</title>
+
+<sect3 id="animenfo">
+<title>AnimeNfo.com</title>
+<para>
+<ulink url="http://www.animenfo.com">AnimeNfo</ulink> is a popular site for information on anime, or Japanese animation.
+</para>
+</sect3>
+
+</sect2>
+
+<!-- start of movie sources -->
+<sect2 id="movie-sources">
+<title>Movie Data Sources</title>
+
+<sect3 id="imdb">
+<title>Internet Movie Database</title>
+
+<para>
+The <ulink url="http://www.imdb.com">Internet Movie Database</ulink> provides information about movies and videos. When a search is conducted for a <emphasis>Person</emphasis>, if more than one possible result is returned, a dialog box is opened to allow you to select the correct person. The configuration options include selecting which IMDb nationality to use and whether images are fetched or not. Since IMDb can return a large number of cast members, you can limit that to a certain number.
+</para>
+
+<screenshot>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="imdb-options.png"/></imageobject>
+</mediaobject>
+</screenshot>
+
+</sect3>
+
+<sect3 id="tmdb">
+<title>TheMovieDB.org</title>
+<para>
+<ulink url="http://themoviedb.org">TheMovieDB.org</ulink> is a free and open online movie database. Registration for a free account is required.
+</para>
+</sect3>
+
+<sect3 id="omdb">
+<title>OMDBAPI.com</title>
+<para>
+<ulink url="http://omdbapi.com">The Open Movie Database</ulink> is a free web service to obtain movie information.
+</para>
+</sect3>
+
+</sect2>
+
+<!-- start of music sources -->
+<sect2 id="music-sources">
+<title>Music Data Sources</title>
+
+<sect3 id="discogs">
+<title>Discogs.com</title>
+<para>
+<ulink url="http://discogs.com">Discogs.com</ulink> is a user-built music database containing information on artists, labels, and their recordings. Registration for a free account is required.
+</para>
+</sect3>
+
+<sect3 id="musicbrainz">
+<title>MusicBrainz.org</title>
+<para>
+<ulink url="http://musicbrainz.org">MusicBrainz.org</ulink> is a community music metadatabase that attempts to create a comprehensive music information site.
+</para>
+</sect3>
+
+</sect2>
+
+<!-- start of wine sources -->
+<sect2 id="wine-sources">
+<title>Wine Data Sources</title>
+
+<sect3 id="winecom">
+<title>Wine.com</title>
+<para>
+<ulink url="http://wine.com">Wine.com</ulink> is an online wine seller, and offers access to a database information on wine varietals. Registration for a free account is required.
+</para>
+</sect3>
+
+</sect2>
+
+<!-- start of video game sources -->
+<sect2 id="videogame-sources">
+<title>Video Game Data Sources</title>
+
+<sect3 id="giantbomb">
+<title>GiantBomb.com</title>
+<para>
+<ulink url="http://giantbomb.com">GiantBomb.com</ulink> is a large community-driven video game database. Registration for a free account is required.
+</para>
+</sect3>
+
+<sect3 id="tgdb">
+<title>TheGamesDB.net</title>
+<para>
+<ulink url="http://thegamesdb.net">TheGamesDB.net</ulink> is an open, online database for video game fans.
+</para>
+</sect3>
+
+</sect2>
+
+<!-- start of wine sources -->
+<sect2 id="variety-type-sources">
+<title>Data Sources for Multiple Collection Types</title>
+
+<sect3 id="amazon-web-services">
+<title>Amazon.com</title>
+
+<para>
+Using the Amazon Web Services, &appname; can search any of nine different international sites operated by <ulink url="http://amazon.com">Amazon.com</ulink> for information: United States, United Kingdom, Germany, Japan,
+France, Canada, China, Spain, and Italy.
+</para>
+
+<screenshot>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="amazon-options.png"/></imageobject>
+</mediaobject>
+</screenshot>
+
+<para>
+Configuring each Amazon.com source involves three settings: the server location, image size, and associate's ID. Some information
+from <ulink url="http://amazon.com">Amazon.com</ulink> may include an image, such as a book or video cover. That image may be downloaded in three different sizes, depending on the item. The associate's ID must be used to access the Amazon.com Web Services, and is included in the links back to the item, as dictated by the license agreement for the use of the Amazon.com Web Services.
+</para>
+
+</sect3>
+
+<sect3 id="externalexec">
+<title>External Scripts or Applications</title>
+<para>
+As an easier way for &appname; to integrate with third-party plugins, external scripts or applications may be used as an interface for searching other information sources. &appname; will execute a command, and pass the search terms as command-line options.
+</para>
+
+<para>Some scripts are distributed with &appname; itself. <ulink url="http://www.allocine.fr">Allocine.fr</ulink> is an French website for movies. The <ulink url="http://www.mcu.es">Spanish Ministry of Culture</ulink> is an online Spanish book database. <ulink url="http://darkhorse.com">Dark Horse Comics</ulink> is a comic book publisher. All three of those data sources require <ulink url="http://python.org">Python</ulink>. <ulink url="http://boardgamegeek.com">BoardGameGeek</ulink> is a website with extensive data for board games, and the script requires <ulink url="http://www.ruby-lang.org">ruby</ulink>.
+</para>
+
+<screenshot>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="externalexec-options.png"/></imageobject>
+</mediaobject>
+</screenshot>
+
+<para>
+The collection type returned by the script must be set, along with the data format. Not only can &appname; import data from scripts that
+use the <link linkend="file-format">default &appname; &XML; format</link>, but it can also import other formats as well, such as bibtex.
+</para>
+
+<para>The full path to the application should be entered in the source options. Be aware that the application is executed on the system with the same permissions as the current user, so do not use scripts from untrusted sources. Check the boxes next to the search keys supported by the application, and enter the required command line options in the edit box. The search value will be inserted where <userinput>%1</userinput> appears.
+</para>
+
+<para>
+For updating entries already in the collection, the final check box and edit box are used to determine the command-line options. The entry fields used to find an update must be entered, in the same format as used for <link linkend="derived">derived value</link> fields.
+</para>
+</sect3>
+
+</sect2>
+
+<sect2 id="multiple-sources">
+<title>Multiple Combined Data Sources</title>
+<para>
+Combinations of up to eight existing data sources can be used as a single source, where the search results from all the sources are merged. The collection type to be used must be set before adding sources.
+</para>
+
+<screenshot>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="multiple-sources-options.png"/></imageobject>
+</mediaobject>
+</screenshot>
+
+<para>
+Only existing data sources can be used in combination. The search request is sent to each source, and the results are combined. Since the merged results depend on the order of the search results, the combined set may be different depending on network and source speed.
+</para>
+</sect2>
+
+</sect1>
+
+</chapter>
--- /dev/null
+++ tellico-3.0.2/doc/details.docbook
@@ -0,0 +1,564 @@
+<chapter id="details">
+<title>&appname; Details</title>
+
+<sect1 id="field-types">
+<title>Field Types</title>
+
+<para>
+Each collection may have an unlimited number of fields. &appname; supports
+eleven types of fields, which allow for a range of different data.
+</para>
+
+<sect2 id="line">
+<title>Simple Text</title>
+
+<para>
+The most basic field type is called <emphasis>Simple Text</emphasis>.
+No restrictions are placed on the field values, and the data entry
+widget is the standard line edit. This type is appropriate for fields
+which aren't expected to have long values, such as the author or the genre.
+</para>
+
+</sect2>
+<sect2 id="number">
+<title>Number</title>
+
+<para>
+The <emphasis>Number</emphasis> type is identical to the
+<emphasis>Simple Text</emphasis>, except that the data is restricted
+to being numerical. Entries will be sorted numerically in the column
+view if a <emphasis>Number</emphasis> field column is clicked. The
+standard line edit, with small arrow buttons for increasing or decreasing
+the value, is used for data entry. No formatting is ever
+applied.</para>
+
+</sect2>
+
+<sect2 id="url">
+<title>&URL;</title>
+
+<para>
+The <emphasis>&URL;</emphasis> type allows for links to other documents,
+using the standard &kde; file type associations for opening the linked
+documents. No validation is done on the actual value of a
+<emphasis>&URL;</emphasis> field, but non-valid links are not
+opened. The data entry is a line edit with a button for opening the
+standard File-Open dialog, but any &URL; may be used. Relative &URL;s are
+interpreted relative to the location of the data file, once it has been saved.
+</para>
+
+<para>
+In the <link linkend="entry-editor"><interface>Entry Editor</interface></link>,
+the label becomes the link, while in the <link linkend="entry-view"><interface>Entry View</interface></link>, an actual
+hyperlink is used. This field type is convenient for linking to <acronym>PDF</acronym>
+files of bibliographic entries, or to movie reviews, for example. No
+formatting is ever applied.</para>
+
+<para>
+Relative &URL;s may also be used. They are interpreted relative to the location of the
+&appname; data file. In the <link linkend="entry-editor"><interface>Entry Editor</interface></link>, the line
+edit provides auto-completion for local file locations. If you want the &URL; from the &kde;
+File Selector Dialog Box to be interpreted relative to the document location, then a
+property for the &URL; field should be set to <emphasis>relative</emphasis> : <emphasis>true</emphasis>.
+</para>
+
+</sect2>
+
+<sect2 id="para">
+<title>Paragraph</title>
+
+<para>
+For longer text fields, the <emphasis>Paragraph</emphasis> type offers
+a larger text edit area, and is always in its own category. A
+<emphasis>Paragraph</emphasis> field may not have multiple values, nor
+is it automatically formatted. It cannot be used for grouping. Abstracts, plot
+summaries, or reviews should be entered using this field type.</para>
+
+</sect2>
+
+<sect2 id="choice">
+<title>Choice</title>
+
+<para>
+When a field should be limited to a few preset values, a
+<emphasis>Choice</emphasis> type is used. The acceptable values are
+presented in a drop down box for selection. Obviously, multiple values
+are not applicable. Fields such as bibliography type or personal rating
+are <emphasis>Choice</emphasis>-type fields.</para>
+
+<para>Semi-colons should be used to separated the allowed values.</para>
+
+</sect2>
+
+<sect2 id="bool">
+<title>Checkbox</title>
+
+<para>
+For fields which take a yes or no value, the
+<emphasis>Checkbox</emphasis> type is available. By default, the field
+is toggled off. <emphasis>Checkbox</emphasis> fields are not formatted
+and are limited to single values. Internally, the field values are
+carried as <emphasis><constant>true</constant></emphasis> or
+<emphasis><constant>false</constant></emphasis>. Some examples are gift or loaned
+fields.</para>
+
+</sect2>
+
+<sect2 id="date">
+<title>Date</title>
+
+<para>
+A <emphasis>Date</emphasis> field can include a day, month, and year. The date is shown in the standard format of YYYY-MM-DD, which allows for easy sorting. The standard &kde; Date Selector may be used to choose the date with the mouse, or it may be entered directly. The field is not required to have non-empty values for the year, month, and day; only the year may be entered, for example. Multiple values are not allowed.
+</para>
+
+</sect2>
+
+<sect2 id="table">
+<title>Table</title>
+
+<para>
+<emphasis>Table</emphasis> fields hold a one or more columns of values.
+In the <link linkend="entry-editor"><interface>Entry Editor</interface></link>, the field is presented using a
+spreadsheet-like view, with numbered rows. When the last row is selected, an additional
+row is then added.  Auto-completion is not available.
+This field is useful for a list of chapters in a book, scenes in a movie, or songs in an album.
+<emphasis>Table</emphasis> fields are always a category by themselves.
+</para>
+
+<para>
+The number of columns, up to a maximum of ten, is defined by adding a property to the field
+definition with the name <emphasis>columns</emphasis>. The columns may be labeled by right-clicking
+on the header, or by setting a field property named <emphasis>column1</emphasis>, etc.
+</para>
+
+<para>
+When using the <interface>Entry Editor</interface> for <emphasis>Table</emphasis> fields, rows may be rearranged by dragging
+the mouse while holding the &Ctrl; button. A popup menu is also available by right-clicking on the table,
+which allows rows to be inserted or removed.
+</para>
+
+</sect2>
+
+<sect2 id="image">
+<title>Image</title>
+
+<para>
+<emphasis>Image</emphasis> fields hold an image, of any format supported by &kde;.
+Some of the typical ones include <acronym>PNG</acronym> or <acronym>JPEG</acronym>.
+The image can be saved inside the &appname; data file itself or in the application data
+directory. The standard &kde; File Selector is used, so you can use a &URL; or just a
+file available locally. Images can also be dragged from a file manager or browser.
+</para>
+
+</sect2>
+
+<sect2 id="rating">
+<title>Rating</title>
+
+<para>
+<emphasis>Rating</emphasis> fields show a number of stars to represent a numerical rating
+for an entry. By default, the rating is a maximum of five. The minimum and maximum may be
+changed by setting properties in the field definition in the <interface>Collection Fields Dialog</interface>, named
+<emphasis>minimum</emphasis> and <emphasis>maximum</emphasis>, respectively.
+</para>
+
+</sect2>
+
+<sect2 id="derived">
+<title>Derived Value Fields</title>
+
+<para>
+Fields with derived values are a special case. The field type corresponds to the typical type of value
+contained in the field, but the value of the field is constructed from other fields using a format
+string in the field description. For example, if the field has
+a value template of <userinput>%{title} %{year}</userinput>, then the value of that field will
+be the title, followed by the year. This field type is used primarily for the title field in
+the coin, stamp, trading card, and wine collections. Either the internal field name or the field title
+may be used in the description for formatting.
+</para>
+
+<para>
+To select only a single value for a field with multiple values, add a position index to the template,
+such as <userinput>%{author:1}</userinput> for the first author. The position may be negative,
+counting from the end, so <userinput>%{author:-1}</userinput> would be the last author. Upper and
+lower-case values may be used by setting template flags, such as <userinput>%{author:1/l}</userinput>
+for lower-case first author and <userinput>%{author:1/u}</userinput> for upper-case.
+</para>
+
+</sect2>
+
+</sect1>
+
+<sect1 id="collection-types">
+<title>Collection Types</title>
+
+<para>
+&appname; supports twelve specific collection types by default: books, bibliographic entries, comic books, videos, music, video games, trading cards, coins, stamps, wines, board games, and file catalogs. In addition, an empty generic collection template is available for any other collectibles. The default collections are only meant to include a general set of fields. You should add, modify, or delete them to fit your needs. The only requirement is that a collection should always have a <emphasis>Title</emphasis> field, so that the <link linkend="group-view"><interface>Group View</interface></link> works correctly. For some collection types, that is just a <link linkend="derived">derived value</link> field combining two or more of the others.
+</para>
+
+<para>
+In general, there's no functional difference between the collection types. You could create a custom collection for your books just as easily as using the default book collection. But &appname; chooses icons based on collection type, and there may be some specialized functionality that is unique to a certain collection, so if you can, you should use the defaults. So, if you want to create a wine collection, but don't like any of the default fields, go ahead and create a default wine collection, then delete all the defaults. That way, &appname; still knows that it's a wine collection.
+</para>
+
+<para>
+By default, all the collection types include an <emphasis>ID</emphasis> field, which shows the ID number of the entry. In addition, except for the file catalog, each collection includes fields showing the date that the entry was created in the collection and the last time that it was modified.
+</para>
+
+<sect2 id="book-collection">
+<title>Book Collections</title>
+<para>
+Book collections have 27 default fields:
+<emphasis>Title</emphasis>,
+<emphasis>Subtitle</emphasis>,
+<emphasis>Author</emphasis>,
+<emphasis>Binding</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Publisher</emphasis>,
+<emphasis>Edition</emphasis>,
+<emphasis>Copyright Year</emphasis>,
+<emphasis>Publication Year</emphasis>,
+<emphasis>ISBN#</emphasis>,
+<emphasis>LCCN#</emphasis>,
+<emphasis>Pages</emphasis>,
+<emphasis>Language</emphasis>,
+<emphasis>Genre</emphasis>,
+<emphasis>Keywords</emphasis>,
+<emphasis>Series</emphasis>,
+<emphasis>Series Number</emphasis>,
+<emphasis>Condition</emphasis>,
+<emphasis>Signed</emphasis>,
+<emphasis>Read</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Loaned</emphasis>,
+<emphasis>Rating</emphasis>,
+<emphasis>Front Cover</emphasis>,
+<emphasis>Plot Summary</emphasis>, and
+<emphasis>Comments</emphasis>.
+</para>
+
+<para>
+The <emphasis>ISBN#</emphasis> field is special, since <acronym>ISBN</acronym> numbers are automatically formatted and the check-digit is calculated. &appname; recognizes the <acronym>ISBN</acronym> field if its internal field name is <emphasis>isbn</emphasis>. If you have deleted it, or need to add it to another type of collection, create the field with the title as <emphasis>ISBN</emphasis> and apply the change, then you can return and modify the title as you want. &appname; creates the internal name based on the initial title, but never changes it if the title is later updated.
+</para>
+
+</sect2>
+
+<sect2 id="bibliography">
+<title>Bibliographies</title>
+<para>
+Bibliographies have 25 default fields:
+<emphasis>Title</emphasis>,
+<emphasis>Entry Type</emphasis>,
+<emphasis>Author</emphasis>,
+<emphasis>Bibtex Key</emphasis>,
+<emphasis>Book Title</emphasis>,
+<emphasis>Editor</emphasis>,
+<emphasis>Organization</emphasis>,
+<emphasis>Publisher</emphasis>,
+<emphasis>ISBN#</emphasis>,
+<emphasis>Address</emphasis>,
+<emphasis>Edition</emphasis>,
+<emphasis>Pages</emphasis>,
+<emphasis>Year</emphasis>,
+<emphasis>Journal</emphasis>,
+<emphasis>Month</emphasis>,
+<emphasis>Number</emphasis>,
+<emphasis>How Published</emphasis>,
+<emphasis>Chapter</emphasis>,
+<emphasis>Series</emphasis>,
+<emphasis>Series Number</emphasis>,
+<emphasis>Volume</emphasis>,
+<emphasis>Cross-Reference</emphasis>,
+<emphasis>Keywords</emphasis>,
+<emphasis>Abstract</emphasis>, and
+<emphasis>Notes</emphasis>.
+</para>
+
+<para>
+Although bibliographic collections are not specifically linked to bibtex, the default set of fields is taken from a typical set of bibtex fields. When exporting to bibtex, a property called <emphasis>bibtex</emphasis> is used for each field to define the corresponding bibtex field. If you add an additional field to a bibliography and want to export it to bibtex, be sure to set the <emphasis>bibtex</emphasis> property.
+</para>
+
+<para>
+&appname; does have some specialized functions for bibliographies. Bibtex string macros can be added, modified, or deleted from within &appname; and the bibtex export gives you the option of expanding the macros. Bibtex citations can be pushed to an external application such as <application>LyX</application> or <application>Kile</application> using the so-called <emphasis><link linkend="hidden-bibtex-options">lyxpipe</link></emphasis>.
+</para>
+
+<para>
+Book collections can be converted to bibliographies. Default bibtex fields are added, and the bibtex properties are set. This functionality exists primarily to convert old collections, before the bibliography type was separated from the book collection type.
+</para>
+</sect2>
+
+<sect2 id="comic-book-collection">
+<title>Comic Book Collections</title>
+<para>
+Comic book collections have 23 default fields:
+<emphasis>Title</emphasis>,
+<emphasis>Subtitle</emphasis>,
+<emphasis>Writer</emphasis>,
+<emphasis>Artist</emphasis>,
+<emphasis>Series</emphasis>,
+<emphasis>Issues</emphasis>,
+<emphasis>Publisher</emphasis>,
+<emphasis>Edition</emphasis>,
+<emphasis>Publication Year</emphasis>,
+<emphasis>Pages</emphasis>,
+<emphasis>Country</emphasis>,
+<emphasis>Language</emphasis>,
+<emphasis>Genre</emphasis>,
+<emphasis>Keywords</emphasis>,
+<emphasis>Condition</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Signed</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Loaned</emphasis>,
+<emphasis>Front Cover</emphasis>,
+<emphasis>Plot Summary</emphasis>, and
+<emphasis>Comments</emphasis>.
+</para>
+
+</sect2>
+
+<sect2 id="video-collection">
+<title>Video Collections</title>
+<para>
+Video collections have 30 default fields:
+<emphasis>Title</emphasis>,
+<emphasis>Medium</emphasis>,
+<emphasis>Production Year</emphasis>,
+<emphasis>Certification</emphasis>,
+<emphasis>Genre</emphasis>,
+<emphasis>Region</emphasis>,
+<emphasis>Nationality</emphasis>,
+<emphasis>Format</emphasis>,
+<emphasis>Cast</emphasis>,
+<emphasis>Director</emphasis>,
+<emphasis>Producer</emphasis>,
+<emphasis>Writer</emphasis>,
+<emphasis>Composer</emphasis>,
+<emphasis>Studio</emphasis>,
+<emphasis>Language Tracks</emphasis>,
+<emphasis>Subtitle Languages</emphasis>,
+<emphasis>Audio Tracks</emphasis>,
+<emphasis>Running Time</emphasis>,
+<emphasis>Aspect Ratio</emphasis>,
+<emphasis>Widescreen</emphasis>,
+<emphasis>Color Mode</emphasis>,
+<emphasis>Director's Cut</emphasis>,
+<emphasis>Plot Summary</emphasis>,
+<emphasis>Personal Rating</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Loaned</emphasis>,
+<emphasis>Cover</emphasis>, and
+<emphasis>Comments</emphasis>.
+</para>
+
+<para>
+The <emphasis>Cast</emphasis> field is a <link linkend="table">table</link> with two columns, and the name of the actor is intended to be in the first column, with their role in the second. The <emphasis>Running Time</emphasis> is meant to be in minutes, though you can change that, of course.
+</para>
+</sect2>
+
+<sect2 id="music-collection">
+<title>Music Collections</title>
+<para>
+Music collections have 15 default fields:
+<emphasis>Title</emphasis>,
+<emphasis>Medium</emphasis>,
+<emphasis>Artist</emphasis>,
+<emphasis>Label</emphasis>,
+<emphasis>Year</emphasis>,
+<emphasis>Genre</emphasis>,
+<emphasis>Tracks</emphasis>,
+<emphasis>Rating</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Loaned</emphasis>,
+<emphasis>Keywords</emphasis>,
+<emphasis>Cover</emphasis>, and
+<emphasis>Comments</emphasis>.
+</para>
+
+</sect2>
+
+<sect2 id="game-collection">
+<title>Game Collections</title>
+<para>
+Video game collections have 16 default fields:
+<emphasis>Title</emphasis>,
+<emphasis>Platform</emphasis>,
+<emphasis>Genre</emphasis>,
+<emphasis>Release Year</emphasis>,
+<emphasis>Publisher</emphasis>,
+<emphasis>Developer</emphasis>,
+<emphasis>ESRB Rating</emphasis>,
+<emphasis>Description</emphasis>,
+<emphasis>Personal Rating</emphasis>,
+<emphasis>Completed</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Loaned</emphasis>,
+<emphasis>Cover</emphasis>, and
+<emphasis>Comments</emphasis>.
+</para>
+
+</sect2>
+
+<sect2 id="card-collection">
+<title>Card Collections</title>
+<para>
+Trading card collections have 17 default fields:
+<emphasis>Title</emphasis>,
+<emphasis>Player</emphasis>,
+<emphasis>Team</emphasis>,
+<emphasis>Brand</emphasis>,
+<emphasis>Card Number</emphasis>,
+<emphasis>Year</emphasis>,
+<emphasis>Series</emphasis>,
+<emphasis>Card Type</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Location</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Keywords</emphasis>,
+<emphasis>Quantity</emphasis>,
+<emphasis>Front Image</emphasis>,
+<emphasis>Back Image</emphasis>, and
+<emphasis>Comments</emphasis>.
+</para>
+
+</sect2>
+
+<sect2 id="coin-collection">
+<title>Coin Collections</title>
+<para>
+Coin collections have 16 default fields:
+<emphasis>Title</emphasis>,
+<emphasis>Type</emphasis>,
+<emphasis>Denomination</emphasis>,
+<emphasis>Year</emphasis>,
+<emphasis>Mint Mark</emphasis>,
+<emphasis>Country</emphasis>,
+<emphasis>Coin Set</emphasis>,
+<emphasis>Grade</emphasis>,
+<emphasis>Grading Service</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Location</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Obverse</emphasis>,
+<emphasis>Reverse</emphasis>, and
+<emphasis>Comments</emphasis>.
+</para>
+
+</sect2>
+
+<sect2 id="stamp-collection">
+<title>Stamp Collections</title>
+<para>
+Stamp collections have 18 default fields:
+<emphasis>Title</emphasis>,
+<emphasis>Description</emphasis>,
+<emphasis>Denomination</emphasis>,
+<emphasis>Country</emphasis>,
+<emphasis>Issue Year</emphasis>,
+<emphasis>Color</emphasis>,
+<emphasis>Scott#</emphasis>,
+<emphasis>Grade</emphasis>,
+<emphasis>Cancelled</emphasis>,
+<emphasis>Hinged</emphasis>,
+<emphasis>Centering</emphasis>,
+<emphasis>Gummed</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Location</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Image</emphasis>, and
+<emphasis>Comments</emphasis>.
+</para>
+
+</sect2>
+
+<sect2 id="wine-collection">
+<title>Wine Collections</title>
+<para>
+Wine collections have 15 default fields.
+<emphasis>Title</emphasis>,
+<emphasis>Producer</emphasis>,
+<emphasis>Appellation</emphasis>,
+<emphasis>Varietal</emphasis>,
+<emphasis>Type</emphasis>,
+<emphasis>Country</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Location</emphasis>,
+<emphasis>Quantity</emphasis>,
+<emphasis>Drink By</emphasis>,
+<emphasis>Rating</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Label Image</emphasis>, and
+<emphasis>Comments</emphasis>.
+</para>
+
+</sect2>
+
+<sect2 id="board-game-collection">
+<title>Board Game Collections</title>
+<para>
+Board game collections have 17 default fields.
+<emphasis>Title</emphasis>,
+<emphasis>Genre</emphasis>,
+<emphasis>Mechanism</emphasis>,
+<emphasis>Release Year</emphasis>,
+<emphasis>Publisher</emphasis>,
+<emphasis>Designer</emphasis>,
+<emphasis>Number of Players</emphasis>,
+<emphasis>Playing Time</emphasis>,
+<emphasis>Minimum Age</emphasis>,
+<emphasis>Description</emphasis>,
+<emphasis>Rating</emphasis>,
+<emphasis>Purchase Date</emphasis>,
+<emphasis>Purchase Price</emphasis>,
+<emphasis>Gift</emphasis>,
+<emphasis>Loaned</emphasis>,
+<emphasis>Cover</emphasis>, and
+<emphasis>Comments</emphasis>,
+</para>
+
+</sect2>
+
+<sect2 id="file-catalog">
+<title>File Catalogs</title>
+<para>
+File catalogs have 14 default fields.
+<emphasis>Name</emphasis>,
+<emphasis>&URL;</emphasis>,
+<emphasis>Description</emphasis>,
+<emphasis>Volume</emphasis>,
+<emphasis>Folder</emphasis>,
+<emphasis>Mimetype</emphasis>,
+<emphasis>Size</emphasis>,
+<emphasis>Permissions</emphasis>,
+<emphasis>Owner</emphasis>,
+<emphasis>Group</emphasis>,
+<emphasis>Created</emphasis>,
+<emphasis>Modified</emphasis>,
+<emphasis>Meta Info</emphasis>, and
+<emphasis>Icon</emphasis>,
+</para>
+
+</sect2>
+
+<sect2 id="custom-collection">
+<title>Custom Collections</title>
+<para>
+Custom collections have one default field, the <emphasis>Title</emphasis>. They should be used when the collectible item is not one of the default types.
+</para>
+
+</sect2>
+
+</sect1>
+
+</chapter>
--- /dev/null
+++ tellico-3.0.2/doc/faqs.docbook
@@ -0,0 +1,232 @@
+<chapter id="faqs">
+<title>Questions and Answers</title>
+
+<!-- (OPTIONAL but recommended) This chapter should include all of the silly
+(and not-so-silly) newbie questions that fill up your mailbox. This chapter
+should be reserved for BRIEF questions and answers! If one question uses more
+than a page or so then it should probably be part of the
+"Using this Application" chapter instead. You should use links to
+cross-reference questions to the parts of your documentation that answer them.
+This is also a great place to provide pointers to other FAQ's if your users
+must do some complicated configuration on other programs in order for your
+application work. -->
+
+<qandaset id="faqlist">
+
+<qandaentry>
+<question>
+<para>How do I enter multiple authors?</para>
+</question>
+<answer>
+
+<para>Author names should be separated by a semi-colon, like so:
+<userinput>Brian W. Kernighan; Dennis M. Ritchie</userinput>. Don't
+include the word "and" or anything similar, even if you have 20
+authors. If you have the auto-format option checked, then the last
+name will automatically be shown first for each author.</para>
+
+<para>Other properties which allow multiple values, like "genre" and
+"keywords", are entered in the same way, with a semi-colon (;)
+separating each value.</para>
+
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question>
+<para>Can I modify what the printed page looks like?</para>
+</question>
+<answer>
+
+<para>Yes, most certainly. Find the file <filename>tellico-printing.xsl</filename> which
+ should be in the $<envar>KDEDIR</envar>/share/apps/tellico/ directory. You can copy
+ that to $<envar>KDEHOME</envar>/share/apps/tellico/ for personal modifications.
+ You'll have to know <ulink
+ url="http://www.w3.org/TR/xslt">&xslt;</ulink>, but modifying that file
+ is how you change the printing layout. &HTML; is generated from the
+ file, and the easiest way to change the appearance of the printout is
+ to modify the &CSS; in the top portion.</para>
+
+<para>Be aware that the <filename>tellico-printing.xsl</filename> references another file, <filename>tellico-common.xsl</filename>, that contains some common &xslt; templates. If you copy
+<filename>tellico-printing.xsl</filename> to $<envar>KDEHOME</envar>, you must either modify the &lt;xsl:import&gt; element to point to the actual location of the <filename>tellico-common.xsl</filename> file or copy the common file as well.
+</para>
+</answer>
+</qandaentry>
+<qandaentry>
+<question>
+<para>How do I group by a property other than the ones listed in the toolbar?</para>
+</question>
+<answer>
+<para>
+To allow grouping by a field which doesn't allow grouping by default, check the
+"Allow Grouping" box for that particular field in the "Collection Fields" dialog.
+</para>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question><para>Why does all that gobbledy-gook show up when I run &appname;?</para></question>
+<answer>
+<para>Stuff like:
+<screen width="40">
+<computeroutput>Tellico::updateCollectionToolBar</computeroutput>
+<computeroutput>GroupView::setGroupAttribute - author</computeroutput>
+<computeroutput>GroupView::slotAddCollection</computeroutput>
+<computeroutput>QCheckBox::property( "title" ) failed: property invalid
+or does not exist</computeroutput>
+</screen>
+
+is debug info. At compile time, this can be stopped by compiling with
+the <userinput><option>--disable-debug</option></userinput> flag. You
+might also want to use
+<userinput><option>--enable-final</option></userinput>, too, which
+takes a bit more memory when compiling, but is more efficient when
+running the application.</para>
+
+<para>The last message is slightly different, it just means your &Qt;
+ installation was compiled with some debugging information.</para>
+
+<para>Or, if &appname; is already installed, run
+<userinput><command>kdebugdialog</command></userinput> and make sure
+that "0 (generic)" is unchecked. That turns off debug messages from
+all generic &kde; apps &ie; those not distributed officially by
+&kde;.</para>
+
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question><para>How do I change which columns are shown?</para></question>
+<answer>
+<para>Right-click on the header bar. You can also drag the headers to re-order
+the columns, and click on them to sort by that field.</para>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question><para>How do I filter by something like the "Read"
+field?</para></question>
+<answer>
+<para>Internally, the checkbox
+fields in &appname; are saved as "true", so if you'd like to filter
+to show only the science fiction books which you've not read, for
+example, then you have two rules. Make sure the "Match all of the
+following" button is checked. Set the first rule to have "Genre"
+"contains" "Science Fiction" (no quotes) and the second rule to have
+"Read" "does not contain" "true" (no quotes).</para>
+
+<para>Also, the quick filter in the toolbar will match any field,
+and if there is a non-word character, the text is interpreted as a
+regular expression. So if you quickly want to filter your books to
+show those by Weber or Bujold, then type "weber|bujold" (no quotes) in
+the toolbar.</para>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question><para>How do I add new entry templates?</para></question>
+
+<answer>
+<para>Entry templates should be saved in
+<filename class="directory">$<envar>KDEHOME</envar>/share/apps/tellico/entry-templates/</filename>
+for access for a single user or
+<filename class="directory">$<envar>KDEDIR</envar>/share/apps/tellico/entry-templates/</filename>
+for access by everyone. Templates in $<envar>KDEHOME</envar> will
+override any files by the same name in $<envar>KDEDIRS</envar>. The
+entry templates can be set on a per collection-type basis in the
+settings dialog.</para>
+
+<para>Templates for the <interface>Report Dialog</interface> are saved in <filename class="directory">$<envar>KDEHOME</envar>/share/apps/tellico/report-templates/</filename>.
+</para>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question><para>Compiling and installing went
+fine, but when &appname; starts up, the window is blank. What's
+wrong?</para></question>
+
+<answer>
+<para>&kde; programs look for data in the locations defined in the
+ $<envar>KDEDIRS</envar> environmental variable. If you install in
+ <filename class="directory">/usr/local</filename> for example, but
+ $<envar>KDEDIRS</envar> is empty or just <filename class="directory">/usr</filename>,
+ then &appname; won't be able to find the files it needs. This is
+ particularly true for &SuSE;, for which you should compile with
+ <userinput><option>--prefix</option>=<filename class="directory">/opt/kde3</filename></userinput>. Alternatively,
+ you could add a line to your <filename>.profile</filename> file to
+ set $<envar>KDEDIRS</envar>. Check the documentation for your
+ shell.</para>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question><para>How do I export additional bibtex fields?</para></question>
+<answer>
+<para>&appname; uses the <emphasis>bibtex</emphasis> property to know how to export
+ bibtex fields. If you want to add additional fields to export, such
+ as an abstract, open up the <interface>Collection Fields Dialog</interface>, and click the <guibutton>Set
+ Properties</guibutton> button. Add a <emphasis>bibtex</emphasis> property with value
+ <emphasis>abstract</emphasis>. Then, when you export to bibtex or bibtexml, that
+ property will be used for the bibtex field name.</para>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question>
+<para>What happened to Bookcase?</para>
+</question>
+
+<answer>
+<para>Due to a trademark conflict, Bookcase was renamed Tellico in September 2004.
+Tellico 0.12 was then released, which was identical to
+Bookcase 0.11, except for the name change.</para>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question>
+<para>What does the name Tellico have to do with anything?</para>
+</question>
+
+<answer>
+<para>I thought about <ulink url="http://www.periapsis.org/archives/2004/09/13/renaming_bookcase.html">several
+other names</ulink>, a few of which were connected with book collections. However,
+Tellico can handle more than just books, and besides, this is a hobby, so I chose
+a neat-sounding (to me) name, one taken from a town close to where I grew up.</para>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question>
+<para>What do you include those links to Amazon.com in the search results?</para>
+</question>
+
+<answer>
+<para>
+The <ulink url="http://www.amazon.com/gp/browse.html/002-0927720-5265623?node=3440661">terms of agreement for accessing the Amazon.com Web Services</ulink> require all images pulled from the service to be linked back to Amazon.com, as well as an additional link. The Amazon.com associate's ID is necessarily included, so any referral payments are duly collected.
+</para>
+</answer>
+</qandaentry>
+
+<qandaentry>
+<question>
+<para>Why don't you use a real database?</para>
+</question>
+
+<answer>
+<para>
+Part of the reason I started &appname; was to learn C++. I didn't know SQL at the time, and at the moment, I only have a faint knowledge
+of how to use it. Simply put, &appname; didn't start out as a relational database, and that won't change until sometime in the future when
+I get around to learning SQL and have the time and motivation to change the data model. If that bothers you, well, don't use &appname; then.
+</para>
+
+<para>
+Of course, anyone is welcome to make any changes they want to with the source code.
+</para>
+</answer>
+</qandaentry>
+
+</qandaset>
+
+</chapter>
--- /dev/null
+++ tellico-3.0.2/doc/fundamentals.docbook
@@ -0,0 +1,586 @@
+<chapter id="fundamentals">
+<title>Using &appname;</title>
+
+<sect1 id="quick-start">
+<title>Quick Start</title>
+
+<para>
+By default, &appname; starts with an empty book collection. To work with some other type of collection, create it using the <menuchoice><guimenu>File</guimenu><guimenuitem>New</guimenuitem></menuchoice> menu item, or the button on the toolbar. Collections are populated with some of the more common fields, but you can add, modify, or delete them to suit your needs.
+</para>
+
+<para>
+New entries can be added by using the <link linkend="entry-editor"><interface>Entry Editor</interface></link>. The <menuchoice><guimenu>Collection</guimenu><guimenuitem>New Entry</guimenuitem></menuchoice> menu item will open the <interface>Entry Editor</interface> with an empty entry ready for editing. The <interface>Entry Editor</interface> can also be opened by using the  <menuchoice><guimenu>Settings</guimenu><guimenuitem>Show Entry Editor</guimenuitem></menuchoice> menu item. Once you've entered the values for the entry, you can save it to the collection by using the <guibutton>Save Entry</guibutton> button in the <interface>Entry Editor</interface> dialog, which remains open in case you want to continue adding new entries. Once you've saved an entry in the collection, you can modify it by clicking on it in the main window. If the <interface>Entry Editor</interface> is not already open, you can double click an entry to open the editor and start editing.
+</para>
+
+<para>
+If you want to include an image in the entry, you can use the standard &kde; File Selector by clicking the <guibutton>Select Image...</guibutton> button in the <link linkend="entry-editor"><interface>Entry Editor</interface></link>, or you can drag an image from the file manager or web browser into the <interface>Entry Editor</interface>.
+</para>
+
+<para>
+When you select an entry, the <link linkend="entry-view"><interface>Entry View</interface></link> shows a formatted view of the entry's contents. You can change the template used for showing the entry in the <link linkend="configuration"><interface>Configuration Dialog</interface></link>.
+</para>
+
+<para>
+The entries in the collection are grouped together when they share the same values for certain fields, such as the author or director. You can change the field used for grouping by using the combo box in the toolbar or the  <menuchoice><guimenu>Settings</guimenu><guimenuitem>Group Selection</guimenuitem></menuchoice> menu item.
+</para>
+
+<para>
+You can use the <interface>Quick Filter</interface> in the toolbar to quickly limit the visible entries to ones which contain the word you type. The filter is also useful when you want to quickly find an entry. You can type in the title or some other unique word that identifies the entry and the <link linkend="detailed-view"><interface>Column View</interface></link> will only show the entries that match the filter. The status bar shows you how many entries are in the collection, and how many are currently being filtered.
+</para>
+
+</sect1>
+
+<sect1 id="main-window">
+<title>General Usage</title>
+
+<para>
+The main window has three distinct areas, all of which show information about the collection
+in a different manner. The primary view is the <link linkend="detailed-view"><interface>Column View</interface></link> in
+the upper right area, where the value of every field for each entry may be shown. On the left side, tabs
+hold the <link linkend="group-view"><interface>Group View</interface></link>, which can be used to sort the entries into groups
+in a tree-structure, the <link linkend="filter-view"><interface>Filter View</interface></link>, which is used to track which
+entries meet certain criteria, and the <link linkend="loan-view"><interface>Loan View</interface></link>, where any loans are
+listed. Finally, the <link linkend="entry-view"><interface>Entry View</interface></link> shows a formatted view
+of the data for a single entry, or an icon view of a group of entries, in the lower right.
+</para>
+
+<screenshot>
+<screeninfo>The &appname; Main Window</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="main-window.png"/></imageobject>
+<textobject><phrase>The &appname; Main Window</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<sect2 id="detailed-view">
+<title><interface>Column View</interface></title>
+
+<para>
+Any of the fields in the collections may be shown in the <interface>Column View</interface>, although <emphasis><link linkend="para">Paragraph</link></emphasis>, <emphasis><link linkend="image">Image</link></emphasis>, and <emphasis><link linkend="table">Table</link></emphasis> fields will probably not be useful. Right-clicking on the header of the view opens a menu for selecting the visible fields. The columns may be resized and reordered in any way, and the settings will be saved between sessions.
+</para>
+</sect2>
+
+<sect2 id="group-view">
+<title><interface>Group View</interface></title>
+
+<para>
+The <interface>Group View</interface> groups the entries in a tree-view by any field which <link linkend="field-options">allows grouping</link>.
+The number of entries in each group is shown next to the group name. Groups may be expanded or collapsed by clicking the arrow sign, or by double-clicking the item. Expanding and contracting all the groups are options in the right-click context menu. The tree may be sorted either by the group name, or by the count, by clicking on the header. A group may also be used as a filter for the <link linkend="detailed-view"><interface>Column View</interface></link>, by right-clicking on the group item.
+</para>
+
+<para id="people-group">
+When more than one field in the collection has the <emphasis><link linkend="fields-dialog"><guilabel>Format as a name</guilabel></link></emphasis> option turned on, an additional group is added to combine all those fields into one single <emphasis>People</emphasis> pseudo-group.
+</para>
+
+<para>
+If an entry does not contain a value for the field being used to form the groups, it is placed in the <emphasis>(Empty)</emphasis> group, which uses a red folder.
+</para>
+</sect2>
+
+<sect2 id="filter-view">
+<title><interface>Filter View</interface></title>
+
+<para>
+If any filters are saved for the collection, the <interface>Filter View</interface> becomes active. As you add or
+modify entries, they will automatically be checked against the filters and add or removed as
+appropriate. The filter may be modified by double-clicking on the item to open
+the <interface>Advanced Filter Dialog</interface>. Right-clicking gives you the option to delete it altogether.
+</para>
+
+<screenshot>
+<screeninfo>The <interface>Filter View</interface></screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="filter-view.png"/></imageobject>
+<textobject><phrase>The <interface>Filter View</interface></phrase></textobject>
+</mediaobject>
+</screenshot>
+
+</sect2>
+
+<sect2 id="loan-view">
+<title><interface>Loan View</interface></title>
+
+<para>
+Once entries are checked-out on loan, the <interface>Loan View</interface> is added to the window, so those
+borrowed entries may be tracked. Loans are tracked on a per-entry bases, so right-clicking
+on an entry item has an option for modifying the loan using the <interface>Loan Dialog</interface>.
+</para>
+
+<screenshot>
+<screeninfo>The <interface>Loan View</interface></screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="loan-view.png"/></imageobject>
+<textobject><phrase>The <interface>Loan View</interface></phrase></textobject>
+</mediaobject>
+</screenshot>
+
+</sect2>
+
+<sect2 id="entry-view">
+<title><interface>Entry View</interface></title>
+
+<para>
+A formatted representation of the entry's values is shown in the <interface>Entry View</interface>. Templates are used for the layout and any additional graphics. Separate templates for each type of collection may be specified in the <link linkend="template-options"><interface>Configuration Dialog</interface></link>, along with custom colors and fonts.</para>
+
+<para>All of the default templates honor the color and font selection, but other custom templates might not.
+The default templates also make &URL; fields active, which will open up with the default &kde; file association. When exporting to &HTML;, the current template is used for exporting the individual entry files.
+</para>
+
+<para>
+In addition, when multiple entries are selected, an icon view is shown, using the first <link linkend="image">Image</link> field in the collection. Entries may be selected as in the <interface>Column View</interface>. Right-clicking in the icon view will show a menu that changes the sorting criteria for the entries.
+</para>
+
+</sect2>
+
+<sect2 id="status-bar">
+<title>Statusbar</title>
+
+<para>
+The status bar is used to show you what &appname; is currently doing. It also includes a total count of the entries in the collection, and if a filter is being used, how many are currently visible.
+</para>
+</sect2>
+
+</sect1>
+
+<sect1 id="entry-editor">
+<title>Editing Entries</title>
+
+<para>
+The <interface>Entry Editor</interface> is used to add and modify entries in the collection. Double-clicking on an entry in either the <interface>Group View</interface> or the <interface>Column View</interface> opens the <interface>Entry Editor</interface> with that entry. New entries may be created using the <menuchoice><guimenu>Collection</guimenu></menuchoice> menu, the toolbar icon, or the button in the <interface>Entry Editor</interface> itself.</para>
+
+<para>Closing the <interface>Entry Editor</interface> when changes have been made but not saved will cause a warning message to appear. The fields are grouped by category and appear in the order that they appear in the <link linkend="fields-dialog"><interface>Collection Fields Dialog</interface></link>. They may also be reordered.
+</para>
+
+<screenshot>
+<screeninfo>The <interface>Entry Editor</interface></screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="entry-editor1.png"/></imageobject>
+<textobject><phrase>The <interface>Entry Editor</interface></phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>
+Clicking the field title for a <link linkend="url"><emphasis>&URL;</emphasis></link> field will open the link using the default &kde; file association. The <guiicon>&URL; selector</guiicon> button beside the text entry will open the default &kde; File Open Dialog, but the field is not limited to local files.
+</para>
+
+<para>
+For <link linkend="image"><emphasis>Image</emphasis></link> fields, the <guibutton>Select Image...</guibutton> button opens up the &kde; image file selection dialog. The image is saved in the collection in the original format, and a scaled version is shown in the <interface>Entry Editor</interface>. The image may be cleared by using the <guibutton>Clear</guibutton> button. Cleared images are removed from the collection. </para>
+
+<screenshot>
+<screeninfo>The <interface>Entry Editor</interface> for <emphasis>Image</emphasis> fields</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="entry-editor3.png"/></imageobject>
+<textobject><phrase>The <interface>Entry Editor</interface> for <emphasis>Image</emphasis> fields</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>
+The edit widget also supports drag-and-drop. Dragging an image file from a file-manager or browser window does the same thing as selecting the image in the File Selector. Dragging an image from the edit widget into a &konqueror; file manager window will save the image in that folder.
+</para>
+
+<warning>
+<para>
+By default, the images are stored in the collection data file, keeping everything contained in one location. However, too many images will cause &appname; to slow down significantly as well result in a very large data file. Alternatively, &appname; can save the images separately, either in the <filename class="directory">$<envar>KDEHOME</envar>/share/apps/tellico/data/</filename> folder or in a folder in the same location as the data file. Loading and saving data files is much faster if images are stored separately, but the data files are no longer portable or archivable.
+Self-contained data files can always be created by using the <menuchoice><guimenu>File</guimenu><guimenu>Export</guimenu><guimenuitem>Export to Zip...</guimenuitem></menuchoice> menu item.
+</para>
+</warning>
+
+<para>
+<link linkend="table"><emphasis>Table</emphasis></link> fields begin with five rows, but moving the cursor to the last row automatically adds another. For multi-column tables, only the first column is used for grouping or formatting.
+</para>
+
+<screenshot>
+<screeninfo>The <interface>Entry Editor</interface> for <emphasis>Table</emphasis> fields</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="entry-editor4.png"/></imageobject>
+<textobject><phrase>The <interface>Entry Editor</interface> for <emphasis>Table</emphasis> fields</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<sect2 id="edit-multiple">
+<title>Editing Multiple Entries</title>
+<para>
+Multiple entries may be edited at the same time by selecting more than one in either the <interface>Group View</interface> or the <interface>Column View</interface>. If multiple entries are selected, the fields which contain the same value in every entry are enabled. If entries have different values, then the fields are disabled. Check boxes are added to the extreme right for each field entry which control whether the field is enabled or not, as shown in the screenshot below.
+</para>
+
+<para>
+Only enabled fields will be modified when the entries are saved, which makes large-scale editing much easier. For example, to set the Medium of all the video entries in the collection, make sure the Medium field is enabled. Change it to <acronym>DVD</acronym>, then save the entries. Only the Medium field will be modified, preserving all the other field values for the entries.
+</para>
+
+<screenshot>
+<screeninfo>The <interface>Entry Editor</interface> for multiple entries</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="entry-editor5.png"/></imageobject>
+<textobject><phrase>The <interface>Entry Editor</interface> for multiple entries</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+</sect2>
+
+<sect2 id="updating-entries">
+<title>Updating Entry Data</title>
+
+<para>
+Entries may be automatically updated by querying the data sources available for the current collection type, which is very useful for combining information from multiple sources. For example, you may add a movie to your collection using
+the <link linkend="amazon-web-services">Amazon.com Web Services</link>, and then update the entry with additional
+information from the <link linkend="imdb">Internet Movie Database</link>.
+</para>
+
+<para>
+Only empty fields are updated unless the <link linkend="data-sources-options">setting for that source</link> allows results to overwrite existing information. For <link linkend="externalexec">external scripts</link>, an update field must be specified in the source options.
+</para>
+
+<para>
+The entry updating may be started via the right-click menu for an entry, or by using the <menuchoice><guimenu>Collection</guimenu><guimenuitem>Update Entry</guimenuitem></menuchoice> menu item.
+</para>
+</sect2>
+
+</sect1>
+
+<sect1 id="fields-dialog">
+<title>Editing Fields</title>
+
+<para>
+The <interface>Collection Fields Dialog</interface> allows you to add new fields to the collection, to modify the existing ones, or to delete fields altogether.
+</para>
+
+<screenshot>
+<screeninfo>The &appname; <interface>Collection Fields Dialog</interface></screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="fields-dialog.png"/></imageobject>
+<textobject><phrase>The &appname; <interface>Collection Fields Dialog</interface></phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<sect2 id="field-list">
+<title>Field List</title>
+
+<para>
+On the left side of the dialog is the list of the current fields. Modified fields are shown in bold italics. The buttons below the list will add or delete a field, and the arrows can be used to change their order. The order of the fields in the list is important because the <interface>Entry Editor</interface> uses the order for its layout. For each category, the fields will be laid out from left to right, according to the top-to-bottom order of the fields in the list.
+</para>
+</sect2>
+
+<sect2 id="field-properties">
+<title>Field Properties</title>
+
+<para>
+A field is defined by its title, type, category, description, and possibly a default value or some allowed values. The title is used everywhere to refer to the field in the user interface. The <interface>Entry Editor</interface> uses it to prompt for values. The <interface>Column View</interface> uses it as a column header. The different types of fields are <link linkend="field-types">explained in the Field Types section</link>. The description is used as a tooltip in the <interface>Entry Editor</interface>, perhaps to provide an explanation of the field's contents. In addition, for <link linkend="derived">fields with <emphasis>derived</emphasis> values</link>, a value template is used to format the field's value. The default value is automatically added when creating a new entry. The list of allowed values for <link linkend="choice"><emphasis>Choice</emphasis></link> fields should be separated by a semi-colon.
+</para>
+
+<para>
+New fields may be any type, but changing the type of existing fields is restricted to compatible types, as shown in the table below:
+</para>
+
+<table>
+<title>Allowable Field Type Changes</title>
+<tgroup cols="2">
+<thead>
+<row>
+<entry>Current Type</entry>
+<entry>New Type Allowed</entry>
+</row>
+</thead>
+<tbody>
+<row>
+<entry><emphasis>Simple Text</emphasis></entry>
+<entry><emphasis>Simple Text</emphasis>, <emphasis>Paragraph</emphasis>, <emphasis>Number</emphasis>, <emphasis>&URL;</emphasis>, <emphasis>Table</emphasis></entry>
+</row>
+<row>
+<entry><emphasis>Paragraph</emphasis></entry>
+<entry><emphasis>Simple Text</emphasis>, <emphasis>Paragraph</emphasis></entry>
+</row>
+<row>
+<entry><emphasis>Choice</emphasis></entry>
+<entry><emphasis>Simple Text</emphasis>, <emphasis>Paragraph</emphasis>, <emphasis>Choice</emphasis>, <emphasis>Number</emphasis>, <emphasis>&URL;</emphasis>, <emphasis>Table</emphasis></entry>
+</row>
+<row>
+<entry><emphasis>Checkbox</emphasis></entry>
+<entry><emphasis>Simple Text</emphasis>, <emphasis>Paragraph</emphasis>, <emphasis>Checkbox</emphasis>, <emphasis>Number</emphasis>, <emphasis>&URL;</emphasis>, <emphasis>Table</emphasis></entry>
+</row>
+<row>
+<entry><emphasis>Number</emphasis></entry>
+<entry><emphasis>Simple Text</emphasis>, <emphasis>Paragraph</emphasis>, <emphasis>Number</emphasis>, <emphasis>&URL;</emphasis>, <emphasis>Table</emphasis></entry>
+</row>
+<row>
+<entry><emphasis>&URL;</emphasis></entry>
+<entry><emphasis>Simple Text</emphasis>, <emphasis>Paragraph</emphasis>, <emphasis>Number</emphasis>, <emphasis>&URL;</emphasis>, <emphasis>Table</emphasis></entry>
+</row>
+<row>
+<entry><emphasis>Date</emphasis></entry>
+<entry><emphasis>Simple Text</emphasis>, <emphasis>Date</emphasis></entry>
+</row>
+<row>
+<entry><emphasis>Table</emphasis></entry>
+<entry><emphasis>Simple Text</emphasis>, <emphasis>Paragraph</emphasis>, <emphasis>Table</emphasis></entry>
+</row>
+<row>
+<entry><emphasis>Image</emphasis></entry>
+<entry><emphasis>Image</emphasis></entry>
+</row>
+<row>
+<entry><emphasis>Rating</emphasis></entry>
+<entry><emphasis>Choice</emphasis>, <emphasis>Rating</emphasis></entry>
+</row>
+</tbody>
+</tgroup>
+</table>
+</sect2>
+
+<sect2 id="field-formatting">
+<title>Field Formatting</title>
+
+<para>
+&appname; provides some capability for automatic formatting of field values. The simplest is auto-capitalization, which capitalizes every word except the articles. Title formatting moves certain articles from the beginning to the end of the field, for example, changing "The Return of the King" to "Return of the King, The". The title articles are configurable. Finally, name formatting tries to break up the string so that the last, or family, name of the person is shown first. Name prefixes and suffixes are configurable. Also, the special <emphasis><link linkend="people-group">People</link></emphasis> group uses all fields with name formatting, even if the global setting is turned off.
+</para>
+
+<para>
+All automatic formatting can be disabled by changing the global options in the <link linkend="general-options"><interface>Configuration Dialog</interface></link>. Globally, capitalization is a distinct option from formatting, so a title can be auto-formatted without being capitalized. Not all field types allow auto-formatting.
+</para>
+
+<table>
+<title>Formatting Examples</title>
+<tgroup cols="5">
+<thead>
+<row>
+<entry>Format Type</entry>
+<entry>Field Value</entry>
+<entry>Auto-Capitalized</entry>
+<entry>Auto-Formatted</entry>
+<entry>Auto-Capitalized &amp; Auto-Formatted</entry>
+</row>
+</thead>
+<tbody>
+<row>
+<entry><emphasis>Title</emphasis></entry>
+<entry>the return of the king</entry>
+<entry>The Return of the King</entry>
+<entry>return of the king, the</entry>
+<entry>Return of the King, The</entry>
+</row>
+<row>
+<entry><emphasis>Name</emphasis></entry>
+<entry>tom swift, jr.</entry>
+<entry>Tom Swift, Jr.</entry>
+<entry>swift, jr., tom</entry>
+<entry>Swift, Jr., Tom</entry>
+</row>
+</tbody>
+</tgroup>
+</table>
+</sect2>
+<sect2 id="field-options">
+<title>Field Options</title>
+
+<para>
+Fields also have three general options. If auto-completion is enabled, &appname; caches the values for each field, and the <interface>Entry Editor</interface> offers automatic completion, using the standard &kde; settings. Not all field types allow auto-completion. &appname; also needs to know if a field may have multiple values or may be used to group the entries. A semi-colon is used to separate multiple values when editing an entry.
+</para>
+
+<para>
+For efficiency, do not enable auto-completion unless you need it for the fields. The more fields with auto-completion in the collection, the slower it takes &appname; to load the file.
+</para>
+
+</sect2>
+</sect1>
+
+<sect1 id="filter-dialog">
+<title>Filtering Entries</title>
+<para>
+The <interface>Advanced Filter Dialog</interface> allows you to limit the entries visible in the <link linkend="detailed-view"><interface>Column View</interface></link>
+to those that match one or more filter rules.
+The filter may be used to find the entries that meet all of the rules in the dialog, or just to
+find those that meet any of them. The <interface>Advanced Filter Dialog</interface> is also useful for advanced searching within a collection.
+</para>
+
+<screenshot>
+<screeninfo>The &appname; <interface>Advanced Filter Dialog</interface></screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="filter-dialog.png"/></imageobject>
+<textobject><phrase>The &appname; <interface>Advanced Filter Dialog</interface></phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>
+Each row contains a single filter rule. Select the field to match in the first box in the row, then select a matching rule in the center. Rules may match values that contain a certain word, or are exactly equal. A regular expression may also be used to match entries, in which case the <guibutton>Edit...</guibutton> button becomes active for editing the expression, if &kregexpeditor; is installed on your computer. Finally, the word or string to match should be entered in the text box.
+</para>
+
+<para>
+Up to eight (8) rules may be used in the filter. The <guibutton>More</guibutton> and <guibutton>Fewer</guibutton> buttons may be used to add or remove rules.
+</para>
+
+<para>
+Filters may be saved, so that all entries which match are grouped together in the <interface>Filter View</interface>. The view is dynamic, so as entries are added or modified, the group is automatically updated. To save the filter, enter a name in the text box, and click the <guibutton>Save Filter</guibutton> button.
+</para>
+
+<para>
+Previously saved filters may be modified by right-clicking on the filter item in the <interface>Filter View</interface> and selecting <guilabel>Modify Filter</guilabel>. The <interface>Advanced Filter Dialog</interface> is opened, and changes may be made to the filter's name or rules.
+</para>
+
+<informalexample>
+<para>
+To find the science fiction books you've not read, check the <guilabel>Match all of the following</guilabel>
+button, set the first rule to <emphasis>Genre contains Science Fiction</emphasis> and the second to <emphasis>Read does not contain true</emphasis>. (For <link linkend="bool">Checkbox</link> fields, the internal value is <emphasis>true</emphasis>).
+</para>
+
+<para>
+To find the books by Bujold or Weber, check the <guilabel>Match any of the following</guilabel>
+button, set the first rule to <emphasis>Author contains Bujold</emphasis> and the second to <emphasis>Author contains Weber</emphasis>.
+</para>
+</informalexample>
+
+</sect1>
+
+<sect1 id="report-dialog">
+<title>Generating Reports</title>
+<para>
+&appname; can generate various reports about your current collection. The <interface>Report Dialog</interface> checks for all &xslt; templates in the installation path and in <filename class="directory">$<envar>KDEHOME</envar>/share/apps/tellico/report-templates/</filename>. So you can create new ones, and they are automatically found and included as options in the <interface>Report Dialog</interface>. Some complex reports may take a while to generate for large collections.
+</para>
+
+<para>
+The templates that are installed with &appname; include a list of titles only, the default column view, a group view, a summary of all of the groups and the most popular values in those groups, a loan report, and a large report with cover images. Select the desired template and click the <guibutton>Generate</guibutton> button. Any report may also be printed or saved to an &HTML; file.
+</para>
+
+<screenshot>
+<screeninfo>The &appname; <interface>Report Dialog</interface></screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="report-dialog.png"/></imageobject>
+<textobject><phrase>The &appname; <interface>Report Dialog</interface></phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>
+The entries included in the report will be limited to the ones in the <interface>Column View</interface> so if you've got an active filter, the <interface>Report Dialog</interface> will use it.
+</para>
+</sect1>
+
+<sect1 id="loan-dialog">
+<title>Loan Tracking</title>
+<para>
+&appname; supports tracking loans of any entries in the collection. The <interface>Loan Dialog</interface> may be opened by using the <guilabel>Check-out</guilabel> menu item, or right-clicking on an entry. Multiple entries may be checked-out at once.
+</para>
+
+<para>
+The borrower's name may be directly entered, or pulled from the default &kde; address book by clicking on the button next to the name entry. The check-out date is assumed to be the current date, but may be changed. The due date is optional, and other notes may be added about the loan.
+</para>
+
+<para>
+If a due date is entered, and &appname; is compiled with libkcal support, a loan reminder may be added to the default &kde; calendar as a To-Do item. &korganizer; can be used to view those items.
+</para>
+
+<para>
+When an entry is checked-out, the <emphasis>Loaned</emphasis> field is set to <emphasis>true</emphasis>. If no loaned field exists in the collection, one is added. Do not modify that field directly! Entries on-loan may be checked-in using the menu item, or right-clicking on an entry in the <interface>Loan View</interface>.
+</para>
+
+<screenshot>
+<screeninfo>The &appname; <interface>Loan Dialog</interface></screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="loan-dialog.png"/></imageobject>
+<textobject><phrase>The &appname; <interface>Loan Dialog</interface></phrase></textobject>
+</mediaobject>
+</screenshot>
+
+</sect1>
+
+<sect1 id="tips">
+<title>General Tips</title>
+
+<para>
+These are the list of tips contained in the "Tip of the Day" list for &appname;.
+</para>
+
+<tip>
+<para>If a book has more than one author, you should separate
+their names by a semi-colon, so that Tellico will know to split them
+and use them separately. Any other field which allows multiple values should be entered the
+same way. with a semi-colon (;) separating each value.
+</para>
+</tip>
+
+<tip>
+<para>You can change which fields are shown in the list view by
+right-clicking on the column header.
+</para>
+</tip>
+
+<tip>
+<para>You can add, edit, or modify the fields in the collection using
+the <interface>Collection Fields Dialog</interface>. The arrow buttons below the field list can be used to change the
+position of the field in the list, which affects the placement in the entry
+editor.
+</para>
+</tip>
+
+<tip>
+<para>If you want to filter by a <link linkend="bool"><emphasis>Checkbox</emphasis></link> field, a value of
+"true" should be used. If you'd like to filter to
+show only the science fiction books which you've not read, for
+example, check the <guilabel>Match all of the
+following</guilabel> button,  set the first rule to have "Genre"
+"contains" "Science Fiction" (no quotes) and the second rule to
+have "Read" "does not contain" "true" (no quotes).
+</para>
+</tip>
+
+<tip>
+<para>If a non-word character is used in the Quick Filter, the text is
+interpreted as a regular expression. To show only books which are by Weber or Bujold, for example, then
+type "weber|bujold" (no quotes) in the filter box.
+</para>
+</tip>
+
+<tip>
+<para>You can edit more than one entry at a time, by holding down
+the &Shift; or &Ctrl; key and selecting multiple entries.
+</para>
+</tip>
+
+<tip>
+<para>You can convert an existing book collection to a bibliography,
+which can then be exported to bibtex or Bibtexml format.
+</para>
+</tip>
+
+<tip>
+<para>If more than one field is formatted as a name, then an additional
+group named "People" is added to the collection, allowing authors and editors
+to be sorted or printed together, for example.
+</para>
+</tip>
+
+<tip>
+<para>You can modify the appearance of the printed output by modifying
+the <filename>tellico-printing.xsl</filename> file. The file generates &HTML;, and the &CSS;
+within the stylesheet governs things like the font, the margins, etc.
+</para>
+</tip>
+
+<tip>
+<para>Double-clicking an entry item opens the <interface>Entry Editor</interface>.
+</para>
+</tip>
+
+<tip>
+<para>You can add &HTML; tags to any <link linkend="para"><emphasis>Paragraph</emphasis></link> field for formatting, such as
+&lt;b&gt;<emphasis role="bold">bold</emphasis>&lt;/b&gt; or &lt;i&gt;<emphasis>italic</emphasis>&lt;/i&gt;.
+</para>
+</tip>
+
+<tip>
+<para>In the <interface>Column View</interface>, you can press a letter on the
+keyboard to skip to the next entry that starts with that letter.
+</para>
+</tip>
+
+<tip>
+<para>You can use derived values to combine values from multiple fields
+into a single value. Just check the derived value box and use a value template
+similar to "<userinput>Value: %{fielda}%{fieldb}</userinput>" where %{...} gets replaced with the
+appropriate field value. This is useful to collect multiple values in a
+single field, &eg; for better grouping, and to combine fields of different
+types by respecting proper sorting at the same time. Consider for example
+a number field followed by a text subfield with entries 3b, 14a.
+</para>
+</tip>
+
+</sect1>
+
+</chapter>
--- /dev/null
+++ tellico-3.0.2/doc/hacking.docbook
@@ -0,0 +1,390 @@
+<chapter id="hacking">
+<title>Hacking &appname;</title>
+
+<para>
+In the spirit of Free Software, you are welcome to hack on &appname; as much as you like. You should be able to write scripts to import, export, or modify data very easily. This chapter gives you more information about doing that.
+</para>
+
+<sect1 id="file-format">
+<title>File Format</title>
+
+<para>
+The default &appname; data file is a zip archive, normally with a <literal role="extension">.tc</literal> file extension. Inside the archive is a top-level <filename>tellico.xml</filename> file. Images may be included inside the <filename>images/</filename> folder in the archive, or they may be included in the &XML; data directly in a base64 encoding. Images may also be saved inside the application data folder, in which case, they are not in the data file at all. &appname; can also load the &XML; file, by itself, uncompressed.
+</para>
+
+<sect2 id="xml-format">
+<title>&XML; Data</title>
+
+<para>
+</para>
+
+<sect3 id="coll-xml-data">
+<title>Collection</title>
+<programlisting>
+<![CDATA[
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tellico PUBLIC "-//Robby Stephenson/DTD Tellico V11.0//EN" "http://periapsis.org/tellico/dtd/v11/tellico.dtd">
+<tellico xmlns="http://periapsis.org/tellico/" syntaxVersion="11">
+ <collection title="My Books" type="2">
+ </collection>
+</tellico>
+]]>
+</programlisting>
+
+<para>
+The file begins with the required &XML; declaration and encoding, followed by the doctype. When a new field type is added or additional properties are set on the default fields, the doctype DTD version is incremented. &appname; is always able to open and read any previous DTD version, but will save files in the current version. The DTD location does point to an actual DTD file.
+</para>
+
+<para>
+The top-level element is a <markup>&lt;tellico&gt;</markup> element, containing the default namespace declaration and the syntax version of the file, which should always match the DTD.
+</para>
+
+<para>
+The <markup>&lt;tellico&gt;</markup> element contains one <markup>&lt;collection&gt;</markup> element. Multiple collections are ignored, for now. The <markup>title</markup> attribute contains the collection title, while the <markup>type</markup> specifies what kinds of entries are contained in the collection. The allowable types are in <link linkend="collection-type-values">listed in a later section</link>. An optional <markup>entryTitle</markup> attribute may be used to specify the title of the entries for a custom collection, and should be plural.
+</para>
+</sect3>
+
+<sect3 id="fields-xml-data">
+<title>Fields</title>
+
+<programlisting>
+<![CDATA[
+  <fields>
+   <field flags="8" title="Title" category="General" format="1" type="1" name="title" />
+   <field flags="7" title="Author" category="General" format="2" type="1" name="author" />
+   <field flags="2" title="Binding" category="General" allowed="Hardback;Paperback;Trade Paperback;E-Book;Magazine;Journal" format="4" type="3" name="binding" >
+    <prop name="default">Paperback</prop>
+   </field>
+   <field flags="6" title="Publisher" category="Publishing" format="0" type="1" name="publisher" />
+   <field flags="4" title="Edition" category="Publishing" format="0" type="1" name="edition" />
+   <field flags="3" title="Copyright Year" category="Publishing" format="4" type="6" name="cr_year" />
+   <field flags="2" title="Publication Year" category="Publishing" format="4" type="6" name="pub_year" />
+   <field flags="0" title="ISBN#" category="Publishing" format="4" type="1" name="isbn" description="International Standard Book Number" />
+   <field flags="7" title="Genre" category="Classification" format="0" type="1" name="genre" />
+   <field flags="7" title="Keywords" category="Classification" format="0" type="1" name="keyword" />
+   <field flags="0" title="Front Cover" category="Front Cover" format="4" type="10" name="cover" />
+   <field flags="0" title="Comments" category="Personal" format="4" type="1" name="comments" />
+   <field title="Rating" flags="2" category="Personal" format="4" type="14" name="rating">
+    <prop name="maximum">5</prop>
+    <prop name="minimum">1</prop>
+   </field>
+   <field title="ID" flags="32" category="Personal" format="4" type="6" name="id">
+    <prop name="template">%{@id}</prop>
+   </field>
+
+  </fields>
+]]>
+</programlisting>
+
+<para>
+All of the fields are defined inside a <markup>&lt;fields&gt;</markup> element, of which there can be only one. All of the information for a field, except for any properties, are included as attributes of the <markup>&lt;field&gt;</markup> element. The allowable values for the <markup>flags</markup>, <markup>format</markup>, and <markup>type</markup> attributes are given in a <link linkend="field-type-values">following section</link>.
+</para>
+
+<para>
+Field properties are used for setting default field values, rating value ranges, derived value templates, etc. The examples above include a default value, a maximum rating value, and a template for a derived ID field.
+</para>
+
+<para>
+
+</para>
+
+</sect3>
+
+<sect3 id="entries-xml-data">
+<title>Entries</title>
+
+<programlisting>
+<![CDATA[
+  <entry>
+   <title>C++ Programming Language, The</title>
+   <authors>
+    <author>Stroustrup, Bjarne</author>
+   </authors>
+   <publisher>Addison-Wesley Pub Co</publisher>
+   <edition>3rd</edition>
+   <pub_year>1997</pub_year>
+   <isbn>0-201-88954-4</isbn>
+   <genres>
+    <genre>Non-Fiction</genre>
+   </genres>
+   <keywords>
+    <keyword>Programming</keyword>
+    <keyword>Computers</keyword>
+   </keywords>
+   <cover>cf65a2f023b6cb9e9233323dca10ac7c.jpeg</cover>
+  </entry>
+]]>
+</programlisting>
+
+<para>
+For every field in the collection, an <markup>&lt;entry&gt;</markup> may contain an element whose name is identical to the field name. If multiple values are allowed for the field, then the letter <emphasis>s</emphasis> is added to the field name to create an element, and each value is added as a child of the element, as in the case of the author, genre, and keyword fields above.
+</para>
+
+<para>
+As a result, if additional fields are added to the collection, the data file will no longer conform to the DTD. However, &appname; uses a non-validating &XML; parser, so additional fields do not cause problems.
+</para>
+</sect3>
+
+<sect3 id="images-xml-data">
+<title>Images</title>
+<programlisting>
+<![CDATA[
+  <images>
+   <image width="111" format="JPEG" height="140" id="cf65a2f023b6cb9e9233323dca10ac7c.jpeg" />
+  </images>
+]]>
+</programlisting>
+
+<para>
+Inside the <markup>&lt;images&gt;</markup> element, each image referenced by an entry is listed, along with attributes describing the image's size, format, and id. If the image is contained inside the Zip file, the element is empty. Otherwise, the image data may be contained in the &XML; stream as base64-encoded text.
+</para>
+</sect3>
+
+</sect2>
+
+</sect1>
+
+<sect1 id="collection-type-values">
+<title>Collection Type Values</title>
+
+<para>
+The type of collection is given in the type attribute of the collection element. The value is equal to the <type>Type</type> enum value in <filename>src/collection.h</filename>.
+</para>
+
+<table>
+<title>Collection Type Values</title>
+<tgroup cols="2">
+<thead>
+<row>
+<entry>Collection Type</entry>
+<entry>Value</entry>
+</row>
+</thead>
+<tbody>
+<row><entry>Custom Collection</entry><entry>1</entry></row>
+<row><entry>Book Collection</entry><entry>2</entry></row>
+<row><entry>Video Collection</entry><entry>3</entry></row>
+<row><entry>Music Collection</entry><entry>4</entry></row>
+<row><entry>Bibliography</entry><entry>5</entry></row>
+<row><entry>Comic Book Collection</entry><entry>6</entry></row>
+<row><entry>Wine Collection</entry><entry>7</entry></row>
+<row><entry>Coin Collection</entry><entry>8</entry></row>
+<row><entry>Stamp Collection</entry><entry>9</entry></row>
+<row><entry>Trading Card Collection</entry><entry>10</entry></row>
+<row><entry>Video Game Collection</entry><entry>11</entry></row>
+<row><entry>File Catalog</entry><entry>12</entry></row>
+<row><entry>Board Game Collection</entry><entry>13</entry></row>
+</tbody>
+</tgroup>
+</table>
+
+</sect1>
+
+<sect1 id="field-type-values">
+<title>Field Type Values</title>
+
+<para>
+&appname; will include all the default fields for a collection if the first field element has the name <emphasis>_default</emphasis>. For <emphasis>Paragraph</emphasis>, <emphasis>Table</emphasis>, or <emphasis>Image</emphasis> fields, the field category should be identical to the field title.
+</para>
+
+<para>
+The type of field is given in the type attribute of the field element. The value is equal to the <type>FieldType</type> enum value in <filename>src/field.h</filename>.
+</para>
+
+<table>
+<title>Field Type Values</title>
+<tgroup cols="2">
+<thead>
+<row>
+<entry>Field Type</entry>
+<entry>Value</entry>
+</row>
+</thead>
+<tbody>
+<row><entry>Simple Text</entry><entry>1</entry></row>
+<row><entry>Paragraph</entry><entry>2</entry></row>
+<row><entry>Choice</entry><entry>3</entry></row>
+<row><entry>Checkbox</entry><entry>4</entry></row>
+<row><entry>Number</entry><entry>6</entry></row>
+<row><entry>&URL;</entry><entry>7</entry></row>
+<row><entry>Single-Column Table</entry><entry>8</entry></row>
+<row><entry>Image</entry><entry>10</entry></row>
+<row><entry>Date</entry><entry>12</entry></row>
+<row><entry>Rating</entry><entry>14</entry></row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The field may have different flags set, given as a bitwise OR'd value in the flags attribute on the field element. The flag for preventing the user from deleting a field is intended for such things as the citation key for bibliographic entries.
+</para>
+
+<table>
+<title>Field Flag Values</title>
+<tgroup cols="2">
+<thead>
+<row>
+<entry>Field Flags</entry>
+<entry>Value</entry>
+</row>
+</thead>
+<tbody>
+<row><entry>Allow Multiple Values</entry><entry><constant>0x01</constant></entry></row>
+<row><entry>Allow Grouping</entry><entry><constant>0x02</constant></entry></row>
+<row><entry>Allow Completion</entry><entry><constant>0x04</constant></entry></row>
+<row><entry><emphasis>Disallow Deleting</emphasis></entry><entry><constant>0x08</constant></entry></row>
+<row><entry><emphasis>Disallow Editing</emphasis></entry><entry><constant>0x10</constant></entry></row>
+<row><entry>Derived Value</entry><entry><constant>0x20</constant></entry></row>
+</tbody>
+</tgroup>
+</table>
+
+<para>
+The format of the field is given in the format attribute on the field element. <emphasis>Date Formatting</emphasis> is not currently used. Grouping by <emphasis>People</emphasis> uses all the fields which use <emphasis>Name Formatting</emphasis>. Setting the <emphasis>Derived Value</emphasis> flag implies the value for the field is generated from the template property from other field values.
+</para>
+
+<table>
+<title>Field Format Values</title>
+<tgroup cols="2">
+<thead>
+<row>
+<entry>Field Format</entry>
+<entry>Value</entry>
+</row>
+</thead>
+<tbody>
+<row><entry>Capitalization Only</entry><entry>0</entry></row>
+<row><entry>Title Formatting</entry><entry>1</entry></row>
+<row><entry>Name Formatting</entry><entry>2</entry></row>
+<row><entry><emphasis>Date Formatting</emphasis></entry><entry>3</entry></row>
+<row><entry>No Formatting</entry><entry>4</entry></row>
+</tbody>
+</tgroup>
+</table>
+
+</sect1>
+
+<sect1 id="hidden-options">
+<title>Hidden Configuration Options</title>
+
+<para>
+&appname; has some additional configuration options that are not visible in the <interface>Configuration Dialog</interface>. They are not important enough to warrant cluttering the dialog with more settings, but as they represent options which may appeal to various users, the application does read them from the configuration file.
+</para>
+
+<para>
+The settings for &appname; are saved in a file in the user's home folder, namely <filename>$<envar>KDEHOME</envar>/share/config/tellicorc</filename>. Within that file, settings are put in groups, which appear with bracketed names, such as [General Options]. To add a setting to the <emphasis>General Options</emphasis> group, find the line in the settings file with that group name. If it does not appear, then create it yourself by adding a line saying [General Options]. Then, the setting can be added underneath the group name.
+</para>
+
+<sect2 id="hidden-general-options">
+<title>[General Options]</title>
+
+<para>
+These settings should be placed in the <emphasis>General Options</emphasis> group.
+</para>
+
+<sect3>
+<title>Max Icon Size</title>
+
+<para>
+The maximum size of the icons in the <interface>Icon View</interface> may be changed with this setting. The default value is 96. The size must be in the range of 32 to 512.
+</para>
+</sect3>
+
+<sect3>
+<title>Example</title>
+<informalexample>
+<para><userinput>Max Icon Size=128</userinput></para>
+</informalexample>
+</sect3>
+
+<sect3>
+<title>Icon Cache Size</title>
+
+<para>
+The maximum numbers of icons cached in memory may be changed with this setting. The default value is 1000.
+</para>
+</sect3>
+
+<sect3>
+<title>Example</title>
+<informalexample>
+<para><userinput>Icon Cache Size=100</userinput></para>
+</informalexample>
+</sect3>
+
+<sect3>
+<title>Example</title>
+<informalexample>
+<para><userinput>Max Icon Size=128</userinput></para>
+</informalexample>
+</sect3>
+
+<sect3>
+<title>Image Cache Size</title>
+
+<para>
+The maximum amount of memory in bytes used for caching all the images may be changed with this setting. The default value is 67108864.
+</para>
+</sect3>
+
+<sect3>
+<title>Example</title>
+<informalexample>
+<para><userinput>Image Cache Size=256000000</userinput></para>
+</informalexample>
+</sect3>
+
+</sect2>
+
+<sect2 id="hidden-bibtex-options">
+<title>[Options - bibtex]</title>
+
+<para>
+These settings should be placed in the <emphasis>Options - bibtex</emphasis> group.
+</para>
+
+<sect3>
+<title>lyxpipe</title>
+
+<para>
+This setting is for the location of the lyxpipe for sending bibliographic citations. It should not include the <literal role="extension">.in</literal> suffix.
+</para>
+</sect3>
+
+<sect3>
+<title>Example</title>
+<informalexample>
+<para><userinput>lyxpipe=$HOME/.lyx/lyxpipe</userinput></para>
+</informalexample>
+</sect3>
+</sect2>
+
+</sect1>
+
+<sect1 id="bibtex-translation">
+<title>Bibtex Character Translation</title>
+
+<para>
+When bibtex files are imported or exported, certain characters are translated between their TeX equivalents and the Unicode characters. Those character mappings are contained in the <filename>bibtex-translation.xml</filename> file, located in the installation data directory. The mappings can be modified, as desired. The key element contains the Unicode character, and the string elements within contain the TeX equivalents, which may be a one-to-many mapping. The first one is the one used when exporting to bibtex.
+</para>
+
+<programlisting>
+<![CDATA[
+  <key char="À">
+    <string>{\`A}</string>
+    <string>\`{A}</string>
+  </key>
+]]>
+</programlisting>
+
+</sect1>
+
+<sect1 id="xslt-tricks">
+<title>XSLT Tricks</title>
+
+<para>
+Here are some tips for writing XSLT to parse &appname; &XML; data: (TBD).
+</para>
+</sect1>
+
+</chapter>
--- /dev/null
+++ tellico-3.0.2/doc/importing-exporting.docbook
@@ -0,0 +1,398 @@
+<chapter id="importing-exporting">
+<title>Importing and Exporting Data</title>
+
+<para>
+&appname; is able to import and export a wide variety of data files, as well as search various Internet sites for information.
+</para>
+
+<sect1 id="internet-search">
+<title>Importing from the Internet</title>
+<para>
+&appname; is able to search various Internet sites using the <interface>Internet Search Dialog</interface>. Entries may be directly imported and added to your current collection. The various providers are configured via the <link linkend="data-sources-options">Data Sources Options</link>.
+</para>
+
+<para>
+Searches may use different criteria: <guilabel>Title</guilabel>, <guilabel>Person</guilabel>, <guilabel>ISBN</guilabel>, <guilabel>UPC/EAN</guilabel>, <guilabel>LCCN</guilabel>, or <guilabel>Keyword</guilabel>. Not all criteria are available for certain data sources. <acronym>ISBN</acronym> and <acronym>LCCN</acronym> values are for books only, while <acronym>UPC</acronym> or <acronym>EAN</acronym> values can apply to any type of item.</para>
+
+<para>Once a search is initiated, the <guibutton>Search</guibutton> button becomes <guibutton>Stop</guibutton> which will end a search. As results are found, they are added to the list directly under the search box, where selecting an item will show the result without adding it to the collection. Clicking the <guibutton>Add Entry</guibutton> button will add all the selected items to your collection. If the data source has more results than were initially requested, the <guibutton>Get More Results</guibutton> button becomes active. Clicking <guibutton>Clear</guibutton> will remove all the current results and reset the search.
+</para>
+
+<screenshot>
+<screeninfo>The &appname; <interface>Internet Search Dialog</interface></screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="fetch-dialog.png"/></imageobject>
+<textobject><phrase>The &appname; <interface>Internet Search Dialog</interface></phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>
+Only entries that match the current collection type will be found. The <guilabel>Description</guilabel> column provides additional information about the entry, in order to differentiate between videos in different formats, or books in different bindings, for example. Once an entry is successfully added to the collection, a checkmark is added to the first column in the list.
+</para>
+
+<para>
+Multiple entries can be added at once by using the standard &kde; method for multiple selection, which usually involves holding the &Shift; or &Ctrl; key when clicking on an item.
+</para>
+
+<para>
+To facilitate the use of barcode scanners, searches can include multiple ISBN/UPC values. Selecting the <guilabel>Multiple ISBN/UPC search</guilabel> check box will disable the search box and enable the <guibutton>Edit ISBN/UPC values...</guibutton> button, which will open a multi-line text entry box. Each ISBN should be entered on a line by itself. After closing the box, each ISBN will be validated for correct formatting. The ISBN validation is able to convert 13-digit EAN values, as well as full <acronym>UPC</acronym> codes, to the proper formatting. The ISBN list may also be read from a text file.
+</para>
+
+</sect1>
+
+<sect1 id="importing">
+<title>Importing Data</title>
+
+<para>
+&appname; offers three different actions when importing data. <guilabel>Replace current collection</guilabel> will close the current collection, and create a new one with the data from the imported file. <guilabel>Append to current collection</guilabel> tells &appname; to add all the entries in the imported collection to the current one, and to add any fields which don't currently exist. The <guilabel>Merge collection</guilabel> action is the same as appending, except that each imported entry is compared to the current ones, and any identical entries are skipped. Future plans include an improved heuristic for identifying matching entries, but currently, except for music collections, they must be identical for every field. Music collections compare the artist and album only, and the tracks are merged for matching entries. The <link linkend="importing-audio-files">audio file importer</link> is able to correctly build track lists by merging entries.
+</para>
+
+<sect2 id="importing-tellico">
+<title>Importing &appname; Data</title>
+
+<para>
+Other &appname; data files may be imported. Replacing the current collection by importing a &appname; file is the same thing as just opening the file itself. The value of importing &appname; data is primarily for appending or merging two collections together.
+</para>
+</sect2>
+
+<sect2 id="importing-csv">
+<title>Importing CSV Data</title>
+
+<para>
+Comma-separated values (<acronym>CSV</acronym>) are a common way of importing and exporting tabular data. Each field value is separated by a comma, with one entry per line. The field titles may be included in the first line. The CSV importer is not limited to using a comma as the separator. Any character or string may be used.
+</para>
+
+<screenshot>
+<screeninfo>The CSV Import Dialog</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="csv-dialog.png"/></imageobject>
+<textobject><phrase>The CSV Import Dialog</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<para>
+First, select the type of collection that you are importing. If you are appending or merging to your open collection, the type is limited to your current collection type. If the first line of the CSV file contains the field titles, click the check box and the importer will automatically compare the titles against the fields in the current collection. If a field title matches, the header for that column changes to show that the column has been assigned to that field. If the file uses a delimiter other than a comma, be sure to change that option accordingly.
+</para>
+
+<para>
+In order for &appname; to properly import the file, it must know which field corresponds to each column. <emphasis>If the column only has a number in the header, the data in that column will not be imported.</emphasis> You should assign fields to each column by selecting a column, either by clicking in it or changing the column number itself, then selecting the field to assign from the drop down box and clicking the <guibutton>Assign Field</guibutton> button. If you need to add a new field to the collection, the last item in the drop down box opens the  <link linkend="fields-dialog"><interface>Collection Fields Dialog</interface></link>.
+</para>
+
+<para>
+Only the first five lines of the imported CSV file are shown in the dialog.
+</para>
+
+</sect2>
+
+<sect2 id="importing-audio">
+<title>Importing Audio &CD; Data</title>
+
+<para>
+&appname; is able to use the <ulink url="http://freedb.org">freedb.org</ulink> service to lookup
+information about a &CD;, including the track list. Depending on your distribution,
+settings for access to the service may be set in the &kde; &systemsettings;. The &CD; artist, title, genre,
+year, and track listing are all added.
+</para>
+
+<para>
+In addition, if the disc contains &CD;-Text, that information is read and added to the imported entry.
+</para>
+</sect2>
+
+<sect2 id="importing-audio-files">
+<title>Importing Audio File Metadata</title>
+
+<para>
+&appname; is able to scan a folder and read the tags for common audio file formats, such as <literal role="extension">mp3</literal> and <literal role="extension">ogg</literal>. The songs are entered in a music collection, where each entry is an album. If the song files contain the track number, the song name is inserted in the correct spot in the track list. The artist and genre information is also added to the entry. If the song tags contain comments, they are appended to the comments field in the entry, preceded by the file name.
+</para>
+
+<para>
+In addition, if a folder contains a <filename>.directory</filename> file and the folder name matches an album title, the <literal>Icon</literal> entry in the desktop file is used as the cover image for the album.
+</para>
+
+<para>
+The audio file metadata importer can recursively scan a folder to find all audio files in any subfolder, though symbolic links are not followed. &appname; uses the <ulink url="http://developer.kde.org/~wheeler/taglib.html">TagLib library</ulink> for reading the audio file metadata, and so can import data from any file type that TagLib understands.
+</para>
+
+</sect2>
+
+<sect2 id="importing-alexandria">
+<title>Importing Alexandria Libraries</title>
+
+<para>
+<application><ulink url="http://alexandria.rubyforge.org">Alexandria</ulink></application> is an alternate book collection manager for the <ulink url="http://www.gnome.org">GNOME</ulink> desktop environment. The importer offers a choice of importing any of the libraries found in <filename class="directory">$<envar>HOME</envar>/.alexandria/</filename>.
+</para>
+
+</sect2>
+
+<sect2 id="importing-amc">
+<title>Importing Ant Movie Catalog Data</title>
+
+<para>
+<application><ulink url="http://www.antp.be/software/moviecatalog/">Ant Movie Catalog</ulink></application> is an alternate movie collection manager.
+</para>
+
+</sect2>
+
+<sect2 id="importing-bibtex">
+<title>Importing Bibtex Data</title>
+
+<para>
+<ulink url="http://en.wikipedia.org/wiki/Bibtex">Bibtex</ulink> is a bibliography format used with the LaTeX document preparation system. Various type of bibliographic references may be included in the file. &appname; imports bibtex files as a Bibliographic collection.
+</para>
+
+<para>
+If the bibtex importer encounters fields in the file which are not in the default bibliography collection, they are added as <link linkend="line">Simple Text</link> fields, with two exceptions. If the field value contains more than 100 characters, it becomes a <link linkend="para">Paragraph</link> field. If the field value appears to contain a &URL; or a file reference, then a <link linkend="url">&URL;</link> field is created. &appname; uses an internal copy of the <ulink url="http://www.gerg.ca/software/btOOL/">btparse library</ulink> for parsing the bibtex files.
+</para>
+</sect2>
+
+<sect2 id="importing-bibtexml">
+<title>Importing Bibtexml Data</title>
+
+<para>
+<ulink url="http://bibtexml.sf.net">Bibtexml</ulink> is an &XML; representation of bibtex data, and the data from the imported bibtexml file is treated in the same way as bibtex data would be.
+</para>
+</sect2>
+
+<sect2 id="importing-delicious-library">
+<title>Importing Delicious Library Data</title>
+
+<para>
+<application><ulink url="http://www.delicious-monster.com/">Delicious Library</ulink></application> is an alternate collection manager for the &Mac; OS X desktop. &appname; imports a subset of the data used by Delicious Library.
+</para>
+</sect2>
+
+<sect2 id="importing-gcstar">
+<title>Importing GCstar Data</title>
+
+<para>
+<application><ulink url="http://www.gcstar.org">GCstar</ulink></application> is an alternate collection manager. Importing books, movies, music, coins, games, board games and wine collections is currently supported.
+</para>
+
+<para>
+&appname; can also import <application>GCfilms</application> data files. <application><ulink url="http://home.gna.org/gcfilms/">GCfilms</ulink></application> is the predecessor of <application>GCstar</application> and was an alternate movie collection manager. Normally, <application>GCfilms</application> data files are found in <filename class="directory">$<envar>HOME</envar>/.local/share/gcfilms/</filename>.
+</para>
+
+</sect2>
+
+<sect2 id="importing-griffith">
+<title>Importing Griffith Data</title>
+
+<para>
+<application><ulink url="http://griffith.berlios.de/">Griffith</ulink></application> is an alternate video collection manager. &appname; is able to import most data from a Griffith database.
+</para>
+</sect2>
+
+<sect2 id="importing-mods">
+<title>Importing MODS Data</title>
+
+<para>
+<acronym><ulink url="http://www.loc.gov/standards/mods/">MODS</ulink></acronym> is a format for representing various types of media collections. Currently, only books are imported by &appname;, as a Bibliographic collection.
+</para>
+
+</sect2>
+
+<sect2 id="importing-pdf">
+<title>Importing PDF Data</title>
+<para>
+If &appname; was compiled with <emphasis>exempi</emphasis> or <emphasis>poppler</emphasis> support, metadata from PDF files can be imported. Metadata may include title, author, and date information, as well as bibliographic identifiers which are then used to update other information.
+</para>
+</sect2>
+
+<sect2 id="importing-referencer">
+<title>Importing Referencer Data</title>
+<para>
+<application><ulink url="http://icculus.org/referencer/">Referencer</ulink></application> is a document organizer and bibliography manager for the GNOME desktop. &appname; will import most of the data found in a Referencer database.
+</para>
+</sect2>
+
+<sect2 id="importing-ris">
+<title>Importing RIS Data</title>
+<para>
+The <ulink url="http://www.adeptscience.co.uk/kb/article/A626"><acronym>RIS</acronym> format</ulink> is a bibliographic file format used by <application>Reference Manager</application> and others. &appname; imports RIS files as a Bibliographic collection.
+</para>
+</sect2>
+
+<sect2 id="importing-goodreads">
+<title>Importing Goodreads Collection</title>
+<para>
+<ulink url="http://www.goodreads.com">Goodreads</ulink> is an online social network for readers to track book collections. &appname; can import the list of books in a user's collection, given either the user name or user ID, as long as the collection is set to be publicly accessible.
+</para>
+</sect2>
+
+<sect2 id="importing-file-listing">
+<title>Importing File Listings</title>
+
+<para>
+The best way to create a <link linkend="file-catalog">File Catalog</link> is to import the contents of a folder. The folder may be searched recursively, to add all files found within. This importer is most useful for backup listings and media cataloging, such as &CD; or <acronym>DVD</acronym> listings. In addition, image previews of the file contents may be generated, although it can take some time to read a large number of files. The file previews are same as those shown in the &kde; file manager.
+</para>
+</sect2>
+
+<sect2 id="importing-xslt">
+<title>Importing &XML; Data via XSLT</title>
+
+<para>
+Any &XML; file may be imported into &appname; provided an &XSL; stylesheet is available to convert the file to &appname; format. &appname; automatically loads the stylesheet and performs the &xslt; processing needed to load the file.
+</para>
+</sect2>
+
+</sect1>
+
+<sect1 id="drag-n-drop">
+<title>Drag and Drop</title>
+
+<para>Dragging data files to the main &appname; window and dropping them will import the files, just as if the <link linkend="importing">import command</link> was made from the menus. Drag and drop works for the following file formats: Tellico, Bibtex, RIS, and PDF. Importing multiple files at once is also supported.</para>
+
+<para>So, for example, if you want to catalog several <link linkend="importing-pdf">PDF files</link>, select them in the file manager and drag them to the &appname; window. &appname; will import as much metadata from the files as it can, and then fetch additional information from various configured Internet sources.</para>
+
+</sect1>
+
+<sect1 id="exporting">
+<title>Exporting Data</title>
+
+<para>
+When exporting the data in the collection, the entry values may be exported as entered, or with the <link linkend="field-formatting">automatic formatting</link> provided by &appname;. Additionally, the export may be limited to the currently selected entries of the collection as well, where the <link linkend="status-bar">statusbar</link> shows the number of selected entries.
+</para>
+
+<para>
+Exported text files, such as Bibtex or CSV, may use the Unicode (UTF-8) character encoding, or the current locale of the operating system.
+</para>
+
+<screenshot>
+<screeninfo>General Export Options</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="export-options.png"/></imageobject>
+<textobject><phrase>General Export Options</phrase></textobject>
+</mediaobject>
+</screenshot>
+
+<sect2 id="exporting-xml">
+<title>Exporting &XML;</title>
+
+<para>
+The file format for &appname; data is a zipped &XML; file. Exporting to &XML; merely creates the &XML; file without zipping it. Images may be included in the &XML; file as base64-encoded data in an image element, but doing so can create very large text files.
+</para>
+</sect2>
+
+<sect2 id="exporting-zip">
+<title>Exporting Zip</title>
+
+<para>
+The standard file format for &appname; is a zipped file, contained the &XML; collection file, and optionally, all the images referenced in the collection. If the images are being stored in the application folder instead, exporting to a Zip file will create a self-contained data file, which includes all the images in the collection.
+</para>
+</sect2>
+
+<sect2 id="exporting-html">
+<title>Exporting &HTML;</title>
+
+<para>
+The &HTML; export uses the <filename>tellico2html.xsl</filename> stylesheet. Images are exported to a folder with the same name as the exported &HTML; file with <emphasis><filename>_files</filename></emphasis> appended.
+</para>
+
+<para>
+The default format is similar to the printed output, and allows various options for modifying the &HTML;. Field headers may be printed at the top of each column, but unfortunately, &kde; does not yet allow the table headers to be repeated on each page. The entries may be grouped as in the <interface>Group View</interface>, as well.
+</para>
+
+<para>
+Additionally, individual files may be created for each entry in the collection, with links created in the top-level &HTML; file. The entry files will be created in the same folder as the images. The entry &HTML; files will use the current stylesheet template, as shown in the <interface>Entry View</interface>.
+</para>
+
+<screenshot>
+<screeninfo>&HTML; Export Options</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="export-html.png"/></imageobject>
+<textobject><phrase>&HTML; Export Options</phrase></textobject>
+</mediaobject>
+</screenshot>
+</sect2>
+
+<sect2 id="exporting-csv">
+<title>Exporting CSV</title>
+
+<para>
+Comma-separated values (CSV) are a common way of importing and exporting tabular data. Each field value is separated by a comma, with one entry per line. The field titles may be included as headers in the first line. Any character or string other than a comma may also be used to delimit the fields.
+</para>
+
+<screenshot>
+<screeninfo>CSV Export Options</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="export-csv.png"/></imageobject>
+<textobject><phrase>CSV Export Options</phrase></textobject>
+</mediaobject>
+</screenshot>
+</sect2>
+
+<sect2 id="exporting-alexandria">
+<title>Exporting Alexandria</title>
+
+<para>
+<application><ulink url="http://alexandria.rubyforge.net">Alexandria</ulink></application> is a book collection manager for the <ulink url="http://www.gnome.org">GNOME</ulink> desktop environment. &appname; is able to export a limited subset of book collection fields to the default Alexandria data location.
+</para>
+
+</sect2>
+
+<sect2 id="exporting-onix">
+<title>Exporting ONIX</title>
+
+<para>
+<ulink url="http://www.editeur.org/onix.html">ONIX</ulink> is an &XML; format for representing and communicating book industry product information, primarily for book vendors. &appname; can export book collections using a small subset of ONIX.
+</para>
+
+</sect2>
+
+<sect2 id="exporting-bibtex">
+<title>Exporting Bibtex</title>
+
+<para>
+When exporting to <ulink url="http://en.wikipedia.org/wiki/Bibtex">Bibtex</ulink>, the field values may be escaped with braces or quotation marks. If any string macros
+are used in the collection, they may optionally be exported as macros or expanded. For &URL; fields, &appname;
+may enclose the field values with the <literal>\url{...}</literal> tag. Finally, entries with no citation key may be skipped rather than have &appname; auto-generate the key.
+</para>
+
+<screenshot>
+<screeninfo>Bibtex Export Options</screeninfo>
+<mediaobject>
+<imageobject><imagedata format="PNG" fileref="export-bibtex.png"/></imageobject>
+<textobject><phrase>Bibtex Export Options</phrase></textobject>
+</mediaobject>
+</screenshot>
+</sect2>
+
+<sect2 id="exporting-bibtexml">
+<title>Exporting Bibtexml</title>
+
+<para>
+<ulink url="http://bibtexml.sourceforge.net">Bibtexml</ulink> is a format for expressing bibtex data via &XML;.
+</para>
+
+</sect2>
+
+<sect2 id="exporting-gcstar">
+<title>Exporting GCstar</title>
+
+<para>
+<application><ulink url="http://www.gcstar.org">GCstar</ulink></application> is another movie collection manager. &appname; is able to export most collection types to a GCstar data file.
+</para>
+
+</sect2>
+
+<sect2 id="exporting-xslt">
+<title>Exporting &XML; via &xslt;</title>
+
+<para>
+Finally, &appname; is able to process its internal &XML; representation of the collection data through an external &XSL; stylesheet before exporting. This type of export may be useful for generating text reports or other file types.
+</para>
+</sect2>
+
+</sect1>
+
+<sect1 id="citations">
+<title>Working With Citations</title>
+<para>
+When working with a <link linkend="bibliography">bibliography</link>, citations for the currently selected entries
+may be generated and used in various other applications. A citation in bibtex format can be copied to the clipboard,
+and then pasted in a latex file. Bibtex citations can also be pushed to an external application such as <application>LyX</application> or <application>Kile</application> using the so-called <emphasis><link linkend="hidden-bibtex-options">lyxpipe</link></emphasis>.
+</para>
+
+</sect1>
+
+</chapter>
--- /dev/null
+++ tellico-3.0.2/doc/index.docbook
@@ -0,0 +1,284 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.5-Based Variant V1.1//EN" "dtd/kdedbx45.dtd" [
+  <!ENTITY appname "&tellico;">
+  <!ENTITY % addindex "IGNORE">
+  <!ENTITY % English "INCLUDE"><!-- change language only here -->
+
+  <!ENTITY robby "Robby Stephenson">
+  <!ENTITY email "robby@periapsis.org">
+  <!ENTITY homepage "http://tellico-project.org">
+  <!ENTITY maillist "http://tellico-project.org/mailing-list">
+  <!ENTITY xslt "<acronym>XSLT</acronym>">
+
+  <!ENTITY fundamentals-chapter SYSTEM "fundamentals.docbook">
+  <!ENTITY importing-exporting-chapter SYSTEM "importing-exporting.docbook">
+  <!ENTITY configuration-chapter SYSTEM "configuration.docbook">
+  <!ENTITY fields-chapter SYSTEM "fields.docbook">
+  <!ENTITY menus-chapter SYSTEM "menus.docbook">
+  <!ENTITY advanced-chapter SYSTEM "advanced.docbook">
+  <!ENTITY hacking-chapter SYSTEM "hacking.docbook">
+  <!ENTITY faqs-chapter SYSTEM "faqs.docbook">
+  <!ENTITY details-chapter SYSTEM "details.docbook">
+
+]>
+
+<!-- ................................................................ -->
+
+<!-- The language must NOT be changed here. -->
+
+<book id="tellico" lang="&language;">
+
+<!-- This header contains all of the meta-information for the document such
+as Authors, publish date, the abstract, and Keywords -->
+
+<bookinfo>
+
+<!-- Date and version information of the documentation
+Don't forget to include this last date and this last revision number, we
+need them for translation coordination !
+Please respect the format of the date (DD/MM/YYYY) and of the version
+(V.MM.LL), it could be used by automation scripts.
+Do NOT change these in the translation. -->
+<date>28/08/2009</date>
+<releaseinfo>2.0</releaseinfo>
+
+<title>The &tellico; Handbook</title>
+
+<authorgroup>
+<author>
+<firstname>Robby</firstname>
+<surname>Stephenson</surname>
+<affiliation>
+<address><email>&email;</email></address>
+</affiliation>
+</author>
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+</authorgroup>
+
+<copyright>
+<year>2001</year>
+<year>2002</year>
+<year>2003</year>
+<year>2004</year>
+<year>2005</year>
+<year>2006</year>
+<year>2007</year>
+<year>2008</year>
+<year>2009</year>
+<year>2010</year>
+<year>2011</year>
+<holder>&robby;</holder>
+</copyright>
+
+<!-- Translators: put here the copyright notice of the translation -->
+
+<legalnotice>
+<para>
+For licensing information of both the software and this documentation, please refer to the
+<link linkend="credits">final section</link>.
+</para>
+</legalnotice>
+
+<!-- Abstract about this handbook -->
+
+<abstract>
+<para>
+This document is a handbook for using &tellico;, a collection manager software application.
+</para>
+</abstract>
+
+<!-- This is a set of Keywords for indexing by search engines.
+Please at least include KDE, the KDE package it is in, the name
+ of your application, and a few relevant keywords. -->
+
+<keywordset>
+<keyword>KDE</keyword>
+<keyword>tellico</keyword>
+<keyword>book</keyword>
+<keyword>bibliography</keyword>
+<keyword>movie</keyword>
+<keyword>collection</keyword>
+<keyword>database</keyword>
+<keyword>catalog</keyword>
+<keyword>extragear</keyword>
+</keywordset>
+
+</bookinfo>
+
+<!-- The contents of the documentation begin here.  Label each chapter
+so with the id attribute. This is necessary for two reasons: it allows
+you to easily reference the chapter from other chapters of your
+document, and if there is no ID, the name of the generated HTML files
+will vary from time to time making it hard to manage for maintainers
+and for the CVS system. Any chapter labelled (OPTIONAL) may be left
+out at the author's discretion. Other chapters should not be left out
+in order to maintain a consistent documentation style across all KDE
+apps. -->
+
+<chapter id="introduction">
+<title>Introduction</title>
+
+<!-- The introduction chapter contains a brief introduction for the
+application that explains what it does and where to report
+problems. Basically a long version of the abstract.  Don't include a
+revision history. (see installation appendix comment) -->
+
+<sect1 id="tellico-intro">
+<title>&tellico;</title>
+
+<para>
+&tellico; is a program for managing collections. It began as a simple
+book collection manager, and has expanded to include default
+collection templates for bibliographies, comic books, videos, music,
+coins, stamps, trading cards, video games, wines, board games, and file listings.
+In addition, custom collections can be built for any other type of collectibles.
+</para>
+
+<sect2 id="what-tellico-is">
+<title>What &tellico; Is</title>
+
+<para>
+&tellico; keeps track of the items in a collection, and offers
+an easy way to enter data for each entry. It provides several
+field types, and allows for an unlimited number of
+user-defined fields. The entries in a collection may be grouped by any
+field for easy organization, and customizable views show as much or as
+little information as you like.
+</para>
+
+<para>
+Loans may be tracked, with optional integration with &korganizer;. Collections may be
+imported or exported using a variety of formats, to allow for easy exchange
+or publication of data.
+</para>
+
+</sect2>
+
+<sect2 id="what-tellico-is-not">
+<title>What &tellico; Is Not</title>
+
+<para>
+&tellico; is not an audio or video player. It does not provide
+facilities for reading or modifying multimedia files. It also does
+not provide any image-editing functionality. Although &tellico; has some
+functionality for managing bibliography lists, it is not a full-blown
+bibliographic reference manager. &tellico; also does not pretend to have
+all the capabilities of a full-fledged relational database.
+</para>
+
+<para>
+As somewhat of a disclaimer, &tellico; is a hobby for the author, and no
+guarantees are made about its functionality, usefullness, or otherwise.
+More information is included in the
+<link linkend="credits">license declaration</link>.
+</para>
+
+</sect2>
+</sect1>
+
+<sect1 id="terminology">
+<title>Terminology</title>
+
+<sect2 id="collections">
+<title>Collections</title>
+<para>
+In &tellico;, a collection is the document. Only one collection exists in each &tellico;
+file. A collection contains any number of <link linkend="fields">fields</link> and
+<link linkend="entries">entries</link>. &tellico; supports 12 specific collection types by
+default: books, bibliographic entries, comic books, videos, music, trading cards, coins, stamps,
+video games, wines, board games, and file listings. In addition, an empty generic collection
+template is available for any other type of collectibles or lists.
+</para>
+</sect2>
+
+<sect2 id="fields">
+<title>Collection Fields</title>
+<para>
+Each collection may have an unlimited number of fields. &tellico; supports eleven types of fields,
+which allow for a range of different data. The fields can be edited with the
+<link linkend="fields-dialog"><interface>Collection Fields Dialog</interface></link> and are explained further in the
+<link linkend="field-types">Field Types</link> section.
+</para>
+</sect2>
+
+<sect2 id="entries">
+<title>Collection Entries</title>
+
+<para>
+An entry is the basic record in &tellico;. Each entry contains a single value for each field in
+the collection. A collection may have an unlimited number of entries, in theory, although since
+the whole collection is always resident in memory, too many entries could slow down the application.
+</para>
+
+<para>
+&tellico; has been tested with a collection of 10,000 entries, and the speed was satisfactory.
+However, if many large images are included in the collection, the loading and processing time
+does slow down greatly. Performance can be improved by having &tellico; store images separate from
+the data file itself, either in the application-specific folder or a folder relative to
+the data file. More information can be found in the
+<link linkend="configuration">configuration section</link>.
+</para>
+
+</sect2>
+
+</sect1>
+
+</chapter>
+
+&fundamentals-chapter;
+
+&details-chapter;
+
+&importing-exporting-chapter;
+
+&advanced-chapter;
+
+&configuration-chapter;
+
+&hacking-chapter;
+
+&faqs-chapter;
+
+&menus-chapter;
+
+<chapter id="credits">
+
+<!-- Include credits for the programmers, documentation writers, and
+contributors here. The license for your software should then be
+included below the credits with a reference to the appropriate license
+file included in the KDE distribution. -->
+
+<title>Credits and License</title>
+
+<para>
+&tellico;
+</para>
+<para>
+Program copyright 2001-2011 &robby; <email>&email;</email>
+</para>
+<para>
+Documentation copyright 2001-2011 &robby; <email>&email;</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underGPL;
+&underFDL;
+
+<para>The author of this documentation has also granted you permission to use the content under the terms of the <ulink
+url="http://www.freebsd.org/copyright/freebsd-doc-license.html">FreeBSD Documentation License</ulink>, if you so choose. If you wish to allow use of your version of this content only under the terms of the FreeBSD Documentation License, and not to allow others to use your version of this file under the terms of the GFDL, indicate your decision by deleting the GFDL notice and replacing it with the notice and other provisions required by the FreeBSD Documentation License. If you do not delete the GFDL notice above, a recipient may use your version of this file under the terms of either the GFDL or the FreeBSD Documentation License.</para>
+
+</chapter>
+
+&documentation.index;
+
+</book>
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+-->
--- /dev/null
+++ tellico-3.0.2/doc/menus.docbook
@@ -0,0 +1,625 @@
+<chapter id="menus">
+<title>Command Reference</title>
+
+<!--
+(OPTIONAL, BUT RECOMMENDED) This chapter should list all of the
+application windows and their menubar and toolbar commands for easy reference.
+Also include any keys that have a special function but have no equivalent in the
+menus or toolbars. This may not be necessary for small apps or apps with no tool
+or menu bars.
+-->
+
+<sect1 id="main-window-menus">
+<title>The Main &tellico; Window</title>
+
+<para>Each menu item is discussed below. When there is a keyboard shortcut that
+performs a menu item function, the default shortcut is listed with the menu item.
+</para>
+
+<sect2>
+<title>The File Menu</title>
+
+<para>
+<variablelist>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>File</guimenu>
+  <guimenuitem>New</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>creates a new collection</action>. &tellico; supports <link linkend="collection-types">12 default collection types</link> along with an empty user-defined custom collection.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>O</keycap></keycombo>
+  </shortcut>
+  <guimenu>File</guimenu>
+  <guimenuitem>Open...</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens a &tellico; file</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>File</guimenu>
+  <guimenuitem>Open Recent</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens a file</action> from a submenu
+that contains a list of recently opened files.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>S</keycap></keycombo>
+  </shortcut>
+  <guimenu>File</guimenu>
+  <guimenuitem>Save...</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>saves the collection</action>. If the file is
+<emphasis>Untitled</emphasis> then <guimenuitem>Save...</guimenuitem> is equivalent to
+<guimenuitem>Save As</guimenuitem>. It is only enabled when the collection has been
+modified.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;&Shift;<keycap>S</keycap></keycombo>
+  </shortcut>
+  <guimenu>File</guimenu>
+  <guimenuitem>Save As...</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>saves the collection to a new file</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>P</keycap></keycombo>
+  </shortcut>
+  <guimenu>File</guimenu>
+  <guimenuitem>Print...</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>prints the collection</action>. Printing options may be set in the <interface>Configuration Dialog</interface>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>File</guimenu>
+  <guimenuitem>Import</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>imports data from another file</action>. &tellico; can import data from a number of <link linkend="importing">other formats</link>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>File</guimenu>
+  <guimenuitem>Export</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>exports the collection to another format</action>. &tellico; can export data to a number of <link linkend="exporting">other formats</link>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>Q</keycap></keycombo>
+  </shortcut>
+  <guimenu>File</guimenu>
+  <guimenuitem>Quit</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>closes the &tellico; window</action>. If the collection has unsaved changes, you will be prompted to save them before continuing.</para>
+</listitem>
+</varlistentry>
+
+</variablelist>
+</para>
+</sect2>
+
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% EDIT MENU %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-->
+<sect2>
+<title>The Edit Menu</title>
+
+<para>
+
+<variablelist>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>Z</keycap></keycombo>
+  </shortcut>
+  <guimenu>Edit</guimenu>
+  <guimenuitem>Undo</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>undoes the previous action</action>. Not all actions are supported by Undo.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;&Shift;<keycap>Z</keycap></keycombo>
+  </shortcut>
+  <guimenu>Edit</guimenu>
+  <guimenuitem>Redo</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>reverts a previous Undo</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>X</keycap></keycombo>
+  </shortcut>
+  <guimenu>Edit</guimenu>
+  <guimenuitem>Cut</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>removes the selected text</action>, if any, and <action>places a copy of the removed text in the clipboard</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>C</keycap></keycombo>
+  </shortcut>
+  <guimenu>Edit</guimenu>
+  <guimenuitem>Copy</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>copies the selected text</action>, if any, to the clipboard.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>V</keycap></keycombo>
+  </shortcut>
+  <guimenu>Edit</guimenu>
+  <guimenuitem>Paste</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>pastes the text in the clipboard</action>, if any, into the editor at the cursor position.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>A</keycap></keycombo>
+  </shortcut>
+  <guimenu>Edit</guimenu>
+  <guimenuitem>Select All</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>selects all the entries</action> in the collection, in the <interface>Column View</interface>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;&Shift;<keycap>A</keycap></keycombo>
+  </shortcut>
+  <guimenu>Edit</guimenu>
+  <guimenuitem>Deselect</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>deselects all the entries</action> in the collection.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>I</keycap></keycombo>
+  </shortcut>
+  <guimenu>Edit</guimenu>
+  <guimenuitem>Internet Search...</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens the <interface>Internet Search Dialog</interface></action> to search for and import entries from various Internet sites, including <ulink url="http://amazon.com">Amazon.com</ulink>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>J</keycap></keycombo>
+  </shortcut>
+  <guimenu>Edit</guimenu>
+  <guimenuitem>Advanced Filter...</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens the <interface>Advanced Filter Dialog</interface></action>.</para>
+</listitem>
+</varlistentry>
+
+</variablelist>
+
+</para>
+</sect2>
+
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% COLLECTION MENU %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-->
+<sect2>
+<title>The Collection Menu</title>
+<para>
+
+<variablelist>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>N</keycap></keycombo>
+  </shortcut>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>New Entry</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens the <interface>Entry Editor</interface> to edit a new entry</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>E</keycap></keycombo>
+  </shortcut>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Edit Entry</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens the <interface>Entry Editor</interface> to edit the selected entries</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>Y</keycap></keycombo>
+  </shortcut>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Duplicate Entry</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>copies, or duplicates, the selected entries</action> as new entries in the collection.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>D</keycap></keycombo>
+  </shortcut>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Delete Entry</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>deletes the selected entries</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+<!--
+<shortcut>
+   <keycombo>&Ctrl;<keycap>G</keycap></keycombo>
+  </shortcut>
+-->
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Merge Entries</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>merges the selected entries</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Update Entry</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This menu contains a list of all available data sources, and can be used to automatically query the
+source and <action>update the selected entries</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Check-out</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens a dialog box for loaning the selected entries.</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Check-in</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>checks-in any of the selected entries which are currently on-loan</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>R</keycap></keycombo>
+  </shortcut>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Rename Collection</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens a dialog box for renaming the collection</action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <shortcut>
+   <keycombo>&Ctrl;<keycap>U</keycap></keycombo>
+  </shortcut>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Collection Fields...</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens the <interface>Collection Fields Dialog</interface></action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Collection</guimenu>
+  <guimenuitem>Generate Reports...</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens the <interface>Report Dialog</interface></action> for generating reports about the collection.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Collection</guimenu>
+  <guisubmenu>Bibliography</guisubmenu>
+  <guimenuitem>Convert to Bibliography</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>converts a book collection to a bibliography</action> by adding certain fields necessary for Bibtex export, and it is only enabled when a book collection is open.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Collection</guimenu>
+  <guisubmenu>Bibliography</guisubmenu>
+  <guimenuitem>String Macros...</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>opens a dialog box for editing the Bibtex string macros</action> in the collection. It is only enabled when editing a bibliography.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Collection</guimenu>
+  <guisubmenu>Bibliography</guisubmenu>
+  <guimenuitem>Check for Duplicate Keys</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>checks for duplicate Bibtex keys</action> and can filter the collection to show the entries with duplicated keys.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Collection</guimenu>
+  <guisubmenu>Bibliography</guisubmenu>
+  <guimenuitem>Copy Bibtex to Clipboard</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>copies a Bibtex citation</action> to the clipboard so that it can pasted in a LaTeX document.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Collection</guimenu>
+  <guisubmenu>Bibliography</guisubmenu>
+  <guimenuitem>Cite Entry in Lyx</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>sends a citation for the selected entries</action> to the so-called <emphasis><link linkend="hidden-bibtex-options">lyxpipe</link></emphasis> for use in <application>LyX</application>, <application>Kile</application>, or other LaTeX applications. It is only enabled when editing a bibliography.</para>
+</listitem>
+</varlistentry>
+
+</variablelist>
+
+</para>
+</sect2>
+
+<!-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SETTINGS / HELP MENU %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%-->
+<sect2>
+<title>The Settings and Help Menu</title>
+
+<para>Apart from the common &kde; Settings and Help menus described in the <ulink url="help:/fundamentals/ui.html#menus">Menu</ulink>
+chapter of the &kde; Fundamentals documentation &tellico; has these application specific menu entries:
+</para>
+
+<variablelist>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Settings</guimenu>
+  <guimenuitem>Show Group View</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>toggles the display of the <interface>Group View</interface></action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Settings</guimenu>
+  <guimenuitem>Show Entry Editor</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>toggles the display of the <interface>Entry Editor</interface></action>.</para>
+</listitem>
+</varlistentry>
+
+<varlistentry>
+<term>
+ <menuchoice>
+  <guimenu>Settings</guimenu>
+  <guimenuitem>Group Selection</guimenuitem>
+ </menuchoice>
+</term>
+
+<listitem>
+<para>This command <action>changes the field used to group the entries</action> in the collection.</para>
+</listitem>
+</varlistentry>
+
+</variablelist>
+
+</sect2>
+
+</sect1>
+</chapter>
--- /dev/null
+++ tellico-3.0.2/src/fetch/dbcfetcher.cpp
@@ -0,0 +1,168 @@
+/***************************************************************************
+    Copyright (C) 2017 Robby Stephenson <robby@periapsis.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 2 of        *
+ *   the License or (at your option) version 3 or any later version        *
+ *   accepted by the membership of KDE e.V. (or its successor approved     *
+ *   by the membership of KDE e.V.), which shall act as a proxy            *
+ *   defined in Section 14 of version 3 of the license.                    *
+ *                                                                         *
+ *   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/>. *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "dbcfetcher.h"
+#include "../tellico_debug.h"
+
+#include <KLocalizedString>
+#include <KConfigGroup>
+
+#include <QLabel>
+#include <QVBoxLayout>
+#include <QUrlQuery>
+
+namespace {
+  static const char* DBC_API_URL = "https://oss-services.dbc.dk/opensearch/4.5/";
+  static const int DBC_MAX_RETURNS_TOTAL = 20;
+}
+
+using namespace Tellico;
+using Tellico::Fetch::DBCFetcher;
+
+DBCFetcher::DBCFetcher(QObject* parent_) : XMLFetcher(parent_) {
+  setLimit(DBC_MAX_RETURNS_TOTAL);
+  setXSLTFilename(QLatin1String("dbc2tellico.xsl"));
+}
+
+DBCFetcher::~DBCFetcher() {
+}
+
+QString DBCFetcher::source() const {
+  return m_name.isEmpty() ? defaultName() : m_name;
+}
+
+bool DBCFetcher::canSearch(FetchKey k) const {
+  return k == Title || k == Person || k == Keyword || k == ISBN;
+}
+
+bool DBCFetcher::canFetch(int type) const {
+  return type == Data::Collection::Book || type == Data::Collection::Bibtex;
+}
+
+void DBCFetcher::readConfigHook(const KConfigGroup&) {
+}
+
+QUrl DBCFetcher::searchUrl() {
+  QUrl u(QString::fromLatin1(DBC_API_URL));
+
+  QUrlQuery query;
+  switch(request().key) {
+    case Title:
+      query.addQueryItem(QLatin1String("query"), QLatin1String("dkcclterm.ti=\"") + request().value + QLatin1Char('"'));
+      break;
+
+    case Keyword:
+      query.addQueryItem(QLatin1String("query"), QLatin1String("cql.keywords=\"") + request().value + QLatin1Char('"'));
+      break;
+
+    case Person:
+      query.addQueryItem(QLatin1String("query"), QLatin1String("term.mainCreator=\"") + request().value + QLatin1Char('"'));
+      break;
+
+    case ISBN:
+      {
+        QString s = request().value;
+        s.remove(QLatin1Char('-'));
+        QStringList isbnList = FieldFormat::splitValue(s);
+        // only search for first ISBN for now
+        QString q = isbnList.isEmpty() ? QString() : QLatin1String("dkcclterm.ib=") + isbnList.at(0);
+        query.addQueryItem(QLatin1String("query"), q);
+      }
+      break;
+
+    default:
+      myWarning() << "key not recognized:" << request().key;
+      return QUrl();
+  }
+  query.addQueryItem(QLatin1String("action"), QLatin1String("search"));
+  // see https://opensource.dbc.dk/services/open-search-web-service
+  // agency and profile determine the search collections
+//  query.addQueryItem(QLatin1String("agency"), QLatin1String("100200"));
+//  query.addQueryItem(QLatin1String("profile"), QLatin1String("test"));
+  query.addQueryItem(QLatin1String("agency"), QLatin1String("761500"));
+  query.addQueryItem(QLatin1String("profile"), QLatin1String("opac"));
+  query.addQueryItem(QLatin1String("term.type"), QLatin1String("bog"));
+  query.addQueryItem(QLatin1String("start"), QLatin1String("1"));
+  query.addQueryItem(QLatin1String("stepValue"), QLatin1String("5"));
+  query.addQueryItem(QLatin1String("outputType"), QLatin1String("xml"));
+  u.setQuery(query);
+
+//  myDebug() << "url:" << u.url();
+  return u;
+}
+
+void DBCFetcher::resetSearch() {
+}
+
+void DBCFetcher::parseData(QByteArray& data_) {
+  Q_UNUSED(data_);
+}
+
+Tellico::Data::EntryPtr DBCFetcher::fetchEntryHookData(Data::EntryPtr entry_) {
+  Q_ASSERT(entry_);
+  return entry_;
+}
+
+Tellico::Fetch::FetchRequest DBCFetcher::updateRequest(Data::EntryPtr entry_) {
+  QString title = entry_->field(QLatin1String("title"));
+  if(!title.isEmpty()) {
+    return FetchRequest(Keyword, title);
+  }
+  return FetchRequest();
+}
+
+Tellico::Fetch::ConfigWidget* DBCFetcher::configWidget(QWidget* parent_) const {
+  return new DBCFetcher::ConfigWidget(parent_, this);
+}
+
+QString DBCFetcher::defaultName() {
+//  return QLatin1String("Dansk BiblioteksCenter (DBC)");
+  return i18n("Danish Bibliographic Center (DBC.dk)");
+}
+
+QString DBCFetcher::defaultIcon() {
+  return favIcon("http://dbc.dk");
+}
+
+Tellico::StringHash DBCFetcher::allOptionalFields() {
+  StringHash hash;
+  return hash;
+}
+
+DBCFetcher::ConfigWidget::ConfigWidget(QWidget* parent_, const DBCFetcher* fetcher_)
+    : Fetch::ConfigWidget(parent_) {
+  QVBoxLayout* l = new QVBoxLayout(optionsWidget());
+  l->addWidget(new QLabel(i18n("This source has no options."), optionsWidget()));
+  l->addStretch();
+
+  // now add additional fields widget
+  addFieldsWidget(DBCFetcher::allOptionalFields(), fetcher_ ? fetcher_->optionalFields() : QStringList());
+}
+
+void DBCFetcher::ConfigWidget::saveConfigHook(KConfigGroup&) {
+}
+
+QString DBCFetcher::ConfigWidget::preferredName() const {
+  return DBCFetcher::defaultName();
+}
--- /dev/null
+++ tellico-3.0.2/src/fetch/dbcfetcher.h
@@ -0,0 +1,86 @@
+/***************************************************************************
+    Copyright (C) 2017 Robby Stephenson <robby@periapsis.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 2 of        *
+ *   the License or (at your option) version 3 or any later version        *
+ *   accepted by the membership of KDE e.V. (or its successor approved     *
+ *   by the membership of KDE e.V.), which shall act as a proxy            *
+ *   defined in Section 14 of version 3 of the license.                    *
+ *                                                                         *
+ *   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/>. *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef TELLICO_DBCFETCHER_H
+#define TELLICO_DBCFETCHER_H
+
+#include "xmlfetcher.h"
+#include "configwidget.h"
+#include "../datavectors.h"
+
+namespace Tellico {
+  namespace Fetch {
+
+/**
+ * A fetcher for https://opensource.dbc.dk/services/open-search-web-service
+ *
+ * @author Robby Stephenson
+ */
+class DBCFetcher : public XMLFetcher {
+Q_OBJECT
+
+public:
+  /**
+   */
+  DBCFetcher(QObject* parent);
+  /**
+   */
+  virtual ~DBCFetcher();
+
+  /**
+   */
+  virtual QString source() const Q_DECL_OVERRIDE;
+  virtual bool canSearch(FetchKey k) const Q_DECL_OVERRIDE;
+  virtual Type type() const Q_DECL_OVERRIDE { return DBC; }
+  virtual bool canFetch(int type) const Q_DECL_OVERRIDE;
+  virtual void readConfigHook(const KConfigGroup& config) Q_DECL_OVERRIDE;
+
+  /**
+   * Returns a widget for modifying the fetcher's config.
+   */
+  virtual Fetch::ConfigWidget* configWidget(QWidget* parent) const Q_DECL_OVERRIDE;
+
+  class ConfigWidget : public Fetch::ConfigWidget {
+  public:
+    explicit ConfigWidget(QWidget* parent_, const DBCFetcher* fetcher = nullptr);
+    virtual void saveConfigHook(KConfigGroup&) Q_DECL_OVERRIDE;
+    virtual QString preferredName() const Q_DECL_OVERRIDE;
+  };
+  friend class ConfigWidget;
+
+  static QString defaultName();
+  static QString defaultIcon();
+  static StringHash allOptionalFields();
+
+private:
+  virtual FetchRequest updateRequest(Data::EntryPtr entry) Q_DECL_OVERRIDE;
+  virtual void resetSearch() Q_DECL_OVERRIDE;
+  virtual QUrl searchUrl() Q_DECL_OVERRIDE;
+  virtual void parseData(QByteArray& data) Q_DECL_OVERRIDE;
+  virtual Data::EntryPtr fetchEntryHookData(Data::EntryPtr entry) Q_DECL_OVERRIDE;
+};
+
+  } // end namespace
+} // end namespace
+#endif
--- /dev/null
+++ tellico-3.0.2/src/fetch/igdbfetcher.cpp
@@ -0,0 +1,616 @@
+/***************************************************************************
+    Copyright (C) 2017 Robby Stephenson <robby@periapsis.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 2 of        *
+ *   the License or (at your option) version 3 or any later version        *
+ *   accepted by the membership of KDE e.V. (or its successor approved     *
+ *   by the membership of KDE e.V.), which shall act as a proxy            *
+ *   defined in Section 14 of version 3 of the license.                    *
+ *                                                                         *
+ *   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/>. *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "igdbfetcher.h"
+#include "../collections/gamecollection.h"
+#include "../images/imagefactory.h"
+#include "../core/filehandler.h"
+#include "../utils/guiproxy.h"
+#include "../utils/string_utils.h"
+#include "../tellico_debug.h"
+
+#include <KLocalizedString>
+#include <KConfigGroup>
+#include <KJob>
+#include <KJobUiDelegate>
+#include <KJobWidgets/KJobWidgets>
+#include <KIO/StoredTransferJob>
+
+#include <QUrl>
+#include <QLabel>
+#include <QFile>
+#include <QTextStream>
+#include <QGridLayout>
+#include <QTextCodec>
+#include <QJsonDocument>
+#include <QJsonArray>
+#include <QUrlQuery>
+
+namespace {
+  static const int IGDB_MAX_RETURNS_TOTAL = 20;
+  static const char* IGDB_API_URL = "https://igdbcom-internet-game-database-v1.p.mashape.com/";
+  static const char* IGDB_API_KEY = "Ger6nO0EnKmsh7FCyUPa3GMdeYM5p1sfrPjjsnLYoHdDf19CGG";
+}
+
+using namespace Tellico;
+using Tellico::Fetch::IGDBFetcher;
+
+IGDBFetcher::IGDBFetcher(QObject* parent_)
+    : Fetcher(parent_), m_started(false), m_apiKey(QLatin1String(IGDB_API_KEY)) {
+  //  setLimit(IGDB_MAX_RETURNS_TOTAL);
+  if(m_genreHash.isEmpty()) {
+    populateHashes();
+  }
+}
+
+IGDBFetcher::~IGDBFetcher() {
+}
+
+QString IGDBFetcher::source() const {
+  return m_name.isEmpty() ? defaultName() : m_name;
+}
+
+QString IGDBFetcher::attribution() const {
+  return i18n("This information was freely provided by <a href=\"http://igdb.com\">IGDB.com</a>.");
+}
+
+bool IGDBFetcher::canSearch(FetchKey k) const {
+  return k == Keyword;
+}
+
+bool IGDBFetcher::canFetch(int type) const {
+  return type == Data::Collection::Game;
+}
+
+void IGDBFetcher::readConfigHook(const KConfigGroup& config_) {
+  QString k = config_.readEntry("API Key", IGDB_API_KEY);
+  if(!k.isEmpty()) {
+    m_apiKey = k;
+  }
+}
+
+void IGDBFetcher::search() {
+  continueSearch();
+}
+
+void IGDBFetcher::continueSearch() {
+  m_started = true;
+
+  if(m_apiKey.isEmpty()) {
+    myDebug() << "empty API key";
+    stop();
+    return;
+  }
+
+  QUrl u(QString::fromLatin1(IGDB_API_URL));
+  u.setPath(u.path() + QLatin1String("games/"));
+  QUrlQuery q;
+  switch(request().key) {
+    case Keyword:
+      q.addQueryItem(QLatin1String("search"), request().value);
+      break;
+
+    default:
+      myWarning() << "key not recognized:" << request().key;
+      stop();
+      return;
+  }
+//  q.addQueryItem(QLatin1String("fields"), QLatin1String("id,name"));
+  q.addQueryItem(QLatin1String("fields"), QLatin1String("*"));
+  q.addQueryItem(QLatin1String("limit"), QString::number(IGDB_MAX_RETURNS_TOTAL));
+  u.setQuery(q);
+//  myDebug() << u;
+
+  m_job = igdbJob(u, m_apiKey);
+  connect(m_job, SIGNAL(result(KJob*)), SLOT(slotComplete(KJob*)));
+}
+
+void IGDBFetcher::stop() {
+  if(!m_started) {
+    return;
+  }
+  if(m_job) {
+    m_job->kill();
+    m_job = nullptr;
+  }
+  m_started = false;
+  emit signalDone(this);
+}
+
+Tellico::Data::EntryPtr IGDBFetcher::fetchEntryHook(uint uid_) {
+  if(!m_entries.contains(uid_)) {
+    myDebug() << "no entry ptr";
+    return Data::EntryPtr();
+  }
+
+  Data::EntryPtr entry = m_entries.value(uid_);
+
+  QStringList publishers;
+  // grab the publisher data
+  if(entry->field(QLatin1String("publisher")).isEmpty()) {
+    foreach(const QString& pid, FieldFormat::splitValue(entry->field(QLatin1String("pub-id")))) {
+      const QString publisher = companyName(pid);
+      if(!publisher.isEmpty()) {
+        publishers << publisher;
+      }
+    }
+  }
+  entry->setField(QLatin1String("publisher"), publishers.join(FieldFormat::delimiterString()));
+
+  QStringList developers;
+  // grab the developer data
+  if(entry->field(QLatin1String("developer")).isEmpty()) {
+    foreach(const QString& did, FieldFormat::splitValue(entry->field(QLatin1String("dev-id")))) {
+      const QString developer = companyName(did);
+      if(!developer.isEmpty()) {
+        developers << developer;
+      }
+    }
+  }
+  entry->setField(QLatin1String("developer"), developers.join(FieldFormat::delimiterString()));
+
+  // clear the placeholder fields
+  entry->setField(QLatin1String("pub-id"), QString());
+  entry->setField(QLatin1String("dev-id"), QString());
+  return entry;
+}
+
+Tellico::Fetch::FetchRequest IGDBFetcher::updateRequest(Data::EntryPtr entry_) {
+  QString title = entry_->field(QLatin1String("title"));
+  if(!title.isEmpty()) {
+    return FetchRequest(Keyword, title);
+  }
+  return FetchRequest();
+}
+
+void IGDBFetcher::slotComplete(KJob* job_) {
+  KIO::StoredTransferJob* job = static_cast<KIO::StoredTransferJob*>(job_);
+
+  if(job->error()) {
+    job->ui()->showErrorMessage();
+    stop();
+    return;
+  }
+
+  const QByteArray data = job->data();
+  if(data.isEmpty()) {
+    myDebug() << "no data";
+    stop();
+    return;
+  }
+  // see bug 319662. If fetcher is cancelled, job is killed
+  // if the pointer is retained, it gets double-deleted
+  m_job = nullptr;
+
+#if 0
+  myWarning() << "Remove debug from igdbfetcher.cpp";
+  QFile file(QString::fromLatin1("/tmp/test.json"));
+  if(file.open(QIODevice::WriteOnly)) {
+    QTextStream t(&file);
+    t.setCodec("UTF-8");
+    t << data;
+  }
+  file.close();
+#endif
+
+  Data::CollPtr coll(new Data::GameCollection(true));
+  if(optionalFields().contains(QLatin1String("pegi"))) {
+    QStringList pegi = QString::fromLatin1("PEGI 3, PEGI 7, PEGI 12, PEGI 16, PEGI 18")
+                                    .split(QRegExp(QLatin1String("\\s*,\\s*")), QString::SkipEmptyParts);
+    Data::FieldPtr field(new Data::Field(QLatin1String("pegi"), i18n("PEGI Rating"), pegi));
+    field->setFlags(Data::Field::AllowGrouped);
+    field->setCategory(i18n("General"));
+    coll->addField(field);
+  }
+  if(optionalFields().contains(QLatin1String("igdb"))) {
+    Data::FieldPtr field(new Data::Field(QLatin1String("igdb"), i18n("IGDB Link"), Data::Field::URL));
+    field->setCategory(i18n("General"));
+    coll->addField(field);
+  }
+  // placeholder for publisher id, to be removed later
+  Data::FieldPtr f(new Data::Field(QLatin1String("pub-id"), QString(), Data::Field::Number));
+  f->setFlags(Data::Field::AllowMultiple);
+  coll->addField(f);
+  // placeholder for developer id, to be removed later
+  f = new Data::Field(QLatin1String("dev-id"), QString(), Data::Field::Number);
+  f->setFlags(Data::Field::AllowMultiple);
+  coll->addField(f);
+
+  QJsonDocument doc = QJsonDocument::fromJson(data);
+  foreach(const QVariant& result, doc.array().toVariantList()) {
+    QVariantMap resultMap = result.toMap();
+    Data::EntryPtr entry(new Data::Entry(coll));
+    populateEntry(entry, resultMap);
+
+    FetchResult* r = new FetchResult(Fetcher::Ptr(this), entry);
+    m_entries.insert(r->uid, entry);
+    emit signalResultFound(r);
+  }
+
+  stop();
+}
+
+void IGDBFetcher::populateEntry(Data::EntryPtr entry_, const QVariantMap& resultMap_) {
+  entry_->setField(QLatin1String("title"), mapValue(resultMap_, "name"));
+  entry_->setField(QLatin1String("description"), mapValue(resultMap_, "summary"));
+  entry_->setField(QLatin1String("certification"), m_esrbHash.value(mapValue(resultMap_, "esrb", "rating")));
+  entry_->setField(QLatin1String("pub-id"), mapValue(resultMap_, "publishers"));
+  entry_->setField(QLatin1String("dev-id"), mapValue(resultMap_, "developers"));
+
+  QString cover = mapValue(resultMap_, "cover", "url");
+  if(cover.startsWith(QLatin1Char('/'))) {
+    cover.prepend(QLatin1String("https:"));
+  }
+  entry_->setField(QLatin1String("cover"), cover);
+
+  QVariantList genreIDs = resultMap_.value(QLatin1String("genres")).toList();
+  QStringList genres;
+  foreach(const QVariant& id, genreIDs) {
+    QString g = m_genreHash.value(id.toInt());
+    if(!g.isEmpty()) {
+      genres << g;
+    }
+  }
+  entry_->setField(QLatin1String("genre"), genres.join(FieldFormat::delimiterString()));
+
+  QVariantList releases = resultMap_.value(QLatin1String("release_dates")).toList();
+  if(!releases.isEmpty()) {
+    QVariantMap releaseMap = releases.at(0).toMap();
+    // for now just grab the year of the first release
+    entry_->setField(QLatin1String("year"), mapValue(releaseMap, "y"));
+    const QString platform = m_platformHash.value(releaseMap.value(QLatin1String("platform")).toInt());
+    if(platform == QLatin1String("Nintendo Entertainment System (NES)")) {
+      entry_->setField(QLatin1String("platform"), i18n("Nintendo"));
+    } else if(platform == QLatin1String("Nintendo PlayStation")) {
+      entry_->setField(QLatin1String("platform"), i18n("PlayStation"));
+    } else if(platform == QLatin1String("PlayStation 2")) {
+      entry_->setField(QLatin1String("platform"), i18n("PlayStation2"));
+    } else if(platform == QLatin1String("PlayStation 3")) {
+      entry_->setField(QLatin1String("platform"), i18n("PlayStation3"));
+    } else if(platform == QLatin1String("PlayStation 4")) {
+      entry_->setField(QLatin1String("platform"), i18n("PlayStation4"));
+    } else if(platform == QLatin1String("PlayStation Portable")) {
+      entry_->setField(QLatin1String("platform"), i18nc("PlayStation Portable", "PSP"));
+    } else if(platform == QLatin1String("Wii")) {
+      entry_->setField(QLatin1String("platform"), i18n("Nintendo Wii"));
+    } else if(platform == QLatin1String("Nintendo GameCube")) {
+      entry_->setField(QLatin1String("platform"), i18n("GameCube"));
+    } else if(platform == QLatin1String("PC (Microsoft Windows)")) {
+      entry_->setField(QLatin1String("platform"), i18nc("Windows Platform", "Windows"));
+    } else if(platform == QLatin1String("Mac")) {
+      entry_->setField(QLatin1String("platform"), i18n("Mac OS"));
+    } else {
+      // TODO all the other platform translations
+      // also make the assumption that if the platform name isn't already in the allowed list, it should be added
+      Data::FieldPtr f = entry_->collection()->fieldByName(QLatin1String("platform"));
+      if(f && !f->allowed().contains(platform)) {
+        f->setAllowed(QStringList(f->allowed()) << platform);
+      }
+      entry_->setField(QLatin1String("platform"), platform);
+    }
+  }
+
+  if(optionalFields().contains(QLatin1String("pegi"))) {
+    entry_->setField(QLatin1String("pegi"), m_pegiHash.value(mapValue(resultMap_, "pegi", "rating")));
+  }
+
+  if(optionalFields().contains(QLatin1String("igdb"))) {
+    entry_->setField(QLatin1String("igdb"), mapValue(resultMap_, "url"));
+  }
+}
+
+QString IGDBFetcher::companyName(const QString& companyId_) const {
+  if(m_companyHash.contains(companyId_)) {
+    return m_companyHash.value(companyId_);
+  }
+  QUrl u(QString::fromLatin1(IGDB_API_URL));
+  u.setPath(u.path() + QLatin1String("companies/") + companyId_);
+
+  QUrlQuery q;
+  q.addQueryItem(QLatin1String("fields"), QLatin1String("*"));
+
+  u.setQuery(q);
+
+  QPointer<KIO::StoredTransferJob> job = igdbJob(u, m_apiKey);
+  if(!job->exec()) {
+    myDebug() << job->errorString() << u;
+    return QString();
+  }
+  const QByteArray data = job->data();
+  if(data.isEmpty()) {
+    myDebug() << "no data for" << u;
+    return QString();
+  }
+#if 0
+  myWarning() << "Remove company debug from igdbfetcher.cpp";
+  QFile file(QString::fromLatin1("/tmp/igdb-company.json"));
+  if(file.open(QIODevice::WriteOnly)) {
+    QTextStream t(&file);
+    t.setCodec("UTF-8");
+    t << data;
+  }
+  file.close();
+#endif
+
+  QJsonDocument doc = QJsonDocument::fromJson(data);
+  const QString company = mapValue(doc.array().toVariantList().at(0).toMap(), "name");
+  m_companyHash.insert(companyId_, company);
+  return company;
+}
+
+Tellico::Fetch::ConfigWidget* IGDBFetcher::configWidget(QWidget* parent_) const {
+  return new IGDBFetcher::ConfigWidget(parent_, this);
+}
+
+
+// Use member hash for certain field names for now.
+// Don't expect IGDB values to change. This avoids exponentially multiplying the number of API calls
+void IGDBFetcher::populateHashes() {
+  m_genreHash.insert(2,  QLatin1String("Point-and-click"));
+  m_genreHash.insert(4,  QLatin1String("Fighting"));
+  m_genreHash.insert(5,  QLatin1String("Shooter"));
+  m_genreHash.insert(7,  QLatin1String("Music"));
+  m_genreHash.insert(8,  QLatin1String("Platform"));
+  m_genreHash.insert(9,  QLatin1String("Puzzle"));
+  m_genreHash.insert(10, QLatin1String("Racing"));
+  m_genreHash.insert(11, QLatin1String("Real Time Strategy (RTS)"));
+  m_genreHash.insert(12, QLatin1String("Role-playing (RPG)"));
+  m_genreHash.insert(13, QLatin1String("Simulator"));
+  m_genreHash.insert(14, QLatin1String("Sport"));
+  m_genreHash.insert(15, QLatin1String("Strategy"));
+  m_genreHash.insert(16, QLatin1String("Turn-based strategy (TBS)"));
+  m_genreHash.insert(24, QLatin1String("Tactical"));
+  m_genreHash.insert(25, QLatin1String("Hack and slash/Beat 'em up"));
+  m_genreHash.insert(26, QLatin1String("Quiz/Trivia"));
+  m_genreHash.insert(30, QLatin1String("Pinball"));
+  m_genreHash.insert(31, QLatin1String("Adventure"));
+  m_genreHash.insert(32, QLatin1String("Indie"));
+  m_genreHash.insert(33, QLatin1String("Arcade"));
+
+  m_platformHash.insert(3, QLatin1String("Linux"));
+  m_platformHash.insert(4, QLatin1String("Nintendo 64"));
+  m_platformHash.insert(5, QLatin1String("Wii"));
+  m_platformHash.insert(6, QLatin1String("PC (Microsoft Windows)"));
+  m_platformHash.insert(7, QLatin1String("PlayStation"));
+  m_platformHash.insert(8, QLatin1String("PlayStation 2"));
+  m_platformHash.insert(9, QLatin1String("PlayStation 3"));
+  m_platformHash.insert(11, QLatin1String("Xbox"));
+  m_platformHash.insert(12, QLatin1String("Xbox 360"));
+  m_platformHash.insert(13, QLatin1String("PC DOS"));
+  m_platformHash.insert(14, QLatin1String("Mac"));
+  m_platformHash.insert(15, QLatin1String("Commodore C64/128"));
+  m_platformHash.insert(16, QLatin1String("Amiga"));
+  m_platformHash.insert(18, QLatin1String("Nintendo Entertainment System (NES)"));
+  m_platformHash.insert(19, QLatin1String("Super Nintendo Entertainment System (SNES)"));
+  m_platformHash.insert(20, QLatin1String("Nintendo DS"));
+  m_platformHash.insert(21, QLatin1String("Nintendo GameCube"));
+  m_platformHash.insert(22, QLatin1String("Game Boy Color"));
+  m_platformHash.insert(23, QLatin1String("Dreamcast"));
+  m_platformHash.insert(24, QLatin1String("Game Boy Advance"));
+  m_platformHash.insert(25, QLatin1String("Amstrad CPC"));
+  m_platformHash.insert(26, QLatin1String("ZX Spectrum"));
+  m_platformHash.insert(27, QLatin1String("MSX"));
+  m_platformHash.insert(29, QLatin1String("Sega Mega Drive/Genesis"));
+  m_platformHash.insert(30, QLatin1String("Sega 32X"));
+  m_platformHash.insert(32, QLatin1String("Sega Saturn"));
+  m_platformHash.insert(33, QLatin1String("Game Boy"));
+  m_platformHash.insert(34, QLatin1String("Android"));
+  m_platformHash.insert(35, QLatin1String("Sega Game Gear"));
+  m_platformHash.insert(36, QLatin1String("Xbox Live Arcade"));
+  m_platformHash.insert(37, QLatin1String("Nintendo 3DS"));
+  m_platformHash.insert(38, QLatin1String("PlayStation Portable"));
+  m_platformHash.insert(39, QLatin1String("iOS"));
+  m_platformHash.insert(41, QLatin1String("Wii U"));
+  m_platformHash.insert(42, QLatin1String("N-Gage"));
+  m_platformHash.insert(44, QLatin1String("Tapwave Zodiac"));
+  m_platformHash.insert(45, QLatin1String("PlayStation Network"));
+  m_platformHash.insert(46, QLatin1String("PlayStation Vita"));
+  m_platformHash.insert(47, QLatin1String("Virtual Console (Nintendo)"));
+  m_platformHash.insert(48, QLatin1String("PlayStation 4"));
+  m_platformHash.insert(49, QLatin1String("Xbox One"));
+  m_platformHash.insert(50, QLatin1String("3DO Interactive Multiplayer"));
+  m_platformHash.insert(51, QLatin1String("Family Computer Disk System"));
+  m_platformHash.insert(52, QLatin1String("Arcade"));
+  m_platformHash.insert(53, QLatin1String("MSX2"));
+  m_platformHash.insert(55, QLatin1String("Mobile"));
+  m_platformHash.insert(56, QLatin1String("WiiWare"));
+  m_platformHash.insert(57, QLatin1String("WonderSwan"));
+  m_platformHash.insert(58, QLatin1String("Super Famicom"));
+  m_platformHash.insert(59, QLatin1String("Atari 2600"));
+  m_platformHash.insert(60, QLatin1String("Atari 7800"));
+  m_platformHash.insert(61, QLatin1String("Atari Lynx"));
+  m_platformHash.insert(62, QLatin1String("Atari Jaguar"));
+  m_platformHash.insert(63, QLatin1String("Atari ST/STE"));
+  m_platformHash.insert(64, QLatin1String("Sega Master System"));
+  m_platformHash.insert(65, QLatin1String("Atari 8-bit"));
+  m_platformHash.insert(66, QLatin1String("Atari 5200"));
+  m_platformHash.insert(67, QLatin1String("Intellivision"));
+  m_platformHash.insert(68, QLatin1String("ColecoVision"));
+  m_platformHash.insert(69, QLatin1String("BBC Microcomputer System"));
+  m_platformHash.insert(70, QLatin1String("Vectrex"));
+  m_platformHash.insert(71, QLatin1String("Commodore VIC-20"));
+  m_platformHash.insert(72, QLatin1String("Ouya"));
+  m_platformHash.insert(73, QLatin1String("BlackBerry OS"));
+  m_platformHash.insert(74, QLatin1String("Windows Phone"));
+  m_platformHash.insert(75, QLatin1String("Apple II"));
+  m_platformHash.insert(77, QLatin1String("Sharp X1"));
+  m_platformHash.insert(78, QLatin1String("Sega CD"));
+  m_platformHash.insert(79, QLatin1String("Neo Geo MVS"));
+  m_platformHash.insert(80, QLatin1String("Neo Geo AES"));
+  m_platformHash.insert(82, QLatin1String("Web browser"));
+  m_platformHash.insert(84, QLatin1String("SG-1000"));
+  m_platformHash.insert(85, QLatin1String("Donner Model 30"));
+  m_platformHash.insert(86, QLatin1String("TurboGrafx-16/PC Engine"));
+  m_platformHash.insert(87, QLatin1String("Virtual Boy"));
+  m_platformHash.insert(88, QLatin1String("Odyssey"));
+  m_platformHash.insert(89, QLatin1String("Microvision"));
+  m_platformHash.insert(90, QLatin1String("Commodore PET"));
+  m_platformHash.insert(91, QLatin1String("Bally Astrocade"));
+  m_platformHash.insert(92, QLatin1String("SteamOS"));
+  m_platformHash.insert(93, QLatin1String("Commodore 16"));
+  m_platformHash.insert(94, QLatin1String("Commodore Plus/4"));
+  m_platformHash.insert(95, QLatin1String("PDP-1"));
+  m_platformHash.insert(96, QLatin1String("PDP-10"));
+  m_platformHash.insert(97, QLatin1String("PDP-8"));
+  m_platformHash.insert(98, QLatin1String("DEC GT40"));
+  m_platformHash.insert(99, QLatin1String("Family Computer"));
+  m_platformHash.insert(100, QLatin1String("Analogue electronics"));
+  m_platformHash.insert(101, QLatin1String("Ferranti Nimrod Computer"));
+  m_platformHash.insert(102, QLatin1String("EDSAC"));
+  m_platformHash.insert(103, QLatin1String("PDP-7"));
+  m_platformHash.insert(104, QLatin1String("HP 2100"));
+  m_platformHash.insert(105, QLatin1String("HP 3000"));
+  m_platformHash.insert(106, QLatin1String("SDS Sigma 7"));
+  m_platformHash.insert(107, QLatin1String("Call-A-Computer time-shared mainframe computer system"));
+  m_platformHash.insert(108, QLatin1String("PDP-11"));
+  m_platformHash.insert(109, QLatin1String("CDC Cyber 70"));
+  m_platformHash.insert(110, QLatin1String("PLATO"));
+  m_platformHash.insert(111, QLatin1String("Imlac PDS-1"));
+  m_platformHash.insert(112, QLatin1String("Microcomputer"));
+  m_platformHash.insert(113, QLatin1String("OnLive Game System"));
+  m_platformHash.insert(114, QLatin1String("Amiga CD32"));
+  m_platformHash.insert(115, QLatin1String("Apple IIGS"));
+  m_platformHash.insert(116, QLatin1String("Acorn Archimedes"));
+  m_platformHash.insert(117, QLatin1String("Philips CD-i"));
+  m_platformHash.insert(118, QLatin1String("FM Towns"));
+  m_platformHash.insert(119, QLatin1String("Neo Geo Pocket"));
+  m_platformHash.insert(120, QLatin1String("Neo Geo Pocket Color"));
+  m_platformHash.insert(121, QLatin1String("Sharp X68000"));
+  m_platformHash.insert(122, QLatin1String("Nuon"));
+  m_platformHash.insert(123, QLatin1String("WonderSwan Color"));
+  m_platformHash.insert(124, QLatin1String("SwanCrystal"));
+  m_platformHash.insert(125, QLatin1String("PC-8801"));
+  m_platformHash.insert(126, QLatin1String("TRS-80"));
+  m_platformHash.insert(127, QLatin1String("Fairchild Channel F"));
+  m_platformHash.insert(128, QLatin1String("PC Engine SuperGrafx"));
+  m_platformHash.insert(129, QLatin1String("Texas Instruments TI-99"));
+  m_platformHash.insert(130, QLatin1String("Nintendo Switch"));
+  m_platformHash.insert(131, QLatin1String("Nintendo PlayStation"));
+  m_platformHash.insert(132, QLatin1String("Amazon Fire TV"));
+  m_platformHash.insert(133, QLatin1String("Philips Videopac G7000"));
+  m_platformHash.insert(134, QLatin1String("Acorn Electron"));
+  m_platformHash.insert(135, QLatin1String("Hyper Neo Geo 64"));
+  m_platformHash.insert(136, QLatin1String("Neo Geo CD"));
+
+  // cheat by grabbing i18n values from default collection
+  Data::CollPtr c(new Data::GameCollection(true));
+  QStringList esrb = c->fieldByName(QLatin1String("certification"))->allowed();
+  Q_ASSERT(esrb.size() == 8);
+  while(esrb.size() < 8) {
+    esrb << QString();
+  }
+  m_esrbHash.insert(QLatin1String("1"), esrb.at(7));
+  m_esrbHash.insert(QLatin1String("2"), esrb.at(6));
+  m_esrbHash.insert(QLatin1String("3"), esrb.at(5));
+  m_esrbHash.insert(QLatin1String("4"), esrb.at(4));
+  m_esrbHash.insert(QLatin1String("5"), esrb.at(3));
+  m_esrbHash.insert(QLatin1String("6"), esrb.at(2));
+  m_esrbHash.insert(QLatin1String("7"), esrb.at(1));
+
+  m_pegiHash.insert(QLatin1String("1"), QLatin1String("PEGI 3"));
+  m_pegiHash.insert(QLatin1String("2"), QLatin1String("PEGI 7"));
+  m_pegiHash.insert(QLatin1String("3"), QLatin1String("PEGI 12"));
+  m_pegiHash.insert(QLatin1String("4"), QLatin1String("PEGI 16"));
+  m_pegiHash.insert(QLatin1String("5"), QLatin1String("PEGI 18"));
+}
+
+QString IGDBFetcher::defaultName() {
+  return i18n("Internet Game Database (IGDB.com)");
+}
+
+QString IGDBFetcher::defaultIcon() {
+  return favIcon("http://www.igdb.com");
+}
+
+Tellico::StringHash IGDBFetcher::allOptionalFields() {
+  StringHash hash;
+  hash[QLatin1String("pegi")] = i18n("PEGI Rating");
+  hash[QLatin1String("igdb")] = i18n("IGDB Link");
+  return hash;
+}
+
+IGDBFetcher::ConfigWidget::ConfigWidget(QWidget* parent_, const IGDBFetcher* fetcher_)
+    : Fetch::ConfigWidget(parent_) {
+  QGridLayout* l = new QGridLayout(optionsWidget());
+  l->setSpacing(4);
+  l->setColumnStretch(1, 10);
+
+  int row = -1;
+
+  QLabel* al = new QLabel(i18n("Registration is required for accessing the %1 data source. "
+                               "If you agree to the terms and conditions, <a href='%2'>sign "
+                               "up for an account</a>, and enter your information below.",
+                                IGDBFetcher::defaultName(),
+                                QLatin1String("http://igdb.github.io/api/about/welcome/")),
+                          optionsWidget());
+  al->setOpenExternalLinks(true);
+  al->setWordWrap(true);
+  ++row;
+  l->addWidget(al, row, 0, 1, 2);
+  // richtext gets weird with size
+  al->setMinimumWidth(al->sizeHint().width());
+
+  QLabel* label = new QLabel(i18n("Access key: "), optionsWidget());
+  l->addWidget(label, ++row, 0);
+
+  m_apiKeyEdit = new QLineEdit(optionsWidget());
+  connect(m_apiKeyEdit, SIGNAL(textChanged(const QString&)), SLOT(slotSetModified()));
+  l->addWidget(m_apiKeyEdit, row, 1);
+  QString w = i18n("The default Tellico key may be used, but searching may fail due to reaching access limits.");
+  label->setWhatsThis(w);
+  m_apiKeyEdit->setWhatsThis(w);
+  label->setBuddy(m_apiKeyEdit);
+
+  l->setRowStretch(++row, 10);
+
+  // now add additional fields widget
+  addFieldsWidget(IGDBFetcher::allOptionalFields(), fetcher_ ? fetcher_->optionalFields() : QStringList());
+
+  if(fetcher_) {
+    // only show the key if it is not the default Tellico one...
+    // that way the user is prompted to apply for their own
+    if(fetcher_->m_apiKey != QLatin1String(IGDB_API_KEY)) {
+      m_apiKeyEdit->setText(fetcher_->m_apiKey);
+    }
+  }
+}
+
+void IGDBFetcher::ConfigWidget::saveConfigHook(KConfigGroup& config_) {
+  const QString apiKey = m_apiKeyEdit->text().trimmed();
+  if(!apiKey.isEmpty()) {
+    config_.writeEntry("API Key", apiKey);
+  }
+}
+
+QString IGDBFetcher::ConfigWidget::preferredName() const {
+  return IGDBFetcher::defaultName();
+}
+
+QPointer<KIO::StoredTransferJob> IGDBFetcher::igdbJob(const QUrl& url_, const QString& apiKey_) {
+  QPointer<KIO::StoredTransferJob> job = KIO::storedGet(url_, KIO::NoReload, KIO::HideProgressInfo);
+  job->addMetaData(QLatin1String("customHTTPHeader"), QLatin1String("X-Mashape-Key: ") + apiKey_);
+  job->addMetaData(QLatin1String("accept"), QLatin1String("application/json"));
+  KJobWidgets::setWindow(job, GUI::Proxy::widget());
+  return job;
+}
--- /dev/null
+++ tellico-3.0.2/src/fetch/igdbfetcher.h
@@ -0,0 +1,124 @@
+/***************************************************************************
+    Copyright (C) 2017 Robby Stephenson <robby@periapsis.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 2 of        *
+ *   the License or (at your option) version 3 or any later version        *
+ *   accepted by the membership of KDE e.V. (or its successor approved     *
+ *   by the membership of KDE e.V.), which shall act as a proxy            *
+ *   defined in Section 14 of version 3 of the license.                    *
+ *                                                                         *
+ *   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/>. *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef TELLICO_IGDBFETCHER_H
+#define TELLICO_IGDBFETCHER_H
+
+#include "fetcher.h"
+#include "configwidget.h"
+#include "../datavectors.h"
+
+#include <QLineEdit>
+#include <QPointer>
+#include <QDate>
+
+class KJob;
+namespace KIO {
+  class StoredTransferJob;
+}
+
+namespace Tellico {
+  namespace Fetch {
+
+/**
+ * A fetcher for igdb.com
+ *
+ * @author Robby Stephenson
+ */
+class IGDBFetcher : public Fetcher {
+Q_OBJECT
+
+public:
+  /**
+   */
+  IGDBFetcher(QObject* parent);
+  /**
+   */
+  virtual ~IGDBFetcher();
+
+  /**
+   */
+  virtual QString source() const Q_DECL_OVERRIDE;
+  virtual QString attribution() const Q_DECL_OVERRIDE;
+  virtual bool isSearching() const Q_DECL_OVERRIDE { return m_started; }
+  virtual bool canSearch(FetchKey k) const Q_DECL_OVERRIDE;
+  virtual void stop() Q_DECL_OVERRIDE;
+  virtual Data::EntryPtr fetchEntryHook(uint uid) Q_DECL_OVERRIDE;
+  virtual Type type() const Q_DECL_OVERRIDE { return IGDB; }
+  virtual bool canFetch(int type) const Q_DECL_OVERRIDE;
+  virtual void readConfigHook(const KConfigGroup& config) Q_DECL_OVERRIDE;
+  virtual void continueSearch() Q_DECL_OVERRIDE;
+
+  /**
+   * Returns a widget for modifying the fetcher's config.
+   */
+  virtual Fetch::ConfigWidget* configWidget(QWidget* parent) const Q_DECL_OVERRIDE;
+
+  class ConfigWidget;
+  friend class ConfigWidget;
+
+  static QString defaultName();
+  static QString defaultIcon();
+  static StringHash allOptionalFields();
+
+private Q_SLOTS:
+  void slotComplete(KJob* job);
+
+private:
+  virtual void search() Q_DECL_OVERRIDE;
+  virtual FetchRequest updateRequest(Data::EntryPtr entry) Q_DECL_OVERRIDE;
+  void populateEntry(Data::EntryPtr entry, const QVariantMap& resultMap);
+  void populateHashes();
+  QString companyName(const QString& companyId) const;
+
+  static QPointer<KIO::StoredTransferJob> igdbJob(const QUrl& url, const QString& apiKey);
+
+  bool m_started;
+
+  QString m_apiKey;
+  QHash<int, Data::EntryPtr> m_entries;
+  QPointer<KIO::StoredTransferJob> m_job;
+
+  QHash<int, QString> m_genreHash;
+  QHash<int, QString> m_platformHash;
+  QHash<QString, QString> m_esrbHash;
+  QHash<QString, QString> m_pegiHash;
+  mutable QHash<QString, QString> m_companyHash;
+};
+
+class IGDBFetcher::ConfigWidget : public Fetch::ConfigWidget {
+Q_OBJECT
+
+public:
+  explicit ConfigWidget(QWidget* parent_, const IGDBFetcher* fetcher = nullptr);
+  virtual void saveConfigHook(KConfigGroup&) Q_DECL_OVERRIDE;
+  virtual QString preferredName() const Q_DECL_OVERRIDE;
+
+private:
+  QLineEdit* m_apiKeyEdit;
+};
+
+  } // end namespace
+} // end namespace
+#endif
--- /dev/null
+++ tellico-3.0.2/src/tests/dbcfetchertest.cpp
@@ -0,0 +1,107 @@
+/***************************************************************************
+    Copyright (C) 2017 Robby Stephenson <robby@periapsis.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 2 of        *
+ *   the License or (at your option) version 3 or any later version        *
+ *   accepted by the membership of KDE e.V. (or its successor approved     *
+ *   by the membership of KDE e.V.), which shall act as a proxy            *
+ *   defined in Section 14 of version 3 of the license.                    *
+ *                                                                         *
+ *   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/>. *
+ *                                                                         *
+ ***************************************************************************/
+
+#undef QT_NO_CAST_FROM_ASCII
+
+#include "dbcfetchertest.h"
+
+#include "../fetch/dbcfetcher.h"
+#include "../collections/bookcollection.h"
+#include "../collectionfactory.h"
+#include "../entry.h"
+#include "../utils/datafileregistry.h"
+
+#include <QTest>
+
+QTEST_GUILESS_MAIN( DBCFetcherTest )
+
+DBCFetcherTest::DBCFetcherTest() : AbstractFetcherTest() {
+}
+
+void DBCFetcherTest::initTestCase() {
+  Tellico::RegisterCollection<Tellico::Data::BookCollection> registerBook(Tellico::Data::Collection::Book, "book");
+  Tellico::DataFileRegistry::self()->addDataLocation(QFINDTESTDATA("../../xslt/dbc2tellico.xsl"));
+}
+
+void DBCFetcherTest::testTitle() {
+  Tellico::Fetch::FetchRequest request(Tellico::Data::Collection::Bibtex, Tellico::Fetch::Title,
+                                       QLatin1String("Min kamp"));
+  Tellico::Fetch::Fetcher::Ptr fetcher(new Tellico::Fetch::DBCFetcher(this));
+
+  Tellico::Data::EntryList results = DO_FETCH1(fetcher, request, 1);
+
+  QCOMPARE(results.size(), 1);
+
+  Tellico::Data::EntryPtr entry = results.at(0);
+  QCOMPARE(entry->field(QLatin1String("title")), QLatin1String("Min kamp"));
+  QCOMPARE(entry->field(QLatin1String("author")), QString::fromUtf8("Karl Ove Knausgård"));
+  QCOMPARE(entry->field(QLatin1String("publisher")), QLatin1String("Lindhardt og Ringhof"));
+  QCOMPARE(entry->field(QLatin1String("pub_year")), QLatin1String("2012"));
+  QCOMPARE(entry->field(QLatin1String("isbn")), QLatin1String("978-87-11-39183-9"));
+  QCOMPARE(entry->field(QLatin1String("pages")), QLatin1String("487"));
+  QCOMPARE(entry->field(QLatin1String("genre")), QLatin1String("barndomserindringer; erindringer"));
+  QVERIFY(!entry->field(QLatin1String("plot")).isEmpty());
+}
+
+void DBCFetcherTest::testIsbn() {
+  Tellico::Fetch::FetchRequest request(Tellico::Data::Collection::Bibtex, Tellico::Fetch::ISBN,
+                                       QLatin1String("9788711391839"));
+  Tellico::Fetch::Fetcher::Ptr fetcher(new Tellico::Fetch::DBCFetcher(this));
+
+  Tellico::Data::EntryList results = DO_FETCH1(fetcher, request, 1);
+
+  QCOMPARE(results.size(), 1);
+
+  Tellico::Data::EntryPtr entry = results.at(0);
+  QCOMPARE(entry->field(QLatin1String("title")), QLatin1String("Min kamp"));
+  QCOMPARE(entry->field(QLatin1String("author")), QString::fromUtf8("Karl Ove Knausgård"));
+  QCOMPARE(entry->field(QLatin1String("publisher")), QLatin1String("Lindhardt og Ringhof"));
+  QCOMPARE(entry->field(QLatin1String("pub_year")), QLatin1String("2012"));
+  QCOMPARE(entry->field(QLatin1String("isbn")), QLatin1String("978-87-11-39183-9"));
+  QCOMPARE(entry->field(QLatin1String("pages")), QLatin1String("487"));
+  QCOMPARE(entry->field(QLatin1String("language")), QLatin1String("Dansk"));
+  QCOMPARE(entry->field(QLatin1String("translator")), QLatin1String("Sara Koch"));
+  QCOMPARE(entry->field(QLatin1String("genre")), QLatin1String("barndomserindringer; erindringer"));
+  QVERIFY(!entry->field(QLatin1String("plot")).isEmpty());
+}
+
+void DBCFetcherTest::testKeyword() {
+  Tellico::Fetch::FetchRequest request(Tellico::Data::Collection::Bibtex, Tellico::Fetch::Keyword,
+                                       QLatin1String("9788711391839"));
+  Tellico::Fetch::Fetcher::Ptr fetcher(new Tellico::Fetch::DBCFetcher(this));
+
+  Tellico::Data::EntryList results = DO_FETCH1(fetcher, request, 1);
+
+  QCOMPARE(results.size(), 1);
+
+  Tellico::Data::EntryPtr entry = results.at(0);
+  QCOMPARE(entry->field(QLatin1String("title")), QLatin1String("Min kamp"));
+  QCOMPARE(entry->field(QLatin1String("author")), QString::fromUtf8("Karl Ove Knausgård"));
+  QCOMPARE(entry->field(QLatin1String("publisher")), QLatin1String("Lindhardt og Ringhof"));
+  QCOMPARE(entry->field(QLatin1String("pub_year")), QLatin1String("2012"));
+  QCOMPARE(entry->field(QLatin1String("isbn")), QLatin1String("978-87-11-39183-9"));
+  QCOMPARE(entry->field(QLatin1String("pages")), QLatin1String("487"));
+  QCOMPARE(entry->field(QLatin1String("genre")), QLatin1String("barndomserindringer; erindringer"));
+  QVERIFY(!entry->field(QLatin1String("plot")).isEmpty());
+}
--- /dev/null
+++ tellico-3.0.2/src/tests/dbcfetchertest.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+    Copyright (C) 2017 Robby Stephenson <robby@periapsis.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 2 of        *
+ *   the License or (at your option) version 3 or any later version        *
+ *   accepted by the membership of KDE e.V. (or its successor approved     *
+ *   by the membership of KDE e.V.), which shall act as a proxy            *
+ *   defined in Section 14 of version 3 of the license.                    *
+ *                                                                         *
+ *   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/>. *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef DBCFETCHERTEST_H
+#define DBCFETCHERTEST_H
+
+#include "abstractfetchertest.h"
+
+class DBCFetcherTest : public AbstractFetcherTest {
+Q_OBJECT
+public:
+  DBCFetcherTest();
+
+private Q_SLOTS:
+  void initTestCase();
+  void testTitle();
+  void testIsbn();
+  void testKeyword();
+};
+
+#endif
--- /dev/null
+++ tellico-3.0.2/src/tests/igdbfetchertest.cpp
@@ -0,0 +1,79 @@
+/***************************************************************************
+    Copyright (C) 2017 Robby Stephenson <robby@periapsis.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 2 of        *
+ *   the License or (at your option) version 3 or any later version        *
+ *   accepted by the membership of KDE e.V. (or its successor approved     *
+ *   by the membership of KDE e.V.), which shall act as a proxy            *
+ *   defined in Section 14 of version 3 of the license.                    *
+ *                                                                         *
+ *   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/>. *
+ *                                                                         *
+ ***************************************************************************/
+
+#undef QT_NO_CAST_FROM_ASCII
+
+#include "igdbfetchertest.h"
+
+#include "../fetch/igdbfetcher.h"
+#include "../collections/gamecollection.h"
+#include "../entry.h"
+#include "../images/imagefactory.h"
+
+#include <KConfig>
+#include <KConfigGroup>
+
+#include <QTest>
+
+QTEST_GUILESS_MAIN( IGDBFetcherTest )
+
+IGDBFetcherTest::IGDBFetcherTest() : AbstractFetcherTest() {
+}
+
+void IGDBFetcherTest::initTestCase() {
+  Tellico::ImageFactory::init();
+}
+
+void IGDBFetcherTest::testKeyword() {
+  KConfig config(QFINDTESTDATA("tellicotest.config"), KConfig::SimpleConfig);
+  QString groupName = QLatin1String("igdb");
+  if(!config.hasGroup(groupName)) {
+    QSKIP("This test requires a config file.", SkipAll);
+  }
+  KConfigGroup cg(&config, groupName);
+
+  Tellico::Fetch::FetchRequest request(Tellico::Data::Collection::Game, Tellico::Fetch::Keyword,
+                                       QLatin1String("Zelda Twilight Princess Wii"));
+  Tellico::Fetch::Fetcher::Ptr fetcher(new Tellico::Fetch::IGDBFetcher(this));
+  fetcher->readConfig(cg, cg.name());
+
+  Tellico::Data::EntryList results = DO_FETCH1(fetcher, request, 1);
+
+  QCOMPARE(results.size(), 1);
+
+  Tellico::Data::EntryPtr entry = results.at(0);
+  QVERIFY(entry);
+  QCOMPARE(entry->field("title"), QLatin1String("The Legend of Zelda: Twilight Princess"));
+  QCOMPARE(entry->field("year"), QLatin1String("2006"));
+  QCOMPARE(entry->field("platform"), QLatin1String("Nintendo Wii"));
+  QCOMPARE(entry->field("certification"), QLatin1String("Teen"));
+  QCOMPARE(entry->field("pegi"), QLatin1String("PEGI 12"));
+  QCOMPARE(entry->field("genre"), QLatin1String("Adventure"));
+  QCOMPARE(entry->field("publisher"), QLatin1String("Nintendo"));
+  QCOMPARE(entry->field("developer"), QLatin1String("Nintendo EAD Group No. 3"));
+  QCOMPARE(entry->field("igdb"), QLatin1String("https://www.igdb.com/games/the-legend-of-zelda-twilight-princess"));
+  QVERIFY(!entry->field(QLatin1String("description")).isEmpty());
+  QVERIFY(!entry->field(QLatin1String("cover")).isEmpty());
+  QVERIFY(!entry->field(QLatin1String("cover")).startsWith('/'));
+}
--- /dev/null
+++ tellico-3.0.2/src/tests/igdbfetchertest.h
@@ -0,0 +1,40 @@
+/***************************************************************************
+    Copyright (C) 2017 Robby Stephenson <robby@periapsis.org>
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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 2 of        *
+ *   the License or (at your option) version 3 or any later version        *
+ *   accepted by the membership of KDE e.V. (or its successor approved     *
+ *   by the membership of KDE e.V.), which shall act as a proxy            *
+ *   defined in Section 14 of version 3 of the license.                    *
+ *                                                                         *
+ *   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/>. *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef IGDBFETCHERTEST_H
+#define IGDBFETCHERTEST_H
+
+#include "abstractfetchertest.h"
+
+class IGDBFetcherTest : public AbstractFetcherTest {
+Q_OBJECT
+public:
+  IGDBFetcherTest();
+
+private Q_SLOTS:
+  void initTestCase();
+  void testKeyword();
+};
+
+#endif
--- /dev/null
+++ tellico-3.0.2/xslt/dbc2tellico.xsl
@@ -0,0 +1,112 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns="http://periapsis.org/tellico/"
+                xmlns:exsl="http://exslt.org/common"
+                xmlns:dbc="http://oss.dbc.dk/ns/opensearch"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:dcterms="http://purl.org/dc/terms/"
+                xmlns:dkabm="http://biblstandard.dk/abm/namespace/dkabm/"
+                xmlns:oss="http://oss.dbc.dk/ns/osstypes"
+                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                extension-element-prefixes="exsl"
+                exclude-result-prefixes="dbc dc dcterms dkabm oss xsi"
+                version="1.0">
+
+<!--
+   ===================================================================
+   Tellico XSLT file - used for importing data from dbc.dk
+
+   Copyright (C) 2017 Robby Stephenson <robby@periapsis.org>
+
+   This XSLT stylesheet is designed to be used with the 'Tellico'
+   application, which can be found at http://tellico-project.org
+
+   ===================================================================
+-->
+
+<xsl:variable name="letters">ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz.</xsl:variable>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
+            doctype-public="-//Robby Stephenson/DTD Tellico V11.0//EN"
+            doctype-system="http://periapsis.org/tellico/dtd/v11/tellico.dtd"/>
+
+<xsl:template match="/">
+ <tellico syntaxVersion="11">
+  <!-- type="2" is a book collection -->
+  <collection title="DBC Import" type="2">
+   <fields>
+    <field name="_default"/>
+   </fields>
+   <!-- only grab records whose type is Book, "Bog" -->
+   <xsl:apply-templates select="dbc:searchResponse/dbc:result/dbc:searchResult/dbc:collection/dbc:object/dkabm:record[dc:type[@xsi:type='dkdcplus:BibDK-Type']='Bog']"/>
+  </collection>
+ </tellico>
+</xsl:template>
+
+<xsl:template match="dkabm:record">
+ <entry>
+  <title>
+   <xsl:value-of select="dc:title"/>
+  </title>
+
+  <pub_year>
+   <xsl:value-of select="substring(dc:date,1,4)"/>
+  </pub_year>
+
+  <xsl:if test="dcterms:extent[contains(.,'sider')]">
+   <pages>
+    <xsl:value-of select="translate(dcterms:extent[contains(.,'sider')],$letters,'')"/>
+   </pages>
+  </xsl:if>
+
+  <publishers>
+   <xsl:for-each select="dc:publisher">
+    <publisher>
+     <xsl:value-of select="."/>
+    </publisher>
+   </xsl:for-each>
+  </publishers>
+
+  <isbn>
+   <xsl:value-of select="dc:identifier[@xsi:type='dkdcplus:ISBN']"/>
+  </isbn>
+
+  <authors>
+   <xsl:for-each select="dc:creator[@xsi:type='dkdcplus:aut']">
+    <author>
+     <xsl:value-of select="."/>
+    </author>
+   </xsl:for-each>
+  </authors>
+
+  <translators>
+   <xsl:for-each select="dc:contributor[@xsi:type='dkdcplus:trl']">
+    <translator>
+     <xsl:value-of select="."/>
+    </translator>
+   </xsl:for-each>
+  </translators>
+
+  <genres>
+   <xsl:for-each select="dc:subject[@xsi:type='dkdcplus:genre']">
+    <genre>
+     <xsl:value-of select="."/>
+    </genre>
+   </xsl:for-each>
+  </genres>
+
+  <languages>
+   <xsl:for-each select="dc:language[not(@xsi:type)]">
+    <language>
+     <xsl:value-of select="."/>
+    </language>
+   </xsl:for-each>
+  </languages>
+
+  <plot>
+   <xsl:value-of select="dcterms:abstract"/>
+  </plot>
+ </entry>
+</xsl:template>
+
+</xsl:stylesheet>
