[jabref] 58/459: [svn-upgrade] Integrating new upstream version, jabref (2.2)

gregor herrmann gregoa at debian.org
Thu Sep 15 20:39:42 UTC 2016


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

gregoa pushed a commit to branch master
in repository jabref.

commit 5c310cf2699616fae60ee68dc5382f16886a7033
Author: gregor herrmann <gregoa at debian.org>
Date:   Fri Feb 2 13:49:30 2007 +0000

    [svn-upgrade] Integrating new upstream version, jabref (2.2)
---
 build.number                                       |    4 +-
 build.xml                                          |   75 +-
 lib/JempBox-0.1.0-dev.jar                          |  Bin 24974 -> 38383 bytes
 src/help/About.html                                |   14 +-
 src/help/Contents.html                             |    2 +-
 src/help/EndNoteFilters.html                       |    2 +-
 src/help/XMPHelp.html                              |    3 +-
 src/help/de/About.html                             |   34 +-
 src/help/de/BaseFrameHelp.html                     |   12 +-
 src/help/de/BibtexHelp.html                        |  255 ++-
 src/help/de/CiteSeerHelp.html                      |   23 +-
 src/help/de/CommandLine.html                       |    3 +-
 src/help/de/Contents.html                          |    6 +-
 src/help/de/CustomImports.html                     |   50 +-
 src/help/de/EndNoteFilters.html                    |    2 +-
 src/help/de/ExternalFiles.html                     |   29 +
 src/help/de/GroupsHelp.html                        |    1 -
 src/help/de/IEEEXploreHelp.html                    |   25 +
 src/help/de/JabRef-UserManual_de.bib               |   46 +-
 src/help/de/JabRef-UserManual_de.tex               | 1148 +++++++-----
 src/help/de/JournalAbbreviations.html              |   53 +
 src/help/de/LabelPatterns.html                     |    7 +-
 src/help/de/MedlineHelp.html                       |    4 +-
 src/help/de/OpenOfficeHelp.html                    |   34 +-
 src/help/de/RemoteHelp.html                        |   22 +
 src/help/de/SearchHelp.html                        |   12 +-
 src/help/de/XMPHelp.html                           |  105 ++
 src/help/fr/About.html                             |   16 +-
 src/help/fr/EndNoteFilters.html                    |    2 +-
 src/help/fr/XMPHelp.html                           |   12 +-
 src/images/font/ACTIVA.TTF                         |  Bin 0 -> 82984 bytes
 src/images/font/ASTROLYT.TTF                       |  Bin 0 -> 42020 bytes
 src/images/font/AUGIE.TTF                          |  Bin 0 -> 54108 bytes
 src/images/splash.png                              |  Bin 223373 -> 171478 bytes
 src/java/net/sf/jabref/AdvancedTab.java            |    6 +-
 src/java/net/sf/jabref/AppearancePrefsTab.java     |   31 +-
 src/java/net/sf/jabref/BasePanel.java              |  137 +-
 src/java/net/sf/jabref/BibtexEntry.java            |    4 +
 src/java/net/sf/jabref/EntryEditor.java            |    5 +-
 src/java/net/sf/jabref/ExternalProgramsTab.java    |    9 +
 src/java/net/sf/jabref/ExternalTab.java            |    6 +-
 src/java/net/sf/jabref/FieldComparator.java        |   19 +-
 src/java/net/sf/jabref/GeneralTab.java             |    3 +
 src/java/net/sf/jabref/Globals.java                |    7 +-
 src/java/net/sf/jabref/JabRef.java                 |    7 +-
 src/java/net/sf/jabref/JabRefFrame.java            |   81 +-
 src/java/net/sf/jabref/JabRefPreferences.java      |    5 +
 src/java/net/sf/jabref/MetaData.java               |    2 +-
 src/java/net/sf/jabref/NameFormatterTab.java       |    6 +-
 src/java/net/sf/jabref/PrefsDialog2.java           |    1 +
 src/java/net/sf/jabref/PrefsDialog3.java           |  515 +++---
 src/java/net/sf/jabref/PrefsTab.java               |   16 +-
 src/java/net/sf/jabref/PreviewPanel.java           |   38 +-
 src/java/net/sf/jabref/PreviewPrefsTab.java        |    4 +
 src/java/net/sf/jabref/SearchManager2.java         |    3 +-
 src/java/net/sf/jabref/SidePaneManager.java        |   39 +-
 src/java/net/sf/jabref/TabLabelPattern.java        |   12 +-
 src/java/net/sf/jabref/TableColumnsTab.java        |  110 +-
 src/java/net/sf/jabref/TablePrefsTab.java          |   44 +-
 src/java/net/sf/jabref/Util.java                   |  461 ++---
 src/java/net/sf/jabref/XmpPrefsTab.java            |  240 +++
 src/java/net/sf/jabref/bst/Bst.java                | 1943 --------------------
 src/java/net/sf/jabref/collab/FileUpdatePanel.java |   10 +
 src/java/net/sf/jabref/collab/GroupChange.java     |    4 +
 src/java/net/sf/jabref/export/ExportFormats.java   |   11 +-
 .../sf/jabref/export/ExportToClipboardAction.java  |  142 ++
 src/java/net/sf/jabref/export/layout/Layout.java   |   52 +-
 .../net/sf/jabref/export/layout/LayoutEntry.java   |   53 +-
 .../sf/jabref/export/layout/format/HTMLChars.java  |  375 ++--
 .../sf/jabref/export/layout/format/RTFChars.java   |    6 +-
 .../external/AutoSetExternalFileForEntries.java    |   26 +-
 .../net/sf/jabref/external/ExternalFilePanel.java  |  107 +-
 src/java/net/sf/jabref/external/PushToEmacs.java   |   25 +-
 src/java/net/sf/jabref/groups/AbstractGroup.java   |   12 +
 src/java/net/sf/jabref/groups/ExplicitGroup.java   |   25 +
 src/java/net/sf/jabref/groups/GroupTreeNode.java   |   17 +-
 src/java/net/sf/jabref/groups/GroupsPrefsTab.java  |    4 +
 src/java/net/sf/jabref/gui/AttachFileDialog.java   |    2 +-
 .../net/sf/jabref/gui/ImportInspectionDialog.java  |   40 +-
 src/java/net/sf/jabref/gui/MainTableFormat.java    |   25 +-
 .../sf/jabref/gui/MainTableSelectionListener.java  |   44 +-
 src/java/net/sf/jabref/imports/BibtexParser.java   |   47 +-
 .../sf/jabref/imports/CiteSeerFetcherPanel.java    |    7 +-
 .../net/sf/jabref/imports/FieldContentParser.java  |    2 +-
 src/java/net/sf/jabref/imports/GeneralFetcher.java |    1 +
 src/java/net/sf/jabref/imports/ImportFormats.java  |    1 -
 src/java/net/sf/jabref/imports/ImportMenuItem.java |    8 +
 src/java/net/sf/jabref/imports/MedlineFetcher.java |    2 +-
 src/java/net/sf/jabref/imports/OAI2Fetcher.java    |   91 +-
 src/java/net/sf/jabref/imports/OAI2Handler.java    |   18 +-
 .../sf/jabref/imports/SilverPlatterImporter.java   |   14 +-
 .../sf/jabref/labelPattern/LabelPatternUtil.java   |    3 +-
 src/java/net/sf/jabref/util/XMPSchemaBibtex.java   |  106 +-
 src/java/net/sf/jabref/util/XMPUtil.java           |  719 +++++++-
 src/java/tests/net/sf/jabref/UtilFindFileTest.java |   26 +-
 src/java/tests/net/sf/jabref/UtilTest.java         |   57 +-
 .../net/sf/jabref/export/layout/AllTests.java      |    3 +-
 .../net/sf/jabref/export/layout/HTMLCharsTest.java |   49 +
 .../net/sf/jabref/export/layout/LayoutTest.java    |   37 +-
 .../net/sf/jabref/export/layout/RTFCharsTest.java  |    1 +
 src/java/tests/net/sf/jabref/imports/AllTests.java |    5 +-
 .../net/sf/jabref/imports/AutoImportTest.java      |   11 -
 .../net/sf/jabref/imports/BibtexParserTest.java    |  151 +-
 .../net/sf/jabref/imports/OAI2ImportTest.java      |   35 +-
 .../net/sf/jabref/util/XMPSchemaBibtexTest.java    |    4 +-
 src/java/tests/net/sf/jabref/util/XMPUtilTest.java |  289 ++-
 src/resource/JabRef_de.properties                  |  103 +-
 src/resource/JabRef_du.properties                  |   16 +
 src/resource/JabRef_en.properties                  |   24 +-
 src/resource/JabRef_fr.properties                  |   14 +
 src/resource/JabRef_it.properties                  |   41 +-
 src/resource/JabRef_no.properties                  |   72 +-
 src/resource/Menu_de.properties                    |    3 +-
 src/resource/Menu_du.properties                    |    2 +
 src/resource/Menu_en.properties                    |    1 +
 src/resource/Menu_fr.properties                    |    1 +
 src/resource/Menu_it.properties                    |    5 +-
 src/resource/Menu_no.properties                    |   17 +-
 src/resource/build.properties                      |    6 +-
 src/txt/README                                     |   31 +-
 src/windows/nsis/setup.nsi                         |    8 +-
 121 files changed, 4670 insertions(+), 4096 deletions(-)

diff --git a/build.number b/build.number
index 135abb0..8111c58 100644
--- a/build.number
+++ b/build.number
@@ -1,3 +1,3 @@
 #Build Number for ANT. Do not edit!
-#Sun Nov 26 20:22:40 CET 2006
-build.number=341
+#Tue Jan 30 19:29:15 CET 2007
+build.number=436
diff --git a/build.xml b/build.xml
index 0b8e3a2..2c8a2ae 100644
--- a/build.xml
+++ b/build.xml
@@ -22,8 +22,8 @@
    Compiler: Ant
    Authors:  Joerg K. Wegner, wegnerj at informatik.uni-tuebingen.de
              Morten O. Alver
-   Version:  $Revision: 1.77 $
-             $Date: 2006/11/23 22:37:19 $
+   Version:  $Revision: 1.78 $
+             $Date: 2006/11/29 00:51:22 $
              $Author: coezbek $
 
    modified:
@@ -47,13 +47,13 @@
      ========================================================================================== -->
 
 	<!-- some version information -->
-	<property name="jabref.bin" value="JabRef-2.2" />
-	<property name="jabref.version" value="2.2b2" />
+	<property name="jabref.version" value="2.2" />
 	<property name="jabref.placeholder.version" value="@version@" />
 	<!-- used by replace task -->
 
 
 	<!-- Set the properties for intermediate directory -->
+	<property name="build.jar" value="JabRef-${jabref.version}.jar" />
 	<property name="build.dir" value="build" />
 	<property name="build.classes" value="${build.dir}/classes" />
 	<property name="build.tmp" value="${build.dir}/tmp" />
@@ -88,18 +88,20 @@
 	<!-- Set the properties for library directories -->
 	<property name="library.directory" value="lib" />
 
+<!--    <property name="nsis.executable" value="makensis.exe"/> -->
+
 	<!-- Load user dependent properties -->
-	<property file="build.properties" />
-	<!-- 
-           * For instance define the NSIS-compiler:
-           *   nsis.executable="d:\prog\dev\NSIS\makensis.exe" 
-           *-->
+	<!-- For instance to redefine the NSIS-compiler write 
+		nsis.executable="d:\prog\dev\NSIS\makensis.exe"
+	  -->
+	<property file="user.properties" />
 
-	<!-- win.installer can only be build under Windows -->
+	<!-- win.installer can only be build under Windows if the nsis.executable is found -->
 	<condition property="is.windows">
 		<and>
 			<os family="windows" />
 			<isset property="nsis.executable" />
+<!--			<available file="${nsis.executable}" /> -->
 		</and>
 	</condition>
 
@@ -117,21 +119,21 @@
 		<pathelement location="${library.directory}/spin.jar" />
 		<pathelement location="${library.directory}/glazedlists-1.7.0_java14.jar" />
 		<pathelement location="${library.directory}/microba.jar" />
-        <pathelement location="${library.directory}/PDFBox-0.7.3-dev-reduced.jar" />
-        <pathelement location="${library.directory}/JempBox-0.1.0-dev.jar" />
+		<pathelement location="${library.directory}/PDFBox-0.7.3-dev-reduced.jar" />
+		<pathelement location="${library.directory}/JempBox-0.1.0-dev.jar" />
 	</path>
-	
+
 	<target name="run" depends="build">
 		<java classname="net.sf.jabref.JabRef" fork="true">
-			<classpath refid="classpath"/>
+			<classpath refid="classpath" />
 		</java>
 	</target>
-	
+
 	<!-- Runs project -->
 	<target name="runFromJar" depends="jars">
 		<java classname="net.sf.jabref.JabRef" fork="true">
 			<classpath>
-				<pathelement location="${build.lib}/jabref.jar" />
+				<pathelement location="${build.lib}/${build.jar}" />
 			</classpath>
 		</java>
 	</target>
@@ -140,7 +142,7 @@
 		<fail unless="netbeans.home">This target can only run inside the NetBeans IDE.</fail>
 
 		<nbprofiledirect>
-			<classpath refid="classpath"/>
+			<classpath refid="classpath" />
 		</nbprofiledirect>
 
 		<property environment="env" />
@@ -148,17 +150,17 @@
 			<jvmarg value="${profiler.info.jvmargs.agent}" />
 			<jvmarg line="${profiler.info.jvmargs}" />
 			<env key="LD_LIBRARY_PATH" path="${profiler.info.agentpath}:${env.LD_LIBRARY_PATH}" />
-			<classpath refid="classpath"/>
+			<classpath refid="classpath" />
 		</java>
 	</target>
 
 	<!-- Compiles project -->
 	<target name="compile">
 		<mkdir dir="${build.classes}" />
-		<javac debug="on" deprecation="on" destdir="${build.classes}" source="1.4" target="1.4">
+		<javac debug="off" deprecation="on" destdir="${build.classes}" source="1.4" target="1.4">
 			<src path="${java.dir}" />
 			<exclude name="tests/**" />
-			<classpath refid="classpath"/>
+			<classpath refid="classpath" />
 		</javac>
 	</target>
 
@@ -167,7 +169,7 @@
 		<mkdir dir="${build.classes}" />
 		<!--deprecation="on"-->
 		<javac srcdir="${java.dir}/tests" debug="off" destdir="${build.classes}" source="1.4" target="1.4">
-			<classpath refid="classpath"/>
+			<classpath refid="classpath" />
 		</javac>
 	</target>
 
@@ -189,7 +191,7 @@
 	<target name="jars" depends="build, unjarlib">
 		<mkdir dir="${build.lib}" />
 		<mkdir dir="${build.tmp}" />
-		<jar destfile="${build.lib}/jabref.jar">
+		<jar destfile="${build.lib}/${build.jar}">
 
 			<fileset dir="${build.classes}" />
 			<fileset dir="${build.tmp}" />
@@ -362,16 +364,16 @@ version=${jabref.version}</echo>
 		<unjar src="${library.directory}/spin.jar" dest="${build.tmp}" />
 		<unjar src="${library.directory}/glazedlists-1.7.0_java14.jar" dest="${build.tmp}" />
 		<unjar src="${library.directory}/microba.jar" dest="${build.tmp}" />
-        <unjar src="${library.directory}/PDFBox-0.7.3-dev-reduced.jar" dest="${build.tmp}" />
-        <unjar src="${library.directory}/JempBox-0.1.0-dev.jar" dest="${build.tmp}" />
-        <delete dir="${build.tmp}/META-INF" />
+		<unjar src="${library.directory}/PDFBox-0.7.3-dev-reduced.jar" dest="${build.tmp}" />
+		<unjar src="${library.directory}/JempBox-0.1.0-dev.jar" dest="${build.tmp}" />
+		<delete dir="${build.tmp}/META-INF" />
 		<!-- rename the microba license file -->
 		<move file="${build.tmp}/license.txt" tofile="${build.tmp}/microba-license.txt" />
 	</target>
 
 
 	<target name="osxjar">
-		<jarbundler dir="${build.lib}" name="JabRef" mainclass="net.sf.jabref.JabRef" jars="${build.lib}/jabref.jar" icon="${images.dir}/JabRef-Logo.icns" version="${jabref.version}" jvmversion="1.4+" stubfile="${library.directory}/JavaApplicationStub" />
+		<jarbundler dir="${build.lib}" name="JabRef" mainclass="net.sf.jabref.JabRef" jars="${build.lib}/${build.jar}" icon="${images.dir}/JabRef-Logo.icns" version="${jabref.version}" jvmversion="1.4+" stubfile="${library.directory}/JavaApplicationStub" />
 	</target>
 
 
@@ -386,11 +388,18 @@ version=${jabref.version}</echo>
 		<delete file="${win.installer.dir}/JabRefSetup.exe" />
 	</target>
 
-	<target name="win.installer.prepare" depends="jars" if="is.windows" description="Copy files in place to be used by the installer">
+	<target name="win.installer" if="is.windows" description="Copy files in place to be used by the installer">
+
 		<!-- Gather everything that will go into the installer in dist -->
 		<mkdir dir="${win.installer.dir}/dist" />
+
 		<!--    	<copy file="${build.lib}/${jabref.bin}.jar" 
     		todir="${win.installer.dir}/dist" /> -->
+
+		<available property="win.installer.jar.available" file="${win.installer.dir}/dist/${build.jar}"/>
+		
+		<fail unless="win.installer.jar.available" message="Did not find jar: ${build.jar}"/>
+		
 		<copy todir="${win.installer.dir}/dist">
 			<fileset dir="${txt.dir}">
 				<include name="gpl.txt" />
@@ -398,15 +407,13 @@ version=${jabref.version}</echo>
 				<include name="README" />
 			</fileset>
 		</copy>
-	</target>
 
-	<target name="win.installer.exewrapper" depends="win.installer.prepare" if="is.windows" description="Create Exe-Wrapper">
+		<!-- "Create Exe-Wrapper" -->
 		<exec dir="." executable="${nsis.executable}" failonerror="true">
-			<arg line="'/DJARFILE=${jabref.bin}.jar' '/DVERSION=${jabref.version}' '/DAPPICON=../../../${images.dir}/JabRef.ico' ${win.installer.dir}/launcher.nsi" />
+			<arg line="'/DJARFILE=${build.jar}' '/DVERSION=${jabref.version}' '/DAPPICON=../../../${images.dir}/JabRef.ico' ${win.installer.dir}/launcher.nsi" />
 		</exec>
-	</target>
 
-	<target name="win.installer.build" depends="win.installer.exewrapper" if="is.windows" description="Create Windows-Installer.">
+		<!-- Finally create Windows-Installer -->
 		<exec dir="." executable="${nsis.executable}" failonerror="true">
 			<arg line="'/DVERSION=${jabref.version}' ${win.installer.dir}/setup.nsi" />
 		</exec>
@@ -517,8 +524,8 @@ Number (CCN)           maintenance
 					<include name="**/*Test.class" />
 				</fileset>
 			</batchtest>
-			<classpath refid="classpath"/>
+			<classpath refid="classpath" />
 		</junit>
 	</target>
- 
+
 </project>
diff --git a/lib/JempBox-0.1.0-dev.jar b/lib/JempBox-0.1.0-dev.jar
index 735639d..9ede3a8 100644
Binary files a/lib/JempBox-0.1.0-dev.jar and b/lib/JempBox-0.1.0-dev.jar differ
diff --git a/src/help/About.html b/src/help/About.html
index 67e2be5..2726ab4 100755
--- a/src/help/About.html
+++ b/src/help/About.html
@@ -5,7 +5,7 @@
 <CENTER>
 <H1>JabRef version @version@ </H1>
 
-(c) 2006
+(c) 2007
 <p>
 <img src="/images/JabRef-icon-48.png"></img>
 
@@ -34,6 +34,9 @@ Egon Willighagen,
 Jörg Zieren
 
 <H2>Contributions from:</H2>
+
+Michael Beckmann,
+Oliver B�ckmann, 
 Kolja Brix,
 Frédéric Darboux,
 Fabrice Dessaint,
@@ -48,12 +51,15 @@ Krzysztof A. Kościuszkiewicz,
 Christian Kopf,
 Jeffrey Kuhn,
 Alex Montgomery,
+Ambrogio Oliva,
 John Relph,
+Hannes Restel,
 Moritz Ringler,
 Andreas Rudert,
 Mark Schenk,
 Rudolf Seemann,
 Toralf Senger,
+Manuel Siebeneicher 
 Mike Smoot,
 Ulrich Stärk,
 Martin Stolle,
@@ -98,6 +104,12 @@ The majority of icons are from the Crystal Clear icon set by Everaldo
 (<code>http://www.everaldo.com</code>), which is distributed under the
     terms of the Lesser General Public License.
 
+<P>
+JabRef uses the JempBox and PDFBox libraries for PDF handling, both of which are
+distributed under a BSD style license.
+
+
+
 </CENTER>
 </BODY>
 </HTML>
diff --git a/src/help/Contents.html b/src/help/Contents.html
index e2ae5b8..dbaa422 100755
--- a/src/help/Contents.html
+++ b/src/help/Contents.html
@@ -35,4 +35,4 @@
     <a href="PreviewHelp.html">Entry preview setup</a><br>
     <a href="XMPHelp.html">XMP metadata support in JabRef</a>
 
-</HTML>
+</HTML>
\ No newline at end of file
diff --git a/src/help/EndNoteFilters.html b/src/help/EndNoteFilters.html
index 446dd1b..75ff8e1 100644
--- a/src/help/EndNoteFilters.html
+++ b/src/help/EndNoteFilters.html
@@ -8,7 +8,7 @@
 <h2>Export from JabRef</h2>
 
 JabRef can export databases to EndNote-readable files.
-To use this feature, choose <b>File -> Export -> EndNote</b>, 
+To use this feature, choose <b>Tools -> EndNote</b>, 
 then specify the name of the export file.
 
 <h2>Import to EndNote</h2>
diff --git a/src/help/XMPHelp.html b/src/help/XMPHelp.html
index d8d937f..aeff817 100644
--- a/src/help/XMPHelp.html
+++ b/src/help/XMPHelp.html
@@ -26,7 +26,8 @@ To use the XMP-feature in JabRef you can do the following:
   <li>To <b>write the bibliographic information to the associated PDF</b> do the following: Double click the entry in the main view, go to the "General" tab and click on "Write XMP".</li>
   <li>If you want <b>to annotate all the PDFs in a given database</b> you can select "Tools -> Write XMP for database"</li>
   <li>To verify if it worked you can open the PDF in Adobe Acrobat and select
-  "File -> Document Properties -> Additional Metadata -> Advanced". In the tree to the right you should see an entry called "http://purl.org/net/bibteXMP"
+  "File -> Document Properties -> Additional Metadata -> Advanced". In the tree to the right you should see an entry called "http://purl.org/net/bibteXMP". This works only with Adobe Acrobat, not with Adobe Reader.</li>
+  <li>If you don't have Adobe Acrobat, you can use <i>pdfinfo</i> instead in order to see the XMP metadata. <i>pdfinfo</i> is part of Xpdf (<code>www.foolabs.com/xpdf</code>) and Poppler (<code>http://poppler.freedesktop.org</code>).</li>
 <ul>
 
 <h2>BibteXmp Fileformat</h2>
diff --git a/src/help/de/About.html b/src/help/de/About.html
index 0f2f79a..44c95ac 100644
--- a/src/help/de/About.html
+++ b/src/help/de/About.html
@@ -6,7 +6,7 @@
 <center>
 <h1>JabRef Version @version@</h1>
 
-(c) 2006
+(c) 2007
 <p>
 <img src="/images/JabRef-icon-48.png"></img>
 
@@ -22,6 +22,7 @@ Michel Baylac,
 Guillaume Gardey,
 Cyrille d'Haese,
 Raik Nagel,
+Christopher Oezbek,
 Ellen Reitmayr,
 Gert Renckens,
 Andreas Rudert,
@@ -34,37 +35,44 @@ Egon Willighagen,
 Jörg Zieren
 
 <h2>Beiträge von:</h2>
+Michael Beckmann,
+Oliver Böckmann,
 Kolja Brix,
 Frédéric Darboux,
 Fabrice Dessaint,
 Nathan Dunn,
-Brian van Essen,
+Brian Van Essen,
 Alexis Gallagher,
 Sascha Hunold,
 Bernd Kalbfuss,
 Martin Kähmer,
 Ervin Kolenovic,
 Krzysztof A. Kościuszkiewicz,
+Christian Kopf,
 Jeffrey Kuhn,
 Alex Montgomery,
-Christopher Oezbek,
+Ambrogio Oliva,
 John Relph,
+Hannes Restel,
 Moritz Ringler,
+Andreas Rudert,
 Mark Schenk,
 Rudolf Seemann,
 Toralf Senger,
+Manuel Siebeneicher,
 Mike Smoot,
+Ulrich Stärk,
 Martin Stolle,
 David Weitzman,
 Seb Wills,
 John Zedlewski
-    
+
 <h2>Dank an:</h2>
 Samin Muhammad Ridwanul Karim,
 Stefan Robert
 
 <h2>Benutzte Fremdsoftware:</h2>
-JabRef benutzt JGoodies Looks 2.0.4 und JGoodiesForms 1.0.5, das von JGoodies (<code>http://www.jgoodies.com</code>) unter den Bedingungen der BSD License vertrieben wird (siehe <code>http://www.opensource.org/licenses/bsd-license.html</code> für nähere Einzelheiten dieser Lizenz).
+JabRef benutzt JGoodies Looks 2.0.4 und JGoodiesForms 1.0.5, das von JGoodies (<code>http://www.jgoodies.com</code>) unter den Bedingungen der BSD-Lizenz vertrieben wird (siehe <code>http://www.opensource.org/licenses/bsd-license.html</code> für nähere Einzelheiten dieser Lizenz).
 <p>
 Außerdem werden zwei zustätzliche Klassen
 (SimpleInternalFrame and UIFSplitPane) von Karsten Lentzsch benutzt,
@@ -78,18 +86,22 @@ Für die Darstellung und Filterung der Tabelle benutzt JabRef die Glazed Lis
     (<code>http://publicobject.com/glazedlists</code>), die unter den Bedingungen der Lesser General Public License vertrieben wird.
 </p><p>
 JabRef benutzt darüber hinaus die "threading library" Spin 1.3.1,
-die unter den Bedingungen der LGPL (Lesser General Public License)
+die ebenfalls unter den Bedingungen der Lesser General Public License
 vertrieben wird.<br>
 </p>
 <p>Für die einfache Auswahl und den Umgang mit Datumsangaben
-werden Komponenten der Microba Bibliothek verwenden. Diese wird unter
-einer BSD Lizenz vertrieben, siehe auch <code>http://sourceforge.net/projects/microba/</code>
+werden Komponenten der Microba-Bibliothek verwenden. Diese wird unter
+einer BSD-Lizenz vertrieben, siehe <code>http://sourceforge.net/projects/microba/</code>
 für eine genauere Beschreibung.
 
 </p><p>
-The majority of icons are from the Crystal Clear icon set by Everaldo
-(<code>http://www.everaldo.com</code>), which is distributed under the
-    terms of the Lesser General Public License.
+Die meisten Icons stammen aus dem Crystal Clear Icon-Set von Everaldo
+(<code>http://www.everaldo.com</code>), das unter den Bedingungen
+der Lesser General Public License vertrieben wird.
+
+<P>
+JabRef verwendet für die Behandlung von PDF-Dateien die JempBox- und PDFBox-Bibliotheken, die unter
+einer BSD-Lizenz vertrieben werden.
 
 </p></center>
 </body></html>
\ No newline at end of file
diff --git a/src/help/de/BaseFrameHelp.html b/src/help/de/BaseFrameHelp.html
index cefe2e1..9515441 100644
--- a/src/help/de/BaseFrameHelp.html
+++ b/src/help/de/BaseFrameHelp.html
@@ -14,11 +14,11 @@ Dies ist das Hauptfenster, in dem Sie mit Ihrer Datei arbeiten. Unter der Men&uu
 <ul>
 <li>Die Auswahl der entsprechenden Felder können Sie im <strong>Einstellungs</strong>-Dialog vornehmen.</li>
 
-<li>Die Felder können direkt in der Tabelle bearbeitet werden, indem Sie einfach auf eine Zelle klicken und den Inhalt eingeben (nur möglich, wenn "Bearbeiten in der Tabelle zulassen" im Dialog <strong>Optionen --> Einstellungen --> Allgemein</strong> ausgewählt ist). Ein Doppelklick auf eine Zelle öffnet einen leistungsfähigeren Editor. Sie können mit den Pfeiltasten in der Tabelle navigieren.</li>
+<li>Mit einem Doppelklick auf eine Tabellenzeile können Sie den Inhalt bearbeiten (der <a href="EntryEditorHelp.html">Eintragseditor</a> wird geöffnet). Sie können mit den Pfeiltasten innerhalb der Tabelle navigieren. Wenn Sie einen Buchstaben drücken, springen Sie zu dem ersten Eintrag, der mit diesem Buchstaben beginnt (abhängig von der Spalte, nach der Sie die Tabelle sortiert haben).</li>
 
-<li>Die Tabelle wird nach einem Feld Ihrer Wahl sortiert. Klicken Sie einfach auf die Kopfzeile einer Spalte, um die Einträge nach dem Feld dieser Spalte zu sortieren. Klicken Sie erneut auf den Spaltenkopf, um die Sortierrichtung umzukehren. Einträge mit gleichem Inhalt im ausgewählten Feld werden nach dem zweiten (und eventuell dem dritten) Kriterium sortiert. Diese Sortierkriterien können im <strong>Einstellungs</strong>-Dialog festgelegt werden.</li>
+<li>Die Tabelle wird nach einem Feld Ihrer Wahl sortiert. Sie können das Standardverhalten unter <strong>Optionen -> Einstellungen -> Tabellenansicht</strong> angeben. Um die Sortierreihenfolge schnell zu ändern, klicken Sie einfach auf die Kopfzeile einer Spalte; damit haben Sie das primäre Sortierkriterium definiert. Klicken Sie erneut auf den Spaltenkopf, um die Sortierrichtung umzukehren. Ein weiterer Klick sorgt dafür, dass die Spalte nicht mehr zur Sortierung he [...]
 
-<li>Sie können die Breite der Tabellenspalten einstellen, indem Sie die Trennlinie zwischen den Spaltenköpfen anklicken und verschieben.</li>
+<li>Sie können die Breite der Tabellenspalten einstellen, indem Sie die Trennlinie zwischen den Spaltenköpfen anklicken und verschieben. Die Reihenfolge der Spalten können Sie festlegen, indem Sie mit der Maus auf den Spaltenkopf klicken und die Spalte an die gewünschte Stelle ziehen.</li>
 
 <li>Im <strong>Einstellungs</strong>-Dialog können Sie festlegen, ob die Tabelle an die Bildschirmgröße angepasst werden soll oder nicht. Aktivieren Sie diese Funktion, um sicherzustellen, dass Sie die gesamte Tabelle sehen können. Deaktivieren Sie diese Funktion, wenn mehr Informationen dargestellt werden sollen.</li>
 
@@ -44,9 +44,7 @@ Es gibt verschiedene Möglichkeiten, einen neuen Eintrag hinzuzufügen.
 
 <H2>Einen Eintrag bearbeiten</H2>
 
-Um den <a href="EntryEditorHelp.html">Eintrags-Editor</a> zur Bearbeitung eines existierenden Eintrags zu öffnen, klicken Sie einfach doppelt auf die linke Spalte der entsprechenden Zeile oder markieren den Eintrag und drücken auf ENTER.
-
-Falls "Bearbeiten in der Tabelle zulassen" nicht ausgewählt ist (im Dialog <strong>Optionen --> Einstellungen --> Allgemein</strong>), öffnet ein Doppelklick irgendwo in der zugehörigen Zeile den <a href="EntryEditorHelp.html">Eintrags-Editor</a>.
+Um den <a href="EntryEditorHelp.html">Eintrags-Editor</a> zur Bearbeitung eines existierenden Eintrags zu öffnen, klicken Sie einfach doppelt auf die Zeile des Eintrags oder markieren den Eintrag und drücken auf ENTER.
 
 <H2>Einen <em>BibTeX</em> String in einem Feld verwenden</H2>
 
@@ -54,7 +52,7 @@ In JabRef schreiben Sie den Inhalt aller Felder so, wie Sie es in einem Textedit
   '#jan# 1997',<BR>
 was interpretiert wird als String mit dem Namen 'jan' gefolgt von '1997'.
 
-<P>Vergleichen Sie dazu auch die Hilfeseite zum <a href="StringEditorHelp.html">String-Editor</a>.
+<P>Vergleichen Sie auch die Hilfeseite zum <a href="StringEditorHelp.html">String-Editor</a>.
 
 </font>
 </BODY>
diff --git a/src/help/de/BibtexHelp.html b/src/help/de/BibtexHelp.html
index d4eaf40..28d27cf 100644
--- a/src/help/de/BibtexHelp.html
+++ b/src/help/de/BibtexHelp.html
@@ -3,31 +3,262 @@
 <BODY text="#275856">
 <basefont size="4" color="#2F4958" face="arial">
 
-<H1>�ber <em>BibTeX</em></H1>
+<H1>Über <em>BibTeX</em></H1>
 
-JabRef hilft Ihnen bei der Arbeit mit Ihren <em>BibTeX</em>-Dateien, aber es m�ssen dennoch Regeln beachtet werden, wenn Sie Ihre Eintr�ge bearbeiten. Nur so kann sichergestellt werden, dass <em>BibTeX</em> Ihre Datei richtig verarbeiten kann.
+JabRef hilft Ihnen bei der Arbeit mit Ihren <em>BibTeX</em>-Dateien, aber es müssen dennoch Regeln beachtet werden, wenn Sie Ihre Einträge bearbeiten. Nur so kann sichergestellt werden, dass <em>BibTeX</em> Ihre Datei richtig verarbeiten kann.
 
 <H2><em>BibTeX</em> Felder</H2>
 
-Es gibt viele unterschiedliche Felder in <em>BibTeX</em> und einige zus�tzliche Felder, die Sie in JabRef einsetzen k�nnen.
+Es gibt viele unterschiedliche Felder in <em>BibTeX</em> und einige zusätzliche Felder, die Sie in JabRef einsetzen können.
 <P>
-Grunds�tzlich k�nnen Sie LaTeX-Befehle in Feldern, die Text beinhalten, einsetzen. <em>BibTeX</em> wird Ihr Literaturverzeichnis automatisch formatieren und je nach <em>BibTeX</em> style (Stildatei .bst) Gro�buchstaben verkleinern. Um sicherzustellen, dass einzelne Buchstaben gro� bleiben, m�ssen Sie sie in Klammern einschlie�en, wie im Wort {B}elgien. <em>(Anm. d. �bers.: Die meisten deutschen <em>BibTeX</em>-Stile behalten die Gro�buchstaben ohnehin bei.)</em>
+Grundsätzlich können Sie LaTeX-Befehle in Feldern, die Text beinhalten, einsetzen. <em>BibTeX</em> wird Ihr Literaturverzeichnis automatisch formatieren und je nach <em>BibTeX</em> style (Stildatei .bst) Großbuchstaben verkleinern. Um sicherzustellen, dass einzelne Buchstaben groß bleiben, müssen Sie sie in Klammern einschließen, wie im Wort {B}elgien. <em>(Anm. d. Übers.: Die meisten deutschen <em>BibTeX</em>-Stile behalten die Großbuchstaben  [...]
 
 <P>
 Hinweise zu einigen Feldtypen:
 <ul>
-<li><em>Author:</em> Dieses Feld sollte alle Autoren Ihres Eintrags enthalten. Die Namen werden durch das Wort <em>and</em> getrennt, auch wenn es mehr als zwei Autoren gibt. Jeder Name kann in zwei gleichwertigen Formen notiert werden:<br>
- Donald E. Knuth <em>oder</em> Knuth, Donald E.<br>
- Eddie van Halen <em>oder</em> van Halen, Eddie<br>
+<li><strong style="font-style: italic;">Bibtexkey<br>
+</strong>Eine eindeutige Bezeichnung, um sich in LaTeX-Dokumenten auf den Eintrag beziehen zu können. Beachten Sie, dass der Bibtexkey genau mit dem Verweis im LaTeX-Dokument übereinstimmen muss (auch die Groß-/Kleinschreibung).<br>
+    <br>
+</li>
 
-Die zweite Form sollte f�r Autoren mit zwei oder mehr Nachnamen benutzt werden, um zwischen dem mittleren und dem Nachnamen zu unterscheiden.
+  <li><strong>address<br>
+    </strong>Der Ort des <em>Verlags</em> oder einer anderen Institution.
+    <p>
+    </p>
+  </li>
+  <li><strong>annote<br>
+    </strong>Eine Anmerkung.
+Dieses Feld wird von den Standard-Bibliographiestilen nicht verwendet, kann aber bei einigen Stilen benutzt werden, um eine kommentierte Literaturliste zu erstellen.
+    <p>
+    </p>
+  </li>
+  <li><strong>author<br>
+    </strong>Dieses Feld sollte alle Autoren Ihres Eintrags enthalten. Die Namen werden durch das Wort <tt>and</tt> getrennt, auch wenn es mehr als zwei Autoren gibt. Jeder Name kann in zwei gleichwertigen Formen notiert werden:
+<ul>
+<li>Donald E. Knuth <em>oder</em> Knuth, Donald E.</li>
+<li>Eddie van Halen <em>oder</em> van Halen, Eddie</li>
+</ul>
+Die zweite Form sollte für Autoren mit zwei oder mehr Nachnamen benutzt werden, um zwischen dem mittleren und dem Nachnamen zu unterscheiden.<br>
+    <br>
+    <span style="font-weight: bold;"></span></li>
+  <li><span style="font-weight: bold;"></span><strong>booktitle<br>
+    </strong>Der Titel eines Buches, aus dem ein Teil zitiert wird. Falls Sie ein Buch zitieren wollen, nehmen Sie für den Titel stattdessen das <tt>title</tt>-Feld.
+    <p>
+    </p>
+  </li>
+  <li><strong>chapter<br>
+    </strong>Eine Kapitelnummer (oder Abschnittsnummer oder was-auch-immer-Nummer).
+    <p>
+    </p>
+  </li>
+  <li><strong>crossref<br>
+    </strong>Der <tt>key</tt> eines Eintrags, auf den ein Querverweis gesetzt wird. Damit lassen sich beispielsweise die Daten eines Sammelbandes in einem Eintrag für einen Aufsatztitel wiederverwenden, ohne sie bei jedem Aufsatztitel explizit einzutragen. Die Funktionalität von <tt>crossref</tt> ist jedoch nicht in jedem Fall praktikabel.
+    <p>
+    </p>
+  </li>
+  <li><strong>edition<br>
+    </strong>Die Auflage eines Buch, z.B. ,,Zweite``. Die Ordnungszahl sollte mit einem Großbuchstaben beginnen; sie wird von den Standardstilen gegebenenfalls in Kleinbuchstaben umgewandelt. Manche Stile verlangen hier eine Ziffer.
+    <p>
+    </p>
+  </li>
+  <li><strong>editor<br>
+    </strong>Dieses Feld ist analog zu dem <em>author</em>-Feld.
+Falls zusätzlich ein <tt>author</tt>-Feld angegeben wird, bezeichnet das <tt>editor</tt>-Feld den Herausgeber des Buches oder des Sammelbandes, in dem die referenzierte Literatur erschienen ist.
+    <p>
+    </p>
+  </li>
+  <li><strong>howpublished<br>
+    </strong>Die Art, wie ein Werk veröffentlicht wurde (meist außerhalb eines Verlags). Das erste Wort sollte mit einem Großbuchstaben beginnen.
+    <p>
+    </p>
+  </li>
+  <li><strong>institution<br>
+    </strong>Die fördernde Institutions eines technischen Reports.
+    <p>
+    </p>
+  </li>
+  <li><strong>journal<br>
+    </strong>Ein Zeitschriftenname.
+Mit Hilfe von "Strings" können Zeitschriftennamen abgekürzt werden. Zum Erstellen eines solchen Strings können Sie den <a href="StringEditorHelp.html">String-Editor</a> benutzen oder die Funktionalität zur <a href="JournalAbbreviations.html">Abkürzung von Zeitschriftentiteln</a> verwenden.
+    <p>
+    </p>
+  </li>
+  <li><strong>key<br>
+    </strong>Dieses Feld wird zur Sortierung, zur Erstellung von Labels (falls kein <tt>author</tt> vorhanden ist) und für Querverweise (<tt>crossref</tt>) verwendet. Verwechseln Sie dieses Feld nicht mit dem <tt>Bibtexkey</tt>, der für die <code>\cite</code>-Kommandos gebraucht wird und am Anfang jedes Eintrags erscheint (im BibTeX-Quelltext).
+    <p>
+    </p>
+  </li>
+  <li><strong>month<br>
+    </strong>Der Monat, in dem ein Werk veröffentlicht oder geschrieben wurde. Benutzen Sie am besten die englischen Abkürzungen (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec).
+    <p>
+    </p>
+  </li>
+  <li><strong>note<br>
+    </strong>Zusätzliche Infromationen. Das erste Wort sollte mit einem Großbuchstaben beginnen.
+    <p>
+    </p>
+  </li>
+  <li><strong>number</strong><br>
+Die Nummer einer Zeitschrift, eines technischen Reports oder eines Bandes innerhalb einer Reihe (<tt>series</tt>). Zeitschriften haben oft eine Band- und Heftzählung, der Band entspricht dem <tt>volume</tt>-, das Heft dem <tt>number</tt>-Eintrag.
+    <p>
+    </p>
+  </li>
+  <li><strong>organization<br>
+    </strong>Die Organisation, die einen Konferenzband fördert.
+    <p>
+    </p>
+  </li>
+  <li><strong>pages<br>
+    </strong>Die Seitenzahl(en) oder der Seitenzahlbereich, z.B. <tt>42-111</tt> oder <tt>7,41,73-97</tt> or <tt>43+</tt> (das `<tt>+</tt>' deutet auf folgende Seiten, die nicht einen einfachen Bereich umfassen).
+Ein einfacher Bindestrich (wie in <tt>7-33</tt>) wird in einen doppelten Bindestrich (<tt>--</tt>) verwandelt, der in TeX den bis-Strich anzeigt (also 7–33).
+    <p>
+    </p>
+  </li>
+  <li><strong>publisher<br>
+    </strong>Der Name des Verlags.
+    <p>
+    </p>
+  </li>
+  <li><strong>school<br>
+    </strong>Der Name einer Universität, an der eine Abschlussarbeit - z.B. eine Dissertation (<tt>phdthesis</tt>) oder Magisterarbeit (<tt>mastersthesis</tt>) - geschrieben wurde.
+    <p>
+    </p>
+  </li>
+  <li><strong>series<br>
+    </strong>Der Name einer Reihe, in der ein Buch erschienen ist.
+Falls die Bücher einer Reihe nummeriert sind, wird die entsprechende Nummer im Feld <tt>number</tt> angegeben.
+    <p>
+    </p>
+  </li>
+  <li><strong>title<br>
+    </strong>Der Titel des Werkes. Die Groß- und Kleinschreibung kann von den Bibliographiestilen und der benutzten Sprache abhängig sein (wobei sie mit deutschen Bibliographiestilen beibehalten wird). Worte, die auch bei Verwendung englischer Bibliographiestile groß geschrieben werden sollen, müssen in geschweifte Klammern eingefasst werden (z.B. <tt>A {German} title</tt>).
+    <p>
+    </p>
+  </li>
+  <li><strong>type<br>
+    </strong>Der Typ eines technischen Reports, z.B. ``Research Note''. Bei <em>jurabib</em> wird dieses Feld auch für den Typ einer Abschlussarbeit verwendet.
+    <p>
+    </p>
+  </li>
+  <li><strong>volume<br>
+    </strong>Der Band (Jahrgang) einer Zeitschrift oder der Band eines Buches in einem mehrbändigen Werk.    <p>
+    </p>
+  </li>
+  <li><strong>year<br>
+    </strong>Das Jahr der Veröffentlichung (oder bei einem unveröffentlichten Werk das Jahr, in dem es geschrieben wurde). Normalerweise sollte im <tt>year</tt>-Feld nur eine vierstellige Zahl stehen, z.B. <tt>1984</tt>. Die Standardstile können aber auch mit <tt>year</tt>-Einträgen umgehen, deren letzte vier Zeichen (ausgenommen Satzzeichen) Ziffern sind, beispielsweise <tt>(um 1984)</tt>.
+    Dieses Feld wird für die meisten Eintragstypen benötigt.</li>
+</ul>
+
+
+
+
+
+
+<br>
+
+
+<h2>Andere Felder</h2>
+
+
+Bibliographie-Stile für BibTeX wurden von vielen Leuten entwickelt,
+und einige haben weitere Felder erstellt. Es folgt eine kleine Auswahl.<br>
+<br>
+Feldnamen, die mit einem Stern* versehen sind, werden nicht direkt von JabRef unterstützt, können aber eingebunden werden (siehe <a href="CustomEntriesHelp.html">Eintragstypen anpassen</a>).
+
+<dl>
+
+
+</dl>
+
+<ul>
+
+  <li><strong><span style="font-weight: normal; font-style: italic;">affiliation*</span><br>
+    </strong>Die Zugehörigkeit eines Autors.<br>
+    <br>
+
+  </li>
+  <li><strong>abstract<br>
+    </strong>Die Zusammenfassung eines Werks.<br>
+    <br>
+
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">contents*</span><br>
+    </strong>Ein Inhaltsverzeichnis.<br>
+    <br>
 
-<li><em>Editor:</em> Dieses Feld ist analog zu dem <em>author</em>-Feld.
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">copyright*</span><br>
+    </strong>Copyright-Informationen.<br>
+    <br>
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">ISBN*</span><br>
+    </strong>Die Internationale Standardbuchnummer.<br>
+    <br>
 
-<li><em>Year:</em> Das Jahr der Publikation. Dieses Feld wird f�r die meisten Eintragstypen ben�tigt. JabRef akzeptiert in diesem Feld nur einen numerischen Wert.
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">ISSN*</span><br>
+    </strong>Die Internationale Standardseriennummer (für Zeitschriften).<br>
+    <br>
+
+  </li>
+  <li><strong>keywords<br>
+    </strong>Stichworte, können in JabRef gut zum Gruppieren verwendet werden.<br>
+    <br>
+
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">language*</span><br>
+    </strong>Die Sprache des Werks.<br>
+    <br>
+
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">location*</span><br>
+    </strong>Der Ort, der mit einem Werk in Verbindung steht, z.B. die Stadt, in der eine Konferenz stattgefunden hat.<br>
+    <br>
+
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">LCCN*</span><br>
+    </strong>Die <em>Library of Congress Call Number</em>.  Manchmal heißt das Feld auch <tt>lib-congress</tt>.<br>
+    <br>
+
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">mrnumber*</span><br>
+    </strong>Die <i>Mathematical Reviews</i>-Nummer.<br>
+    <br>
+
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">price*</span><br>
+    </strong>Der Preis.<br>
+    <br>
+
+  </li>
+  <li><strong><span style="font-weight: normal; font-style: italic;">size*</span><br>
+    </strong>Die physische Größe eines Dokuments.<br>
+    <br>
+
+  </li>
+  <li><strong>url<br>
+    </strong>Der <em>Uniform Resource Locator</em> (URL, "einheitlicher Quellenanzeiger"), der auf eine Webseite im Internet verweist.<br><br>
+  </li>
+
+  <li><strong>urldate<br>
+    </strong>Das Datum, an dem eine Webseite zuletzt besucht wurde.</li>
 
-<li><em>Bibtexkey:</em> Eine eindeutige Bezeichnung,um sich in LaTeX-Dokumenten auf den Eintrag beziehen zu k�nnen. Beachten Sie, dass der Bibtexkey genau mit dem Verweis im LaTeX-Dokument �bereinstimmen muss (auch die Gro�-/Kleinschreibung).
 </ul>
 
 
-</HTML>
+<br>
+
+<br>
+
+
+
+
+
+
+
+<br>
+
+
+
+</body>
+</HTML>
\ No newline at end of file
diff --git a/src/help/de/CiteSeerHelp.html b/src/help/de/CiteSeerHelp.html
index 81e5b37..5707313 100644
--- a/src/help/de/CiteSeerHelp.html
+++ b/src/help/de/CiteSeerHelp.html
@@ -5,6 +5,8 @@
 
 <H1>CiteSeer-Import</H1>
 
+CiteSeer ist eine digitale Bibliothek und Suchmaschine für wissenschaftliche Literatur, vornehmlich zu den Bereichen Computer und Informatik.
+
 <H2>Importieren eines Eintrags von CiteSeer</H2>
 
 JabRef kann Informationen über eine bestimmte Literaturangabe aus der CiteSeer-Datenbank
@@ -26,19 +28,14 @@ Literaturangabe.
 indem Sie <b>BibTeX -> Felder von CiteSeer importieren</b> auswählen. Achten Sie darauf, dass
 Sie die Zeile(n) ausgewählt haben, die Sie aktualisieren wollen.
 
-<H2>Generating a Citation Database</H2>
-
-Hinweis des Übersetzers: Offen gesagt habe ich diesen Absatz nicht verstanden, was daran liegen mag,
-dass ich CiteSeer nicht kenne und deshalb auch die Funktionsweise nicht nachvollziehen kann.
-Für Hinweise, Erklärungen oder eine fertige Übersetzung wäre ich deshalb dankbar.
-Damit die Informationen für deutsche Benutzer nicht verloren gehen, habe ich Sie im Original belassen:
+<H2>Eine Datei mit zitierenden Literaturangaben erzeugen</H2>
 
-<blockquote>
-Given a set of references, you can generate a list of documents that cite the elements of this set.
-To facilitate this feature, each citation in a database must have a citeseerurl field with the format specified
-in <b>Importing An Entry From CiteSeer</b>.  To use this feature, select <b>Tools -> Fetch Citations
-from CiteSeer</b>.
-</blockquote>
+Mit einem Satz von Literaturangaben können Sie eine Liste der Dokumente
+erzeugen, die die einzelnen Literaturangaben ihrerseits zitieren. Dazu
+muss jede Literaturangabe der entsprechenden Datenbank-Datei ein
+ausgefülltes citeseerurl-Feld besitzen, dessen Inhalt dem in <b>Importieren eines Eintrags von CiteSeer</b>
+beschriebenen Format entspricht. Sie können diese Funktion nutzen, indem
+Sie <b>Zitierende Literatur von CiteSeer abrufen</b> auswählen.
 
 <H2>Benutzung eines Proxy-Servers</H2>
 
@@ -50,4 +47,4 @@ an Java. Diese Umgebungseinstellungen sind dokumentiert unter
 
 <p> 
 
-</HTML>
+</HTML>
\ No newline at end of file
diff --git a/src/help/de/CommandLine.html b/src/help/de/CommandLine.html
index 1c9a78b..ad9834b 100644
--- a/src/help/de/CommandLine.html
+++ b/src/help/de/CommandLine.html
@@ -3,7 +3,7 @@
 <BODY text="#275856">
 <basefont size="4" color="#2F4958" face="arial">
 
-<H1>JabRef von der Kommandozeile</H1>
+<H1>Kommandozeilen-Optionen</H1>
 
 Obwohl JabRef in erster Linie ein Programm mit grafischer Benutzeroberfläche ist, bietet es
 einige nützliche Optionen für die Kommandozeile und kann sogar Dateikonvertierungen
@@ -21,7 +21,6 @@ unter dem Namen <code>filetoexport.xml</code>
 und unterdrückt das Laden der grafischen Oberfläche. Das Word <em>true</em> verhindert, dass der
 Dateiname als Argument der Option <code>-n</code> interpretiert wird.
 
-<H1>Kommandozeilen-Optionen</H2>
 <H2>Hilfe: -h</H2>
 
 Diese Option veranlasst JabRef, eine Zusammenfassung der Kommandozeilen-Optionen anzuzeigen und das
diff --git a/src/help/de/Contents.html b/src/help/de/Contents.html
index 8e2b2aa..1fd0a95 100644
--- a/src/help/de/Contents.html
+++ b/src/help/de/Contents.html
@@ -14,15 +14,17 @@
 <a href="BibtexHelp.html"><em>BibTeX</em> Hilfe</a><br>
 <a href="MarkingHelp.html">Einträge markieren</a><br>
 <a href="CiteSeerHelp.html">Einträge von <em>CiteSeer</em> abrufen</a><br>
+<a href="IEEEXploreHelp.html">Einträge von <em>IEEExplore</em> abrufen</a><br>
 <a href="MedlineHelp.html">Einträge von <em>Medline</em> abrufen</a><br>
 <a href="EntryEditorHelp.html">Der Eintrags-Editor</a><br>
 <a href="CustomEntriesHelp.html">Eintragstypen anpassen</a><br>
 <a href="PreviewHelp.html">Eintragsvorschau anpassen</a><br>
 <a href="CustomExports.html">Exportfilter anpassen</a><br>
-<a href="CustomImports.html">Externe Importfilter</a><br>
+<a href="RemoteHelp.html">Externer Zugriff</a><br>
 <a href="EndNoteFilters.html">Die Exportfilter und Importfilter für EndNote</a><br>
 <a href="BaseFrameHelp.html">Das Hauptfenster von JabRef</a><br>
 <a href="GroupsHelp.html">Hilfe zu den <em>Gruppen</em></a><br>
+<a href="CustomImports.html">Importfilter anpassen</a><br>
 <a href="ImportInspectionDialog.html">Import-Kontrollfenster</a><br>
 <a href="OpenOfficeHelp.html">JabRef-Bibliographien in OpenOffice.org benutzen</a><br>
 <a href="CommandLine.html">Kommandozeilen-Optionen</a><br>
@@ -30,6 +32,8 @@
 <a href="StringEditorHelp.html">Der String-Editor</a><br>
 <a href="SearchHelp.html">Die Suchfunktionen von JabRef</a><br>
 <a href="ContentSelectorHelp.html">Wortauswahl verwalten</a><br>
+<a href="XMPHelp.html">XMP-Metadaten und JabRef</a><br>
+<a href="JournalAbbreviations.html">Zeitschriftentitel abkürzen</a><br>
 <a href="TimeStampHelp.html">Zeitstempel</a><br>
 
 </HTML>
\ No newline at end of file
diff --git a/src/help/de/CustomImports.html b/src/help/de/CustomImports.html
index 59a5b6e..da78dce 100644
--- a/src/help/de/CustomImports.html
+++ b/src/help/de/CustomImports.html
@@ -3,16 +3,16 @@
 <BODY text="#275856">
 <basefont size="4" color="#2F4958" face="arial">
 
-<H1>Externe Importfilter</H1>
+<H1>Importfilter anpassen</H1>
 
-<p>JabRef bietet Ihnen die Möglichkeit, ganz ähnlich den Standard-Importern, eigene Importer 
+<p>JabRef bietet Ihnen die Möglichkeit, ganz ähnlich den Standard-Importern, eigene Importer
 zu definieren und zu benutzen. Man definiert einen Importer durch eine oder mehrere Java
 <i>Klassen</i>, die Dateinhalte aus einem sogenannten <i>Input stream</i> lesen
-und daraus BibTex-Einträge erzeugen. Sie können vorkompilierte Importer einbinden, die Sie vielleicht 
+und daraus BibTex-Einträge erzeugen. Sie können vorkompilierte Importer einbinden, die Sie vielleicht
 von SourceForge erhalten haben (siehe "Ihre Arbeit anderen zur Verfügung stellen"). Sie können auch
-mit Grundkenntnissen der Java-Programmierung eigene Importer für für Sie wichtige Referenzquellen 
+mit Grundkenntnissen der Java-Programmierung eigene Importer für für Sie wichtige Referenzquellen
 erstellen oder neue, verbesserte Versionen existierender Importer einbinden, ohne JabRef neu zu
-kompilieren.</p> 
+kompilieren.</p>
 
 <p>Externe Importfilter haben Vorrang vor Standard-Importern. So können Sie mit Ihren Importern
 die existierenden in der automatischen Formaterkennung und an der Kommandozeile in JabRef überschreiben.
@@ -22,16 +22,16 @@ Externe Importfilter selbst sind dann nach Namen sortiert.</p>
 
 <p>Stellen Sie sicher, dass Sie den Importer in kompilierter Form haben (eine oder mehrere
 <code>.class</code> Dateien) und dass die Klassendateien
-in einer Verzeichnisstruktur entsprechend ihrer Package-Struktur liegen. 
-Um einen neuen externen Importfilter hinzuzufügen, öffnen Sie den Dialog 
+in einer Verzeichnisstruktur entsprechend ihrer Package-Struktur liegen.
+Um einen neuen externen Importfilter hinzuzufügen, öffnen Sie den Dialog
 <b>Optionen -> Verwalte externe Importfilter</b>, und klicken Sie auf
-<b>Aus Klassenpfad hinzufügen</b>. Ein Dateiauswahl-Fenster erscheint, 
+<b>Aus Klassenpfad hinzufügen</b>. Ein Dateiauswahl-Fenster erscheint,
 mit dem Sie den Klassenpfad des Importers wählen, dass heißt den obersten Ordner,
 in dem die Package-Struktur Ihres Importers beginnt. In einem zweiten Dateiauswahl-Fenster
 wählen Sie die <i>.class</i>-Datei Ihres Importers, die von <code>ImportFormat</code> abgeleitet
 ist. Wenn Sie <b>Klasse auswählen</b> klicken, erscheint Ihr neuer Importer
 in der Liste der externen Importfilter. Alle externen Importfilter erscheinen in den
-JabRef-Submenüs <b>Datei -> Importieren -> Externe Importfilter</b> und 
+JabRef-Submenüs <b>Datei -> Importieren -> Externe Importfilter</b> und
 <b>Datei -> Importieren und Anhängen -> Externe Importfilter</b>.</p>
 
 <p>Bitte beachten Sie: wenn Sie die Klassen in ein anderes Verzeichnis verschieben,
@@ -47,7 +47,7 @@ Sie können auch Importer aus ZIP- oder JAR-Archiven registrieren, wähl
 
 <H2>Einen Importfilter entwickeln</H2>
 
-Bitte schauen Sie auf unseren Download-Seiten nach Beispielen und nützliche Dateien zur 
+Bitte schauen Sie auf unseren Download-Seiten nach Beispielen und nützliche Dateien zur
 Entwicklung Ihres Importfilters.
 
 <H3>Ein einfaches Beispiel</H3>
@@ -78,11 +78,11 @@ public class SimpleCsvImporter extends ImportFormat {
   public boolean isRecognizedFormat(InputStream stream) throws IOException {
     return true; // this is discouraged except for demonstration purposes
   }
-  
-  public List importEntries(InputStream stream) throws IOException {    
+
+  public List importEntries(InputStream stream) throws IOException {
   	ArrayList bibitems = new ArrayList();
     BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream));
-      
+
     String line = in.readLine();
     while (line != null) {
       if (!"".equals(line.trim())) {
@@ -94,9 +94,9 @@ public class SimpleCsvImporter extends ImportFormat {
         be.setField("title", fields[2]);
         bibitems.add(be);
         line = in.readLine();
-      }     
+      }
     }
-    return bibitems;	  	
+    return bibitems;
   }
 }
 </pre></p>
@@ -104,28 +104,28 @@ public class SimpleCsvImporter extends ImportFormat {
 <p>Beachten Sie, dass die Beispielklasse im Default-Package liegt. Angenommen, Sie haben
 sie unter <code>/meinpfad/SimpleCsvImporter.java</code> gespeichert. Nehmen wir weiter an,
 die Datei <i>JabRef-2.0.jar</i> ist im gleichen Verzeichnis wie
-<code>SimpleCsvImporter.java</code> und Java ist in Ihrem Kommandopfad. 
-Kompilieren Sie die Klasse mit JSDK 1.4 zum Beispiel mit folgendem Kommandozeilen-Aufruf: 
+<code>SimpleCsvImporter.java</code> und Java ist in Ihrem Kommandopfad.
+Kompilieren Sie die Klasse mit JSDK 1.4 zum Beispiel mit folgendem Kommandozeilen-Aufruf:
 <pre>
 javac -classpath JabRef-2.0.jar SimpleCsvImporter.java
 </pre>
 Nun sollte dort auch eine Datei <code>/mypath/SimpleCsvImporter.class</code> liegen.</p>
 
 <p>Öffnen Sie in JabRef <b>Optionen -> Verwaltung externer Importfilter</b> und klicken Sie
-auf <b>Aus Klassenpfad hinzufügen</b>. Navigieren Sie nach <code>/meinpfad</code> und 
+auf <b>Aus Klassenpfad hinzufügen</b>. Navigieren Sie nach <code>/meinpfad</code> und
 klicken Sie <b>Klassenpfad auswählen</b>. Wählen Sie dann <code>SimpleCsvImporter.class</code>
 und klicken Sie <b>Klasse auswählen</b>. Ihr Importfilter sollte nun in der Liste der
 externen Importfilter unter dem Namen "Simple CSV Importer" erscheinen, und,
-sobald Sie <b>Schließen</b> gewählt haben, auch in den Untermenüs <b>Datei -> Importieren -> 
-Externe Importfilter</b> und <b>Datei -> Importieren und Anhängen -> Externe Importfilter</b> 
+sobald Sie <b>Schließen</b> gewählt haben, auch in den Untermenüs <b>Datei -> Importieren ->
+Externe Importfilter</b> und <b>Datei -> Importieren und Anhängen -> Externe Importfilter</b>
 des JabRef-Hauptfensters.</p>
 
-<H2>Ihre Arbeit anderen zur Verfügung stellen</H2>
+<H2>Teilen Sie Ihre Arbeit</H2>
 
 Mit externen Importfiltern ist es recht einfach, Importfilter zwischen Nutzern auszutauschen und
-gemeinsam zu nutzen. Wenn Sie einen Importer für ein  Format schreiben, das JabRef noch nicht unterstützt, 
-oder einen Importer verbessern, bitten wir Sie, Ihre Ergebnisse auf unserer SourceForge.net 
-Seite zu veröffentlichen. Wir bieten gerne eine Sammlung eingereichter Importfilter an oder 
+gemeinsam zu nutzen. Wenn Sie einen Importer für ein  Format schreiben, das JabRef noch nicht unterstützt,
+oder einen Importer verbessern, bitten wir Sie, Ihre Ergebnisse auf unserer SourceForge.net
+Seite zu veröffentlichen. Wir bieten gerne eine Sammlung eingereichter Importfilter an oder
 fügen sie unserer Auswahl an Standard-Importfiltern hinzu.
 
-</HTML>
+</HTML>
\ No newline at end of file
diff --git a/src/help/de/EndNoteFilters.html b/src/help/de/EndNoteFilters.html
index 3f484ab..7201c0e 100644
--- a/src/help/de/EndNoteFilters.html
+++ b/src/help/de/EndNoteFilters.html
@@ -8,7 +8,7 @@
 <h2>Exportieren aus JabRef</h2>
 
 JabRef kann Dateien so exportieren, dass EndNote sie lesen kann.
-Um diese Funktion zu nutzen, wählen Sie <b>Datei -> Exportieren -> Endnote</b>
+Um diese Funktion zu nutzen, wählen Sie <b>Extras -> Endnote</b>
 und wählen dann den Namen der Export-Datei.
 
 <h2>Importieren in EndNote</h2>
diff --git a/src/help/de/ExternalFiles.html b/src/help/de/ExternalFiles.html
index 8d65acb..f40ead6 100644
--- a/src/help/de/ExternalFiles.html
+++ b/src/help/de/ExternalFiles.html
@@ -54,4 +54,33 @@ wird das Feld entsprechend gesetzt.
 überhaupt zu benutzen. Der Nachteil ist in diesem Fall allerdings, dass das PDF-Icon in der Tabellenansicht
 nicht angezeigt wird, solange das PDF-Feld leer bleibt.
 
+<H2>Dateispezifische PDF- und PS-Verzeichnisse</H2>
+<P>
+Sie können für jede Datei eigene PDF- und PS-Verzeichnisse angeben (<b>Datei -> Eigenschaften der Datei</b>). Diese Verzeichnisse ersetzen dann die Standardverzeichnisse.
+</P>
+
+<a name="RegularExpressionSearch">
+<H2>Die Suche mit regulären Ausdrücken für automatische Verknüpfungen nutzen</H2>
+</a>
+<p>
+Wenn Sie Dateinamen verwenden, die dem bibtexkey ergänzt um die Dateiendung entsprechen, findet JabRef diese Dateien automatisch.
+</p><p>
+Ab Version 2.2 ist mit Hilfe von regulären Ausdrücken eine größere Flexibilität beim Benennen der Dateien gewährleistet. In den meisten Fällen dürfte das Standardverhalten bereits ausreichend sein.
+</p><p>
+In den Einstellungen zu externen Programmen (<b>Optionen -> Einstellungen -> Externe Programme</b>) findet sich eine Option "Suche mit regulärem Ausdruck benutzen". Wenn Sie diese Option aktivieren, können Sie für die Suche in PDF-Verzeichnissen einen eigenen regulären Ausdruck angeben.
+</p><p>
+Die folgende Syntax wird verwendet:
+</p>
+<ul>
+  <li><code>*</code> - Suche in allen direkten Unterverzeichnissen, NICHT im aktuellen Verzeichnis und in Unterverzeichnissen zweiter oder tieferer Ebene.</li>
+  <li><code>**</code> - Rekursive Suche in allen Unterverzeichnissen UND im aktuellen Verzeichnis.</li>
+  <li><code>.</code> und <code>..</code> - Das aktuelle Verzeichnis und das Elternverzeichnis (eine Ebene höher).</li>
+  <li><code>[title]</code> - Alle Ausdrücke in eckigen Klammern werden durch den Inhalt des entsprechenden Felds ersetzt.</li>
+  <li><code>[extension]</code> - Wird durch die Dateiendung des Feldes, das Sie benutzen, ersetzt.</li>
+  <li>Anderer Text wird als regulärer Ausdruck interpretiert. Aber Vorsicht: <em>backslashes</em> müssen mit einem weiteren <em>backslash</em> <em>escaped</em> werden (<tt>\\</tt>), damit sie nicht mit Separatoren in Pfad-Angaben verwechselt werden.</li>
+</ul>
+<p>
+Der Standard ist <code>**/.*[bibtexkey].*\\.[extension]</code>. Damit wird in allen Unterverzeichnissen des Ordners der entsprechenden Dateiendung (z.B. das PDF-Verzeichnis) nach allen Dateien mit der richtigen Dateiendung gesucht, die den bibtexkey in ihrem Namen haben.
+</p>
+</body>
 </HTML>
\ No newline at end of file
diff --git a/src/help/de/GroupsHelp.html b/src/help/de/GroupsHelp.html
index 601876a..c9b9164 100644
--- a/src/help/de/GroupsHelp.html
+++ b/src/help/de/GroupsHelp.html
@@ -96,7 +96,6 @@ In der Gruppenansicht werden dynamische Gruppen standardmäßig <i>kurs
 
 <h3>Hierarchischer Kontext</h3>
 
-<em>Hinweis des Übersetzers: weiter bin ich noch (03.11.2005) nicht gekommen.</em><br>
 Standardmäßig ist eine Gruppe <b>unabhängig</b> von ihrer Position im Gruppenbaum. Ist eine Gruppe ausgewählt, wird nur der Inhalt dieser Gruppe angezeigt. Es ist jedoch -- besonders beim Verwenden dynamischer Gruppen -- oft nützlich, eine Untergruppe zu erstellen, die <b>ihre Obergruppe verfeinert</b>. Wenn diese Untergruppe ausgewählt wird, werden alle Einträge dieser Gruppe und ihrer Obergruppe angezeigt. Erstellen Sie z.B. eine Obergrupe, die Eintr [...]
 <p>
 Das logische Gegenstück zu einer solchen verfeinernden Untergruppe ist eine Gruppe, die <b>ihre Untergruppen berücksichtigt</b>. Wird sie ausgewählt, werden nicht nur die Einträge dieser Gruppe, sondern auch diejenigen aller Untergruppen angezeigt. Im Gruppenbaum hat auch diese Art von Gruppen ein spezielles Icon. (Dieses Verhalten kann in den Einstellungen abgestellt werden.)
diff --git a/src/help/de/IEEEXploreHelp.html b/src/help/de/IEEEXploreHelp.html
new file mode 100644
index 0000000..39eed80
--- /dev/null
+++ b/src/help/de/IEEEXploreHelp.html
@@ -0,0 +1,25 @@
+<HTML>
+
+<BODY text="#275856">
+<basefont size="4" color="#2F4958" face="arial">
+
+<H1>IEEEXplore durchsuchen</H1>
+
+IEEEXplore bietet Zugang zu Literatur in den Bereichen Elektrotechnik, Informatik und Elektronik.
+<p>
+JabRef kann Literaturangaben der IEEEXplore-Datenbank herunterladen.
+Um diese Funktion zu nutzen, wählen Sie <b>Internet -> IEEEXplore abfragen</b>
+und geben in dem Dialog, der im linken Bildschirmbereich erscheint, Ihre
+Suchausdrücke ein. Drücken Sie anschließend die
+<b>Enter</b>-Taste oder den <b>Abrufen</b>-Button.
+<p>
+Die Suche wird im Gäste-Modus durchgeführt, es werden also maximal 100 Ergebnisse
+angezeigt.
+<p>
+Sie können die <i>abstracts</i> zusammen mit den Literaturangaben herunterladen,
+indem Sie einen Haken bei <b>Abstracts berücksichtigen</b> setzen. Das verursacht
+eine deutlich höhere Anzahl von Netzwerk-Anfragen; um die Webseite von IEEEXplore
+nicht übermäßig zu belasten, lädt JabRef <i>abstracts</i> nur bei einer Suche,
+deren Ergebnis eine bestimmte Trefferanzahl nicht übersteigt.
+
+</HTML>
\ No newline at end of file
diff --git a/src/help/de/JabRef-UserManual_de.bib b/src/help/de/JabRef-UserManual_de.bib
index 65f6c52..7dcf672 100644
--- a/src/help/de/JabRef-UserManual_de.bib
+++ b/src/help/de/JabRef-UserManual_de.bib
@@ -1,52 +1,70 @@
-This file was created with JabRef 1.8.1.
+This file was created with JabRef 2.2b2.
 Encoding: ISO8859_1
 
+ at ARTICLE{Fenn2006,
+  author = {Fenn, J�rgen},
+  title = {Managing Citations and Your Bibliography with \bibtex{}},
+  journal = {The Prac\TeX{} Journal},
+  year = {2006},
+  gender = {sm},
+  number = {4},
+  annote = {Kurze Einf�hrung in die Verwaltung von Literaturdaten und die Benutzung
+	von \bibtex{}. Auch f�r Anf�nger geeignet; englisch.},
+  timestamp = {2006-12-09},
+  url = {http://www.tug.org/pracjourn/2006-4/fenn},
+  urldate = {9.\,12.\,2006}
+}
+
 @UNPUBLISHED{Markey2005,
   author = {Markey, Nicolas},
   title = {Tame the BeaST},
+  note = {\ctan{info\slash{}bibtex\slash{}tamethebeast\slash{}}},
   month = {6.\,} # mar,
   year = {2005},
-  annote = {Ausf�hrliches Tutorium rund um Bib\TeX{}, von der Erstellung von bib-Dateien
-	�ber die Programmierung bis hin zu kleinen n�tzlichen Tipps und Tricks
-	und dem "`Missbrauch"' von Bib\TeX{} als Adressbuch oder Glossar~\ldots{};
-	englisch.},
+  annote = {Ausf�hrliches Tutorium rund um Bib\TeX{}, von der Erstellung von
+	bib-Dateien �ber die Programmierung bis hin zu kleinen n�tzlichen
+	Tipps und Tricks und dem "`Missbrauch"' von Bib\TeX{} als Adressbuch
+	oder Glossar~\ldots{}; englisch.},
   timestamp = {2005-11-15},
-  titleaddon = {The B to X of Bib\TeX},
+  titleaddon = {The B to X of Bib\TeX}
 }
 
 @UNPUBLISHED{btxdoc,
   author = {Oren Patashnik},
   title = {Bib\TeX{}ing},
+  note = {\ctan{biblio\slash{}bibtex\slash{}distribs\slash{}doc\slash{}btxdoc.tex}},
   month = {8.\,} # feb,
   year = {1988},
   abstract = {Documentation for general {\BibTeX} users},
   annote = {Einf�hrung in die Benutzung von Bib\TeX{}, vom Autor des Programms
-	selbst; englisch.},
-  timestamp = {2005-11-15},
-  titleaddon = {Datei "`btxdoc"'},
+	selbst; englisch. Dokumentation von Bib\TeX{}, die bei jeder \LaTeX{}-Distribution
+	dabei sein sollte.},
+  timestamp = {2005-11-15}
 }
 
 @UNPUBLISHED{btxhak,
   author = {Oren Patashnik},
   title = {Designing Bib\TeX{} Styles},
+  note = {\ctan{biblio\slash{}bibtex\slash{}distribs\slash{}doc\slash{}btxhak.tex}},
   month = {8.\,} # feb,
   year = {1988},
   abstract = {The part of \BibTeX's documentation that's not meant for general users},
   annote = {Einf�hrung in die Bib\TeX{}-Programmierung, vom Autor des Programms
-	selbst; englisch.},
-  timestamp = {2005-11-15},
-  titleaddon = {Datei "`btxhak"'},
+	selbst; englisch. Dokumentation von Bib\TeX{}, die bei jeder \LaTeX{}-Distribution
+	dabei sein sollte. },
+  timestamp = {2005-11-15}
 }
 
 @UNPUBLISHED{Raichle2002,
   author = {Raichle, Bernd},
   title = {Tutorium: Einf�hrung in die Bib\TeX{}-Programmierung},
+  note = {\href{http://www.dante.de/dante/events/dante2002/handouts/raichle-bibtexprog.pdf}{http://www.dante.de/dante/events/dante2002/handouts/raichle-bibtexprog.pdf}},
   year = {2002},
   address = {Erlangen},
   annote = {Gibt eine kurze Einf�hrung in den Aufbau einer Bib\TeX{}-Datei, hat
 	seinen Schwerpunkt aber vor allem auf der Erstellung eines Bib\TeX{}-Styles
 	(.bst). Erkl�rt auch die f�r Bib\TeX{} verwendete Programmiersprache
-	UPN (Umgekehrt Polnische Notation); deutsch.},
-  timestamp = {2005-11-15},
+	UPN (Umgekehrte Polnische Notation); deutsch.},
+  timestamp = {2005-11-15}
 }
 
diff --git a/src/help/de/JabRef-UserManual_de.tex b/src/help/de/JabRef-UserManual_de.tex
index 4fdef14..1a22acd 100644
--- a/src/help/de/JabRef-UserManual_de.tex
+++ b/src/help/de/JabRef-UserManual_de.tex
@@ -1,15 +1,13 @@
-% unter >>Erscheinungsbild<< noch die Punkte Tabellendarstellung,
-% Toolbar, Panels und Schriften erstellen (DW)
-%
-% FAQ ganz am Ende? (halte ich f�r nicht unbedingt n�tig; eine Online-FAQ
-% w�re m.E. besser) (DW)
-
 \documentclass[10pt,normalheadings]{scrartcl}
 \usepackage[T1]{fontenc}
 \usepackage[latin1]{inputenc}
-\setcounter{secnumdepth}{1}
+\usepackage{textcomp}
+\setcounter{secnumdepth}{2}
 \setcounter{tocdepth}{4}
 
+%%% version date
+\newcommand{\versiondate}{in Bearb.}%19.\,12.\,2006
+
 %%%%% Page Dimensions %%%%%
 \usepackage{geometry}
 \geometry{verbose,a5paper,tmargin=2cm,bmargin=2cm,lmargin=1cm,rmargin=1cm}
@@ -21,6 +19,8 @@
 \usepackage{graphicx}
 \usepackage{setspace}
 \usepackage{amssymb}
+\usepackage{soul}
+\usepackage{hanging}
 
 \makeatletter
 %%%%% LyX command %%%%%
@@ -29,21 +29,32 @@
 %%%%% Because html converters don't know tabularnewline %%%%%
 \providecommand{\tabularnewline}{\\}
 
-%%%%% Environment "lyxcode" %%%%%
- \usepackage{verbatim}
- \newenvironment{lyxcode}
-   {\begin{list}{}{
-     \setlength{\rightmargin}{\leftmargin}
-     \setlength{\listparindent}{0pt}% needed for AMS classes
-     \raggedright
-     \setlength{\itemsep}{0pt}
-     \setlength{\parsep}{0pt}
-     \normalfont\ttfamily}%
-    \item[]}
-   {\end{list}}
+%%%%% Listings %%%%%
+\usepackage{listings}
+\lstset{%
+  frame=none,
+  %backgroundcolor=\color{pyellow},
+  language=[LaTeX]TeX,
+  basicstyle=\ttfamily\small,
+  commentstyle=\color{red},
+  keywordstyle=, % LaTeX-Befehle werden nicht fett dargestellt
+  numbers=none,%left/right
+  %numberstyle=\tiny\lnstyle,
+  %numbersep=5pt,
+  %numberblanklines=false,
+  breaklines=true,
+  %caption=\lstname,
+  xleftmargin=25pt,
+  xrightmargin=20pt,
+  escapeinside={(*}{*)},
+  belowskip=\medskipamount,
+  prebreak=\mbox{$\hookleftarrow$}% "geklaut" vom scrguide (KOMA-Script)
+}
+
 %%%%% Environment "revhist" (for revision history) %%%%%
-\newenvironment{revhist}
-    {\list{--}{\setlength\itemsep{0pt}\setlength{\parsep}{0pt}}}
+\newenvironment{revhist}[1]
+    {\subsection*{#1}
+     \list{--}{\setlength\itemsep{0pt}\setlength{\parsep}{0pt}}}
     {\endlist}
 
 %%%%% PDF 1.2 for Acrobat 3 onwards %%%%%
@@ -67,11 +78,13 @@
   }%
 }
 %%% version number
-\newcommand{\versionnr}{2.0} %
+\newcommand{\versionnr}{2.2} %
 %%% JabRef logo with version nr
 \newcommand{\jabrefversion}{\jabref{}~\versionnr}
+%%% BibTeX-shortcut
+\newcommand{\bibtex}{\texorpdfstring{Bib\kern-.125em\TeX}{BibTeX}}
 %%% for Menu references
-\newcommand{\menu}[1]{{\color{dkred}\textit{#1}}}
+\newcommand{\menu}[1]{\texorpdfstring{{\color{dkred}\textit{#1}}}{#1}}
 %%% Menu separator
 \newcommand{\msep}{{\color{dkred}\textit{\guilsinglright}}}
 %%% yellow box with dark blue text
@@ -81,6 +94,19 @@
     \color{dkblue}\textit{#1}#2}}%
   \end{center}%
 }%
+%%% for the FAQ 
+\newcounter{faq}
+\newcommand{\faq}[2]{\refstepcounter{faq}%
+  \medskip\noindent\colorbox{pyellow}{\parbox{0.9\textwidth}{%
+    \hangpara{0.11\textwidth}{1}%
+    \color{dkblue}Frage \thefaq: \textit{#1}}}\par\smallskip%
+  \begin{hangparas}{0.11\textwidth}{0}%
+    #2\par%
+  \end{hangparas}
+}%
+%\newcommand{\faq}[2]{%
+%  \subsection{#1}
+%  #2}%
 %%% for CTAN references
 \newcommand{\ctan}[1]{%
   {CTAN: \color{dkblue}#1}%
@@ -93,16 +119,18 @@
 %%%%% Headings %%%%%
 \usepackage{scrpage2}
 \pagestyle{scrheadings}
-\ihead{}
-\chead{\FileTitle{}}
-\ohead{}
+\ihead{\FileTitle{} (\versiondate{})}
+\chead{}
+\ohead{\headmark}
 \ifoot{}
 \cfoot{\pagemark}
 \ofoot{}
+\automark[section]{section}
 
 %%%%% Fonts %%%%%
 \usepackage{charter}
 \addtokomafont{sectioning}{\rmfamily} % Headings with serifs
+\usepackage[scaled=.83]{beramono}
 
 %%%%% Other stuff %%%%%
 \deffootnote{1.5em}{1em}{\makebox[1.5em][l]{\thefootnotemark}}
@@ -127,7 +155,7 @@ Me-n
 
 %%%%% Bibliography %%%%%
 \usepackage{jurabib}
-\jurabibsetup{annote=true}
+\jurabibsetup{annote=true,authorformat=year}
 \renewcommand{\bib at heading}{\addsec{Kommentiertes Literaturverzeichnis}}
 
 %%%%% Hyperref %%%%%
@@ -150,8 +178,7 @@ bookmarksopenlevel=1,%
 \makeatother
 \begin{document}
 
-\subject{\includegraphics[%
-  scale=0.25]{../../images/JabRef-splash.png}}
+\subject{\includegraphics[scale=.5]{../../images/JabRef-icon-48.png}}
 
 
 \title{\jabrefversion{}\\
@@ -166,12 +193,12 @@ Benutzerhandbuch}
 
 \maketitle
 \begin{abstract}
-\jabref{} ist eine grafische Java-Anwendung zur Bearbeitung von Bib\TeX{}-Dateien
+\jabref{} ist eine grafische Java-Anwendung zur Bearbeitung von \bibtex{}-Dateien
 (.bib). Mit \jabref{} k�nnen Literaturangaben in Gruppen organisiert
 und mit einem einfachen Klick die Ansicht auf eine einzelne Gruppe,
 eine Schnittmenge von Gruppen oder die Gesamtmenge mehrerer Gruppen
 eingegrenzt werden. \jabref{} kann Literaturangaben sortieren (f�r
-alle Standard-Bib\TeX{}-Felder) und automatisch Bib\TeX{}-Keys erzeugen.
+alle Standard-\bibtex{}-Felder) und automatisch \bibtex{}-Keys erzeugen.
 Auch Links zu PDF-Dateien oder Webseiten k�nnen mit \jabref{} einfach
 erstellt werden.
 
@@ -186,7 +213,7 @@ zu starten.
 \begin{center}{\scriptsize Copyright \textcopyright{} 2005--2006, Dominik
 Wa�enhoven}
 \end{center}
-{\scriptsize Dieser Inhalt ist unter einem Creative Commons Attribution-NonCommercial-ShareAlike 2.0 Germany Lizenzvertrag lizenziert. Um die Lizenz anzusehen, gehen Sie bitte zu \href{http://creativecommons.org/licenses/by-nc-sa/2.0/de/}{http://creativecommons.org\slash{}licenses\slash{}by-nc-sa\slash{}2.0\slash{}de\slash{}} oder schicken Sie einen Brief an Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. \par}\end{spacing}
+{\scriptsize Der Inhalt dieses Handbuchs wird unter den Bedingungen der Creative Commons Public License ">Namensnennung"=NichtKommerziell"=Weitergabe unter gleichen Bedingungen 2.0 Deutschland"< zur Verf�gung gestellt. Um den Lizenzvertrag anzusehen, gehen Sie bitte zu \href{http://creativecommons.org/licenses/by-nc-sa/2.0/de/}{http://creativecommons.org\slash{}licenses\slash{}by-nc-sa\slash{}2.0\slash{}de\slash{}} oder schicken einen Brief an Creative Commons, 559 Nathan Abbott Way, Sta [...]
 
 \end{quote}
 \thispagestyle{empty}
@@ -230,70 +257,141 @@ Abschnitt >>Versionsgeschichte<< (S.\,\pageref{RevisionHistory})
 Auskunft.
 
 
-\subsection{Einf�hrung in Bib\TeX{}}
+\subsection{Einf�hrung in \bibtex{}}
 
 \label{BibtexHelp}\tip[]{\jabref{} hilft Ihnen bei der Arbeit mit
-Ihren Bib\TeX{}-Dateien, aber es m�ssen dennoch Regeln beachtet werden,
+Ihren \bibtex{}-Dateien, aber es m�ssen dennoch Regeln beachtet werden,
 wenn Sie Ihre Eintr�ge bearbeiten. Nur so kann sichergestellt werden,
-dass Bib\TeX{} Ihre Datei richtig verarbeiten kann.}
+dass \bibtex{} Ihre Datei richtig verarbeiten kann.}
 
+\noindent Im Folgenden k�nnen nur einige allgemeine Hinweise gegeben werden. Ausf�hrlichere Einf�hrungen und weitere Erl�uterungen zu \bibtex{} finden Sie bei \cite{Fenn2006,Markey2005,btxdoc,btxhak,Raichle2002}.
 
-\subsubsection{Bib\TeX{} Felder}
+\subsubsection{\bibtex{}-Felder}
 
-Es gibt viele unterschiedliche Felder in Bib\TeX{} und einige zus�tzliche
-Felder, die Sie in \jabref{} einsetzen k�nnen. Grunds�tzlich k�nnen
-Sie \LaTeX{}-Befehle in Feldern, die Text beinhalten, einsetzen. Bib\TeX{}
-wird Ihr Literaturverzeichnis je nach Bib\TeX{} style (Stildatei \texttt{.bst})
-automatisch formatieren und bei Stildateien f�r englische Texte Gro�buchstaben
-verkleinern. Um sicherzustellen, dass einzelne Buchstaben gro� bleiben,
-m�ssen Sie sie in Klammern einschlie�en, wie im Wort \{B\}elgien.
-Die meisten deutschen Bib\TeX{}-Stile%
-\footnote{Beispielsweise natdin, dinat, jurabib~\ldots{}%
-} behalten die Gro�buchstaben ohnehin bei.
+Es gibt viele unterschiedliche Felder in \bibtex{} und einige zus�tzliche Felder, die Sie in \jabref{} einsetzen k�nnen.
+Grunds�tzlich k�nnen Sie \LaTeX{}-Befehle in Feldern, die Text beinhalten, einsetzen. \bibtex{} wird Ihr Literaturverzeichnis automatisch formatieren und je nach \bibtex{} style (Stildatei .bst) Gro�buchstaben verkleinern. Um sicherzustellen, dass Anfangsbuchstaben gro� bleiben, m�ssen Sie die W�rter in geschweifte Klammern einschlie�en, wie im Wort \{Belgien\}.\footnote{Die meisten deutschen \bibtex{}-Stile behalten die Gro�buchstaben ohnehin bei.}
 
-Hier einige Hinweise zu den wichtigsten Feldtypen:
+Hinweise zu einigen Feldtypen:
+\begin{itemize}
+\item \emph{Bibtexkey}\\
+Eine eindeutige Bezeichnung, um sich in \LaTeX{}-Dokumenten auf den Eintrag beziehen zu k�nnen. Beachten Sie, dass der Bibtexkey genau mit dem Verweis im \LaTeX{}-Dokument �bereinstimmen muss (auch die Gro�-/Kleinschreibung).
+  \item \emph{address}\\
+    Der Ort des \emph{Verlags} oder einer anderen Institution.
+  \item \emph{annote}\\
+    Eine Anmerkung.
+Dieses Feld wird von den Standard-Bibliographiestilen nicht verwendet, kann aber bei einigen Stilen benutzt werden, um eine kommentierte Literaturliste zu erstellen.
+  \item \emph{author}\\
+    Dieses Feld sollte alle Autoren Ihres Eintrags enthalten. Die Namen werden durch das Wort \texttt{and} getrennt, auch wenn es mehr als zwei Autoren gibt. Jeder Name kann in zwei gleichwertigen Formen notiert werden:
+\begin{itemize}
+\item Donald E. Knuth \emph{oder} Knuth, Donald E.
+\item Eddie van Halen \emph{oder} van Halen, Eddie
+\end{itemize}
+Die zweite Form sollte f�r Autoren mit zwei oder mehr Nachnamen benutzt werden, um zwischen dem mittleren und dem Nachnamen zu unterscheiden.
+  \item \emph{booktitle}\\
+    Der Titel eines Buches, aus dem ein Teil zitiert wird. Falls Sie ein Buch zitieren wollen, nehmen Sie f�r den Titel stattdessen das \texttt{title}-Feld.
+  \item \emph{chapter}\\
+    Eine Kapitelnummer (oder Abschnittsnummer oder was-auch-immer-Nummer).
+  \item \emph{crossref}\\
+    Der \texttt{key} eines Eintrags, auf den ein Querverweis gesetzt wird. Damit lassen sich beispielsweise die Daten eines Sammelbandes in einem Eintrag f�r einen Aufsatztitel wiederverwenden, ohne sie bei jedem Aufsatztitel explizit einzutragen. Die Funktionalit�t von \texttt{crossref} ist jedoch nicht in jedem Fall praktikabel.
+  \item \emph{edition}\\
+    Die Auflage eines Buch, z.\,B. \texttt{Zweite}. Die Ordnungszahl sollte mit einem Gro�buchstaben beginnen; sie wird von den Standardstilen gegebenenfalls in Kleinbuchstaben umgewandelt. Manche Stile verlangen hier eine Ziffer.
+  \item \emph{editor}\\
+    Dieses Feld ist analog zu dem \emph{author}-Feld.
+Falls zus�tzlich ein \texttt{author}-Feld angegeben wird, bezeichnet das \texttt{editor}-Feld den Herausgeber des Buches oder des Sammelbandes, in dem die referenzierte Literatur erschienen ist.
+  \item \emph{howpublished}\\
+    Die Art, wie ein Werk ver�ffentlicht wurde (meist au�erhalb eines Verlags). Das erste Wort sollte mit einem Gro�buchstaben beginnen.
+  \item \emph{institution}\\
+    Die f�rdernde Institutions eines technischen Reports.
+  \item \emph{journal}\\
+    Ein Zeitschriftenname.
+Mit Hilfe von ">Strings"< k�nnen Zeitschriftennamen abgek�rzt werden. Zum Erstellen eines solchen Strings k�nnen Sie den \nameref{StringEditorHelp} benutzen oder die Funktionalit�t zur \nameref{JournalAbbreviations} %Abk�rzung von Zeitschriftentiteln 
+verwenden.
+  \item \emph{key}\\
+    Dieses Feld wird zur Sortierung, zur Erstellung von Labels (falls kein \texttt{author} vorhanden ist) und f�r Querverweise (\texttt{crossref}) verwendet. Verwechseln Sie dieses Feld nicht mit dem \texttt{Bibtexkey}, der f�r die \texttt{\textbackslash cite}-Kommandos gebraucht wird und am Anfang jedes Eintrags erscheint (im \bibtex{}-Quelltext).
+  \item \emph{month}\\
+    Der Monat, in dem ein Werk ver�ffentlicht oder geschrieben wurde. Benutzen Sie am besten die englischen Abk�rzungen (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec).
+  \item \emph{note}\\
+    Zus�tzliche Infromationen. Das erste Wort sollte mit einem Gro�buchstaben beginnen.
+  \item \emph{number}\\
+Die Nummer einer Zeitschrift, eines technischen Reports oder eines Bandes innerhalb einer Reihe (\texttt{series}). Zeitschriften haben oft eine Band- und Heftz�hlung, der Band entspricht dem \texttt{volume}-, das Heft dem \texttt{number}-Eintrag.
+  \item \emph{organization}\\
+    Die Organisation, die einen Konferenzband f�rdert.
+  \item \emph{pages}\\
+    Die Seitenzahl(en) oder der Seitenzahlbereich, z.\,B. \texttt{42-111} oder \texttt{7,41,73-97} or \texttt{43+} (das \texttt{+} deutet auf folgende Seiten, die nicht einen einfachen Bereich umfassen).
+Ein einfacher Bindestrich (wie in \texttt{7-33}) wird in einen doppelten Bindestrich (\texttt{-{-}}) verwandelt, der in TeX den bis-Strich anzeigt (also 7--33).
+  \item \emph{publisher}\\
+    Der Name des Verlags.
+  \item \emph{school}\\
+    Der Name einer Universit�t, an der eine Abschlussarbeit~-- z.\,B. eine Dissertation (\texttt{phdthesis}) oder Magisterarbeit (\texttt{mastersthesis})~-- geschrieben wurde.
+  \item \emph{series}\\
+    Der Name einer Reihe, in der ein Buch erschienen ist.
+Falls die B�cher einer Reihe nummeriert sind, wird die entsprechende Nummer im Feld \texttt{number} angegeben.
+  \item \emph{title}\\
+    Der Titel des Werkes. Die Gro�- und Kleinschreibung kann von den Bibliographiestilen und der benutzten Sprache abh�ngig sein (wobei sie mit deutschen Bibliographiestilen beibehalten wird). Worte, die auch bei Verwendung englischer Bibliographiestile gro� geschrieben werden sollen, m�ssen in geschweifte Klammern eingefasst werden (z.\,B. \texttt{A \{German\} title}).
+  \item \emph{type}\\
+    Der Typ eines technischen Reports, z.\,B. ">Research Note"<. Bei \emph{jurabib} wird dieses Feld auch f�r den Typ einer Abschlussarbeit verwendet.
+  \item \emph{volume}\\
+    Der Band (Jahrgang) einer Zeitschrift oder der Band eines Buches in einem mehrb�ndigen Werk.
+  \item \emph{year}\\
+    Das Jahr der Ver�ffentlichung (oder bei einem unver�ffentlichten Werk das Jahr, in dem es geschrieben wurde). Normalerweise sollte im \texttt{year}-Feld nur eine vierstellige Zahl stehen, z.\,B. \texttt{1984}. Die Standardstile k�nnen aber auch mit \texttt{year}-Eintr�gen umgehen, deren letzte vier Zeichen (ausgenommen Satzzeichen) Ziffern sind, beispielsweise \texttt{(um 1984)}.
+    Dieses Feld wird f�r die meisten Eintragstypen ben�tigt.
+\end{itemize}
 
-\begin{labeling}{00.00.0000}
-\item [\emph{author}]Dieses Feld sollte alle Autoren Ihres Eintrags enthalten.
-Die Namen werden durch das Wort \emph{and} getrennt,%
-\footnote{Nicht durch Kommata, auch nicht durch >>und<<.%
-} auch wenn es mehr als zwei Autoren gibt. Jeder Name kann in zwei
-gleichwertigen Formen notiert werden:
+\subsubsection{Weitere Felder}
 
-\begin{quote}
-\texttt{Donald E. Knuth} \emph{oder} \texttt{Knuth, Donald E.}
+Bibliographie-Stile f�r \bibtex{} wurden von vielen Leuten entwickelt,
+und einige haben weitere Felder erstellt. Es folgt eine kleine Auswahl.
 
-\texttt{Eddie van Halen} \emph{oder} \texttt{van Halen, Eddie}
-\end{quote}
-Die zweite Form sollte f�r Autoren mit zwei oder mehr Nachnamen benutzt
-werden, um zwischen dem mittleren und dem Nachnamen zu unterscheiden.
-
-\item [\emph{editor}]Dieses Feld ist analog zum \emph{author}-Feld.
-\item [\emph{year}]Das Jahr der Publikation. Dieses Feld wird f�r die meisten
-Eintragstypen ben�tigt. \jabref{} akzeptiert in diesem Feld nur einen
-numerischen Wert.
-\item [\emph{bibtexkey}]Eine eindeutige Bezeichnung, um sich in \LaTeX{}-Dokumenten
-auf den Eintrag beziehen zu k�nnen. Beachten Sie, dass der Bib\TeX{}-Key
-genau mit dem Verweis im \LaTeX{}-Dokument �bereinstimmen muss (auch
-die Gro�"~\slash{}Kleinschreibung).
-\end{labeling}
-F�r weitere Erl�uterungen zu Bib\TeX{} wird verwiesen auf \cite{Markey2005,btxdoc,btxhak,Raichle2002}.
+Feldnamen, die mit einem Stern* versehen sind, werden nicht direkt von \jabref{} unterst�tzt, k�nnen aber eingebunden werden (siehe Abschnitt~\ref{CustomEntriesHelp} \nameref{CustomEntriesHelp}).
+
+\begin{itemize}
+  \item \emph{affiliation*}\\
+    Die Zugeh�rigkeit eines Autors.
+  \item \emph{abstract}\\
+    Die Zusammenfassung eines Werks.
+  \item \emph{contents*}\\
+    Ein Inhaltsverzeichnis.
+  \item \emph{copyright*}\\
+    Copyright-Informationen.
+  \item \emph{ISBN*}\\
+    Die Internationale Standardbuchnummer.
+  \item \emph{ISSN*}\\
+    Die Internationale Standardseriennummer (f�r Zeitschriften).
+  \item \emph{keywords}\\
+    Stichworte, k�nnen in \jabref{} gut zum Gruppieren verwendet werden.
+  \item \emph{language*}\\
+    Die Sprache des Werks.
+  \item \emph{location*}\\
+    Der Ort, der mit einem Werk in Verbindung steht, z.\,B. die Stadt, in der eine Konferenz stattgefunden hat.
+  \item \emph{LCCN*}\\
+    Die \emph{Library of Congress Call Number}.  Manchmal hei�t das Feld auch \texttt{lib-congress}.
+  \item \emph{mrnumber*}\\
+    Die \emph{Mathematical Reviews}-Nummer.
+  \item \emph{price*}\\
+    Der Preis.
+  \item \emph{size*}\\
+    Die physische Gr��e eines Dokuments.
+  \item \emph{url}\\
+    Der \emph{Uniform Resource Locator} (URL, "einheitlicher Quellenanzeiger"), der auf eine Webseite im Internet verweist.
+  \item \emph{urldate}\\
+    Das Datum, an dem eine Webseite zuletzt besucht wurde.
+\end{itemize}
 
 
-\clearpage
+\clearpage 
 \section{Installation}
 \secttoc
 
 \subsection{System-Voraussetzungen}
 
 \jabref{} ist in Java programmiert und somit betriebssystemunabh�ngig,
-kann prinzipiell also unter Windows, Mac OS X, Linux und anderen UNIXen
+kann prinzipiell also unter Windows, Mac OS X, Linux und anderen UNIX-Systemen
 betrieben werden. Voraussetzung ist allerdings, dass die \emph{Java
 Virtual Machine} mindestens in der Version~1.4.2 installiert ist.
 Sie ist kostenlos und kann unter \url{http://java.sun.com/} heruntergeladen
-werden. Im Normalfall sollte das \emph{Java Runtime Environment} ausreichen;
+werden. Im Normalfall sollte das \emph{Java Runtime Environment} (JRE) ausreichen;
 nur wenn Sie \jabref{} kompilieren m�chten, ben�tigen Sie das \emph{Java
-Development Kit}.
+Development Kit} (JDK).
 
 
 \subsection{Windows}
@@ -325,9 +423,9 @@ Erstellen Sie in dem Ordner, in dem Sie die Datei \emph{JabRef.jar}
 abgelegt haben, eine Batch-Datei mit dem Namen \emph{jabref-start.bat}.
 Diese Datei soll nur eine Zeile enthalten:
 
-\begin{lyxcode}
-start~javaw~-jar~JabRef.jar
-\end{lyxcode}
+\begin{lstlisting}
+start javaw -jar JabRef.jar
+\end{lstlisting}
 Mit einem Doppelklick auf die Batch-Datei starten Sie \jabref{}.
 
 
@@ -365,22 +463,22 @@ unter \url{http://jabref.sourceforge.net} und in der Datei INSTALL
 (zum Kompilieren aus den \emph{sourcen}).
 
 
-\clearpage
+\clearpage 
 \section{Funktionen}
 \secttoc
 \bigskip
 
 \noindent \label{JabRefHelp}\jabref{} ist ein Programm zur Verwaltung von
-Bib\TeX{}-Dateien. Es benutzt kein eigenes Dateiformat, d.\,h. dass
-Sie Ihre Dateien direkt im Bib\TeX{}-Format (Dateiendung \texttt{.bib})
+\bibtex{}-Dateien. Es benutzt kein eigenes Dateiformat, d.\,h. dass
+Sie Ihre Dateien direkt im \bibtex{}-Format (Dateiendung \texttt{.bib})
 laden und speichern. Sie k�nnen aber auch bibliographische Datenbanken
 in anderen Formaten in \jabref{} importieren.
 
 \jabref{} unterst�tzt Sortier- und Suchfunktionen, um einen �berblick
 �ber den Inhalt Ihrer Datei zu bekommen. Sie k�nnen der Datei ganz
 einfach neue Eintr�ge hinzuf�gen, ohne sich daran erinnern zu m�ssen,
-welche Informationen ben�tigt werden. Au�erdem kann \jabref{} Bib\TeX{}-Keys
-automatisch generieren. \jabref{} ist sehr n�tzlich, wenn Sie Bib\TeX{}
+welche Informationen ben�tigt werden. Au�erdem kann \jabref{} \bibtex{}-Keys
+automatisch generieren. \jabref{} ist sehr n�tzlich, wenn Sie \bibtex{}
 oder CiteMaker benutzen, kann aber auch f�r diejenigen sinnvoll sein,
 die andere Bibliographie-Systeme benutzen oder schlicht und einfach
 ihre Literaturquellen organisieren wollen.
@@ -396,22 +494,11 @@ aufgerufen werden.}
 arbeiten, befindet sich unter der Men�leiste und der Werkzeugleiste
 die Tableiste mit Tabs (Reitern) f�r jede Ihrer ge�ffneten Dateien.
 Wenn Sie einen dieser Tabs anklicken, erscheint eine Tabelle, die
-alle Datens�tze und einige der Datenfelder auf\textcompwordmark{}listet.
-
-Die Felder k�nnen direkt in der Tabelle bearbeitet werden, indem Sie
-einfach auf eine Zelle klicken und den Inhalt eingeben (nur m�glich,
-wenn \menu{Bearbeiten in der Tabelle zulassen} im Dialog \menu{Optionen}
-\msep{} \menu{Einstellungen} \msep{} \menu{Allgemein} ausgew�hlt
-ist). Ein Doppelklick auf eine Zelle �ffnet einen leistungsf�higeren
-Editor. Sie k�nnen mit den Pfeiltasten in der Tabelle navigieren.
-
-Die Sortierung der Tabelle erfolgt nach einem Feld Ihrer Wahl. Klicken
-Sie einfach auf die Kopfzeile einer Spalte, um die Eintr�ge nach dem
-Feld dieser Spalte zu sortieren. Klicken Sie erneut auf den Spaltenkopf,
-um die Sortierrichtung umzukehren. Eintr�ge mit gleichem Inhalt im
-ausgew�hlten Feld werden nach dem zweiten (und eventuell dem dritten)
-Kriterium sortiert. Diese Sortierkriterien k�nnen im \menu{Einstellungs}-Dialog
-festgelegt werden.
+alle Datens�tze und einige der Datenfelder auf"|listet.
+
+Mit einem Doppelklick auf eine Tabellenzeile k�nnen Sie den Inhalt bearbeiten (der \nameref{EntryEditorHelp} wird ge�ffnet). Sie k�nnen mit den Pfeiltasten innerhalb der Tabelle navigieren. Wenn Sie einen Buchstaben dr�cken, springen Sie zu dem ersten Eintrag, der mit diesem Buchstaben beginnt (abh�ngig von der Spalte, nach der Sie die Tabelle sortiert haben).
+
+Die Sortierung der Tabelle erfolgt nach einem Feld Ihrer Wahl. Sie k�nnen das Standardverhalten unter \menu{Optionen \msep{} Einstellungen \msep{} Tabellenansicht} angeben. Um die Sortierreihenfolge schnell zu �ndern, klicken Sie einfach auf die Kopfzeile einer Spalte; damit haben Sie das prim�re Sortierkriterium definiert. Klicken Sie erneut auf den Spaltenkopf, um die Sortierrichtung umzukehren. Ein weiterer Klick sorgt daf�r, dass die Spalte nicht mehr zur Sortierung herangezogen wird [...]
 
 Welche Felder (Spalten) in der Tabelle angezeigt werden sollen, k�nnen
 Sie im \menu{Einstellungs}-Dialog ausw�hlen. Auch die Breite der
@@ -428,14 +515,14 @@ und ausgeschaltet werden. Die Farbanzeige illustriert, ob Ihre Daten
 vollst�ndig sind, indem sie die Zellen wie folgt darstellt:
 
 \begin{itemize}
-\item Eine \textcolor{red}{rote} Zelle in der linken Spalte kennzeichnet
+\item Eine \colorbox{red}{\textcolor{white}{rote}} Zelle in der linken Spalte kennzeichnet
 einen unvollst�ndigen Eintrag.
-\item Eine \textcolor{yellow}{gelbe} Zelle in der linken Spalte kennzeichnet
+\item Eine \colorbox{yellow}{gelbe} Zelle in der linken Spalte kennzeichnet
 einen Eintrag, der nicht alle ben�tigten Felder selbst enth�lt, der
 aber einen Querverweis enth�lt.
-\item Eine \textcolor{blue}{blaue} Zelle kennzeichnet ein ben�tigtes Feld.
-\item Eine \textcolor{green}{gr�ne} Zelle kennzeichnet ein optionales Feld.
-\item Eine farblose (wei�e) Zelle kennzeichnet ein Feld, das von Bib\TeX{}
+\item Eine \colorbox{blue}{\textcolor{white}{blaue}} Zelle kennzeichnet ein ben�tigtes Feld.
+\item Eine \colorbox{green}{gr�ne} Zelle kennzeichnet ein optionales Feld.
+\item Eine farblose (wei�e) Zelle kennzeichnet ein Feld, das von \bibtex{}
 f�r diesen Eintragstyp nicht benutzt wird. Das Feld kann selbstverst�ndlich
 in \jabref{} bearbeitet werden.
 \end{itemize}
@@ -459,7 +546,7 @@ f
 
 \subsubsection{Einen Eintrag bearbeiten}
 
-Um den Eintrags-Editor (siehe \ref{EntryEditorHelp}) zur Bearbeitung
+Um den \nameref{EntryEditorHelp} zur Bearbeitung
 eines existierenden Eintrags zu �ffnen, klicken Sie einfach doppelt
 auf die linke Spalte der entsprechenden Zeile oder markieren den Eintrag
 und dr�cken auf ENTER. Falls \menu{Bearbeiten in der Tabelle zulassen}
@@ -468,19 +555,18 @@ nicht ausgew
 zugeh�rigen Zeile den Eintrags-Editor.
 
 
-\subsubsection{Einen Bib\TeX{}-String in einem Feld verwenden}
+\subsubsection{Einen \bibtex{}-String in einem Feld verwenden}
 
 In \jabref{} schreiben Sie den Inhalt aller Felder so, wie Sie es
 in einem Texteditor machen w�rden, mit einer Ausnahme: um einen String
 (eine Art Abk�rzung) zu verwenden, umschlie�en Sie den Namen des Strings
 mit je einem \#, z.\,B.
 
-\begin{lyxcode}
-\#jan\#~1997
-\end{lyxcode}
+\begin{lstlisting}
+\#jan\# 1997
+\end{lstlisting}
 was interpretiert wird als String mit dem Namen \texttt{jan} gefolgt
-von \texttt{1997}. Vergleichen Sie dazu auch die Hinweise zum String-Editor
-(\ref{StringEditorHelp}).
+von \texttt{1997}. Vergleichen Sie dazu auch die Hinweise zum \nameref{StringEditorHelp}.
 
 
 \subsection{Eintrags-Editor}
@@ -498,7 +584,7 @@ auf ESC dr
 \end{quote}
 Im Eintrags-Editor k�nnen Sie alle relevanten Informationen eines
 Eintrags festlegen. Der Editor �berpr�ft den Eintragstyp und zeigt
-alle ben�tigten und optionalen Felder f�r den Gebrauch mit Bib\TeX{}
+alle ben�tigten und optionalen Felder f�r den Gebrauch mit \bibtex{}
 an. Dar�ber hinaus gibt es einige Felder, die \emph{Allgemeine Felder}
 genannt werden und f�r alle Eintragstypen gelten.
 
@@ -512,7 +598,7 @@ Sie mehr Informationen dar
 
 Der Eintrags-Editor besteht in der Standardeinstellung aus f�nf Panels:
 \emph{Ben�tigte Felder}, \emph{Optionale Felder}, \emph{General},
-\emph{Abstract} und \emph{Bib\TeX{}} \emph{Quelltext}, wobei \emph{General}
+\emph{Abstract} und \emph{\bibtex{}} \emph{Quelltext}, wobei \emph{General}
 und \emph{Abstract} vom Benutzer angepasst werden k�nnen (siehe dazu
 Abschnitt~\ref{GeneralFields}). In den ersten drei Panels k�nnen
 Sie mit TAB und SHIFT-TAB zwischen den einzelnen Feldern hin- und
@@ -529,9 +615,9 @@ Au
 indem Sie >>STRG-SHIFT-$\downarrow$<< bzw. >>STRG-SHIFT-$\uparrow$<<
 oder die Pfeil-Buttons in der linken Toolbar dr�cken.
 
-Das Panel \emph{Bib\TeX{} Quelltext} zeigt, wie der Eintrag aussehen
+Das Panel \emph{\bibtex{} Quelltext} zeigt, wie der Eintrag aussehen
 wird, wenn die Datei im \texttt{bib}-Format gespeichert wird. Wenn
-Sie wollen, k�nnen Sie den Bib\TeX{} Quelltext direkt bearbeiten.
+Sie wollen, k�nnen Sie den \bibtex{} Quelltext direkt bearbeiten.
 Sobald Sie zu einem anderen Panel wechseln, STRG-S dr�cken oder den
 Eintrags-Editor schlie�en, wird \jabref{} versuchen, den Inhalt des
 Quelltext-Panels zu analysieren. Falls dabei Probleme auftreten, werden
@@ -553,14 +639,14 @@ Drag \& Drop. Sie k
 \subsubsection{�berpr�fung der Feldkonsistenz}
 
 Wenn der Inhalt eines Feldes ge�ndert wird, �berpr�ft \jabref{},
-ob der neue Inhalt akzeptiert werden kann. Bei Feldern, die von Bib\TeX{}
+ob der neue Inhalt akzeptiert werden kann. Bei Feldern, die von \bibtex{}
 genutzt werden, wird der Inhalt zum einen auf die richtige Klammerung
 mit geschweiften Klammern, aber auch auf die Benutzung des Zeichens
 \texttt{\#} hin �berpr�ft. Das >>hash<<-Symbol (im Deutschen oft
 >>Doppelkreuz<< oder >>Raute<< genannt) darf \emph{nur} paarweise
-benutzt werden, um damit den Namen eines Bib\TeX{}-Strings einzuschlie�en.
+benutzt werden, um damit den Namen eines \bibtex{}-Strings einzuschlie�en.
 Beachten Sie, dass \jabref{} nicht �berpr�ft, ob der angef�hrte String
-tats�chlich vorhanden ist (der Bib\TeX{}-Stil, den Sie benutzen, kann
+tats�chlich vorhanden ist (der \bibtex{}-Stil, den Sie benutzen, kann
 eine beliebige Anzahl von Strings definieren, die \jabref{} nicht
 kennt).
 
@@ -578,51 +664,48 @@ Mit dieser Funktion 
 und versucht Fehler aufzudecken. Mit dem \menu{�berpr�fen}-Button
 kann der Vorgang gestartet werden. Es wird eine Liste mit Hinweisen
 (Info-Icon) und m�glichen Fehlern (Ausrufezeichen-Icon) sowie dem
-entsprechenden Bib\TeX{}-Key erstellt. Wenn Sie einen Hinweis ausw�hlen,
+entsprechenden \bibtex{}-Key erstellt. Wenn Sie einen Hinweis ausw�hlen,
 erscheint der Inhalt des Feldes, das beanstandet wird. Sie k�nnen
 nun den Feldinhalt ver�ndern und die Ver�nderungen mit Klick auf die
 Schaltfl�che \menu{�bernehmen} speichern.
 
 
-\subsection{Bib\TeX{}-Keys}
+\subsection{\bibtex{}-Keys}
 
 Damit man sich in einem \LaTeX{}-Dokument auf einen Literaturverweis
-beziehen kann, braucht man einen eindeutigen Bib\TeX{}-Key. Eindeutig
+beziehen kann, braucht man einen eindeutigen \bibtex{}-Key. Eindeutig
 hei�t, dass er nur einmal vergeben sein darf. Es wird nach Gro�"~
 und Kleinschreibung unterschieden, \texttt{Yared1998} ist also nicht
 identisch mit \texttt{yared1998}. \jabref{} bietet einige M�glichkeiten,
-um auch bei gr��eren Datenbanken den �berblick �ber die Bib\TeX{}-Keys
+um auch bei gr��eren Datenbanken den �berblick �ber die \bibtex{}-Keys
 nicht zu verlieren.
 
-\tip{Falls Sie in einem \LaTeX{}-Dokument mehrere Bib\TeX{}-Dateien
+\tip{Falls Sie in einem \LaTeX{}-Dokument mehrere \bibtex{}-Dateien
 einbinden, m�ssen Sie selbst darauf achten, dass in den unterschiedlichen
-Dateien nicht mehrmals derselbe Bib\TeX{}-Key vergeben ist. Nutzen
+Dateien nicht mehrmals derselbe \bibtex{}-Key vergeben ist. Nutzen
 Sie deshalb am besten die Funktion \menu{Extras} \msep{} \menu{Neue Teildatei aus AUX-Datei}.}
-
-Der einfachste Weg, einen eindeutigen Bib\TeX{}-Key zu bekommen, ist
+Der einfachste Weg, einen eindeutigen \bibtex{}-Key zu bekommen, ist
 das automatische Erzeugen, das Sie mit der Tastenkombination STRG-G
 oder mit dem Zauberstab-Button im Eintrags-Editor veranlassen k�nnen.
 Falls Sie sich nicht im Eintrags-Editor befinden, werden mit Hilfe
 von STRG-G oder dem Zauberstab-Button aus der Men�leiste f�r alle
-Eintr�ge der Datei Bib\TeX{}-Keys erzeugt. Falls dabei Keys �berschrieben
+Eintr�ge der Datei \bibtex{}-Keys erzeugt. Falls dabei Keys �berschrieben
 werden, gibt \jabref{} eine Warnmeldung aus.
 
-Wie die Bib\TeX{}-Keys aussehen, die \jabref{} automatisch generiert,
-und wie Sie dieses Aussehen ver�ndern k�nnen, erfahren Sie unter Abschnitt~\ref{LabelPatterns}.
+Wie die \bibtex{}-Keys aussehen, die \jabref{} automatisch generiert,
+und wie Sie dieses Aussehen ver�ndern k�nnen, erfahren Sie unter Abschnitt~\ref{LabelPatterns} \nameref{LabelPatterns}.
 
 
 \subsection{Suchfunktionen}
 
+\label{SearchHelp}
 \begin{quote}
-\label{SearchHelp}\emph{STRG-F �ffnet oder aktiviert den Suchdialog.
+\emph{STRG-F �ffnet oder aktiviert den Suchdialog.
 Dr�ckt man mehrmals auf STRG-F, so werden die verschiedenen Suchmodi
 ausgew�hlt. Mit STRG-SHIFT-F �ffnet oder aktiviert man den Suchdialog
 und w�hlt gleichzeitig die direkte Suche aus. Bei der direkten Suche
 springt man mit STRG-F oder STRG-SHIFT-F zum n�chsten Treffer.}
 \end{quote}
-Es gibt drei verschiedene Suchmethoden in \jabref{}: die direkte
-Suche, die Markier-Suche und die Sortier-Suche.
-
 
 \subsubsection{Direkte Suche}
 
@@ -636,31 +719,21 @@ Sortierung Ihrer Datei. Um die direkte Suche zu verlassen, dr
 Sie ESC oder klicken Sie auf \menu{Zur�cksetzen}.
 
 
-\subsubsection{Markier-Suche}
-
-Wenn Sie die Suchmethode \emph{Markieren} w�hlen, sucht das Programm
-in Ihrer Datei nach allen Vorkommen ihres Suchbegriffs, sobald Sie
-auf ENTER dr�cken. Die Treffer werden indirekt markiert, d.\,h. alle
-Nicht-Treffer werden grau hinterlegt. Haben Sie zus�tzlich die Option
-\menu{Treffer ausw�hlen} aktiviert (im \menu{Einstellungen}-Men�
-des Suchdialogs), dann werden die Treffer ausgew�hlt.
+\subsubsection{Normale Suche}
 
+Hierbei sucht das Programm nach allen Vorkommen der W�rter ihres Suchausdrucks, sobald Sie ENTER dr�cken. Nur Eintr�ge, die alle W�rter enthalten, gelten als Treffer. Um nach festen Ausdr�cken zu suchen, m�ssen Sie die W�rter in doppelte Anf�hrungszeichen einfassen. Zum Beispiel findet die Suchanfrage \texttt{progress \textquotedbl marine acquaculture\textquotedbl} Eintr�ge, die sowohl das wort ">progress"< als auch den Ausdruck ">marine acquaculture"< aufweisen. Alle Eintr�ge, die keine [...]
 
-\subsubsection{Sortier-Suche}
+\subsubsection{Suchoptionen}
 
-Die Suche mit der Methode \emph{Oben einsortieren} ist �hnlich wie
-die Suche mit Markierung, nur dass die Treffer automatisch an den
-Anfang der Tabelle sortiert werden. Eintr�ge, die nicht mit dem Suchbegriff
-�bereinstimmen, werden unter den Treffern aufgelistet und zus�tzlich
-grau hinterlegt. Um die Anzeige der Suchergebnisse abzuschalten, dr�cken
-Sie ESC oder klicken auf \emph{Zur�cksetzen}.
+Der \menu{Einstellungen}-Button im Suchdialog �ffnet ein Men�, in
+dem man mehrere Optionen (de)aktivieren kann: das Beachten von Gro�-
+und Kleinschreibung, das Nutzen regul�rer Ausdr�cke sowie das Ausw�hlen
+der Suchergebnisse.
 
 \tip{Suchen Sie mit der Option \menu{Treffer ausw�hlen} und dr�cken
-anschlie�end STRG-M, so haben Sie alle Treffer markiert (vgl. Abschnitt~\ref{MarkingHelp}:
-Markieren von Eintr�gen) und k�nnen z.\,B. eine weitere Suche durchf�hren,
+anschlie�end STRG-M, so haben Sie alle Treffer markiert (vgl. Abschnitt ">\nameref{MarkingHelp}"<) und k�nnen z.\,B. eine weitere Suche durchf�hren,
 ohne die bisherigen Ergebnisse zu >>verlieren<<.}
 
-
 \subsubsection{Feldbezeichner und logische Operatoren}
 
 \label{SearchHelp_advanced}Um nur einige bestimmte Felder zu durchsuchen
@@ -668,9 +741,9 @@ und\slash{}oder logische Operatoren im Suchbegriff zu benutzen, wird
 eine spezielle Syntax zur Verf�gung gestellt. Um beispielsweise nach
 Eintr�gen mit dem Autor >>Miller<< zu suchen, geben Sie
 
-\begin{lyxcode}
-author~=~miller
-\end{lyxcode}
+\begin{lstlisting}
+author = miller
+\end{lstlisting}
 in das Suchfeld ein. \emph{(Achtung! Das funktioniert nicht bei der
 direkten Suche!)} Falls der Suchbegriff Leerzeichen enth�lt, schlie�en
 Sie ihn in Anf�hrungszeichen ein. Benutzen Sie \emph{nie} Leerzeichen
@@ -678,17 +751,15 @@ in dem Feldbezeichner. Mehrere Feldbezeichner werden durch >>|<<
 voneinander getrennt. Um beispielsweise nach Eintr�gen �ber Karl den
 Gro�en zu suchen, geben Sie folgendes ein:
 
-\begin{lyxcode}
-title|keywords~=~\char`\"{}Karl~der~Gro�e\char`\"{}
-\end{lyxcode}
+\begin{lstlisting}
+title|keywords = "Karl der Gro�e"
+\end{lstlisting}
 Sie k�nnen die logischen Operatoren AND, OR und NOT sowie Klammern
 verwenden:
 
-\begin{lyxcode}
-(author~=~miller~OR~title|keywords~=~\char`\"{}Karl~der~Gro�e\char`\"{})~
-
-AND~NOT~author~=~brown
-\end{lyxcode}
+\begin{lstlisting}
+(author = miller OR title|keywords = "Karl der Gro�e") AND NOT author = brown
+\end{lstlisting}
 \ldots{} sucht beispielsweise nach Eintr�gen, in denen entweder der
 Autor >>Miller<< hei�t oder im \emph{title}- oder \emph{keywords}-Feld
 der Begriff >>Karl der Gro�e<< steht; gleichzeitig werden die Eintr�ge
@@ -701,29 +772,21 @@ man \texttt{==} oder \texttt{matches} (>>
 enthalten ist. Um nach Eintr�gen eines bestimmten Typs zu suchen,
 gibt es ein Pseudofeld namens \emph{entrytype}:
 
-\begin{lyxcode}
-entrytype~=~thesis
-\end{lyxcode}
+\begin{lstlisting}
+entrytype = thesis
+\end{lstlisting}
 \ldots{} findet Eintr�ge, deren Typ (wie in der Spalte \emph{Entrytype}
 dargestellt) das Wort >>thesis<< enth�lt (z.\,B. >>phdthesis<<
 und >>mastersthesis<<). Ebenso erlaubt das Pseudofeld \emph{bibtexkey}
-die Suche nach Bib\TeX{}-Keys, z.\,B.:
-
-\begin{lyxcode}
-bibtexkey~=~miller2005
-\end{lyxcode}
-
-\subsubsection{Suchoptionen}
-
-Der \menu{Einstellungen}-Button im Suchdialog �ffnet ein Men�, in
-dem man mehrere Optionen (de)aktivieren kann: das Beachten von Gro�-
-und Kleinschreibung, das Nutzen regul�rer Ausdr�cke sowie das Ausw�hlen
-der Suchergebnisse.
+die Suche nach \bibtex{}-Keys, z.\,B.:
 
+\begin{lstlisting}
+bibtexkey = miller2005
+\end{lstlisting}
 
 \subsection{Gruppen}
 
-Mit Gruppen k�nnen Sie Ihre Bib\TeX{}-Datei in einer Baumstruktur
+Mit Gruppen k�nnen Sie Ihre \bibtex{}-Datei in einer Baumstruktur
 anordnen, vergleichbar mit einer Dateistruktur in Ordnern und Unterordnern.
 Die beiden Hauptunterschiede sind:
 
@@ -751,16 +814,17 @@ benutzerabh
 
 
 \subsubsection{Die Gruppenansicht}
-
-Die Gruppenansicht wird im linken Bereich des Bildschirms angezeigt.
+\begin{quote}
+\emph{Die Gruppenansicht wird im linken Bereich des Bildschirms angezeigt.
 Sie kann mit der Tastenkombination STRG-SHIFT-G oder dem Gruppen-Button
 in der Toolbar ein- und ausgeblendet werden. Die Gruppenansicht verf�gt
 �ber mehrere Schaltfl�chen, aber die meisten Funktionen werden �ber
 das Kontextmen� angesteuert (also mit der rechten Maustaste). Drag\,\&\,Drop
-wird ebenfalls unterst�tzt.
+wird ebenfalls unterst�tzt.}
+\end{quote}
 
 
-\subsection{Einige kurze Beispiele}
+\subsubsection{Einige kurze Beispiele}
 
 Sie m�chten vielleicht~\ldots{}
 
@@ -833,7 +897,7 @@ anderen Gruppen sollten nun markiert sein.
 
 \subsubsection{Arten von Gruppen}
 
-In \jabref{}~1.8 gibt es vier verschiedene Arten von Gruppen:
+In \jabrefversion{} gibt es vier verschiedene Arten von Gruppen:
 
 \begin{enumerate}
 \item Die Gruppe \emph{Alle Eintr�ge}, die~-- wie der Name vermuten l�sst~--
@@ -842,7 +906,7 @@ noch gel
 \item \emph{Statische Gruppen} verhalten sich wie Ordner auf einer Festplatte
 und beinhalten nur die Eintr�ge, die Sie ihnen explizit zuweisen.
 \item \emph{Dynamische Gruppen basierend auf einem Stichwort} beinhalten
-Eintr�ge, die in einem bestimmten Bib\TeX{}-Feld (z.\,B. \emph{keywords})
+Eintr�ge, die in einem bestimmten \bibtex{}-Feld (z.\,B. \emph{keywords})
 ein bestimmtes Stichwort (z.\,B. \emph{elektrisch}) aufweisen. Diese
 Methode ben�tigt kein manuelles Zuweisen der Eintr�ge, sondern nutzt
 die bereits in der Datei vorhandenen Informationen. Wenn alle Eintr�ge
@@ -853,7 +917,7 @@ Eintr
 wird dieselbe Syntax verwendet wie beim Suchen (siehe Abschnitt~\ref{SearchHelp}).
 Diese Syntax (die auf S.\,\pageref{SearchHelp_advanced} genauer
 beschrieben wird) unterst�tzt logische Operatoren (AND, OR, NOT) und
-erlaubt es, in einem oder mehreren Bib\TeX{}-Feldern zu suchen. Dadurch
+erlaubt es, in einem oder mehreren \bibtex{}-Feldern zu suchen. Dadurch
 ist eine flexiblere Definition von Gruppen m�glich als mit einer Stichwortsuche
 (z.\,B. \texttt{author=smith AND title=elektrisch}).
 \end{enumerate}
@@ -893,8 +957,8 @@ w
 k�nnen keine weiteren Optionen angegeben werden.
 
 Diese Methode des Gruppierens setzt voraus, dass alle Eintr�ge einen
-eindeutigen Bib\TeX{}-Key haben. Im Falle von fehlenden oder doppelten
-Bib\TeX{}-Keys kann das Zuweisen der betreffenden Eintr�ge in k�nftigen
+eindeutigen \bibtex{}-Key haben. Im Falle von fehlenden oder doppelten
+\bibtex{}-Keys kann das Zuweisen der betreffenden Eintr�ge in k�nftigen
 Sitzungen nicht korrekt wiederhergestellt werden.
 
 
@@ -910,7 +974,7 @@ Datei vornehmen. Es gibt zwei m
 \item Ein Feld nach einem Stichwort durchsuchen
 
 
-Diese Methode gruppiert Eintr�ge, bei denen ein bestimmtes Bib\TeX{}-Feld
+Diese Methode gruppiert Eintr�ge, bei denen ein bestimmtes \bibtex{}-Feld
 (z.\,B. \emph{keywords}) einen bestimmten Suchausdruck (z.\,B. \emph{elektrisch})
 enth�lt. Damit dies funktioniert, muss das Feld, nach dem sortiert
 wird, nat�rlich in jedem Eintrag vorhanden und sein Inhalt fehlerfrei
@@ -947,22 +1011,19 @@ Standardm
 im Gruppenbaum. Ist eine Gruppe ausgew�hlt, wird nur der Inhalt dieser
 Gruppe angezeigt. Es ist jedoch~-- besonders beim Verwenden dynamischer
 Gruppen~-- oft n�tzlich, eine Untergruppe zu erstellen, die \emph{ihre
-Obergruppe verfeinert}.%
-\footnote{In \jabref{}~1.8.1 sind die entsprechenden Optionen noch nicht ins
-Deutsche �bersetzt. Gemeint sind hier \emph{refining (sub-)groups}.%
-} Wenn diese Untergruppe ausgew�hlt wird, werden alle Eintr�ge dieser
+Obergruppe verfeinert}. Wenn diese Untergruppe ausgew�hlt wird, werden alle Eintr�ge dieser
 Gruppe und ihrer Obergruppe angezeigt. Erstellen Sie z.\,B. eine
 Obergrupe, die Eintr�ge mit dem Stichwort \emph{Verteilung} enth�lt,
-sowie eine verfeinernde Untergruppe mit Eintr�gen, die das Stichwort
+sowie eine einbeziehende Untergruppe mit Eintr�gen, die das Stichwort
 \emph{Gau�} enthalten. Wenn Sie nun die Untergruppe ausw�hlen, werden
 alle Eintr�ge angezeigt, die beiden Bedingungen entsprechen, also
 alle, die mit Gau�'scher Verteilung zu tun haben. Indem Sie nun eine
 weitere Untergruppe f�r \emph{Laplace} anlegen, die dieselbe Obergruppe
 verfeinert, k�nnen Sie die Gruppierung einfach erweitern. Im Gruppenbaum
-haben solche Gruppen, die ihre Obergruppen verfeinern, ein spezielles
+haben solche Gruppen, die ihre Obergruppen einbeziehen, ein spezielles
 Icon. (Dieses Verhalten kann in den Einstellungen abgestellt werden.)
 
-Das logische Gegenst�ck zu einer solchen verfeinernden Untergruppe
+Das logische Gegenst�ck zu einer solchen einbeziehenden Untergruppe
 ist eine Gruppe, die \emph{ihre Untergruppen ber�cksichtigt}.%
 \footnote{Im Englischen \emph{including (super-)groups}.%
 } Wird sie ausgew�hlt, werden nicht nur die Eintr�ge dieser Gruppe,
@@ -1046,17 +1107,12 @@ R
 ist ein h�ndisches Aktualisieren n�tig.
 
 
-\paragraph{Verfeinernde Untergruppen und einbeziehende Obergruppen mischen%\protect%
-%\footnote{In \jabref{}~1.8.1 sind die entsprechenden Optionen noch nicht ins
-%Deutsche �bersetzt. Gemeint sind hier \emph{refining (sub-)groups}
-%und \emph{including (super-)groups}.%
-%}
-}
+\paragraph{Einbeziehende Unter- und Obergruppen mischen}
 
-Wenn eine verfeinernde Gruppe die Untergruppe von einer Gruppe ist,
+Wenn eine einbeziehende Gruppe die Untergruppe von einer Gruppe ist,
 die ihre Untergruppen ber�cksichtigt~-- also sozusagen die Geschwister
-der verfeinernden Gruppe~--, dann werden diese Geschwister ignoriert,
-sobald die verfeinernde Gruppe ausgew�hlt wird.
+der einbeziehenden Gruppe~--, dann werden diese Geschwister ignoriert,
+sobald die einbeziehende Gruppe ausgew�hlt wird.
 
 
 \subsection{Markieren von Eintr�gen}
@@ -1085,14 +1141,13 @@ einmal genauer ansehen m
 
 
 \subsection{String-Editor}
-
 \label{StringEditorHelp}
 
 \begin{quote}
 \emph{Zugriff �ber das Men� \menu{BibTeX}} \msep{} \emph{\menu{Strings bearbeiten}
 oder durch Klick auf die Schaltfl�che \menu{Strings bearbeiten}.}
 \end{quote}
-\emph{Strings} sind das Bib\TeX{}-�quivalent zu Konstanten in einer
+\emph{Strings} sind das \bibtex{}-�quivalent zu Konstanten in einer
 Programmiersprache. Jeder String wird durch einen eindeutigen \emph{Namen}
 und einen \emph{Inhalt} festgelegt. Der Name kann an anderer Stelle
 in der Datei benutzt werden, um den Inhalt wiederzugeben.
@@ -1109,20 +1164,64 @@ ausgegeben wird.
 Der Verweis auf einen String kann an jeder Stelle in einem beliebigen
 Feld erscheinen, wobei der Name des Strings immer von einem Paar \texttt{\#}-Zeichen
 eingeschlossen werden muss. Diese Syntax gilt nur f�r \jabref{} und
-weicht ein wenig von der Bib\TeX{}-Syntax ab, die erzeugt wird, wenn
+weicht ein wenig von der \bibtex{}-Syntax ab, die erzeugt wird, wenn
 Sie Ihre Datei speichern.
 
 In derselben Weise kann man auch im Inhalt eines Strings auf einen
 anderen String verweisen, vorausgesetzt, dass der String, auf den
 verwiesen wird, bereits \emph{vorher} definiert ist.
 
-W�hrend die Reihenfolge der Strings in Ihrer Bib\TeX{}-Datei in einigen
+W�hrend die Reihenfolge der Strings in Ihrer \bibtex{}-Datei in einigen
 F�llen wichtig ist, brauchen Sie sich bei der Benutzung von \jabref{}
 dar�ber keine Gedanken zu machen. Die Strings werden in alphabetischer
 Reihenfolge im String-Editor aufgelistet und in derselben Reihenfolge
-gespeichert, au�er wenn eine andere Reihenfolge von Bib\TeX{} verlangt
+gespeichert, au�er wenn eine andere Reihenfolge von \bibtex{} verlangt
 wird.
 
+\subsection{Abk�rzung von Zeitschriftentiteln}
+\label{JournalAbbreviations}
+\begin{quote}
+\emph{Diese Funktion kann unter \menu{Optionen \msep{} Abk�rzungen der Zeitschriften verwalten} eingestellt werden.}
+\end{quote}
+\jabref{} kann automatisch zwischen Zeitschriftentiteln in abgek�rzter und ausf�hrlicher Form hin- und herschalten, sofern die Titel in einer Ihrer Zeitschriftenlisten enthalten ist. Sie k�nnen mehrere dieser Listen benutzen, die Sie als externe Textdateien anlegen.
+
+\subsubsection{Benutzungshinweise}
+
+Die Abk�rzung von Zeitschriftentiteln k�nnen Sie vom Eintragseditor oder vom Men� \menu{Extras} aus ein- und ausschalten. Im Eintragseditor benutzen Sie dazu den Button \menu{Abk�rzung an-/abschalten} neben dem \emph{Journal}-Feld. Es wird zwischen drei Modi hin- und hergeschaltet:
+\begin{itemize}
+    \item Kompletter Name, z.\,B. ">Aquacultural Engineering"<
+    \item \caps{ISO}-Abk�rzung, z.\,B. ">Aquacult. Eng."<
+    \item \caps{MEDLINE}-Abk�rzung, z.\,B. ">Aquacult Eng"<
+\end{itemize}
+Falls der Zeitschriftenname sich nicht in Ihren Zeitschriftenlisten findet, wird das Feld nicht ver�ndert.
+
+Um die Zeitschriftennamen mehrerer Eintr�ge auf einmal zu konvertieren, k�nnen Sie eine beliebige Anzahl von Eintr�gen ausw�hlen und im Men� \menu{Extras} einen der Eintr�ge \menu{Zeitschriftennamen abk�rzen (ISO)}, \menu{Zeitschriftennamen abk�rzen (MEDLINE)} und \menu{Abk�rzung der Zeitschriften aufheben} w�hlen.
+Diese drei Aktionen sorgen daf�r, dass bei allen ausgew�hlten Eintr�gen die Zeitschriftennamen, die in den Zeitschriftenlisten gefunden werden konnten, abgek�rzt oder komplett ausgeschrieben werden.
+
+\subsubsection{Zeitschriftenlisten verwalten}
+
+Sie k�nnen mehrere Zeitschriftenlisten als externe Textdateien benutzen, die mit \jabref{} verlinkt sind. Die prim�re Liste kann in \jabref{} selbst verwaltet werden.
+
+\paragraph{Ihre pers�nliche Zeitschriften-Abk�rzungsliste}
+
+Ihre pers�nliche Liste verwalten Sie im oberen Teil des \menu{Abk�rzung der Zeitschriftennamen}-Dialogs.
+W�hlen Sie \menu{Neue Datei} und geben einen Dateinamen ein oder klicken auf den \menu{Durchsuchen}-Button. Wenn Sie bereits eine Datei haben, die Sie als Grundlage nehmen wollen, w�hlen Sie stattdessen \menu{Bestehende Datei} und benutzen den \menu{Durchsuchen}-Button zum Ausw�hlen dieser Datei. Die Tabelle zeigt dann den Inhalt der Liste, die Sie ausgew�hlt haben.
+
+Sie k�nnen mit Hilfe der \menu{+} und \menu{--} Buttons an der rechten Seite Eintr�ge hinzuf�gen oder entfernen. F�r jeden Eintrag m�ssen Sie den vollst�ndigen Zeitschriftennamen und die ISO-Abk�rzung angeben (z.\,B. ">Aquacultural Engineering"< und ">Aquacult. Eng."<). Mit einem Doppelklick auf die Tabellenzeile k�nnen Sie die Eintr�ge bearbeiten.
+
+Sobald Sie auf \menu{OK} klicken (oder wenn Sie eine bestehende Datei ausgew�lt haben), enth�lt die Tabelle mindestens eine Zeile. Der Tabelleninhalt wird in die ausgew�hlte Datei geschrieben und die Zeitschriftenliste von \jabref{} wird aktualisiert.
+
+\paragraph{Externe Zeitschriftenlisten}
+
+Zus�tzlich zu Ihrer pers�nlichen Liste k�nnen Sie mehrere externe Listen verlinken. Diese Verkn�pfungen werden im unteren Teil des \menu{Abk�rzung der Zeitschriftennamen}-Dialogs verwaltet. Externe Listen sind den pers�nlichen Listen �hnlich~-- der einzige Unterschied ist, dass Sie nicht mit \jabref{} selbst verwaltet werden k�nnen.
+
+Um eine externe Liste hinzuzuf�gen, klicken Sie zun�chst auf den \menu{+} Knopf, falls n�tig (das f�gt eine weitere Zeile hinzu). Dann benutzen Sie entweder den \menu{Durchsuchen}- oder den \menu{Herunterladen}-Button.
+    \begin{itemize}
+    \item Mit dem \menu{Durchsuchen}-Knopf k�nnen Sie eine auf Ihrem Computer bestehende Datei ausw�hlen.
+    \item Mit dem \menu{Herunterladen}-Knopf k�nnen Sie eine Liste aus dem Internet herunterladen, indem Sie eine \caps{URL} angeben. Die Datei wird auf Ihrem Computer gespeichert und mit \jabref{} verlinkt.
+    Die \caps{URL} ist standardm��ig die Adresse einer Zeitschriftenliste auf der \jabref{}-Homepage. Diese Liste ist unvollst�ndig, wird in Zukunft aber ausgebaut.
+    \end{itemize}
+Jeder Eintrag in Ihrer pers�nlichen Liste �berschreibt einen Eintrag mit demselben vollst�ndigen Zeitschriftennamen in einer Ihrer externen Listen. In �hnlicher Weise werden die externen Listen in der Reihenfolge, wie sie aufgelistet werden, abgearbeitet.
 
 \subsection{Wortauswahl verwalten}
 
@@ -1134,7 +1233,7 @@ indem Sie diese Felder im oberen Teil des Dialogs \menu{Extras} \msep{}
 \menu{Wortauswahl verwalten} hinzuf�gen.
 
 Die Wortauswahl gilt nur f�r die jeweilige Datei und wird daher zusammen
-mit den Literaturangaben in der Bib\TeX{}-Datei gespeichert. Jedes
+mit den Literaturangaben in der \bibtex{}-Datei gespeichert. Jedes
 Feld mit Wortauswahl erh�lt im Eintrags-Editor einen gesonderten Bereich
 mit einer Auswahlliste und der Schaltfl�che \menu{Verwalten}. Wenn
 Sie die Auswahlliste mit der Maus anklicken, erscheint eine Liste
@@ -1159,7 +1258,7 @@ Datei hinzugef
 
 Im Kontrollfenster k�nnen Sie Eintr�ge entfernen, die nicht �bernommen
 werden sollen, und einige einfache Arbeiten durchf�hren wie etwa das
-Generieren von Bib\TeX{}-Keys f�r die Eintr�ge oder das Zuordnen von
+Generieren von \bibtex{}-Keys f�r die Eintr�ge oder das Zuordnen von
 Eintr�gen zu Gruppen. Wenn Sie in eine bestehende Datei importieren,
 ist es oftmals leichter, diese Arbeiten durchzuf�hren, bevor die neuen
 Eintr�ge zwischen die bereits bestehenden sortiert wurden.
@@ -1211,12 +1310,12 @@ installiert.) Klicken Sie schlie
 den Importvorgang zu starten.
 
 \end{enumerate}
-Der EndNote Exportfilter ordnet Bib\TeX{}-Eintragstypen folgenden
+Der EndNote Exportfilter ordnet \bibtex{}-Eintragstypen folgenden
 EndNote-Re\-fe\-renz\-ty\-pen zu:
 
 \medskip{}
 \begin{center}\begin{tabular}{ll}
-\textbf{Bib\TeX{}-Eintragstyp}&
+\textbf{\bibtex{}-Eintragstyp}&
 \textbf{Endnote-Referenztyp}\tabularnewline
 misc, other&
 Generic\tabularnewline
@@ -1251,7 +1350,7 @@ und demzufolge unpassend formatiert.
 
 \subsubsection{Erweiterte Benutzung: EndNote Extras}
 
-\label{EndNote_erweitert}Einige Felder, die von Bib\TeX{} genutzt
+\label{EndNote_erweitert}Einige Felder, die von \bibtex{} genutzt
 werden, geh�ren nicht zu EndNotes vorgegebenen Referenztypen. W�hrend
 der Import in \jabref{} und der Export nach \jabref{} ohne ein �ndern
 der Referenztypen funktioniert, werden die Feldnamen in EndNote nicht
@@ -1270,8 +1369,8 @@ Sie den Angaben in der Datei \texttt{readme.txt}.
 
 \subsubsection[EndNote -> JabRef]{EndNote $\to$~\jabref{}}
 
-EndNote hat einen Export-Stil Bib\TeX{}, der allerdings nicht alle
-Eintragstypen und Felder von Bib\TeX{} und auch nicht die zus�tzlich
+EndNote hat einen Export-Stil \bibtex{}, der allerdings nicht alle
+Eintragstypen und Felder von \bibtex{} und auch nicht die zus�tzlich
 von \jabref{} genutzten Allgemeinen Felder (\emph{pdf}, \emph{owner},
 \emph{key} usw.) unterst�tzt. Falls Sie diese Felder nutzen wollen,
 extrahieren Sie die EndNote Extras (\menu{Datei} \msep{} \menu{Exportieren}
@@ -1308,7 +1407,7 @@ Anschlie
 \item Exportieren Sie Ihre Datei in das \texttt{.sxc}-Format.
 \item Starten Sie OpenOffice.org.
 \item W�hlen Sie \menu{Extras} \msep{} \menu{Datenquellen}.
-\item W�hlen Sie die \emph{Bibliography}-Datei und �ndern ihren Namen z.B. in \emph{Bibliographie-alt}.
+\item W�hlen Sie die \emph{Bibliography}-Datei und �ndern ihren Namen z.\,B. in \emph{Bibliographie-alt}. 
 \item Dr�cken Sie \menu{Anwenden}.
 \item Klicken Sie \menu{Neue Datenquelle}. Ein neuer Eintrag erscheint. �ndern Sie den Namen zu \emph{Bibliography}.
 \item �ndern Sie den \menu{Dateityp} zu \menu{Tabelle}. Klicken Sie den \menu{\ldots}-Button in der Zeile \menu{Datenquellen URL}. W�hlen Sie die \texttt{.sxc}-Datei, die Sie exportiert haben.
@@ -1342,7 +1441,7 @@ wird bei jedem neuen Zuweisen von Textbereichen das Feld 
 
 Bereits zugewiesene Textteile werden im Tab \menu{Importtext} blau
 hervorgehoben. Um zu kontrollieren, welche Textbereiche Sie einem
-bestimmten Bib\TeX{}-Feld zugewiesen haben, w�hlen Sie das Feld im
+bestimmten \bibtex{}-Feld zugewiesen haben, w�hlen Sie das Feld im
 rechten Bereich aus; der zugeordnete Text wird nun rot hervorgehoben.
 
 Sie k�nnen sich das Ergebnis des Importvorgangs jederzeit im Tab \menu{BibTeX Quelltext}
@@ -1351,9 +1450,9 @@ werden; das ist erst m
 und ein neuer Eintrag angelegt wurde. Auf m�gliche Fehler werden Sie
 im Tab \menu{Hinweise und Warnungen} aufmerksam gemacht.
 
-Haben Sie alle Textstellen den gew�nschten Bib\TeX{}-Feldern zugewiesen,
+Haben Sie alle Textstellen den gew�nschten \bibtex{}-Feldern zugewiesen,
 klicken Sie auf die Schaltfl�che \menu{�bernehmen}. Nun erstellt
-\jabref{} den neuen Eintrag, der allerdings noch keinen Bib\TeX{}-Key
+\jabref{} den neuen Eintrag, der allerdings noch keinen \bibtex{}-Key
 hat.
 
 
@@ -1413,7 +1512,7 @@ referenziert, so dass Sie problemlos PDF-Verzeichnisse verschieben
 oder mit mehreren Benutzern von verschiedenen Netzwerkarbeitspl�tzen
 aus an derselben Datei arbeiten k�nnen.
 
-Wenn Sie Ihren PDF-Dateien dann noch Namen geben, die mit dem Bib\TeX{}-Key
+Wenn Sie Ihren PDF-Dateien dann noch Namen geben, die mit dem \bibtex{}-Key
 des entsprechenden Eintrags �bereinstimmen (plus \texttt{.pdf} im
 Dateinamen), sucht \jabref{} in Ihrem Standard-PDF-Ordner und dessen
 Unterordnern nach der richtigen PDF-Datei. Sobald die korrekt benannte
@@ -1426,26 +1525,132 @@ Wenn Sie eine PDF-Datei wie beschrieben benennen, k
 in diesem Fall allerdings, dass das PDF-Icon in der Tabellenansicht
 nicht angezeigt wird, solange das PDF-Feld leer bleibt.
 
+\subsubsection{Dateispezifische PDF- und PS-Verzeichnisse}
 
-\subsection[JabRef und Online-Datenbanken]{\jabref{} und Online-Datenbanken}
+Sie k�nnen f�r jede Datei eigene PDF- und PS-Verzeichnisse angeben (\menu{Datei \msep{} Eigenschaften der Datei}). Diese Verzeichnisse ersetzen dann die Standardverzeichnisse.
+
+\subsubsection{Die Suche mit regul�ren Ausdr�cken f�r automatische Verkn�pfungen nutzen}
+\label{RegularExpressionSearch}
+
+Wenn Sie Dateinamen verwenden, die dem bibtexkey erg�nzt um die Dateiendung entsprechen, findet \jabref{} diese Dateien automatisch.
+
+Ab Version~2.2 ist mit Hilfe von regul�ren Ausdr�cken eine gr��ere Flexibilit�t beim Benennen der Dateien gew�hrleistet. In den meisten F�llen d�rfte das Standardverhalten bereits ausreichend sein.
+
+In den Einstellungen zu externen Programmen (\menu{Optionen \msep{} Einstellungen \msep{} Externe Programme}) findet sich eine Option ">Suche mit regul�rem Ausdruck benutzen"<. Wenn Sie diese Option aktivieren, k�nnen Sie f�r die Suche in PDF-Verzeichnissen einen eigenen regul�ren Ausdruck angeben.
 
+Die folgende Syntax wird verwendet:
+
+\begin{labeling}{MextensionM}
+  \item [\texttt{*}] Suche in allen direkten Unterverzeichnissen, NICHT im aktuellen Verzeichnis und in Unterverzeichnissen zweiter oder tieferer Ebene.
+  \item [\texttt{**}] Rekursive Suche in allen Unterverzeichnissen UND im aktuellen Verzeichnis.
+  \item [\texttt{.} und  \texttt{..}] Das aktuelle Verzeichnis und das Elternverzeichnis (eine Ebene h�her).
+  \item [\texttt{{[}title{]}}] Alle Ausdr�cke in eckigen Klammern werden durch den Inhalt des entsprechenden Felds ersetzt.
+  \item [\texttt{{[}extension{]}}] Wird durch die Dateiendung des Feldes, das Sie benutzen, ersetzt.
+  \item Anderer Text wird als regul�rer Ausdruck interpretiert. Aber Vorsicht: \emph{backslashes} m�ssen mit einem weiteren \emph{backslash} \emph{escaped} werden (\texttt{\textbackslash\textbackslash}), damit sie nicht mit Separatoren in Pfad-Angaben verwechselt werden.
+\end{labeling}
+Der Standard ist \lstinline{**/.*[bibtexkey].*\\.[extension]}. Damit wird in allen Unterverzeichnissen des Ordners der entsprechenden Dateiendung (z.\,B. das PDF-Verzeichnis) nach allen Dateien mit der richtigen Dateiendung gesucht, die den bibtexkey in ihrem Namen haben.
+
+\subsection{XMP-Metadaten}
+\label{XMPHelp}
+
+XMP ist ein Standard, der von Adobe Systems entwickelt wurde, um Metadaten (Daten, die Informationen �ber andere Daten enthalten) in Dateien zu speichern. Ein bekanntes Beispiel f�r Metadaten sind ID3-Tags, die zur Beschreibung von K�nstlern, Albumtiteln und Liednamen einer MP3-Datei verwendet werden. Mit Hilfe von Metadaten k�nnen MP3-Dateien unabh�ngig von ihrem Dateinamen identifiziert und z.B. von MP3-Playern ausgelesen und angezeigt werden.
+
+Mit der XMP-Unterst�tzung versucht das \jabref{}-Team, die Vorteile von Metadaten in die Welt der Literaturmanager einzuf�hren. Sie k�nnen \menu{XMP schreiben} im \menu{Allgemein}-Tab des Eintragseditors w�hlen und damit alle \bibtex{}-Informationen in die verlinkte PDF-Datei schreiben. Wenn Sie diese PDF-Datei mit anderen austauschen, k�nnen diese die Datei in das \jabref{}-Fenster ziehen und haben damit alle Informationen zur Verf�gung, die Sie eingegeben haben.
+
+\subsubsection{Benutzung}
+
+Um die XMP-Funktionen in \jabref{} zu nutzen, gehen Sie folgenderma�en vor:
+
+\begin{itemize}
+  \item Zum \emph{Importieren einer einzelnen PDF-Datei mit Metadaten} w�hlen Sie \menu{Datei \msep{} Importieren in {[}neue{|}aktuelle{]} Datenbank} und im anschlie�enden Dialog als Dateiformat \menu{PDF mit XMP-Anmerkungen} aus. Sie k�nnen die PDF-Datei stattdessen auch mit der Maus auf das Hauptfenster von \jabref{} ziehen.
+  \item Um \emph{bibliographische Informationen in eine verlinkte PDF-Datei zu schreiben}, klicken Sie auf \menu{XMP schreiben} im \menu{Allgemein}-Tab des Eintragseditors.
+  \item Wenn Sie \emph{alle PDFs einer Datei mit Metadaten versehen} wollen, w�hlen Sie \menu{Extras \msep{} XMP-Metadaten in PDFs schreiben}.
+  \item Um zu �berpr�fen, ob das Schreiben der Metadaten funktioniert hat, �ffnen Sie die Datei in Adobe Acrobat und w�hlen \menu{Datei \msep{} Dokumenteigenschaften} und dann unter dem Reiter \menu{Beschreibung} die Schaltfl�che \menu{Zus�tzliche Metadaten}. Wenn Sie links ">Erweitert"< ausw�hlen, sollten Sie im rechten Teil des Dialogs einen Eintrag \texttt{http://jabref.sourceforge.net/bibteXMP} sehen, der die entsprechenden Metadaten enth�lt. Dies geht nur mit dem Vollprogramm Adobe  [...]
+  \item Wer kein Adobe Acrobat zur Verf�gung hat, kann stattdessen das Programm ">pdfinfo"<\footnote{Dieses Programm ist Teil von \href{http://www.foolabs.com/xpdf/}{Xpdf} und \href{http://poppler.freedesktop.org/}{Poppler}.} verwenden, um die XMP-Metadaten zu �berpr�fen. Rufen Sie dazu auf der Kommandozeile einfach \lstinline{pdfinfo -meta <PDF-Datei>} auf, dann werden die entsprechenden Metadaten angezeigt.
+\end{itemize}
+
+\subsubsection{bibteXMP Dateiformat}
+
+XMP nutzt zum Speichern der Daten eine Teilmenge des \emph{Resource Description Framework} (RDF). F�r \jabref{} wird ein neues Metadatenformat benutzt, das \bibtex{} sehr gut abbildet. Alle Felder und Werte werden in Knoten eines XML-Dokuments verwandelt. Nur Autoren und Herausgeber werden als \texttt{rdf:Seq}-Strukturen gespeichert, so dass die trennenden ">and"< weggelassen werden k�nnen. Alle Strings und crossrefs werden in den Metadaten aufgel�st.
+ 
+Das folgende einfache Minimal-Schema wird benutzt:
+\begin{itemize}
+  \item Der \bibtex{}-Key wird als \texttt{bibtexkey} gespeichert.
+  \item Der Eintragstyp wird als \texttt{entrytype} gespeichert.
+  \item \texttt{author} und \texttt{editor} sind kodiert als \texttt{rdf:Seq}, wobei die einzelnen Autoren und Herausgeber als \texttt{rdf:li}s dargestellt werden.
+  \item Alle anderen Felder werden unter ihrem Feld-Namen gespeichert.
+\end{itemize}
+
+Es folgt ein Beispiel:
+\begin{lstlisting}
+ at INPROCEEDINGS{CroAnnHow05,
+  author = {Crowston, K. and Annabi, H. and Howison, J. and Masango, C.},
+  title = {Effective work practices for floss development: A model and propositions},
+  booktitle = {Hawaii International Conference On System Sciences (HICSS)},
+  year = {2005},
+  owner = {oezbek},
+  timestamp = {2006.05.29},
+  url = {http://james.howison.name/publications.html}
+}
+\end{lstlisting}
+
+wird umgewandelt in
+
+\begin{lstlisting}
+<rdf:Description xmlns:bibtex="http://jabref.sourceforge.net/bibteXMP/"
+    bibtex:bibtexkey="CroAnnHow05"
+    bibtex:year="2005"
+    bibtex:title="Effective work practices for floss development: A model and propositions"
+    bibtex:owner="oezbek"
+    bibtex:url="http://james.howison.name/publications.html"
+    bibtex:booktitle="Hawaii International Conference On System Sciences (HICSS)"
+    bibtex:timestamp="2006.05.29">
+        <bibtex:author>
+            <rdf:Seq>
+                <rdf:li>K. Crowston</rdf:li>
+                <rdf:li>H. Annabi</rdf:li>
+                <rdf:li>J. Howison</rdf:li>
+                <rdf:li>C. Masango</rdf:li>
+            </rdf:Seq>
+        </bibtex:author>
+    <bibtex:entrytype>Inproceedings</bibtex:entrytype>
+</rdf:Description>
+\end{lstlisting}
+
+Wenn Sie bibteXMP parsen m�chten, beachten Sie, dass in RDF Attribut-Wert-Paare auch als Knoten wiedergegeben werden k�nnen und vice versa.
+
+\subsubsection{Weiterf�hrende Links}
+
+Einige Links zu XMP und PDFs mit Anmerkungen (englisch):
+
+\begin{itemize}
+  \item James Howison's Blog \href{http://freelancepropaganda.com/themp/}{">Themp---Managing Academic Papers like MP3s"<}
+  \item \href{http://www.xml.com/pub/a/2004/09/22/xmp.html}{XML.com-Artikel} zu XMP
+  \item \href{http://jempbox.org}{JempBox} und \href{http://pdfbox.org}{PDFBox} von Ben Litchfield (Java libraries zum Zugriff auf die PDFs und die Metadaten)
+  \item Gute \href{http://episteme.arstechnica.com/eve/ubb.x/a/tpc/f/8300945231/m/377001889631}{Diskussion bei ArsTechnica} zum Management von PDFs.
+  \item \href{http://partners.adobe.com/public/developer/en/xmp/sdk/xmpspecification.pdf}{Adobe XMP Spezifikation}
+\end{itemize}
+
+\subsection[JabRef und Online-Datenbanken]{\jabref{} und Online-Datenbanken}
 
 \subsubsection{CiteSeer}
 
-\label{CiteSeerHelp}\jabref{} kann Informationen �ber eine bestimmte
+\label{CiteSeerHelp}
+\begin{quote}
+CiteSeer ist eine digitale Bibliothek und Suchmaschine f�r wissenschaftliche Literatur, vornehmlich zu den Bereichen Computer und Informatik.
+\end{quote}
+\jabref{} kann Informationen �ber eine bestimmte
 Literaturangabe aus der CiteSeer-Datenbank herunterladen. Um diesen
 Vorgang zu starten, f�gen Sie Ihrer Datei einen neuen Eintrag hinzu
 und belegen das Feld \emph{citeseerurl} mit einem Link zur entsprechenden
 Inhaltsseite auf CiteSeer. Das Feld \emph{citeseerurl} muss in einem
 der folgenden Formate eingegeben werden:
 
-\begin{lyxcode}
-http://citeseer.ist.psu.edu/DDDDDD{[}.html{]}\textrm{,~oder}
-
-oai:CiteSeerPSU:DDDDDD\textrm{,~oder}
-
+\begin{lstlisting}
+http://citeseer.ist.psu.edu/DDDDDD[.html] % oder
+oai:CiteSeerPSU:DDDDDD                    % oder
 DDDDDD
-\end{lyxcode}
+\end{lstlisting}
 wobei DDDDDD eine Ziffernfolge darstellt. Um diese Ziffernfolge f�r
 einen CiteSeer-Eintrag zu finden, gehen Sie auf die Dokumentseite
 der Literaturangabe des Formats \texttt{http://citeseer.ist.psu.edu/}\texttt{\emph{nameYearTitle}}\texttt{.html}
@@ -1468,11 +1673,20 @@ kann. F
 ich deshalb dankbar.%
 }
 
+\paragraph{Eine Datei mit zitierenden Literaturangaben erzeugen}
+
+Mit einem Satz von Literaturangaben k�nnen Sie eine Liste der Dokumente
+erzeugen, die die einzelnen Literaturangaben ihrerseits zitieren. Dazu
+muss jede Literaturangabe der entsprechenden Datenbank-Datei ein
+ausgef�lltes citeseerurl-Feld besitzen, dessen Inhalt dem oben
+beschriebenen Format entspricht. Sie k�nnen diese Funktion nutzen, indem
+Sie \menu{Zitierende Literatur von CiteSeer abrufen} ausw�hlen.
 
 \subsubsection{Medline}
 
 \begin{quote}
-\label{MedlineHelp}\jabref{} kann Literaturangaben von der Medline-Datenbank
+\label{MedlineHelp}\caps{MEDLINE} ist die wichtigste Datenbank der \emph{U.\,S. National Library of Medicine}. Sie enth�lt Literaturangaben von Zeitschriftenartikeln der Lebenswissenschaften, vornehmlich der Biomedizin.
+\jabref{} kann Literaturangaben von der Medline-Datenbank
 herunterladen. Um diese Funktion zu nutzen, w�hlen Sie \menu{Extras}
 \msep{} \menu{Medline abrufen}, so dass der Medline-Dialog im linken
 Seitenfeld erscheint.
@@ -1495,6 +1709,26 @@ m
 Die abgerufenen Eintr�ge werden Ihrer zu diesem Zeitpunkt aktivierten
 Datei zugeordnet.
 
+\subsubsection{IEEEXplore}
+\label{IEEEXploreHelp}
+
+\begin{quote} 
+\emph{IEEEXplore bietet Zugang zu Literatur in den Bereichen Elektrotechnik, Informatik und Elektronik.}
+\end{quote}
+\jabref{} kann Literaturangaben der IEEEXplore-Datenbank herunterladen.
+Um diese Funktion zu nutzen, w�hlen Sie \menu{Internet \msep{} IEEEXplore abfragen}
+und geben in dem Dialog, der im linken Bildschirmbereich erscheint, Ihre
+Suchausdr�cke ein. Dr�cken Sie anschlie�end die
+ENTER-Taste oder den \menu{Abrufen}-Button.
+
+Die Suche wird im G�ste-Modus durchgef�hrt, es werden also maximal 100 Ergebnisse
+angezeigt.
+
+Sie k�nnen die \emph{abstracts} zusammen mit den Literaturangaben herunterladen,
+indem Sie einen Haken bei \menu{Abstracts ber�cksichtigen} setzen. Das verursacht
+eine deutlich h�here Anzahl von Netzwerk-Anfragen; um die Webseite von IEEEXplore
+nicht �berm��ig zu belasten, l�dt \jabref{} \emph{abstracts} nur bei einer Suche,
+deren Ergebnis eine bestimmte Trefferanzahl nicht �bersteigt.
 
 \subsubsection{Benutzung eines Proxy-Servers}
 
@@ -1502,11 +1736,9 @@ Wenn Sie einen HTTP-Proxy-Server benutzen m
 Servernamen und die Portnummer an Java. Diese Umgebungseinstellungen
 sind dokumentiert unter \url{http://java.sun.com/j2se/1.4.2/docs/guide/net/properties.html}
 
-\begin{lyxcode}
-java~-Dhttp.proxyHost=\char`\"{}hostname\char`\"{}
-
--Dhttp.proxyPort=\char`\"{}portnumber\char`\"{}
-\end{lyxcode}
+\begin{lstlisting}
+java -Dhttp.proxyHost="hostname" -Dhttp.proxyPort="portnumber"
+\end{lstlisting}
 
 \subsection[JabRef mit mehreren Benutzern verwenden]{\jabref{} mit mehreren Benutzern verwenden}
 
@@ -1569,7 +1801,7 @@ mit grafischer Benutzeroberfl
 Optionen f�r die Kommandozeile und kann sogar Dateikonvertierungen
 durchf�hren, ohne die grafische Benutzeroberfl�che zu �ffnen.
 
-Sie k�nnen eine oder mehrere Bib\TeX{}-Dateien laden, indem Sie auf
+Sie k�nnen eine oder mehrere \bibtex{}-Dateien laden, indem Sie auf
 der Kommandozeile die entsprechenden Dateinamen auflisten. Achten
 Sie darauf, alle gew�nschten Optionen anzugeben, bevor Sie die Dateinamen
 anf�gen. Au�erdem m�ssen Sie sich vergewissern, dass der erste Dateiname
@@ -1578,9 +1810,9 @@ eine Bool'sche Option wie \texttt{-n} oder \texttt{-l} direkt vor
 einem Dateinamen steht, m�ssen Sie also \texttt{true} als Argument
 angeben. Das Beispielkommando:
 
-\begin{lyxcode}
-jabref~-o~filetoexport.xml,docbook~-n~true~original.bib
-\end{lyxcode}
+\begin{lstlisting}
+jabref -o filetoexport.xml,docbook -n true original.bib
+\end{lstlisting}
 l�dt die Datei \texttt{original.bib}, exportiert sie in das Docbook-Format,
 speichert sie unter dem Namen \texttt{filetoexport.xml} und unterdr�ckt
 das Laden der grafischen Oberfl�che. Das Word \emph{true} verhindert,
@@ -1596,13 +1828,11 @@ vorgestellt.
 \begin{itemize}
 \item Hilfe: \texttt{-h}
 
-
 Diese Option veranlasst \jabref{}, eine Zusammenfassung der Kommandozeilen-Optionen
 anzuzeigen und das Programm unmittelbar darauf zu schlie�en.
 
 \item Kein GUI-Modus: \texttt{-n}
 
-
 Diese Option unterdr�ckt sowohl das \jabref{}-Fenster als auch den
 Er�ffnungsbildschirm, der normalerweise beim Programmstart angezeigt
 wird. Das Programm wird beendet, sobald die Kommandozeilen-Optionen
@@ -1613,17 +1843,15 @@ oder mit Hilfe eines Scripts durchzuf
 
 \item Sitzung laden: \texttt{-l}
 
-
 Diese Option veranlasst \jabref{}, eine gespeicherte Sitzung zu laden,
 sofern eine vorhanden ist, bevor sich das Hauptfenster �ffnet.
 
 \item Datei importieren: \texttt{-i Dateiname{[},Importformat{]}}
 
-
 Bei dieser Option importiert oder l�dt \jabref{} eine bestimmte Datei.
 Wenn nur ein Dateiname angegeben wird oder ein Komma und ein {*}-Zeichen
 hinter dem Dateinamen stehen, versucht \jabref{}, das Dateiformat
-automatisch zu erkennen. Das sollte bei allen Bib\TeX{}-Dateien ebenso
+automatisch zu erkennen. Das sollte bei allen \bibtex{}-Dateien ebenso
 funktionieren wie bei Dateien, die in einem der von \jabref{} unterst�tzten
 Importformate vorliegen. Wenn dem Dateinamen ein Komma und ein Importformat
 folgen, wird der angegebene Importfilter benutzt. Mit der Option \texttt{-h}
@@ -1641,7 +1869,6 @@ als Argument maximal eine Datei.
 
 \item Datei exportieren: \texttt{-o Dateiname{[},Exportformat{]}}
 
-
 Diese Option veranlasst \jabref{}, eine Datei zu speichern oder zu
 exportieren, die von derselben Kommandozeile geladen oder importiert
 wurde. Wenn eine Datei mit der Option \texttt{-i} importiert wurde,
@@ -1649,7 +1876,7 @@ wird diese Datei exportiert. Ansonsten wird die Datei exportiert,
 die \emph{zuletzt}~-- ohne die Option \texttt{-i}~-- angegeben (und
 erfolgreich geladen) wurde.
 
-Wird nur ein Dateiname angegeben, so wird diese Datei im Bib\TeX{}-Format
+Wird nur ein Dateiname angegeben, so wird diese Datei im \bibtex{}-Format
 gespeichert. Wenn dem Dateinamen ein Komma und ein Exportformat folgen,
 wird der angegebene Exportfilter benutzt. Auf diese Weise wird auch
 ein benutzerdefinierter Exportfilter angewendet; wenn der Name sowohl
@@ -1668,32 +1895,42 @@ als Argument maximal eine Datei.
 
 \item Einstellungen exportieren: \texttt{-x Dateiname}
 
-
 Mit dieser Option k�nnen Sie \jabref{} veranlassen, alle Benutzer-Einstellungen
 in eine XML-Datei zu speichern. Nach dem Export startet \jabref{}
 normal.
 
 \item Einstellungen importieren: \texttt{-p Dateiname}
 
-
 Mit dieser Option importiert \jabref{} Benutzer-Einstellungen, die
 mit der Option \texttt{-x} exportiert wurden. Nach dem Import startet
 \jabref{} normal.
 
 \item Nur benutzte Eintr�ge exportieren: \texttt{-a Dateiname{[}.aux{]},neueBibDatei{[}.bib{]}}
 
-
-Manchmal ist es n�tzlich, eine Bib\TeX{}-Datei zu haben, die nur die
+Manchmal ist es n�tzlich, eine \bibtex{}-Datei zu haben, die nur die
 benutzten Eintr�ge enth�lt. Eine Liste dieser benutzten Eintr�ge findet
 sich in einer .aux-Datei (sobald Sie \LaTeX{} aufgerufen haben). \jabref{}
-kann diese Datei analysieren, um eine neue Bib\TeX{}-Datei zu erstellen,
+kann diese Datei analysieren, um eine neue \bibtex{}-Datei zu erstellen,
 die nur die bekannten und benutzten Eintr�ge enth�lt. Das bedeutet,
-dass ein Eintrag, der in der Standard-Bib\TeX{}-Datei nicht definiert
+dass ein Eintrag, der in der Standard-\bibtex{}-Datei nicht definiert
 ist, auch nicht in die neue Datei geschrieben werden kann.
 
 \end{itemize}
 
-\clearpage
+\subsubsection{Externer Zugriff}
+\label{RemoteHelp}
+\begin{quote}
+\emph{Diese Funktion kann unter \menu{Einstellungen \msep{} Erweitert} eingestellt werden.}
+\end{quote}
+
+\tip[]{Beachten Sie, dass das Aktivieren dieser Funktion mit Windows XP SP2 (und m�glicherweise auch mit anderen Konfigurationen) zu einer Meldung f�hren kann, die besagt, dass bestimmte Funktionen des Programms von der Windows-Firewall geblockt wurden. Sie k�nnen die Firewall anweisen, weiterhin zu blocken, denn die Firewall beeintr�chtigt den Externen Zugriff von \jabref{} nicht.}
+Falls das Abh�ren von externen Zugriffen aktiviert ist, versucht \jabref{} beim Programmstart, den entsprechenden Port abzuh�ren. Das bedeutet, dass andere Anwendungen Informationen durch diesen Port an \jabref{} senden k�nnen. \jabref{} akzeptiert dabei nur lokale Verbindungen, um das Risiko eines Eingriffs von au�erhalb auszuschlie�en.
+
+Mit dem externen Zugriff kann eine zweite Instanz von \jabref{} erkennen, dass eine erste Instanz bereits l�uft. In diesem Fall leitet die zweite Instanz ihre Kommandozeilen-Optionen an die erste Instanz weiter und beendet sich selbst direkt im Anschluss~-- sofern die zweite Instanz nicht ausdr�cklich instruiert wurde, im Stand-Alone-Modus (als selbst�ndige Instanz) zu starten.
+
+Die erste \jabref{}-Instanz liest die Kommandozeilenoptionen und f�hrt die erforderlichen Aktionen aus, z.\,B. das Lesen oder Importieren einer Datei oder das Anh�ngen einer Datei an die aktive Datenbank. Falls eine Datei mit der Option \texttt{-{-}importToOpen} importiert wird, werden die Eintr�ge an die aktive Datei angeh�ngt. Falls keine Datei ge�ffnet ist, wird eine neue Datei angelegt.
+
+\clearpage 
 \section{Anpassung}
 \secttoc
 
@@ -1786,42 +2023,37 @@ sie jeweils durch ein Semikolon.
 
 Das Beispiel
 
-\begin{lyxcode}
-Allgemeine~Felder:url;keywords;doi;pdf
-
+\begin{lstlisting}
+Allgemeine Felder:url;keywords;doi;pdf
 Zusammenfassung:abstract;annote
-\end{lyxcode}
+\end{lstlisting}
 ergibt somit einen Tab mit dem Namen >>Allgemeine Felder<<, der
 die Felder \emph{url}, \emph{keywords}, \emph{doi} und \emph{pdf}
 enth�lt, sowie einen zweiten Tab namens >>Zusammenfassung<< mit
 den Feldern \emph{abstract} und \emph{annote}.
 
 
-\subsection{Automatische Erstellung von Bib\TeX{}-Keys}
+\subsection{Automatische Erstellung von \bibtex{}-Keys}
 
 \begin{quote}
 \label{LabelPatterns}Im Tab \menu{Key-Muster} des Dialogs \menu{Einstellungen}
 kann man die Felder bestimmen, die zur automatischen Generierung der
-Bib\TeX{}-Keys herangezogen werden.
+\bibtex{}-Keys herangezogen werden.
 \end{quote}
 Standardm��ig verwendet \jabref{} ein vorgegebenes Muster (default
-pattern) zur Generierung von Bib\TeX{}-Keys, das Keys wie z.\,B.
-\texttt{Yared1998} erzeugt. Falls der Bib\TeX{}-Key in der ge�ffneten
+pattern) zur Generierung von \bibtex{}-Keys, das Keys wie z.\,B.
+\texttt{Yared1998} erzeugt. Falls der \bibtex{}-Key in der ge�ffneten
 Datei nicht eindeutig sein sollte, wird einer der Buchstaben a-z angef�gt,
 bis ein eindeutiger Key gefunden ist. Dementsprechend k�nnten die
 Labels wie folgt aussehen:
 
-\begin{lyxcode}
+\begin{lstlisting}
 Yared1998
-
 Yared1998a
-
 Yared1998b
-
-\textrm{\ldots{}}
-
-\end{lyxcode}
-\jabref{} verwendet Feldmarken, um das Aussehen der Bib\TeX{}-Keys
+(*\ldots*)
+\end{lstlisting}
+\jabref{} verwendet Feldmarken, um das Aussehen der \bibtex{}-Keys
 zu bestimmen. Das Key-Muster kann f�r jeden der vorgegebenen Eintragstypen
 bestimmt werden. Es kann beliebigen Text enthalten, unabh�ngig von
 und zus�tzlich zu den Feldmarken, die angeben, dass ein bestimmtes
@@ -1858,7 +2090,7 @@ Autor vorhanden ist. Ein Plus (+) wird angeh
 drei Autoren gibt.
 \end{labeling}
 
-\tip[Anmerkung:]{Falls es keinen Autor gibt (z.B. bei einem Buch mit Herausgeber), benutzen die genannten \texttt{{[}auth...{]}}-Feldmarken den oder die Herausgeber, die im editor-Feld angegeben wurden. Also werden die Herausgeber eines Buches ohne Autor f�r die Label-Erstellung wie Autoren behandelt. Falls Sie dieses Verhalten nicht w�nschen und die Feldmarke stattdessen bei einem leeren author-Feld zu nichts expandieren soll, m�ssen Sie stattdessen >>pureauth<< verwenden, z.B.: \texttt [...]
+\tip[Anmerkung:]{Falls es keinen Autor gibt (z.\,B. bei einem Buch mit Herausgeber), benutzen die genannten \texttt{{[}auth...{]}}-Feldmarken den oder die Herausgeber, die im editor-Feld angegeben wurden. Also werden die Herausgeber eines Buches ohne Autor f�r die Label-Erstellung wie Autoren behandelt. Falls Sie dieses Verhalten nicht w�nschen und die Feldmarke stattdessen bei einem leeren author-Feld zu nichts expandieren soll, m�ssen Sie stattdessen >>pureauth<< verwenden, z.\,B.: \te [...]
 
 \begin{labeling}{veryveryveryshorttitle}
 \item [\texttt{{[}edtr{]}}]Der Nachname des ersten Herausgebers.
@@ -1901,7 +2133,7 @@ w
 Kleinbuchstaben. So wird beispielsweise bei \texttt{{[}auth:lower{]}}
 der Nachname des ersten Autors in Kleinbuchstaben ausgegeben.
 \end{labeling}
-Das Standard-Key-Muster, das Bib\TeX{}-Keys wie \texttt{Yared1998}
+Das Standard-Key-Muster, das \bibtex{}-Keys wie \texttt{Yared1998}
 erzeugt, ist \texttt{{[}auth{]}{[}year{]}}. Wenn Sie keine Key-Muster
 f�r einen bestimmten Eintragstyp angeben, wird dieses vorgegebene
 Muster verwendet. Sie k�nnen das vorgegebene Muster nat�rlich ebenfalls
@@ -1909,35 +2141,20 @@ anpassen~-- seine Einstellung befindet sich 
 im Tab \menu{Key-Muster} des Dialogs \menu{Einstellungen}.
 
 Beachten Sie, dass \jabref{} Umlaute und Buchstaben mit Akzenten
-sowie das � beim Erstellen von Bib\TeX{}-Keys ver�ndert, um m�glichen
+sowie das � beim Erstellen von \bibtex{}-Keys ver�ndert, um m�glichen
 Problemen vorzubeugen. Hierzu einige Beispiele:
 
-\begin{lyxcode}
-D�az~Iba�ez~$\to$~DiazIbanez
-
-Str�mb�ck~$\to$~Stroembaeck
-
-Wa�enhoven~$\to$~Wassenhoven
-
-\textrm{usw.}
-\end{lyxcode}
-
-\subsubsection*{Ersetzen eines Regul�ren Ausdrucks}
-
-Nachdem das Key-Muster angewendet wurde, um einen Bib\TeX{}-Key zu erstellen, k�nnen Sie den Key-Generator nach einem bestimmten Regul�ren Ausdruck suchen und ihn durch eine Zeichenfolge ersetzen lassen. Der Regul�re Ausdruck und die Zeichenfolge, die ihn ersetzen soll, werden in den Textfeldern unter der Liste der Key-Muster eingegeben. Falls das Feld zur Ersetzung des Regul�ren Ausdrucks leer ist, werden die mit der Suche �bereinstimmenden Regul�ren Ausdr�cke einfach gel�scht.
+\begin{lstlisting}
+D�az Iba�ez (*$\to$*) DiazIbanez
+Str�mb�ck   (*$\to$*) Stroembaeck
+Wa�enhoven  (*$\to$*) Wassenhoven
+\end{lstlisting}
 
-\subsection{Erscheinungsbild}
+\subsubsection{Ersetzen eines regul�ren Ausdrucks}
 
-\begin{comment}
-fehlende Punkte:
--- Tabellendarstellung
--- Toolbar
--- Panels
-\end{comment}
-\tip[Hinweis: ]{Dieser Abschnitt ist noch vorl�ufig. Es sind Beschreibungen zur Tabellendarstellung, zur Toolbar, den Panels und der Verwendung von Schriften geplant.}
+Nachdem das Key-Muster angewendet wurde, um einen \bibtex{}-Key zu erstellen, k�nnen Sie den Key-Generator nach einem bestimmten regul�ren Ausdruck suchen und ihn durch eine Zeichenfolge ersetzen lassen. Der regul�re Ausdruck und die Zeichenfolge, die ihn ersetzen soll, werden in den Textfeldern unter der Liste der Key-Muster eingegeben. Falls das Feld zur Ersetzung des regul�ren Ausdrucks leer ist, werden die mit der Suche �bereinstimmenden regul�ren Ausdr�cke einfach gel�scht.
 
-
-\subsubsection{Eintragsvorschau}
+\subsection{Eintragsvorschau}
 
 \label{PreviewHelp}Die Eintragsvorschau wird mit denselben Mechanismen
 erstellt, die auch bei den Exportfiltern angewendet werden. Bei der
@@ -1949,12 +2166,6 @@ Aussehen und Inhalt der Vorschau k
 werden, die f�r die Anpassung der Exportfilter verwendet wird (siehe
 Abschnitt~\ref{CustomExports}).
 
-\begin{comment}
-fehlende Punkte:
--- Schriften
-\label{sub:Erscheinungsbild_Schriften}
-\end{comment}
-
 \subsection{Exportfilter}
 
 \label{CustomExports}Mit \jabref{} k�nnen Sie Ihre eigenen Exportfilter
@@ -2002,23 +2213,15 @@ bzw. \texttt{.end} enthalten m
 \noindent In unserem Beispiel-Exportfilter k�nnten diese Dateien folgenderma�en
 aussehen:
 
-\begin{lyxcode}
-\textrm{html.begin.layout:}
-
+\begin{lstlisting}[title=html.begin.layout]
 <HTML>
-
-<BODY~text=\char`\"{}\#275856\char`\"{}>
-
-<basefont~size=\char`\"{}4\char`\"{}~color=\char`\"{}\#2F4958\char`\"{}~face=\char`\"{}arial\char`\"{}>
-
-~
-
-\textrm{html.end.layout:}
-
+<BODY text="#275856">
+<basefont size="4" color="#2F4958" face="arial">
+\end{lstlisting}
+\begin{lstlisting}[title=html.end.layout]
 </BODY>
-
 </HTML>
-\end{lyxcode}
+\end{lstlisting}
 Die Datei \texttt{html.layout} stellt die \emph{Standard}-Formatvorlage
 f�r den Export eines einzelnen Eintrags bereit. Falls Sie unterschiedliche
 Formatvorlagen f�r verschiedene Eintragstypen anwenden wollen, m�ssen
@@ -2061,16 +2264,16 @@ Ein Formatierer wird angewendet, indem man das Kommando \texttt{\textbackslash{}
 gefolgt vom Namen des Formatierers in eckigen Klammern und dem Feldnamen
 in geschweiften Klammern einf�gt, z.\,B.:
 
-\begin{lyxcode}
-\textbackslash{}format{[}ToLowerCase{]}\{\textbackslash{}author\}
-\end{lyxcode}
+\begin{lstlisting}
+\format[ToLowerCase]{\author}
+\end{lstlisting}
 Sie k�nnen auch mehrere Formatierer angeben, getrennt durch Kommas.
 Diese werden nacheinander aufgerufen, und zwar von links nach rechts.
 Das Kommando
 
-\begin{lyxcode}
-\textbackslash{}format{[}ToLowerCase,HTMLChars{]}\{\textbackslash{}author\}
-\end{lyxcode}
+\begin{lstlisting}
+\format[ToLowerCase,HTMLChars]{\author}
+\end{lstlisting}
 ruft z.\,B. zun�chst den Formatierer \emph{ToLowerCase} auf, \emph{HTMLChars}
 formatiert anschlie�end das Ergebnis. Auf diese Weise k�nnen Sie eine
 beliebige Anzahl an Formatierern auflisten.
@@ -2126,22 +2329,20 @@ Manche statische Ausgabe macht nur Sinn, wenn ein bestimmtes Feld
 nicht leer ist. Wenn wir z.\,B. hinter den Namen der Editoren den
 Text \texttt{(Hrsg.)} haben wollen, brauchen wir Folgendes:
 
-\begin{lyxcode}
-\textbackslash{}format{[}HTMLChars,AuthorFirstFirst{]}\{\textbackslash{}editor\}~(Hrsg.)
-\end{lyxcode}
+\begin{lstlisting}
+\format[HTMLChars,AuthorFirstFirst]{\editor} (Hrsg.)
+\end{lstlisting}
 Wenn nun aber das \emph{editor}-Feld leer ist~-- m�glicherweise ist
 es f�r den Eintrag, der exportiert werden soll, nicht erforderlich~--,
 dann w�rde das \texttt{(Hrsg.)} dennoch erscheinen. Das kann man mit
 den Kommandos \texttt{\textbackslash{}begin} und \texttt{\textbackslash{}end}
 verhindern:
 
-\begin{lyxcode}
-\textbackslash{}begin\{editor\}
-
-\textbackslash{}format{[}HTMLChars,AuthorFirstFirst{]}\{\textbackslash{}editor\}~(Hrsg.)
-
-\textbackslash{}end\{editor\}
-\end{lyxcode}
+\begin{lstlisting}
+\begin{editor}
+\format[HTMLChars,AuthorFirstFirst]{\editor} (Hrsg.)
+\end{editor}
+\end{lstlisting}
 Die Kommandos \texttt{\textbackslash{}begin} und \texttt{\textbackslash{}end}
 sorgen daf�r, dass der Text, den sie einschlie�en, nur dann ausgegeben
 wird, falls das Feld, auf das in den geschweiften Klammern verwiesen
@@ -2167,39 +2368,21 @@ Nehmen wir zum Beispiel an, dass wir die Ausgabe nach dem \emph{keyword}
 die Eintr�ge nach dem \emph{keyword} sortiert worden sein. Dann benutzen
 Sie die folgenden Kommandos, um nach \emph{keyword} zu gruppieren:
 
-\begin{lyxcode}
-\textbackslash{}begingroup\{keywords\}
-
-New~Category:~\textbackslash{}format{[}HTMLChars{]}\{\textbackslash{}keywords\}
-
-\textbackslash{}endgroup\{keywords\}
-\end{lyxcode}
-
-\subsubsection{Teilen Sie Ihre Arbeit mit anderen}
-
-Mit externen Layout-Dateien ist es einfach, Ihre eigenen Export-Formate
-mit anderen Anwendern gemeinsam zu benutzen. Falls Sie einen Exportfilter
-f�r ein Format erstellen, das nicht von \jabref{} unterst�tzt wird,
-oder falls Sie einen bestehenden Exportfilter verbessern, m�chten
-wir Sie ermutigen, Ihre Arbeit auf der SourceForge.net-Seite bereitzustellen.
-Dasselbe gilt f�r Formatierklassen, die Sie schreiben. Wir w�rden
-uns freuen, eine Sammlung von bereitgestellten Layout-Dateien verteilen
-zu k�nnen oder die Standard-Export-Filter und Standard-Formatierer
-zu erweitern.
-
+\begin{lstlisting}
+\begingroup{keywords}
+New Category: \format[HTMLChars]{\keywords}
+\endgroup{keywords}
+\end{lstlisting}
 
-\clearpage
-\section{Externe Importfilter}
-\secttoc
-\bigskip
+\subsection{Importfilter}
 
-\noindent \jabref{} bietet Ihnen die M�glichkeit, ganz �hnlich den Standard-Importern, eigene Importer
+\noindent \jabref{} bietet Ihnen die M�glichkeit, ganz �hnlich den Standard-Importern, eigene Importer 
 zu definieren und zu benutzen. Man definiert einen Importer durch eine oder mehrere Java
 \emph{Klassen}, die Dateiinhalte aus einem sogenannten \emph{Input stream} lesen
-und daraus Bib\TeX{}-Eintr�ge erzeugen. Sie k�nnen vorkompilierte Importer einbinden, die Sie vielleicht
-von SourceForge erhalten haben (siehe Abschnitt >>Ihre Arbeit anderen zur Verf�gung stellen<<,
+und daraus \bibtex{}-Eintr�ge erzeugen. Sie k�nnen vorkompilierte Importer einbinden, die Sie vielleicht 
+von SourceForge erhalten haben (siehe Abschnitt >>Ihre Arbeit anderen zur Verf�gung stellen<<, 
 S.\,\pageref{subsec:Ihre-Arbeit}). Sie k�nnen auch
-mit Grundkenntnissen der Java-Programmierung eigene Importer f�r f�r Sie wichtige Referenzquellen
+mit Grundkenntnissen der Java-Programmierung eigene Importer f�r f�r Sie wichtige Referenzquellen 
 erstellen oder neue, verbesserte Versionen existierender Importer einbinden, ohne \jabref{} neu zu
 kompilieren.
 
@@ -2209,20 +2392,20 @@ Externe Importfilter haben Vorrang vor Standard-Importern. So k
 die existierenden in der automatischen Formaterkennung und an der Kommandozeile in \jabref{} �berschreiben.
 Externe Importfilter selbst sind dann nach Namen sortiert.
 
-\subsection{Einen externen Importfilter hinzuf�gen}
+\subsubsection{Einen externen Importfilter hinzuf�gen}
 
 Stellen Sie sicher, dass Sie den Importer in kompilierter Form haben (eine oder mehrere
 \texttt{.class} Dateien) und dass die Klassendateien
-in einer Verzeichnisstruktur entsprechend ihrer Package-Struktur liegen.
-Um einen neuen externen Importfilter hinzuzuf�gen, �ffnen Sie den Dialog
+in einer Verzeichnisstruktur entsprechend ihrer Package-Struktur liegen. 
+Um einen neuen externen Importfilter hinzuzuf�gen, �ffnen Sie den Dialog 
 \menu{Optionen} \msep{} \menu{Verwalte externe Importfilter}, und klicken Sie auf
-\menu{Aus Klassenpfad hinzuf�gen}. Ein Dateiauswahl-Fenster erscheint,
+\menu{Aus Klassenpfad hinzuf�gen}. Ein Dateiauswahl-Fenster erscheint, 
 mit dem Sie den Klassenpfad des Importers w�hlen, dass hei�t den obersten Ordner,
 in dem die Package-Struktur Ihres Importers beginnt. In einem zweiten Dateiauswahl-Fenster
 w�hlen Sie die \emph{.class}-Datei Ihres Importers, die von \texttt{\textbackslash{}ImportFormat} abgeleitet
 ist. Wenn Sie \menu{Klasse ausw�hlen} klicken, erscheint Ihr neuer Importer
 in der Liste der externen Importfilter. Alle externen Importfilter erscheinen in den
-\jabref{}-Untermen�s \menu{Datei} \msep{} \menu{Importieren} \msep{} \menu{Externe Importfilter} und
+\jabref{}-Untermen�s \menu{Datei} \msep{} \menu{Importieren} \msep{} \menu{Externe Importfilter} und 
 \menu{Datei} \msep{} \menu{Importieren und Anh�ngen} \msep{} \menu{Externe Importfilter}.
 
 \tip[Bitte beachten Sie: ]{Wenn Sie die Klassen in ein anderes Verzeichnis verschieben,
@@ -2236,135 +2419,101 @@ Sie k
 \emph{\menu{Aus Archiv-Datei hinzuf�gen}}, dann das ZIP- oder JAR-Archiv und dann den Eintrag
 (Klassendatei), der den neuen Importer darstellt.}
 
-\subsection{Einen Importfilter entwickeln}
+\subsubsection{Einen Importfilter entwickeln}
 
-Bitte schauen Sie auf unseren Download-Seiten nach Beispielen und n�tzlichen Dateien zur
+Bitte schauen Sie auf unseren Download-Seiten nach Beispielen und n�tzlichen Dateien zur 
 Entwicklung Ihres Importfilters.
 
-\subsubsection{Ein einfaches Beispiel}
+\paragraph{Ein einfaches Beispiel}
 
 Angenommen, wir wollen Dateien der folgenden Form importieren:
-\begin{lyxcode}
+\begin{lstlisting}
 1936;John Maynard Keynes;The General Theory of Employment, Interest and Money
-
-2003;Boldrin \& Levine;Case Against Intellectual Monopoly
-
+2003;Boldrin & Levine;Case Against Intellectual Monopoly
 2004;ROBERT HUNT AND JAMES BESSEN;The Software Patent Experiment
-\end{lyxcode}
+\end{lstlisting}
 
-\paragraph{SimpleCsvImporter Erstellen}
+\subparagraph{SimpleCsvImporter Erstellen}
 
 Erzeugen Sie in einem Text-Editor eine von \texttt{ImportFormat} abgeleitete Klasse,
-die die Methoden \texttt{getFormatName()},
+die die Methoden \texttt{getFormatName()}, 
 \texttt{isRecognizedFormat()}
 und \texttt{importEntries()} implementiert. Hier ein Beispiel:
-\begin{lyxcode}
+\begin{lstlisting}
 import java.io.*;
-
 import java.util.*;
-
 import net.sf.jabref.*;
-
 import net.sf.jabref.imports.ImportFormat;
-
 import net.sf.jabref.imports.ImportFormatReader;
 
-~
-
 public class SimpleCsvImporter extends ImportFormat {
 
-~
-
   public String getFormatName() {
-
-    return "{}Simple CSV Importer";
-
+    return "Simple CSV Importer";
   }
 
-~
-
   public boolean isRecognizedFormat(InputStream stream) throws IOException {
-
     return true; // this is discouraged except for demonstration purposes
-
   }
 
-~
-
   public List importEntries(InputStream stream) throws IOException {
-
   	ArrayList bibitems = new ArrayList();
-
     BufferedReader in = new BufferedReader(ImportFormatReader.getReaderDefaultEncoding(stream));
 
-~
-
     String line = in.readLine();
-
     while (line != null) {
-
-      if (!"{}"{}.equals(line.trim())) {
-
+      if (!"".equals(line.trim())) {
         String[] fields = line.split(";");
-
         BibtexEntry be = new BibtexEntry(Util.createNeutralId());
-
         be.setType(BibtexEntryType.getType("techreport"));
-
         be.setField("year", fields[0]);
-
-        be.setField("{}author", fields[1]);
-
+        be.setField("author", fields[1]);
         be.setField("title", fields[2]);
-
         bibitems.add(be);
-
         line = in.readLine();
-
       }
-
     }
-
-  	return bibitems;
-
+    return bibitems;
   }
-
 }
-\end{lyxcode}
+\end{lstlisting}
 
-\paragraph{SimpleCsvImporter �bersetzen}
+\subparagraph{SimpleCsvImporter �bersetzen}
 
 Beachten Sie, dass die Beispielklasse im Default"=Package liegt. Angenommen, Sie haben
 sie unter \texttt{/meinpfad/SimpleCsvImporter.java} gespeichert. Nehmen wir weiter an,
 die Datei \texttt{JabRef-2.0.jar} ist im gleichen Verzeichnis wie
-\texttt{SimpleCsvImporter.java} und Java ist in Ihrem Kommandopfad.
-Kompilieren Sie die Klasse mit JSDK 1.4 zum Beispiel mit folgendem Kommandozeilen"=Aufruf:
-\begin{lyxcode}
+\texttt{SimpleCsvImporter.java} und Java ist in Ihrem Kommandopfad. 
+Kompilieren Sie die Klasse mit JSDK 1.4 zum Beispiel mit folgendem Kommandozeilen"=Aufruf: 
+\begin{lstlisting}
 javac -classpath JabRef-2.0.jar SimpleCsvImporter.java
-\end{lyxcode}
+\end{lstlisting}
 Nun sollte dort auch eine Datei \texttt{/mypath/SimpleCsvImporter.class} liegen.
 
-\paragraph{SimpleCsvImporter registrieren}
+\subparagraph{SimpleCsvImporter registrieren}
 
 �ffnen Sie in \jabref{} \menu{Optionen} \msep{} \menu{Verwaltung externer Importfilter} und klicken Sie
-auf \menu{Aus Klassenpfad hinzuf�gen}. Navigieren Sie nach \texttt{/meinpfad} und
+auf \menu{Aus Klassenpfad hinzuf�gen}. Navigieren Sie nach \texttt{/meinpfad} und 
 klicken Sie \menu{Klassenpfad ausw�hlen}. W�hlen Sie dann die Datei \texttt{SimpleCsvImporter.class}
 und klicken Sie \menu{Klasse ausw�hlen}. Ihr Importfilter sollte nun in der Liste der
 externen Importfilter unter dem Namen >>Simple CSV Importer<< erscheinen und,
-sobald Sie \menu{Schlie�en} gew�hlt haben, auch in den Untermen�s \menu{Datei} \msep{} \menu{Importieren} \msep{}
-\menu{Externe Importfilter} und \menu{Datei} \msep{} \menu{Importieren und Anh�ngen} \msep{} \menu{Externe Importfilter}
+sobald Sie \menu{Schlie�en} gew�hlt haben, auch in den Untermen�s \menu{Datei} \msep{} \menu{Importieren} \msep{} 
+\menu{Externe Importfilter} und \menu{Datei} \msep{} \menu{Importieren und Anh�ngen} \msep{} \menu{Externe Importfilter} 
 des \jabref{}-Hauptfensters auftauchen.
 
-\subsection{Ihre Arbeit anderen zur Verf�gung stellen}
+\subsection{Teilen Sie Ihre Arbeit mit anderen}
 \label{subsec:Ihre-Arbeit}
-Mit externen Importfiltern ist es recht einfach, Importfilter zwischen Nutzern auszutauschen und
-gemeinsam zu nutzen. Wenn Sie einen Importer f�r ein  Format schreiben, das \jabref{} noch nicht unterst�tzt,
-oder einen Importer verbessern, bitten wir Sie, Ihre Ergebnisse auf unserer SourceForge.net
-Seite zu ver�ffentlichen. Wir bieten gerne eine Sammlung eingereichter Importfilter an oder
-f�gen sie unserer Auswahl an Standard-Importfiltern hinzu.
-
+Mit externen Layout-Dateien und Importfiltern ist es einfach, Ihre eigenen Export-Formate und Importfilter
+mit anderen Anwendern gemeinsam zu benutzen. Falls Sie einen Exportfilter oder einen Importfilter
+f�r ein Format erstellt haben, das noch nicht von \jabref{} unterst�tzt wird,
+oder falls Sie einen bestehenden Exportfilter oder Importfilter verbessern, m�chten
+wir Sie ermutigen, Ihre Arbeit auf der \href{http://sourceforge.net/projects/jabref/}{SourceForge.net-Seite} bereitzustellen.
+Dasselbe gilt f�r Formatierklassen, die Sie schreiben. Wir w�rden
+uns freuen, eine Sammlung von bereitgestellten Layout-Dateien verteilen
+zu k�nnen oder die Standard-Export-Filter, -Formatierer und -Importfilter
+zu erweitern.
 
-\clearpage
+\clearpage 
 \section{Tastenk�rzel}
 
 Die Men�s k�nnen alle �ber Tastenk�rzel angesteuert werden, die meisten
@@ -2424,7 +2573,7 @@ Neuer Eintrag aus Klartext&
 STRG-SHIFT-N\tabularnewline
 Eintrag bearbeiten&
 STRG-E\tabularnewline
-Bib\TeX{}-Keys generieren&
+\bibtex{}-Keys generieren&
 STRG-G\tabularnewline
 R�ckg�ngig&
 STRG-Y\tabularnewline
@@ -2515,8 +2664,26 @@ Hilfe&
 F1\tabularnewline
 \end{longtable}
 
+\clearpage 
+\section{H�ufige Fragen und Antworten}\label{sec:faq}
+%\secttoc
+
+Die folgenden Fragen und Antworten sind der \href{http://jabref.sourceforge.net/faq.php}{\jabref{}-Homepage} entnommen. Falls Sie dar�ber hinaus Fragen haben, die das Handbuch nicht beantworten konnte, haben Sie folgende M�glichkeiten, zu einer Antwort zu kommen:
+\begin{enumerate}
+	\item Durchsuchen Sie die \href{http://sourceforge.net/forum/?group_id=92314}{Foren} auf der Projektseite bei Sourceforge.
+	\item Stellen Sie Ihre Frage in der \href{http://sourceforge.net/mail/?group_id=92314}{\jabref{}-Mailingliste}.
+\end{enumerate}
+
+\faq{L�uft \jabref{} unter freiem Java (Classpath, Kaffee GCJ etc.)?}{Am 13.~November~2006 hat Sun sein Java unter die GNU General Public License (Version~2) gestellt, so dass die Antwort ">Ja"< lautet. Ansonsten ist zu sagen, dass eine unserer Abh�ngigkeiten derzeit zu einem Absturz f�hrt, wenn mit einer anderen Java API als der von Sun gearbeitet wird. Das gilt f�r Version 0.92 von Classpath.}
 
-\clearpage
+\faq{\label{faq-linux}\jabref{} startet nicht unter Linux. Was kann ich tun?}{\jabref{} l�uft unter Linux, wenn Sie eine Java Runtime Environment (JRE) von Sun in der Version~1.4.2 oder einer neueren Version verwenden. Falls \jabref{} dennoch nicht starten sollte, k�nnen Sie folgende Fehlersuche durchf�hren:
+Starten Sie \texttt{java -{-}version} von der Kommandozeile. Falls dabei kein Produkt von Sun Microsystems verwendet wird (sondern beispielsweise angezeigt wird, dass Sie GCJ VM verwenden), selbst wenn Sie die JRE von Sun installiert haben, m�ssen Sie Ihr Setup anpassen. Da das Vorgehen daf�r sehr von Ihrer Linux-Distribution abh�ngt, k�nnen wir keine Hinweise f�r jede m�gliche Konstellation geben.
+Unter Debian/Ubuntu k�nnen Sie die Einstellungen anpassen, indem Sie \texttt{sudo update-alternatives -{-}config java} aufrufen (dazu brauchen Sie admin-Rechte). In dem Dialog, der daraufhin erscheint, w�hlen Sie die Sun JDK oder JRE. Alternativ k�nnen Sie auch nach der Java-Programmdatei suchen und diese direkt ausf�hren. In Ubuntu findet man Java gew�hnlich unter \texttt{/usr\slash{}lib\slash{}jvm\slash{}java-1.5.0-sun\slash{}jre\slash{}bin\slash{}java}.
+Wenn Sie keine admin-Rechte auf dem Computer haben, k�nnen Sie die Sun JRE in ihrem Home-Verzeichnis installieren. Sie m�ssen dann darauf achten, dass Sie die richtige Programmdatei aufrufen. Wenn Sie die JRE z.\,B. in einen Ordner namens ">java"< in ihrem Home-Verzeichnis installiert haben, geben Sie \texttt{\texttildelow{}/java/jre/bin/java -jar JabRef-2.1.jar} (bzw. die entsprechende Versionsnummer) in der Kommandozeile ein.}
+
+\clearpage\faq{Ich arbeite unter Ubuntu und \jabref{} startet, wenn ich auf das Icon klicke, aber nicht von der Kommandozeile. Wo liegt das Problem?}{Sie haben mehrere Java Virtual Machines installiert und von der Kommandozeile wird die falsche gew�hlt. Schauen Sie unter Frage \ref{faq-linux} nach, wie Sie die Einstellungen �ndern k�nnen.}
+
+\clearpage 
 \section{Entwicklung}
 \secttoc
 \bigskip
@@ -2538,73 +2705,21 @@ der dann f
 \subsection{Beschr�nkungen und bekannte Probleme (Bugs)}
 
 \begin{quote}
-\emph{Dieses Handbuch befindet sich noch in der Entstehungsphase.
-Bitte sehen Sie auf der} \emph{\href{http://sourceforge.net/projects/jabref/}{Projektseite bei Sourceforge}
-nach, welche bekannten Probleme bei \jabref{} auftreten k�nnten.}
+\emph{Da sich die Software schneller entwickelt als dieses Handbuch, muss an dieser Stelle auf die \href{http://sourceforge.net/projects/jabref/}{Projektseite bei Sourceforge} verwiesen werden.}
 \end{quote}
 
-\subsection[Die Zukunft von JabRef]{Die Zukunft von \jabref{}}
-
-Hier sollen einige Punkte aufgef�hrt werden, die in einer der n�chsten
-Versionen von \jabref{} verwirklicht werden k�nnten, z.\,B. die
-\emph{Anpassung der Tastenk�rzel}.
-
-
 \subsection{Danksagung}
 
-Neben den Entwicklern, die die Hilfe-Seiten des Programms geschrieben
-haben, m�chte ich Thomas Fritz f�r seine hilfreichen Tipps und
-Anregungen zum Handbuch danken.
-
-Seit den Anf�ngen als \emph{BibKeeper} und \emph{JBibtexManager} haben
-zahlreiche Personen dazu beigetragen, das \jabrefversion{} zu dem
-geworden ist, was es ist. Erster Dank geb�hrt nat�rlich den Initiatoren
-Morten O. Alver und Nizar N. Batada. Das Entwicklerteam (Michel Baylac,
-Guillaume Gardey, Cyrille d'Haese, Raik Nagel, Ellen Reitmayr, Michael
-Spiegel, Ulrik Stervbo, Dominik Wa�enhoven, Joerg K. Wegner, Michael
-Wrighton, Egon Willighagen und J�rg Zieren) dankt auch den Beitr�gen
-von Kolja Brix, Fr�d�ric Darboux, Fabrice Dessaint, Nathan Dunn, Alexis
-Gallagher, Sascha Hunold, Bernd Kalbfuss, Martin K�hmer, Jeffrey Kuhn,
-Alex Montgomery, John Relph, Moritz Ringler, Rudolf Seemann, Mike
-Smoot, Martin Stolle, David Weitzman und Seb Wills. Weiterer Dank
-geht an Samin Muhammad Ridwanul Karim und Stefan Robert.
+Neben den Entwicklern, die die Hilfe-Seiten des Programms geschrieben haben, m�chte ich Thomas Fritz, Axel Junge und Tobias Wolf f�r ihre hilfreichen Tipps und Anmerkungen zum Handbuch danken.
 
+Seit den Anf�ngen als \emph{BibKeeper} (von Morten O.~Alver) und \emph{JBibtexManager} (von Nizar N.~Batada) haben
+zahlreiche Personen dazu beigetragen, dass \jabrefversion{} zu dem
+geworden ist, was es ist. Wer zum Entwicklerteam geh�rt und wer alles zum Programm beigetragen hat, k�nnen Sie im Programm unter \menu{Hilfe \msep{} �ber JabRef} nachsehen.
 
 \subsection{Lizenz}
 
-\jabref{} ist frei verf�gbar unter den Bedingungen der \href{http://www.gnu.org/copyleft/gpl.html}{GNU Public License}.
-
-
-\subsubsection{Benutzte Fremdsoftware}
-
-\jabref{} benutzt JGoodies Looks 1.2.2 und JGoodiesForms 1.0.4, das
-von \href{http://www.jgoodies.com}{JGoodies} unter den Bedingungen
-der \href{http://www.opensource.org/licenses/bsd-license.html}{BSD License}
-vertrieben wird. Au�erdem werden zwei zust�tzliche Klassen (SimpleInternalFrame and UIFSplitPane) von Karsten Lentzsch benutzt. Kommandozeilenbefehle werden geparst mit \href{http://ritopt.sourceforge.net}{RitOpt},
-das unter den Bedingungen der GNU Public License (Version 2) verf�gbar
-ist. \jabref{} verwendet f�r die Suche den ANTLR Parser Generator.
-ANTLR ist \emph{public domain software}~-- siehe \href{http://www.antlr.org/license.html}{http://www.antlr.org/license.html}
-f�r die Lizenzbedingungen. F�r die Darstellung und Filterung der Tabelle benutzt \jabref{} die \href{http://publicobject.com/glazedlists}{Glazed Lists library}, die unter den Bedingungen der \href{http://www.opensource.org/licenses/lgpl-license.php}{LGPL}
-(Lesser GNU Public License) vertrieben wird. \jabref{} benutzt dar�ber hinaus die \emph{threading
-library} Spin 1.3.1, die unter den Bedingungen der \href{http://www.opensource.org/licenses/lgpl-license.php}{LGPL} vertrieben wird. Das hier beschriebene
-Produkt beinhaltet Software, die von der \href{http://www.apache.org}{Apache Software Foundation}
-entwickelt wurde. Die Bibliotheken \emph{Commons Logging} und \emph{Commons
-HTTP Client} werden von \href{http://jakarta.apache.org}{The Jakarta Project}
-unter der \href{http://opensource.org/licenses/apachepl.php}{Apache Software Lizenz}
-(Version 1.1) vertrieben.
-
-Einige Icons sind von uns, aber die meisten stammen vom \href{http://www.eclipse.org}{Eclipse Projekt},
-das unter den Bedingungen der \href{http://www.opensource.org/licenses/cpl.php}{Common Public License}
-vertrieben wird, sowie vom \href{http://qt.osdn.org.ua}{QIcons Paket},
-das unter den Bedingungen der \href{http://www.gnu.org/copyleft/gpl.html}{GNU Public License}
-vertrieben wird.
-
-\begin{comment}
-M�glicherweise ans Ende eine FAQ anschlie�en
--- Ich kann nicht programmieren, kann ich trotzdem zum Projekt beitragen?
--- Wie installiere ich neue Schriften?
-   Siehe \ref{sub:Erscheinungsbild_Schriften}.
-\end{comment}
+\jabref{} ist frei verf�gbar unter den Bedingungen der \href{http://www.gnu.org/copyleft/gpl.html}{GNU General Public License}. Es gibt unterschiedliche Softwarepakete, die von \jabref{} genutzt werden. Wenn Sie sich �ber die Lizenzbestimmungen dieser Fremdsoftware informieren wollen, schauen Sie bitte unter \menu{Hilfe \msep{} �ber JabRef} nach.
+
 \appendix
 \newpage
 \bibliographystyle{jurabib}
@@ -2617,29 +2732,56 @@ M
 
 \label{RevisionHistory}
 
-\subsection*{(in Arbeit))}
-\begin{revhist}
+%\begin{revhist}{\versiondate}%Datum}
+%\item �nderung
+%\end{revhist}
+
+\begin{revhist}{\versiondate}%Datum}
+\item Grafik auf Titelseite ausgetauscht
+\item Ein paar kleinere �nderungen
+\end{revhist}
+
+\begin{revhist}{10.\,12.\,2006}
+\item Abschnitt ">XMP-Metadaten"< leicht verbessert
+\item FAQ zu freien Java-APIs aktualisiert (Suns Java ist jetzt selbst frei)
+\item Wie immer: kleinere �nderungen
+\end{revhist}
+
+\begin{revhist}{9.\,12.\,2006}
+\item Abschnitte ">Weitere Hilfen"< in ">H�ufige Fragen und Antworten (FAQ)"< umbenannt
+\item FAQs von der Homepage �bersetzt und integriert
+\item Literaturverzeichnis um Eintrag von \cite{Fenn2006} erg�nzt
+\item Ein paar kleinere �nderungen
 \end{revhist}
 
-\subsection*{30.\,1.\,2006)}
-\begin{revhist}
+\begin{revhist}{30.\,11.\,2006}
+\item Abschnitte ">Weitere Hilfen"< hinzugef�gt
+\end{revhist}
+
+\begin{revhist}{28.\,11.\,2006}
+\item Abschnitte ">Abk�rzung von Zeitschriftentiteln"<, ">XMP-Metadaten"<, ">IEEExplore"< und ">Externer Zugriff"< hinzugef�gt
+\item Abschnitte ">Einf�hrung in \bibtex{}"<, ">Das Hauptfenster"<, ">Links zu externen Dateien"< und ">Jabref und Online-Datenbanken"< erweitert
+\item Abschnitt ">Suchfunktionen"< aktualisiert
+\item Abschnitt ">Entwicklung"< gek�rzt
+\item Paket ">listings"< eingebunden (ersetzt Umgebung ">lyxcode"<)
+\item Typewriter-Schrift \texttt{beramono} eingesetzt
+\item Einige kleinere �nderungen
+\end{revhist}
+
+\begin{revhist}{30.\,1.\,2006}
 \item Abschnitt >>\jabref{}-Bibliographien in OpenOffice.org benutzen<< aktualisiert
-\item Abschnitt zur Erzeugung der Bib\TeX{}-Keys aktualisiert
+\item Abschnitt zur Erzeugung der \bibtex{}-Keys aktualisiert
 \item Neues Kapitel (>>Externe Importfilter<<), geschrieben von Andreas Rudert
 \item Einige kleinere �nderungen
 \end{revhist}
 
-\subsection*{6.\,12.\,2005}
-%\renewcommand{\labelitemi}{}
-
-\begin{revhist}
+\begin{revhist}{6.\,12.\,2005}
 \item Lizenzbedingungen f�r das Handbuch hinzugef�gt
 \item von PDF~1.4 auf PDF~1.2 umgestellt
 \item mehrere kleinere �nderungen
 \end{revhist}
 
-\subsection*{16.\,11.\,2005}
-\begin{revhist}
+\begin{revhist}{16.\,11.\,2005}
 \item Erstentwurf von Dominik Wa�enhoven, basierend
 auf dem unver�ffentlichten englischen \emph{Initial Draft} von Nizar Batada (20.\,2.\,2004)
 und den Hilfeseiten des Programms
diff --git a/src/help/de/JournalAbbreviations.html b/src/help/de/JournalAbbreviations.html
new file mode 100644
index 0000000..5d9028e
--- /dev/null
+++ b/src/help/de/JournalAbbreviations.html
@@ -0,0 +1,53 @@
+<HTML>
+
+<BODY text="#275856">
+<basefont size="4" color="#2F4958" face="arial">
+
+<H1>Zeitschriftentitel abkürzen</H1>
+
+Diese Funktion kann unter <b>Optionen -> Abkürzungen der Zeitschriften verwalten</b> eingestellt werden.
+
+<p>JabRef kann automatisch zwischen Zeitschriftentiteln in abgekürzter und ausführlicher Form hin- und herschalten, sofern die Titel in einer Ihrer Zeitschriftenlisten enthalten ist. Sie können mehrere dieser Listen benutzen, die Sie als externe Textdateien anlegen.
+
+<H2>Benutzungshinweise</H2>
+<p>
+Die Abkürzung von Zeitschriftentiteln können Sie von Eintragseditor oder vom Menü <b>Extras</b> aus ein- und ausschalten. Im Eintragseditor benutzen Sie dazu den Button <b>Abkürzung an-/abschalten</b> neben dem <b>Journal</b>-Feld. Es wird zwischen drei Modi hin- und hergeschaltet:
+<ul>
+    <li>Kompletter Name, z.B. "Aquacultural Engineering"</li>
+    <li>ISO-Abkürzung, z.B. "Aquacult. Eng."</li>
+    <li>MEDLINE-Abkürzung, z.B. "Aquacult Eng"</li>
+</ul>
+Falls der Zeitschriftenname sich nicht in Ihren Zeitschriftenlisten findet, wird das Feld nicht verändert.
+
+<p>
+Um die Zeitschriftennamen mehrerer Einträge auf einmal zu konvertieren, können Sie eine beliebige Anzahl von Einträgen auswählen und im Menü <b>Extras</b> einen der Einträge <b>Zeitschriftennamen abkürzen (ISO)</b>, <b>Zeitschriftennamen abkürzen (MEDLINE)</b> und <b>Abkürzung der Zeitschriften aufheben</b> wählen.
+Diese drei Aktionen sorgen dafür, dass bei allen ausgewählten Einträgen die Zeitschriftennamen, die in den Zeitschriftenlisten gefunden werden konnten, abgekürzt oder komplett ausgeschrieben werden.
+
+<h2>Zeitschriftenlisten verwalten</h2>
+
+Sie können mehrere Zeitschriftenlisten als externe Textdateien benutzen, die mit JabRef verlinkt sind. Die primäre Liste kann in JabRef selbst verwaltet werden.
+
+<H3>Ihre persönliche Zeitschriften-Abkürzungsliste</H3>
+
+Ihre persönliche Liste verwalten Sie im oberen Teil des <b>Abkürzung der Zeitschriftennamen</b>-Dialogs.
+Wählen Sie <b>Neue Datei</b> und geben einen Dateinamen ein oder klicken auf den <b>Durchsuchen</b>-Button. Wenn Sie bereits eine Datei haben, die Sie als Grundlage nehmen wollen, wählen Sie stattdessen <b>Bestehende Datei</b> und benutzen den <b>Durchsuchen</b>-Button zum Auswählen dieser Datei. Die Tabelle zeigt dann den Inhalt der Liste, die Sie ausgewählt haben.
+
+<p>Sie können mit Hilfe der <b>+</b> und <b>-</b> Buttons an der rechten Seite Einträge hinzufügen oder entfernen. Für jeden Eintrag müssen Sie den vollständigen Zeitschriftennamen und die ISO-Abkürzung angeben (z.B. "Aquacultural Engineering" und "Aquacult. Eng."). Mit einem Doppelklick auf die Tabellenzeile können Sie die Einträge bearbeiten.
+
+<p>Sobald Sie auf <b>OK</b> klicken (oder wenn Sie eine bestehende Datei ausgewält haben), enthält die Tabelle mindestens eine Zeile. Der Tabelleninhalt wird in die ausgewählte Datei geschrieben und die Zeitschriftenliste von JabRef wird aktualisiert.
+
+<h3>Externe Zeitschriftenlisten</h3>
+
+Zusätzlich zu Ihrer persönlichen Liste können Sie mehrere externe Listen verlinken. Diese Verknüpfungen werden im unteren Teil des <b>Abkürzung der Zeitschriftennamen</b>-Dialogs verwaltet. Externe Listen sind den persönlichen Listen ähnlich - der einzige Unterschied ist, dass Sie nicht mit JabRef selbst verwaltet werden können.
+<p>
+Um eine externe Liste hinzuzufügen, klicken Sie zunächst auf den <b>+</b> Knopf, falls nötig (das fügt eine weitere Zeile hinzu). Dann benutzen Sie entweder den <b>Durchsuchen</b>- oder den <b>Herunterladen</b>-Button.
+    <ul>
+    <li>Mit dem <b>Durchsuchen</b>-Knopf können Sie eine auf Ihrem Computer bestehende Datei auswählen.</li>
+    <li>Mit dem <b>Herunterladen</b>-Knopf können Sie eine Liste aus dem Internet herunterladen, indem Sie eine URL angeben. Die Datei wird auf Ihrem Computer gespeichert und mit JabRef verlinkt.
+    Die URL ist standardmäßig die Adresse einer Zeitschriftenliste auf der JabRef-Homepage. Diese Liste ist unvollständig, wird in Zukunft aber ausgebaut.</li>
+    </ul>
+
+Jeder Eintrag in Ihrer persönlichen Liste überschreibt einen Eintrag mit demselben vollständigen Zeitschriftennamen in einer Ihrer externen Listen. In ähnlicher Weise werden die externen Listen in der Reihenfolge, wie sie aufgelistet werden, abgearbeitet.
+
+</BODY>
+</HTML>
\ No newline at end of file
diff --git a/src/help/de/LabelPatterns.html b/src/help/de/LabelPatterns.html
index 886cd22..8ac7418 100644
--- a/src/help/de/LabelPatterns.html
+++ b/src/help/de/LabelPatterns.html
@@ -63,6 +63,7 @@ Modifikator stehen. Modifikatoren werden in der Reihenfolge angewendet, in der s
 <ul>
 <li><b>:abbr</b>: Kürzt den Text, der von einem Feldnamen oder speziellen Feldmarken gebildet wird. Nur der erste Buchstabe und weitere Buchstaben, die auf ein Leerzeichen folgen, werden berücksichtigt. Zum Beispiel würde <b>[journal:abbr]</b> die Zeitschrift "Jorunal of Fish Biology" zu "JoFB" wandeln.<br>
 <li><b>:lower</b>: Wandelt den von der Feldmarke eingefügten Text in Kleinbuchstaben. So wird beispielsweise bei <b>[auth:lower]</b> der Nachname des ersten Autors in Kleinbuchstaben ausgegeben.
+</ul>
 <P>
 Wenn Sie keine Key-Muster für einen bestimmten Eintragstyp angeben, wird das vorgegebene
 Muster (default pattern) verwendet. Sie können das vorgegebene Muster natürlich ebenfalls
@@ -78,11 +79,11 @@ wie folgt aussehen:
 <blockquote> <code>Yared1998</code><BR> <code>Yared1998a</code><BR>
 <code>Yared1998b</code> </blockquote>
 
-<h2>Ersetzen eines Regulären Ausdrucks</h2>
+<h2>Ersetzen eines regulären Ausdrucks</h2>
 
-Nachdem das Key-Muster angewendet wurde, um einen BibTeX-Key zu erstellen, können Sie den Key-Generator nach einem bestimmten Regulären Ausdruck suchen und ihn durch eine Zeichenfolge ersetzen lassen. Der Reguläre Ausdruck und die Zeichenfolge, die ihn ersetzen soll, werden in den Textfeldern unter der Liste der Key-Muster eingegeben.
+Nachdem das Key-Muster angewendet wurde, um einen BibTeX-Key zu erstellen, können Sie den Key-Generator nach einem bestimmten regulären Ausdruck suchen und ihn durch eine Zeichenfolge ersetzen lassen. Der reguläre Ausdruck und die Zeichenfolge, die ihn ersetzen soll, werden in den Textfeldern unter der Liste der Key-Muster eingegeben.
 
-Falls das Feld zur Ersetzung des Regulären Ausdrucks leer ist, werden die mit der Suche übereinstimmenden Regulären Ausdrücke einfach gelöscht.
+Falls das Feld zur Ersetzung des regulären Ausdrucks leer ist, werden die mit der Suche übereinstimmenden regulären Ausdrücke einfach gelöscht.
 
 </font>
 </BODY>
diff --git a/src/help/de/MedlineHelp.html b/src/help/de/MedlineHelp.html
index a299758..914fb2a 100644
--- a/src/help/de/MedlineHelp.html
+++ b/src/help/de/MedlineHelp.html
@@ -5,6 +5,8 @@
 
 <H1>Einträge von Medline abrufen</H1>
 
+MEDLINE ist die wichtigste Datenbank der <em>U.S. National Library of Medicine</em>. Sie enthält Literaturangaben von Zeitschriftenartikeln der Lebenswissenschaften, vornehmlich der Biomedizin.
+<p>
 JabRef kann Literaturangaben von der Medline-Datenbank herunterladen. Um diese Funktion
 zu nutzen, wählen Sie <b>Extras -> Medline abrufen</b>, so dass der Medline-Dialog
 im linken Seitenfeld erscheint.
@@ -31,4 +33,4 @@ an Java. Diese Umgebungseinstellungen sind dokumentiert unter
 
 <p><code>java -Dhttp.proxyHost="hostname" -Dhttp.proxyPort="portnumber"</code>
 
-</HTML>
+</HTML>
\ No newline at end of file
diff --git a/src/help/de/OpenOfficeHelp.html b/src/help/de/OpenOfficeHelp.html
index efbca98..93aefe7 100644
--- a/src/help/de/OpenOfficeHelp.html
+++ b/src/help/de/OpenOfficeHelp.html
@@ -44,36 +44,4 @@ Anschließend wählen Sie <b>Extras -> Literaturdatenbank</b>. Ihre Dat
 Anschließend wählen Sie <b>Extras -> Literaturdatenbank</b>.
 Ihre Datenbank sollte nun angezeigt werden.
 
-<h2>Die exportierte Datei als Bibliographiedatenbank in OpenOffice 2.0 (oder neuer) benutzen</h2>
-Gehen Sie folgendermaßen vor, um eine Tabelle, die von JabRef exportiert wurde, als Bibliographiedatenbank in OpenOffice.org zu benutzen:
-
-<ul>
-    <li>Exportieren Sie Ihre Datenbank in das <b>.ods</b> -Format</li>
-    <li>Starten Sie OpenOffice.org</li>
-    <li>Wählen Sie <b>Extras -> Optionen -> OpenOffice.org Base -> Datenbanken</b></li>
-    <li>Bearbeiten Sie die <i>Bibliography</i>-Datenbank und ändern ihren Namen z.B. in <i>Bibliographie-alt</i></li>
-    <li>Schließen Sie das Fenster <b>Optionen</b> und gehen Sie zu <b>Datei -> Neu -> Datenbank</b></li>
-    <li>Wählen Sie <b>Verbindung zu einer bestehenden Datenbank herstellen</b>, wählen <b>Tabellendokument</b> als
-    Datenbanktyp und wählen die <b>.ods</b>-Datei, die Sie exportiert haben</li>
-    <li>Klicken Sie auf <b>Fertig stellen</b> und wählen den Namen <i>Bibliography</i> im Speicherdialog</li>
-</ul>
-Anschließend wählen Sie <b>Extras -> Literaturdatenbank</b>. Ihre Datenbank sollte nun angezeigt werden.
-<p>
-
-<h2>Eine exportierte Datei als Datenbank in OpenOffice 1.1.x benutzen</h2>
-
- <ul>
-    <li>Exportieren Sie Ihre Datei in das <b>.sxc</b>-Format</li>
-    <li>Starten Sie OpenOffice.org</li>
-    <li>Wählen Sie <b>Extras -> Datenquellen</b></li>
-    <li>Wählen Sie die <i>Bibliography</i>-Datei und ändern ihren Namen z.B. in <i>Bibliographie-alt</i></li>. Drücken Sie <b>Anwenden</b>.
-    <li>Klicken Sie <b>Neue Datenquelle</b>. Ein neuer Eintrag erscheint. Ändern Sie den Namen zu
-        <i>Bibliography</i>.</li>
-     <li>Ändern Sie den <b>Dateityp</b> zu <b>Tabelle</b>. Klicken Sie den <b>...</b>-Button
-     in der Zeile <b>Datenquellen URL</b>. Wählen Sie die <b>.sxc</b>-Datei, die Sie exportiert haben.</li>
-     <li>Klicken Sie auf <b>OK</b>, um das Fenster <b>Datenquellen</b> zu schließen.</li>
-</ul>
-Anschließend wählen Sie <b>Extras -> Literaturdatenbank</b>.
-Ihre Datenbank sollte nun angezeigt werden.
-
-</HTML>
+</HTML>
\ No newline at end of file
diff --git a/src/help/de/RemoteHelp.html b/src/help/de/RemoteHelp.html
new file mode 100644
index 0000000..f31127e
--- /dev/null
+++ b/src/help/de/RemoteHelp.html
@@ -0,0 +1,22 @@
+<HTML>
+
+<BODY text="#275856">
+<basefont size="4" color="#2F4958" face="arial">
+
+<H1>Externer Zugriff</H1>
+
+Diese Funktion kann unter <b>Einstellungen -> Erweitert</b> eingestellt werden.
+
+<p><i>Beachten Sie, dass das Aktivieren dieser Funktion mit Windows XP SP2 (und möglicherweise auch mit anderen Konfigurationen) zu einer Meldung führen kann, die besagt, dass bestimmte Funktionen des Programms von der Windows-Firewall geblockt wurden. Sie können die Firewall anweisen, weiterhin zu blocken, denn die Firewall beeinträchtigt den Externen Zugriff von JabRef nicht.</i>
+
+<p>Falls das Abhören von externen Zugriffen aktiviert ist, versucht JabRef beim Programmstart, den entsprechenden Port abzuhören. Das bedeutet, dass andere Anwendungen Informationen durch diesen Port an JabRef senden können. JabRef akzeptiert dabei nur lokale Verbindungen, um das Risiko eines Eingriffs von außerhalb auszuschließen.
+
+<p>
+Mit dem externen Zugriff kann eine zweite Instanz von JabRef erkennen, dass eine erste Instanz bereits läuft. In diesem Fall leitet die zweite Instanz ihre Kommandozeilen-Optionen an die erste Instanz weiter und beendet sich selbst direkt im Anschluss - sofern die zweite Instanz nicht ausdrücklich instruiert wurde, im Stand-Alone-Modus (als selbständige Instanz) zu starten.
+
+<p>Die erste JabRef-Instanz liest die Kommandozeilenoptionen und führt die erforderlichen Aktionen aus, z.B. das Lesen oder Importieren einer Datei oder das Anhängen einer Datei an die aktive Datenbank. Falls eine Datei mit der Option <code>--importToOpen</code> importiert wird, werden die Einträge an die aktive Datei angehängt. Falls keine Datei geöffnet ist, wird eine neue Datei angelegt.
+
+
+
+</BODY>
+</HTML>
\ No newline at end of file
diff --git a/src/help/de/SearchHelp.html b/src/help/de/SearchHelp.html
index e83cb36..678def5 100644
--- a/src/help/de/SearchHelp.html
+++ b/src/help/de/SearchHelp.html
@@ -5,7 +5,7 @@
 
 <H1>Suchfunktionen</H1>
 
-Es gibt drei verschiedene Suchmethoden in JabRef.
+<!--Es gibt drei verschiedene Suchmethoden in JabRef.-->
 
 <p>
 <em>STRG-F</em> öffnet oder aktiviert den Suchdialog. Drückt man mehrmals auf <em>STRG-F</em>, so werden die verschiedenen Suchmodi ausgewählt. Bei der direkten Suche springt man mit <em>STRG-F</em> zum nächsten Treffer.
@@ -16,13 +16,9 @@ Es gibt drei verschiedene Suchmethoden in JabRef.
 
 Bei der direkten Suche sucht das Programm sofort, sobald Sie einen Buchstaben eingeben. Die Statuszeile informiert Sie über den Sucherfolg. Mit den Tastaturkürzeln wird das Programm dazu veranlasst, nach dem nächsten Vorkommen des aktuellen Suchbegriffs zu suchen. Falls es keine weiteren Vorkommen gibt, informiert die Statuszeile sie darüber. Bei erneuter Wiederholung startet die Suche vom Anfang der Datei. Die Suchreihenfolge richtet sich nach der aktuellen Sortierun [...]
 
-<H2>Suche mit Markierung</H2>
+<H2>Normale Suche</H2>
 
-Wenn Sie die Suchoption "Markieren" wählen, sucht das Programm in Ihrer Datei nach allen Vorkommen ihres Suchbegriffs, sobald Sie auf ENTER drücken. Alle Treffer werden ausgewählt.
-
-<H2>Float-Suche</H2>
-
-Die Suche mit der Option "Float" ist ähnlich wie die Suche mit Markierung, nur dass die Treffer nicht ausgewählt, sondern an den Anfang der Tabelle sortiert werden. Einträge, die nicht mit dem Suchbegriff übereinstimmen, werden unter den Treffern aufgelistet und zusätzlich grau hinterlegt. Um die Anzeige der Suchergebnisse abzuschalten, drücken Sie ESC oder klicken auf "Zurücksetzen".
+Hierbei sucht das Programm nach allen Vorkommen der Wörter ihres Suchausdrucks, sobald Sie ENTER drücken. Nur Einträge, die alle Wörter enthalten, gelten als Treffer. Um nach festen Ausdrücken zu suchen, müssen Sie die Wörter in doppelte Anführungszeichen einfassen. Zum Beispiel findet die Suchanfrage <b>progress "marine acquaculture"</b> Einträge, die sowohl das wort "progress" als auch den Ausdruck "marine acquaculture" aufweisen. Alle Eintr [...]
 
 <a name="advanced"><H2>Feldbezeichner und logische Operatoren</H2></a>
 
@@ -44,7 +40,7 @@ Das "="-Zeichen ist eigentlich eine Abkürzung für "enthält" ("con
 <p>
 entrytype = thesis
 <p>
-… findet z.B. Einträge, deren Typ (wie in der Spalte "Entrytype" dargestellt) das Wort "thesis" enthält (z.B. "phdthesis" und "mastersthesis"). Ebenso erlaubt das Pseudofeld "bibtexkey" die Suche nach BibTeX keys, z.B.:
+… findet z.B. Einträge, deren Typ (wie in der Spalte "Entrytype" dargestellt) das Wort "thesis" enthält (z.B. "phdthesis" und "mastersthesis"). Ebenso erlaubt das Pseudofeld "bibtexkey" die Suche nach BibTeX-Keys, z.B.:
 <p>
 bibtexkey = miller2005
 
diff --git a/src/help/de/XMPHelp.html b/src/help/de/XMPHelp.html
new file mode 100644
index 0000000..c75510c
--- /dev/null
+++ b/src/help/de/XMPHelp.html
@@ -0,0 +1,105 @@
+<HTML>
+
+<BODY text="#275856">
+<basefont size="4" color="#2F4958" face="arial">
+
+<H1>Unterstützung von XMP-Metadaten in JabRef</H1>
+<p>
+XMP ist ein Standard, der von Adobe Systems entwickelt wurde, um Metadaten (Daten, die Informationen über andere Daten enthalten) in Dateien zu speichern. Ein bekanntes Beispiel für Metadaten sind ID3-Tags, die zur Beschreibung von Künstlern, Albumtiteln und Liednamen einer MP3-Datei verwendet werden. Mit Hilfe von Metadaten können MP3-Dateien unabhängig von ihrem Dateinamen identifiziert und z.B. von MP3-Playern ausgelesen und angezeigt werden.
+</p>
+<p>
+Mit der XMP-Unterstützung versucht das JabRef-Team, die Vorteile von Metadaten in die Welt der Literaturmanager einzuführen.
+Sie können <b>XMP schreiben</b> im <b>Allgemein</b>-Tab des Eintragseditors wählen und damit alle BibTeX-Informationen in die verlinkte PDF-Datei schreiben. Wenn Sie diese PDF-Datei mit anderen austauschen, können diese die Datei in das JabRef-Fenster ziehen und haben damit alle Informationen zur Verfügung, die Sie eingegeben haben.
+</p>
+
+<H2>Benutzung</H2>
+
+Um die XMP-Funktionen in JabRef zu nutzen, gehen Sie folgendermaßen vor:
+
+<ul>
+  <li>Zum <i>Importieren einer einzelnen PDF-Datei mit Metadaten</i> wählen Sie <b>Datei -> Importieren in [neue|aktuelle] Datenbank</b> und im anschließenden Dialog als Dateiformat <b>PDF mit XMP-Anmerkungen</b> aus. Sie können die PDF-Datei stattdessen auch mit der Maus auf das Hauptfenster von JabRef ziehen.
+</li>
+  <li>Um <i>bibliographische Informationen in eine verlinkte PDF-Datei zu schreiben</i>, klicken Sie auf <b>XMP schreiben</b> im <b>Allgemein</b>-Tab des Eintragseditors.</li>
+  <li>Wenn Sie <i>alle PDFs einer Datei mit Metadaten versehen</i> wollen, wählen Sie <b>Extras -> XMP-Metadaten in PDFs schreiben</b>.</li>
+  <li>Um zu überprüfen, ob das Schreiben der Metadaten funktioniert hat, öffnen Sie die Datei in Adobe Acrobat und wählen <b>Datei -> Dokumenteigenschaften</b> und dann unter dem Reiter <b>Beschreibung</b> die Schaltfläche <b>Zusätzliche Metadaten</b>. Wenn Sie links "Erweitert" auswählen, sollten Sie im rechten Teil des Dialogs einen Eintrag "http://jabref.sourceforge.net/bibteXMP" sehen, der die entsprechenden Metadaten enthält. Dies geht nur mit [...]
+  <li>Wer kein Adobe Acrobat zur Verfügung hat, kann stattdessen das Programm <i>pdfinfo</i> verwenden, um die XMP-Metadaten zu überprüfen. <i>pdfinfo</i> ist Teil von Xpdf (<code>www.foolabs.com/xpdf</code>) und Poppler (<code>http://poppler.freedesktop.org</code>).</li>
+</ul>
+
+<h2>BibteXmp Dateiformat</h2>
+
+<p>
+XMP nutzt zum Speichern der Daten eine Teilmenge des <i>Resource Description Framework</i> (RDF). Für JabRef wird ein neues Metadatenformat benutzt, das BibTeX sehr gut abbildet. Alle Felder und Werte werden in Knoten eines XML-Dokuments verwandelt. Nur Autoren und Herausgeber werden als rdf:Seq-Strukturen gespeichert, so dass die trennenden 'and's weggelassen werden können. Alle Strings und crossrefs werden in den Metadaten aufgelöst.
+</p>
+<p>
+Das folgende einfache Minimal-Schema wird benutzt:
+</p>
+<p>
+<ul>
+  <li>Der BibTeX-Key wird als <code>bibtexkey</code> gespeichert.</li>
+  <li>Der Eintragstyp wird als <code>entrytype</code> gespeichert.</li>
+  <li><code>author</code> und <code>editor</code> sind kodiert als <code>rdf:Seq</code>s, wobei die einzelnen Autoren und Herausgeber als <code>rdf:li</code>s dargestellt werden.</li>
+  <li>Alle anderen Felder werden unter ihrem Feld-Namen gespeichert.</li>
+</ul>
+</p>
+<p>
+Es folgt ein Beispiel:
+</p>
+<pre>
+ at INPROCEEDINGS{CroAnnHow05,
+  author = {Crowston, K. and Annabi, H. and Howison, J. and Masango, C.},
+  title = {Effective work practices for floss development: A model and propositions},
+  booktitle = {Hawaii International Conference On System Sciences (HICSS)},
+  year = {2005},
+  owner = {oezbek},
+  timestamp = {2006.05.29},
+  url = {http://james.howison.name/publications.html}
+}
+</pre>
+
+wird umgewandelt in
+
+<pre>
+<rdf:Description xmlns:bibtex="http://jabref.sourceforge.net/bibteXMP/"
+    bibtex:bibtexkey="CroAnnHow05"
+    bibtex:year="2005"
+    bibtex:title="Effective work practices for floss development: A model and propositions"
+    bibtex:owner="oezbek"
+    bibtex:url="http://james.howison.name/publications.html"
+    bibtex:booktitle="Hawaii International Conference On System Sciences (HICSS)"
+    bibtex:timestamp="2006.05.29">
+        <bibtex:author>
+            <rdf:Seq>
+                <rdf:li>K. Crowston</rdf:li>
+                <rdf:li>H. Annabi</rdf:li>
+                <rdf:li>J. Howison</rdf:li>
+                <rdf:li>C. Masango</rdf:li>
+            </rdf:Seq>
+        </bibtex:author>
+    <bibtex:entrytype>Inproceedings</bibtex:entrytype>
+</rdf:Description>
+</pre></td></tr>
+</table>
+
+<p>
+Beachten Sie die folgenden Warnungen, wenn Sie bibteXMP parsen möchten:
+</p>
+<p>
+<ul>
+  <li>In RDF können Attribut-Wert-Paare auch als Knoten wiedergegeben werden und vice versa.</li>
+</ul>
+</p>
+<H2>Weiterführende Links</H2>
+<p>
+Einige Links zu XMP und PDFs mit Anmerkungen (englisch):
+</p>
+<p>
+<ul>
+  <li><a href="http://freelancepropaganda.com/themp/">James Howison's Blog "Themp---Managing Academic Papers like MP3s"</a></li>
+  <li><a href="http://www.xml.com/pub/a/2004/09/22/xmp.html">XML.com-Artikel zu XMP</a></li>
+  <li><a href="http://jempbox.org">JempBox</a> und <a href="http://pdfbox.org">PDFBox</a> von Ben Litchfield (Java libraries zum Zugriff auf die PDFs und die Metadaten)</a></li>
+  <li><a href="http://episteme.arstechnica.com/eve/ubb.x/a/tpc/f/8300945231/m/377001889631">Gute Diskussion bei ArsTechnica zum Management von PDFs.</a></li>
+  <li><a href="http://partners.adobe.com/public/developer/en/xmp/sdk/xmpspecification.pdf">Adobe XMP Spezifikation</a></li>
+</ul>
+</p>
+</body>
+</HTML>
\ No newline at end of file
diff --git a/src/help/fr/About.html b/src/help/fr/About.html
index 6479a3c..7d12cb2 100644
--- a/src/help/fr/About.html
+++ b/src/help/fr/About.html
@@ -5,7 +5,7 @@
 <CENTER>
 <H1>JabRef version @version@</H1>
 
-(c) 2006
+(c) 2007
 <p>
 <img src="/images/JabRef-icon-48.png"></img>
 
@@ -21,6 +21,7 @@ Michel Baylac,
 Guillaume Gardey,
 Cyrille d'Haese,
 Raik Nagel,
+Christopher Oezbek,
 Ellen Reitmayr,
 Gert Renckens,
 Andreas Rudert,
@@ -33,6 +34,8 @@ Egon Willighagen,
 Jörg Zieren
 
 <H2>Contributions de :</H2>
+Michael Beckmann,
+Oliver B�ckmann,
 Kolja Brix,
 Frédéric Darboux,
 Fabrice Dessaint,
@@ -44,15 +47,20 @@ Bernd Kalbfuss,
 Martin Kähmer,
 Ervin Kolenovic,
 Krzysztof A. Kościuszkiewicz,
+Christian Kopf,
 Jeffrey Kuhn,
 Alex Montgomery,
-Christopher Oezbek,
+Ambrogio Oliva,
 John Relph,
+Hannes Restel,
 Moritz Ringler,
+Andreas Rudert,
 Mark Schenk,
 Rudolf Seemann,
 Toralf Senger,
+Manuel Siebeneicher
 Mike Smoot,
+Ulrich Stärk,
 Martin Stolle,
 David Weitzman,
 Seb Wills,
@@ -91,6 +99,10 @@ La majorit
 (<code>http://www.everaldo.com</code>), qui est distribu�e sous les termes de la
 Lesser General Public License.
 
+<P>
+JabRef utilise les bibliothèques JempBox et PDFBox pour gérer manipuler les PDF, les deux étant 
+ées sous une licence de style BSD.
+
 </CENTER>
 </BODY>
 </HTML>
diff --git a/src/help/fr/EndNoteFilters.html b/src/help/fr/EndNoteFilters.html
index 2a59500..5d59364 100644
--- a/src/help/fr/EndNoteFilters.html
+++ b/src/help/fr/EndNoteFilters.html
@@ -9,7 +9,7 @@
 
 JabRef peut exporter des bases de données dans des fichiers
 lisibles par EndNote. Pour utiliser cette fonction,
-choisissez <b>Fichier -> Exporter -> EndNote</b>, et
+choisissez <b>Outils -> EndNote</b>, et
 spécifiez le nom du fichier d'exportation.
 
 <h2>Importer dans EndNote</h2>
diff --git a/src/help/fr/XMPHelp.html b/src/help/fr/XMPHelp.html
index e5bf6c1..15f3ae4 100644
--- a/src/help/fr/XMPHelp.html
+++ b/src/help/fr/XMPHelp.html
@@ -28,7 +28,15 @@ Pour utiliser la fonction XMP dans JabRef, vous pouvez faire les choses suivante
   la fenêtre principale, allez dans l'onglet "General" et cliquer sur "Ecrire XMP".</li>
   <li>Si vous voulez <b>annoter tous les PDFs dans une base de données déterminée</b> vous pouvez sélectionner "Outils -> Ecrire XMP pour la base de données"</li>
   <li>Pour vérifier si cela a fonctionné, vous pouvez ouvrir le PDF dans Adobe Acrobat et sélectionner
-  "Fichier -> Propriétés du Document -> Métadonnées additionnelles -> Avancé". Dans l'arborescence sur la droite vous devriez voir une entrée nommée "http://purl.org/net/bibteXMP".
+  "Fichier -> Propriétés du Document -> Métadonnées additionnelles -> Avancé". 
+ Dans l'arborescence sur la droite vous devriez voir une entrée nommée "http://purl.org/net/bibteXMP".
+  Cela fonctionne uniquement avec Adobe Acrobat, et pas avec Adobe Reader.</li>
+  <li>Si vous n'avez pas Adobe Acrobat, vous pouvez utiliser <i>pdfinfo</i> à  la place afin de voir les métadonnées XMP. <i>pdfinfo</i> fait partie de Xpdf (<code>www.foolabs.com/xpdf</code>) et Poppler (<code>http://poppler.freedesktop.org</code>).</li>
+
+
+
+
+
 </ul>
 
 <h2>Format de fichier BibteXmp</h2>
@@ -89,7 +97,7 @@ sera transformé en
 </table>
 
 <p>
-Faites attention aux pi�ges suivants si vous essayer de traiter les m�tadonn�es bibtexXMP :
+Faites attention aux pi�ges suivants si vous essayez de traiter les m�tadonn�es bibtexXMP :
 </p>
 <p>
 <ul>
diff --git a/src/images/font/ACTIVA.TTF b/src/images/font/ACTIVA.TTF
new file mode 100644
index 0000000..c973b2c
Binary files /dev/null and b/src/images/font/ACTIVA.TTF differ
diff --git a/src/images/font/ASTROLYT.TTF b/src/images/font/ASTROLYT.TTF
new file mode 100644
index 0000000..9a92497
Binary files /dev/null and b/src/images/font/ASTROLYT.TTF differ
diff --git a/src/images/font/AUGIE.TTF b/src/images/font/AUGIE.TTF
new file mode 100644
index 0000000..175d7ce
Binary files /dev/null and b/src/images/font/AUGIE.TTF differ
diff --git a/src/images/splash.png b/src/images/splash.png
index 55bce92..56addd6 100644
Binary files a/src/images/splash.png and b/src/images/splash.png differ
diff --git a/src/java/net/sf/jabref/AdvancedTab.java b/src/java/net/sf/jabref/AdvancedTab.java
index 0a686c1..02279a5 100644
--- a/src/java/net/sf/jabref/AdvancedTab.java
+++ b/src/java/net/sf/jabref/AdvancedTab.java
@@ -157,7 +157,7 @@ public class AdvancedTab extends JPanel implements PrefsTab {
     public boolean readyToClose() {
 	   
         try {
-            int size = Integer.parseInt(remoteServerPort.getText());
+            Integer.parseInt(remoteServerPort.getText());
             return true; // Ok, the number was legal.
         } catch (NumberFormatException ex) {
             JOptionPane.showMessageDialog
@@ -169,4 +169,8 @@ public class AdvancedTab extends JPanel implements PrefsTab {
 
     }
 
+	public String getTabName() {
+		return Globals.lang("Advanced");
+	}
+
 }
diff --git a/src/java/net/sf/jabref/AppearancePrefsTab.java b/src/java/net/sf/jabref/AppearancePrefsTab.java
index 3b4e6a2..dbc140f 100644
--- a/src/java/net/sf/jabref/AppearancePrefsTab.java
+++ b/src/java/net/sf/jabref/AppearancePrefsTab.java
@@ -1,15 +1,24 @@
 package net.sf.jabref;
 
-import java.util.Vector;
-import javax.swing.*;
-import javax.swing.table.*;
-import java.awt.*;
-import java.awt.event.*;
-import com.jgoodies.forms.layout.*;
-import com.jgoodies.forms.factories.*;
-import com.jgoodies.forms.builder.*;
+import java.awt.BorderLayout;
+import java.awt.Font;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
 import net.sf.jabref.gui.ColorSetupPanel;
 
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+
 class AppearancePrefsTab extends JPanel implements PrefsTab {
 
     JabRefPreferences _prefs;
@@ -169,8 +178,7 @@ class AppearancePrefsTab extends JPanel implements PrefsTab {
     public boolean readyToClose() {
         try {
             // Test if font size is a number:
-            int size = Integer.parseInt(fontSize.getText());
-
+            Integer.parseInt(fontSize.getText());
         } catch (NumberFormatException ex) {
             JOptionPane.showMessageDialog
                     (null, Globals.lang("You must enter an integer value in the text field for") + " '" +
@@ -182,4 +190,7 @@ class AppearancePrefsTab extends JPanel implements PrefsTab {
 
     }
 
+	public String getTabName() {
+	    return Globals.lang("Appearance");
+	}  
 }
diff --git a/src/java/net/sf/jabref/BasePanel.java b/src/java/net/sf/jabref/BasePanel.java
index 3acf1c6..76bfc09 100644
--- a/src/java/net/sf/jabref/BasePanel.java
+++ b/src/java/net/sf/jabref/BasePanel.java
@@ -1328,81 +1328,8 @@ public class BasePanel extends JPanel implements ClipboardOwner, FileUpdateListe
                   });
 
 
-              actions.put("exportToClipboard", new AbstractWorker() {
-              String message = null;
-              public void run() {
-              if (mainTable.getSelected().size() == 0) {
-                  message = Globals.lang("No entries selected")+".";
-                  getCallBack().update();
-                  return;
-              }
-
-              // Make a list of possible formats:
-              Map formats = new HashMap();
-              formats.put("BibTeXML", "bibtexml");
-              formats.put("DocBook", "docbook");
-              formats.put("HTML", "html");
-                          formats.put("RTF (Harvard)", "harvard/harvard");
-              formats.put("Simple HTML", "simplehtml");
-              for (int i = 0; i < Globals.prefs.customExports.size(); i++) {
-                  Object o = (Globals.prefs.customExports.getElementAt(i))[0];
-                  formats.put(o, o);
-              }
-                          Object[] array = formats.keySet().toArray();
-                          Arrays.sort(array);
-              JList list = new JList(array);
-              list.setBorder(BorderFactory.createEtchedBorder());
-              list.setSelectionInterval(0,0);
-              list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-              int answer =
-                  JOptionPane.showOptionDialog(frame, list, Globals.lang("Select format"),
-                               JOptionPane.YES_NO_OPTION,
-                               JOptionPane.QUESTION_MESSAGE, null,
-                               new String[] {Globals.lang("Ok"), Globals.lang("Cancel")},
-                               Globals.lang("Ok"));
-
-              if (answer == JOptionPane.NO_OPTION)
-                  return;
-
-              String lfName = (String)(formats.get(list.getSelectedValue()));
-              final boolean custom = (list.getSelectedIndex() >= Globals.STANDARD_EXPORT_COUNT);
-              String dir = null;
-              if (custom) {
-                  int index = list.getSelectedIndex()-Globals.STANDARD_EXPORT_COUNT;
-                  dir = (String)(Globals.prefs.customExports.getElementAt(index)[1]);
-                  File f = new File(dir);
-                  lfName = f.getName();
-                  lfName = lfName.substring(0, lfName.indexOf("."));
-                  // Remove file name - we want the directory only.
-                  dir = f.getParent()+System.getProperty("file.separator");
-              }
-              final String format = lfName,
-                  directory = dir;
-
-              try {
-                  BibtexEntry[] bes = mainTable.getSelectedEntries();
-                  StringWriter sw = new StringWriter();
-                  System.out.println("actual export to clipboard not implemented...");
-                  //FileActions.exportEntries(database, bes, format, custom, directory, sw);
-                  ClipboardOwner owner = new ClipboardOwner() {
-                    public void lostOwnership(Clipboard clipboard, Transferable content) {}
-                  };
-                  //StringSelection ss = new StringSelection(sw.toString());
-                  RtfSelection rs = new RtfSelection(sw.toString());
-                     Toolkit.getDefaultToolkit().getSystemClipboard()
-                        .setContents(rs, owner);
-                  message = Globals.lang("Entries exported to clipboard")+": "+bes.length;
-              } catch (Exception ex) {
-                  ex.printStackTrace();
-              }
-              }
-
-              public void update() {
-              output(message);
-              }
-
-          });
-
+          actions.put("exportToClipboard", new ExportToClipboardAction(frame, database()));
+        
         actions.put("writeXMP", new WriteXMPAction(this));
         
         actions.put("abbreviateIso", new AbbreviateAction(this, true));
@@ -2415,35 +2342,43 @@ public class BasePanel extends JPanel implements ClipboardOwner, FileUpdateListe
       //Util.pr("File '"+file.getPath()+"' has been modified.");
       updatedExternally = true;
 
+      final ChangeScanner scanner = new ChangeScanner(frame, BasePanel.this);
+
       // Adding the sidepane component is Swing work, so we must do this in the Swing
       // thread:
       Thread t = new Thread() {
-        public void run() {
-            // Test: running scan automatically in background
-            ChangeScanner scanner = new ChangeScanner(frame, BasePanel.this);
-            scanner.changeScan(BasePanel.this.getFile());
-            try {
-                scanner.join();
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-            }
-
-            if (scanner.changesFound()) {
-                FileUpdatePanel pan = new FileUpdatePanel(frame, BasePanel.this,
-                        sidePaneManager, getFile(), scanner);
-          sidePaneManager.register("fileUpdate", pan);
-          sidePaneManager.show("fileUpdate");
-                setUpdatedExternally(false);
-                //scanner.displayResult();
-            } else {
-                setUpdatedExternally(false);
-                //System.out.println("No changes found.");
-        }
-
-        }
-      };
-      SwingUtilities.invokeLater(t);
+	      public void run() {
+		  
+		  // Check if there is already a notification about external
+		  // changes:
+		  boolean hasAlready = sidePaneManager.hasComponent(FileUpdatePanel.NAME);
+		  if (hasAlready) {
+		      sidePaneManager.hideComponent(FileUpdatePanel.NAME);
+		      sidePaneManager.unregisterComponent(FileUpdatePanel.NAME);
+		  }
+		  FileUpdatePanel pan = new FileUpdatePanel(frame, BasePanel.this,
+							    sidePaneManager, getFile(), scanner);
+		  sidePaneManager.register(FileUpdatePanel.NAME, pan);
+		  sidePaneManager.show(FileUpdatePanel.NAME);
+		  setUpdatedExternally(false);
+		  //scanner.displayResult();
+	      }
+	  };
+
+      // Test: running scan automatically in background
+      scanner.changeScan(BasePanel.this.getFile());
+      try {
+	  scanner.join();
+      } catch (InterruptedException e) {
+	  e.printStackTrace();
+      }
 
+      if (scanner.changesFound()) {
+	  SwingUtilities.invokeLater(t);
+      } else {
+	  setUpdatedExternally(false);
+	  //System.out.println("No changes found.");
+      }
     }
 
       public void fileRemoved() {
@@ -2509,4 +2444,4 @@ public class BasePanel extends JPanel implements ClipboardOwner, FileUpdateListe
         return frame.groupSelector;
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/java/net/sf/jabref/BibtexEntry.java b/src/java/net/sf/jabref/BibtexEntry.java
index 950fad4..3833e17 100644
--- a/src/java/net/sf/jabref/BibtexEntry.java
+++ b/src/java/net/sf/jabref/BibtexEntry.java
@@ -51,6 +51,10 @@ public class BibtexEntry
     // Search and grouping status is stored in boolean fields for quick reference:
     private boolean searchHit, groupHit;
 
+    public BibtexEntry(){
+    	this(Util.createNeutralId());
+    }
+    
     public BibtexEntry(String id)
     {
         this(id, BibtexEntryType.OTHER);
diff --git a/src/java/net/sf/jabref/EntryEditor.java b/src/java/net/sf/jabref/EntryEditor.java
index ce1d53d..6f95038 100644
--- a/src/java/net/sf/jabref/EntryEditor.java
+++ b/src/java/net/sf/jabref/EntryEditor.java
@@ -480,8 +480,9 @@ public class EntryEditor extends JPanel implements VetoableChangeListener {
 				source.setText(srcString);
 				lastSourceStringAccepted = srcString;
 			} catch (IOException ex) {
-				source.setText("Error: " + ex.getMessage() + "\n\n" + "Correct the entry, and "
-					+ "reopen editor to display/edit source.");
+				source.setText(ex.getMessage() + "\n\n" + 
+                                        Globals.lang("Correct the entry, and "
+					+ "reopen editor to display/edit source."));
 				source.setEditable(false);
 			}
 
diff --git a/src/java/net/sf/jabref/ExternalProgramsTab.java b/src/java/net/sf/jabref/ExternalProgramsTab.java
index bd932b3..7d8b4d9 100644
--- a/src/java/net/sf/jabref/ExternalProgramsTab.java
+++ b/src/java/net/sf/jabref/ExternalProgramsTab.java
@@ -6,6 +6,12 @@ import java.awt.*;
 import java.awt.event.*;
 import java.io.File;
 
+/**
+ * 
+ * 
+ *  @version $Revision: 1.6 $ ($Date: 2007/01/22 23:00:47 $)
+ *  @deprecated Use ExternalTab instead.
+ */
 class ExternalProgramsTab extends JPanel implements PrefsTab {
 
     JabRefPreferences _prefs;
@@ -128,6 +134,9 @@ class ExternalProgramsTab extends JPanel implements PrefsTab {
 	return true;
     }
 
+	public String getTabName() {
+		return Globals.lang("External programs");
+	}
 }
 
 
diff --git a/src/java/net/sf/jabref/ExternalTab.java b/src/java/net/sf/jabref/ExternalTab.java
index 04f35de..b8e58ca 100644
--- a/src/java/net/sf/jabref/ExternalTab.java
+++ b/src/java/net/sf/jabref/ExternalTab.java
@@ -4,7 +4,6 @@ import java.awt.BorderLayout;
 import java.awt.event.ItemEvent;
 import java.awt.event.ItemListener;
 
-import javax.swing.Action;
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
@@ -21,8 +20,6 @@ public class ExternalTab extends JPanel implements PrefsTab {
 
 	JabRefFrame _frame;
 
-	// private JComboBox language = new
-	// JComboBox(GUIGlobals.LANGUAGES.keySet().toArray());
 	JTextField pdfDir, regExpTextField, psDir, pdf, ps, html, lyx, winEdt, citeCommand;
 
 	ItemListener regExpListener;
@@ -200,4 +197,7 @@ public class ExternalTab extends JPanel implements PrefsTab {
 		return true;
 	}
 
+	public String getTabName() {
+		return Globals.lang("External programs");
+	}
 }
diff --git a/src/java/net/sf/jabref/FieldComparator.java b/src/java/net/sf/jabref/FieldComparator.java
index 77e58ea..f1b465a 100644
--- a/src/java/net/sf/jabref/FieldComparator.java
+++ b/src/java/net/sf/jabref/FieldComparator.java
@@ -14,7 +14,7 @@ import java.util.Comparator;
  * Current Version:
  * 
  * @author $Author: coezbek $
- * @version $Revision: 1.5 $ ($Date: 2006/09/02 00:03:48 $)
+ * @version $Revision: 1.6 $ ($Date: 2006/12/17 23:50:07 $)
  * 
  * TODO: Testcases
  * 
@@ -58,12 +58,21 @@ public class FieldComparator implements Comparator {
 			f2 = e2.getField(field);
 		}
 
+		/*
+		 * [ 1598777 ] Month sorting
+		 * 
+		 * http://sourceforge.net/tracker/index.php?func=detail&aid=1598777&group_id=92314&atid=600306
+		 */
+		int localMultiplier = multiplier;
+		if (isMonthField)
+			localMultiplier = -localMultiplier;
+		
 		// Catch all cases involving null:
 		if (f1 == null)
-			return f2 == null ? 0 : multiplier;
+			return f2 == null ? 0 : localMultiplier;
 
 		if (f2 == null)
-			return -multiplier;
+			return -localMultiplier;
 
 		// Now we now that both f1 and f2 are != null
 		if (isNameField) {
@@ -87,8 +96,6 @@ public class FieldComparator implements Comparator {
 			 */
 			f1 = new Integer(Util.getMonthNumber((String)f1));			
 			f2 = new Integer(Util.getMonthNumber((String)f2));
-			// Somehow this is twisted
-			multiplier = -multiplier;
 		}
 
 		int result = 0;
@@ -105,7 +112,7 @@ public class FieldComparator implements Comparator {
 			result = ours.compareTo(theirs);
 		}
 
-		return result * multiplier;
+		return result * localMultiplier;
 	}
 
 	/**
diff --git a/src/java/net/sf/jabref/GeneralTab.java b/src/java/net/sf/jabref/GeneralTab.java
index 978b56d..a88f35e 100644
--- a/src/java/net/sf/jabref/GeneralTab.java
+++ b/src/java/net/sf/jabref/GeneralTab.java
@@ -311,4 +311,7 @@ public class GeneralTab extends JPanel implements PrefsTab {
         return true;
     }
 
+	public String getTabName() {
+		return Globals.lang("General");
+	}
 }
diff --git a/src/java/net/sf/jabref/Globals.java b/src/java/net/sf/jabref/Globals.java
index d138361..d8486b0 100644
--- a/src/java/net/sf/jabref/Globals.java
+++ b/src/java/net/sf/jabref/Globals.java
@@ -150,6 +150,7 @@ public class Globals {
 	public static SidePaneManager sidePaneManager;
 
 	public static final String NEWLINE = System.getProperty("line.separator");
+    public static final int NEWLINE_LENGTH = System.getProperty("line.separator").length();
 
 	/**
 	 * true if we have unix newlines
@@ -214,7 +215,7 @@ public class Globals {
 			translation = key;
 
 			// Thread.dumpStack(); // For debugging
-			logger("Warning: could not get translation for \"" + key + "\"");
+			//logger("Warning: could not get translation for \"" + key + "\"");
 		}
 		if ((translation != null) && (translation.length() != 0)) {
 			translation = translation.replaceAll("_", " ");
@@ -657,7 +658,7 @@ public class Globals {
 		// According to ISO 8859-1 the "\times" symbol should be placed here
 		// (#215).
 		// Omitting this, because it is a mathematical symbol.
-		HTMLCHARS.put("O", "&OSlash;"); // #216
+		HTMLCHARS.put("O", "Ø"); // #216
 		HTMLCHARS.put("`U", "Ù"); // #217
 		HTMLCHARS.put("'U", "Ú"); // #218
 		HTMLCHARS.put("^U", "Û"); // #219
@@ -1117,7 +1118,7 @@ public class Globals {
 		// According to ISO 8859-1 the "\times" symbol should be placed here
 		// (#215).
 		// Omitting this, because it is a mathematical symbol.
-		RTFCHARS.put("O", "\\u216O"); // "OSlash"
+		RTFCHARS.put("O", "\\u216O"); // "Oslash"
 		// RTFCHARS.put("`U", "\\u217"); // "Ugrave" exists in standard
 		// codepage
 		RTFCHARS.put("'U", "\\u218U"); // "Uacute"
diff --git a/src/java/net/sf/jabref/JabRef.java b/src/java/net/sf/jabref/JabRef.java
index c3448da..bb87284 100644
--- a/src/java/net/sf/jabref/JabRef.java
+++ b/src/java/net/sf/jabref/JabRef.java
@@ -79,7 +79,12 @@ public class JabRef {
 
     public JabRef(String[] args) {
 
-    	ths = this;
+        ths = this;
+
+        // The following two lines signal that the system proxy settings should be used:
+        System.setProperty("java.net.useSystemProxies", "true");
+        System.getProperties().put( "proxySet", "true" );
+
         JabRefPreferences prefs = JabRefPreferences.getInstance();
         Globals.prefs = prefs;
         Globals.setLanguage(prefs.get("language"), "");
diff --git a/src/java/net/sf/jabref/JabRefFrame.java b/src/java/net/sf/jabref/JabRefFrame.java
index 010ef49..932ea7f 100644
--- a/src/java/net/sf/jabref/JabRefFrame.java
+++ b/src/java/net/sf/jabref/JabRefFrame.java
@@ -102,6 +102,7 @@ public class JabRefFrame extends JFrame {
 	JLabel statusLine = new JLabel("", SwingConstants.LEFT), statusLabel = new JLabel(Globals
 		.lang("Status")
 		+ ":", SwingConstants.LEFT);
+    JProgressBar progressBar = new JProgressBar();
 
 	// SearchManager searchManager = new SearchManager(ths, prefs);
 
@@ -489,8 +490,8 @@ AboutAction aboutAction = new AboutAction();
               public void run() {
                   output(Globals.lang("Opening preferences..."));
                   if (prefsDialog == null) {
-                      prefsDialog = new PrefsDialog3(ths, prefs);
-                      Util.placeDialog(prefsDialog, ths);
+                      prefsDialog = new PrefsDialog3(JabRefFrame.this);
+                      Util.placeDialog(prefsDialog, JabRefFrame.this);
                   }
                   else
                       prefsDialog.setValues();
@@ -546,7 +547,7 @@ public JabRefPreferences prefs() {
           }
         }
         if (baseAt(i).getFile() != null) {
-          filenames.add(baseAt(i).getFile().getPath());
+          filenames.add(baseAt(i).getFile().getAbsolutePath());
         }
       }
     }
@@ -558,7 +559,10 @@ public JabRefPreferences prefs() {
       prefs.putInt("sizeX", ths.getSize().width);
       prefs.putInt("sizeY", ths.getSize().height);
       prefs.putBoolean("searchPanelVisible", sidePaneManager.isComponentVisible("search"));
-
+      // Store divider location for side pane:
+      int width = contentPane.getDividerLocation();
+      if (width > 0) 
+          prefs.putInt("sidePaneWidth", width);
       if (prefs.getBoolean("openLastEdited")) {
         // Here we store the names of allcurrent filea. If
         // there is no current file, we remove any
@@ -639,9 +643,12 @@ public JabRefPreferences prefs() {
     }
   }
 
+
   private void initLayout() {
     tabbedPane.putClientProperty(Options.NO_CONTENT_BORDER_KEY, Boolean.TRUE);
 
+    setProgressBarVisible(false);
+
       pushExternalButton = new PushToApplicationButton(this,
               PushToApplicationButton.applications);
     fillMenu();
@@ -706,9 +713,14 @@ public JabRefPreferences prefs() {
     status.add(statusLabel);
     con.weightx = 1;
     con.insets = new Insets(0, 4, 0, 0);
-    con.gridwidth = GridBagConstraints.REMAINDER;
+    con.gridwidth = 1;
     gbl.setConstraints(statusLine, con);
     status.add(statusLine);
+    con.weightx = 0;
+    con.gridwidth = GridBagConstraints.REMAINDER;
+    gbl.setConstraints(progressBar, con);
+    status.add(progressBar);
+    con.weightx = 1;
     con.gridwidth = GridBagConstraints.REMAINDER;
     statusLabel.setForeground(GUIGlobals.validFieldColor.darker());
     con.insets = new Insets(0, 0, 0, 0);
@@ -1115,6 +1127,10 @@ public JabRefPreferences prefs() {
       tools.add(abbreviateMedline);
       tools.add(unabbreviate);
 
+      // TODO: Temporary for 2.2 release: we should perhaps find a better solution:
+      tools.addSeparator();
+      tools.add(new ExpandEndnoteFilters(ths));
+      
       mb.add(tools);
 
       web.add(fetchMedline);
@@ -2075,6 +2091,59 @@ class FetchCiteSeerAction
     }
 
 
+    /** Set the visibility of the progress bar in the right end of the
+      * status line at the bottom of the frame.
+      *
+      * If not called on the event dispatch thread, this method uses
+      * SwingUtilities.invokeLater() to do the actual operation on the EDT.
+      */
+    public void setProgressBarVisible(final boolean visible) {
+	if (SwingUtilities.isEventDispatchThread())
+	    progressBar.setVisible(visible);
+	else SwingUtilities.invokeLater(new Runnable() {
+		public void run() {
+		    progressBar.setVisible(visible);
+		}
+	    });
+    }
+
+
+    /**
+     * Sets the current value of the progress bar.
+      *
+      * If not called on the event dispatch thread, this method uses
+      * SwingUtilities.invokeLater() to do the actual operation on the EDT.
+     */
+    public void setProgressBarValue(final int value) {
+	if (SwingUtilities.isEventDispatchThread())
+	    progressBar.setValue(value);
+	else SwingUtilities.invokeLater(new Runnable() {
+		public void run() {
+		    progressBar.setValue(value);
+		}
+	    });
+
+    }
+
+    /**
+     * Sets the maximum value of the progress bar. Always call this method
+     * before using the progress bar, to set a maximum value appropriate to
+     * the task at hand.
+      *
+      * If not called on the event dispatch thread, this method uses
+      * SwingUtilities.invokeLater() to do the actual operation on the EDT.
+     */
+    public void setProgressBarMaximum(final int value) {
+	if (SwingUtilities.isEventDispatchThread())
+	    progressBar.setMaximum(value);
+	else SwingUtilities.invokeLater(new Runnable() {
+		public void run() {
+		    progressBar.setMaximum(value);
+		}
+	    });
+
+
+    }
 
 class SaveSessionAction
       extends MnemonicAwareAction {
@@ -2341,4 +2410,4 @@ class SaveSessionAction
       // Override isOpaque() to prevent the glasspane from hiding the window contents:
       public boolean isOpaque() { return false; }
   }
-}
\ No newline at end of file
+}
diff --git a/src/java/net/sf/jabref/JabRefPreferences.java b/src/java/net/sf/jabref/JabRefPreferences.java
index 4ea8085..df377db 100644
--- a/src/java/net/sf/jabref/JabRefPreferences.java
+++ b/src/java/net/sf/jabref/JabRefPreferences.java
@@ -129,6 +129,8 @@ public class JabRefPreferences {
         defaults.put("terDescending", Boolean.FALSE);
         defaults.put("columnNames", "entrytype;author;title;year;journal;owner;timestamp;bibtexkey");
         defaults.put("columnWidths","75;280;400;60;100;100;100;100");
+        defaults.put("xmpPrivacyFilters", "pdf;timestamp;keywords;owner;note;review");
+        defaults.put("useXmpPrivacyFilter", Boolean.FALSE);
         defaults.put("numberColWidth",new Integer(GUIGlobals.NUMBER_COL_LENGTH));
         defaults.put("workingDirectory", System.getProperty("user.home"));
         defaults.put("exportWorkingDirectory", System.getProperty("user.home"));
@@ -301,6 +303,8 @@ public class JabRefPreferences {
         defaults.put("useNativeFileDialogOnMac", Boolean.TRUE);
 
         defaults.put("lastUsedExport", null);
+        defaults.put("sidePaneWidth", new Integer(-1));
+        
         //defaults.put("tempDir", System.getProperty("java.io.tmpdir"));
         //Util.pr(System.getProperty("java.io.tempdir"));
 
@@ -737,6 +741,7 @@ public class JabRefPreferences {
         defKeyBinds.put("Abbreviate", "ctrl alt A");
         defKeyBinds.put("Unabbreviate", "ctrl alt shift A");
         defKeyBinds.put("Search IEEXplore", "F8");
+        defKeyBinds.put("Fetch ArXiv.org", "shift F8");
         defKeyBinds.put("Write XMP", "ctrl F4");
 
         //defKeyBinds.put("Select value", "ctrl B");
diff --git a/src/java/net/sf/jabref/MetaData.java b/src/java/net/sf/jabref/MetaData.java
index d40c5ba..2acdc97 100644
--- a/src/java/net/sf/jabref/MetaData.java
+++ b/src/java/net/sf/jabref/MetaData.java
@@ -239,7 +239,7 @@ public class MetaData {
     }
 
     private void wrapStringBuffer(StringBuffer sb, int lineLength) {
-        for (int i=lineLength; i<sb.length(); i+=lineLength+1) {
+        for (int i=lineLength; i<sb.length(); i+=lineLength+Globals.NEWLINE_LENGTH) {
             sb.insert(i, Globals.NEWLINE);
         }
     }
diff --git a/src/java/net/sf/jabref/NameFormatterTab.java b/src/java/net/sf/jabref/NameFormatterTab.java
index 4003868..82fd516 100644
--- a/src/java/net/sf/jabref/NameFormatterTab.java
+++ b/src/java/net/sf/jabref/NameFormatterTab.java
@@ -168,7 +168,7 @@ public class NameFormatterTab extends JPanel implements PrefsTab {
 		tlb.add(new AddRowAction());
 		tlb.add(new DeleteRowAction());
 		tlb.add(new HelpAction(helpDialog, GUIGlobals.nameFormatterHelp,
-			Globals.lang("Help on Name Formatting"), GUIGlobals.getIconUrl("helpSmall")));
+			"Help on Name Formatting", GUIGlobals.getIconUrl("helpSmall")));
 
 		tabPanel.add(tlb, BorderLayout.EAST);
 
@@ -304,4 +304,8 @@ public class NameFormatterTab extends JPanel implements PrefsTab {
 	public boolean readyToClose() {
 		return true;
 	}
+
+	public String getTabName() {
+        return Globals.lang("Name formatter");
+	}
 }
diff --git a/src/java/net/sf/jabref/PrefsDialog2.java b/src/java/net/sf/jabref/PrefsDialog2.java
index 7064663..c05f080 100644
--- a/src/java/net/sf/jabref/PrefsDialog2.java
+++ b/src/java/net/sf/jabref/PrefsDialog2.java
@@ -32,6 +32,7 @@ import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.table.*;
 
+
 /**
  * Preferences dialog. Contains a TabbedPane, and tabs will be defined
  * in separate classes. Tabs MUST implement the PrefsTab interface,
diff --git a/src/java/net/sf/jabref/PrefsDialog3.java b/src/java/net/sf/jabref/PrefsDialog3.java
index 27ce8b6..dc81b83 100644
--- a/src/java/net/sf/jabref/PrefsDialog3.java
+++ b/src/java/net/sf/jabref/PrefsDialog3.java
@@ -1,29 +1,29 @@
 /*
-Copyright (C) 2003 JabRef project
+ Copyright (C) 2003 JabRef project
 
-All programs in this directory and
-subdirectories are published under the GNU General Public License as
-described below.
+ All programs in this directory and
+ subdirectories are published under the GNU General Public License as
+ described below.
 
-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) any later version.
+ 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) any later version.
 
-This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-General Public License for more details.
+ 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, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-USA
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ USA
 
-Further information about the GNU GPL is available at:
-http://www.gnu.org/copyleft/gpl.ja.html
+ Further information about the GNU GPL is available at:
+ http://www.gnu.org/copyleft/gpl.ja.html
 
-*/
+ */
 
 package net.sf.jabref;
 
@@ -37,261 +37,240 @@ import javax.swing.event.*;
 
 import net.sf.jabref.groups.GroupsPrefsTab;
 import net.sf.jabref.gui.MainTable;
+
 import com.jgoodies.forms.builder.ButtonBarBuilder;
 
 /**
- * Preferences dialog. Contains a TabbedPane, and tabs will be defined
- * in separate classes. Tabs MUST implement the PrefsTab interface,
- * since this dialog will call the storeSettings() method of all tabs
- * when the user presses ok.
- *
+ * Preferences dialog. Contains a TabbedPane, and tabs will be defined in
+ * separate classes. Tabs MUST implement the PrefsTab interface, since this
+ * dialog will call the storeSettings() method of all tabs when the user presses
+ * ok.
+ * 
  * With this design, it should be very easy to add new tabs later.
- *
+ * 
  */
 public class PrefsDialog3 extends JDialog {
 
-    private JabRefPreferences _prefs;
-    JPanel upper = new JPanel(),
-        lower = new JPanel(),
-    main = new JPanel();/* {
-		public void add(Component c, Object o) {
-		    super.add(c, o);
-		    System.out.println(o+" "+c.getPreferredSize());
-		    }
-		    };*/
-    JList chooser;
-    JButton importPrefs = new JButton(Globals.lang("Import preferences")),
-    exportPrefs = new JButton(Globals.lang("Export preferences"));
-    CardLayout cardLayout = new CardLayout();
-    HashMap panels = new HashMap();
-    JabRefFrame frame;
-    PrefsDialog3 ths = this;
-
-    public PrefsDialog3(JabRefFrame parent, JabRefPreferences prefs) {
-        super(parent, Globals.lang("JabRef preferences"), false);
-        _prefs = prefs;
-        frame = parent;
-        getContentPane().setLayout(new BorderLayout());
-    getContentPane().add(upper, BorderLayout.CENTER);
-        getContentPane().add(lower, BorderLayout.SOUTH);
-
-        // ----------------------------------------------------------------
-        // Add tabs to tabbed here. Remember, tabs must implement PrefsTab.
-        // ----------------------------------------------------------------
-    String
-        GEN = Globals.lang("General"),
-        APP = Globals.lang("Appearance"),
-        GRP = Globals.lang("Groups"), // JZTODO lyrics
-        EXT = Globals.lang("External programs"),
-        TAB = Globals.lang("Entry table"),
-        COL = Globals.lang("Entry table columns"),
-        KEY = Globals.lang("Key pattern"),
-        PRE = Globals.lang("Entry preview"),
-        //JOU = Globals.lang("Journal names"),
-        ADV = Globals.lang("Advanced"),
-        NAM = Globals.lang("Name formatter");
-
-    ArrayList al = new ArrayList();
-    al.add(GEN);
-    al.add(APP);
-    al.add(GRP);
-    al.add(EXT);
-    al.add(TAB);
-    al.add(COL);
-    al.add(KEY);
-    //al.add(JOU);
-    al.add(PRE);
-    al.add(ADV);
-    al.add(NAM);
-    
-    main.setLayout(cardLayout);
-
-    main.add(new GeneralTab(frame, _prefs), GEN);
-    main.add(new AdvancedTab(_prefs, parent.helpDiag), ADV);
-    main.add(new GroupsPrefsTab(_prefs), GRP);
-    main.add(new AppearancePrefsTab(_prefs), APP);
-    main.add(new ExternalTab(frame, _prefs, parent.helpDiag), EXT);
-    main.add(new TablePrefsTab(_prefs, parent), TAB);
-    main.add(new TableColumnsTab(_prefs, parent), COL);
-    main.add(new TabLabelPattern(_prefs, parent.helpDiag), KEY);
-    main.add(new PreviewPrefsTab(_prefs), PRE);
-    main.add(new NameFormatterTab(parent.helpDiag), NAM);
-    
-    //main.add(new ManageJournalsPanel(frame), JOU);
-
-    upper.setBorder(BorderFactory.createEtchedBorder());
-
-    chooser = new JList(al.toArray());
-    chooser.setBorder(BorderFactory.createEtchedBorder());
-    // Set a prototype value to control the width of the list:
-    chooser.setPrototypeCellValue("This should be wide enough");
-    chooser.setSelectedIndex(0);
-    chooser.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-
-    // Add the selection listener that will show the correct panel when selection changes:
-    chooser.addListSelectionListener(new ListSelectionListener() {
-        public void valueChanged(ListSelectionEvent e) {
-            if (e.getValueIsAdjusting())
-            return;
-            String o = (String)chooser.getSelectedValue();
-            cardLayout.show(main, o);
-        }
-        });
-
-    JPanel one = new JPanel(), two = new JPanel();
-    one.setLayout(new BorderLayout());
-    two.setLayout(new BorderLayout());
-    one.add(chooser, BorderLayout.CENTER);
-    one.add(importPrefs, BorderLayout.SOUTH);
-    two.add(one, BorderLayout.CENTER);
-    two.add(exportPrefs, BorderLayout.SOUTH);
-    upper.setLayout(new BorderLayout());
-    upper.add(two, BorderLayout.WEST);
-    upper.add(main, BorderLayout.CENTER);
-
-    
-        JButton
-            ok = new JButton(Globals.lang("Ok")),
-            cancel = new JButton(Globals.lang("Cancel"));
-        ok.addActionListener(new OkAction());
-        CancelAction cancelAction = new CancelAction();
-        cancel.addActionListener(cancelAction);
-        lower.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
-        ButtonBarBuilder bb = new ButtonBarBuilder(lower);
-        bb.addGlue();
-        bb.addGridded(ok);
-        bb.addGridded(cancel);
-        bb.addGlue();
-        //lower.add(ok);
-        //lower.add(cancel);
-
-        // Key bindings:
-        ActionMap am = chooser.getActionMap();
-        InputMap im = chooser.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
-        im.put(frame.prefs().getKey("Close dialog"), "close");
-        am.put("close", cancelAction);
-
-    // Import and export actions:
-    exportPrefs.setToolTipText(Globals.lang("Export preferences to file"));
-    importPrefs.setToolTipText(Globals.lang("Import preferences from file"));
-    exportPrefs.addActionListener(new ActionListener() {
-        public void actionPerformed(ActionEvent e) {
-            String filename = Globals.getNewFile
-            (frame, new File(System.getProperty("user.home")),
-             ".xml", JFileChooser.SAVE_DIALOG, false);
-            if (filename == null)
-            return;
-            File file = new File(filename);
-            if (!file.exists() ||
-            (JOptionPane.showConfirmDialog
-                         (ths, "'"+file.getName()+"' "+Globals.lang("exists. Overwrite file?"),
-                          Globals.lang("Export preferences"), JOptionPane.OK_CANCEL_OPTION)
-                         == JOptionPane.OK_OPTION)) {
-
-            try {
-                _prefs.exportPreferences(filename);
-            } catch (IOException ex) {
-                JOptionPane.showMessageDialog
-                (ths, Globals.lang("Could not export preferences")+": "+ex.getMessage(), Globals.lang("Export preferences"), JOptionPane.ERROR_MESSAGE);
-                //ex.printStackTrace();
-            }
-            }
-
-        }
-        });
-
-    importPrefs.addActionListener(new ActionListener() {
-        public void actionPerformed(ActionEvent e) {
-            String filename = Globals.getNewFile
-            (frame, new File(System.getProperty("user.home")),
-             ".xml", JFileChooser.OPEN_DIALOG, false);
-            if (filename == null)
-            return;
-
-            try {
-            _prefs.importPreferences(filename);
-            setValues();
-                BibtexEntryType.loadCustomEntryTypes(_prefs);
-                frame.removeCachedEntryEditors();
-            } catch (IOException ex) {
-            JOptionPane.showMessageDialog
-                (ths, Globals.lang("Could not import preferences")+": "+ex.getMessage(), Globals.lang("Import preferences"), JOptionPane.ERROR_MESSAGE);
-            //ex.printStackTrace();
-            }
-        }
-
-
-        });
-
-    setValues();
-
-        pack(); //setSize(440, 500);
-    }
-
-    class OkAction extends AbstractAction {
-        public OkAction() {
-            super("Ok");
-        }
-        public void actionPerformed(ActionEvent e) {
-
-        AbstractWorker worker = new AbstractWorker() {
-            boolean ready = true;
-            public void run() {
-            // First check that all tabs are ready to close:
-            int count = main.getComponentCount();
-            Component[] comps = main.getComponents();
-            for (int i = 0; i < count; i++) {
-                if (!((PrefsTab)comps[i]).readyToClose()) {
-                ready = false;
-                return; // If not, break off.
-                }
-            }
-            // Then store settings and close:
-            for (int i = 0; i < count; i++) {
-                ( (PrefsTab)comps[i]).storeSettings();
-            }
-            Globals.prefs.flush();
-            //try { Thread.sleep(3000); } catch (InterruptedException ex) {}
-            }
-            public void update() {
-            if (!ready)
-                return;
-            setVisible(false);
-            MainTable.updateRenderers();
-            frame.setupAllTables();
-            frame.groupSelector.revalidateGroups(); // icons may have changed
-            frame.output(Globals.lang("Preferences recorded."));
-            }
-        };
-        worker.getWorker().run();
-        worker.getCallBack().update();
-
-        }
-    }
-
-    public void setValues() {
-    // Update all field values in the tabs:
-    int count = main.getComponentCount();
-    Component[] comps = main.getComponents();
-    for (int i = 0; i < count; i++) {
-        ((PrefsTab)comps[i]).setValues();
-    }
-    }
-
-    class CancelAction extends AbstractAction {
-        public CancelAction() {
-            super("Cancel");
-
-        }
-        public void actionPerformed(ActionEvent e) {
-        setVisible(false);
-            // Just close dialog without recording changes.
-            /*(new Thread() {
-              public void run() {
-
-              }
-	      }).start();*/
-        }
-    }
+	JPanel main;
+
+	JabRefFrame frame;
+
+	public PrefsDialog3(JabRefFrame parent) {
+		super(parent, Globals.lang("JabRef preferences"), false);
+		final JabRefPreferences prefs = JabRefPreferences.getInstance();
+		frame = parent;
+
+		final JList chooser;
+
+		JButton importPrefs = new JButton(Globals.lang("Import preferences"));
+		JButton exportPrefs = new JButton(Globals.lang("Export preferences"));
+
+		main = new JPanel();
+		JPanel upper = new JPanel();
+		JPanel lower = new JPanel();
+
+		getContentPane().setLayout(new BorderLayout());
+		getContentPane().add(upper, BorderLayout.CENTER);
+		getContentPane().add(lower, BorderLayout.SOUTH);
+
+		final CardLayout cardLayout = new CardLayout();
+		main.setLayout(cardLayout);
+
+		// ----------------------------------------------------------------
+		// Add tabs to tabbed here. Remember, tabs must implement PrefsTab.
+		// ----------------------------------------------------------------
+		ArrayList tabs = new ArrayList();
+		tabs.add(new GeneralTab(frame, prefs));
+		tabs.add(new GroupsPrefsTab(prefs));
+		tabs.add(new AppearancePrefsTab(prefs));
+		tabs.add(new ExternalTab(frame, prefs, parent.helpDiag));
+		tabs.add(new TablePrefsTab(prefs, parent));
+		tabs.add(new TableColumnsTab(prefs, parent));
+		tabs.add(new TabLabelPattern(prefs, parent.helpDiag));
+		tabs.add(new PreviewPrefsTab(prefs));
+		tabs.add(new NameFormatterTab(parent.helpDiag));
+		tabs.add(new XmpPrefsTab());
+                tabs.add(new AdvancedTab(prefs, parent.helpDiag));
+		
+		Iterator it = tabs.iterator();
+		String[] names = new String[tabs.size()];
+		int i = 0;
+		while (it.hasNext()) {
+			PrefsTab tab = (PrefsTab) it.next();
+			names[i++] = tab.getTabName(); 
+			main.add((Component) tab, tab.getTabName());
+		}
+
+		upper.setBorder(BorderFactory.createEtchedBorder());
+
+		chooser = new JList(names);
+		chooser.setBorder(BorderFactory.createEtchedBorder());
+		// Set a prototype value to control the width of the list:
+		chooser.setPrototypeCellValue("This should be wide enough");
+		chooser.setSelectedIndex(0);
+		chooser.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+		// Add the selection listener that will show the correct panel when
+		// selection changes:
+		chooser.addListSelectionListener(new ListSelectionListener() {
+			public void valueChanged(ListSelectionEvent e) {
+				if (e.getValueIsAdjusting())
+					return;
+				String o = (String) chooser.getSelectedValue();
+				cardLayout.show(main, o);
+			}
+		});
+
+		JPanel one = new JPanel(), two = new JPanel();
+		one.setLayout(new BorderLayout());
+		two.setLayout(new BorderLayout());
+		one.add(chooser, BorderLayout.CENTER);
+		one.add(importPrefs, BorderLayout.SOUTH);
+		two.add(one, BorderLayout.CENTER);
+		two.add(exportPrefs, BorderLayout.SOUTH);
+		upper.setLayout(new BorderLayout());
+		upper.add(two, BorderLayout.WEST);
+		upper.add(main, BorderLayout.CENTER);
+
+		JButton ok = new JButton(Globals.lang("Ok")), cancel = new JButton(Globals.lang("Cancel"));
+		ok.addActionListener(new OkAction());
+		CancelAction cancelAction = new CancelAction();
+		cancel.addActionListener(cancelAction);
+		lower.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
+		ButtonBarBuilder bb = new ButtonBarBuilder(lower);
+		bb.addGlue();
+		bb.addGridded(ok);
+		bb.addGridded(cancel);
+		bb.addGlue();
+		// lower.add(ok);
+		// lower.add(cancel);
+
+		// Key bindings:
+		ActionMap am = chooser.getActionMap();
+		InputMap im = chooser.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+		im.put(frame.prefs().getKey("Close dialog"), "close");
+		am.put("close", cancelAction);
+
+		// Import and export actions:
+		exportPrefs.setToolTipText(Globals.lang("Export preferences to file"));
+		importPrefs.setToolTipText(Globals.lang("Import preferences from file"));
+		exportPrefs.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				String filename = Globals.getNewFile(frame, new File(System
+					.getProperty("user.home")), ".xml", JFileChooser.SAVE_DIALOG, false);
+				if (filename == null)
+					return;
+				File file = new File(filename);
+				if (!file.exists()
+					|| (JOptionPane.showConfirmDialog(PrefsDialog3.this, "'" + file.getName()
+						+ "' " + Globals.lang("exists. Overwrite file?"), Globals
+						.lang("Export preferences"), JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION)) {
+
+					try {
+						prefs.exportPreferences(filename);
+					} catch (IOException ex) {
+						JOptionPane.showMessageDialog(PrefsDialog3.this, Globals
+							.lang("Could not export preferences")
+							+ ": " + ex.getMessage(), Globals.lang("Export preferences"),
+							JOptionPane.ERROR_MESSAGE);
+						// ex.printStackTrace();
+					}
+				}
+
+			}
+		});
+
+		importPrefs.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				String filename = Globals.getNewFile(frame, new File(System
+					.getProperty("user.home")), ".xml", JFileChooser.OPEN_DIALOG, false);
+				if (filename == null)
+					return;
+
+				try {
+					prefs.importPreferences(filename);
+					setValues();
+					BibtexEntryType.loadCustomEntryTypes(prefs);
+					frame.removeCachedEntryEditors();
+				} catch (IOException ex) {
+					JOptionPane.showMessageDialog(PrefsDialog3.this, Globals
+						.lang("Could not import preferences")
+						+ ": " + ex.getMessage(), Globals.lang("Import preferences"),
+						JOptionPane.ERROR_MESSAGE);
+					// ex.printStackTrace();
+				}
+			}
+
+		});
+
+		setValues();
+
+		pack(); // setSize(440, 500);
+	}
+
+	class OkAction extends AbstractAction {
+		public OkAction() {
+			super("Ok");
+		}
+
+		public void actionPerformed(ActionEvent e) {
+
+			AbstractWorker worker = new AbstractWorker() {
+				boolean ready = true;
+
+				public void run() {
+					// First check that all tabs are ready to close:
+					int count = main.getComponentCount();
+					Component[] comps = main.getComponents();
+					for (int i = 0; i < count; i++) {
+						if (!((PrefsTab) comps[i]).readyToClose()) {
+							ready = false;
+							return; // If not, break off.
+						}
+					}
+					// Then store settings and close:
+					for (int i = 0; i < count; i++) {
+						((PrefsTab) comps[i]).storeSettings();
+					}
+					Globals.prefs.flush();
+					// try { Thread.sleep(3000); } catch (InterruptedException
+					// ex) {}
+				}
+
+				public void update() {
+					if (!ready)
+						return;
+					setVisible(false);
+					MainTable.updateRenderers();
+					frame.setupAllTables();
+					frame.groupSelector.revalidateGroups(); // icons may have
+					// changed
+					frame.output(Globals.lang("Preferences recorded."));
+				}
+			};
+			worker.getWorker().run();
+			worker.getCallBack().update();
+
+		}
+	}
+
+	public void setValues() {
+		// Update all field values in the tabs:
+		int count = main.getComponentCount();
+		Component[] comps = main.getComponents();
+		for (int i = 0; i < count; i++) {
+			((PrefsTab) comps[i]).setValues();
+		}
+	}
+
+	class CancelAction extends AbstractAction {
+		public CancelAction() {
+			super("Cancel");
+		}
+
+		public void actionPerformed(ActionEvent e) {
+			setVisible(false);
+		}
+	}
 
 }
diff --git a/src/java/net/sf/jabref/PrefsTab.java b/src/java/net/sf/jabref/PrefsTab.java
index 2831131..0d8947e 100644
--- a/src/java/net/sf/jabref/PrefsTab.java
+++ b/src/java/net/sf/jabref/PrefsTab.java
@@ -1,7 +1,15 @@
 
 package net.sf.jabref;
 
-
+/**
+ * A prefsTab is a component displayed in the PreferenceDialog.
+ * 
+ * It needs to extend from Component.
+ * 
+ * @author $Author: coezbek $
+ * @version $Revision: 1.5 $ ($Date: 2007/01/22 23:00:47 $)
+ *
+ */
 public interface PrefsTab {
 
     /**
@@ -31,4 +39,10 @@ public interface PrefsTab {
      */
     public boolean readyToClose();
 
+    /**
+     * Should return the localized identifier to use for the tab.
+     * 
+     * @return Identifier for the tab (for instance "General", "Appearance" or "External Files").
+     */
+    public String getTabName();  
 }
diff --git a/src/java/net/sf/jabref/PreviewPanel.java b/src/java/net/sf/jabref/PreviewPanel.java
index 37dd412..ae6283b 100644
--- a/src/java/net/sf/jabref/PreviewPanel.java
+++ b/src/java/net/sf/jabref/PreviewPanel.java
@@ -5,6 +5,9 @@ import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.RenderingHints.Key;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyVetoException;
+import java.beans.VetoableChangeListener;
 import java.io.IOException;
 import java.io.StringReader;
 
@@ -25,7 +28,7 @@ import net.sf.jabref.export.layout.LayoutHelper;
  * @version $Revision: 1.15 $ ($Date: 2006/09/03 19:09:59 $)
  *
  */
-public class PreviewPanel extends JEditorPane {
+public class PreviewPanel extends JEditorPane implements VetoableChangeListener {
 
 	public String CONTENT_TYPE = "text/html";
 
@@ -53,7 +56,7 @@ public class PreviewPanel extends JEditorPane {
 	public PreviewPanel(BibtexDatabase database, MetaData metaData, BibtexEntry entry, String layoutFile) {
 		this(metaData, layoutFile);
 		this.database = database;
-		this.entry = entry;
+		setEntry(entry);
 
 		try {
 			readLayout();
@@ -116,13 +119,18 @@ public class PreviewPanel extends JEditorPane {
 	}
 
 	public void setEntry(BibtexEntry newEntry) {
-		entry = newEntry;
-		try {
-			readLayout();
-			update();
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
+            if (newEntry != entry) {
+                if (entry != null)
+                    entry.removePropertyChangeListener(this);
+                newEntry.addPropertyChangeListener(this);
+            }
+            entry = newEntry;
+            try {
+                    readLayout();
+                    update();
+            } catch (Exception ex) {
+                    ex.printStackTrace();
+            }
 	}
 
 	public void update() {
@@ -158,4 +166,16 @@ public class PreviewPanel extends JEditorPane {
 		super.paintComponent(g2);
 		g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, hint);
 	}
+
+    /**
+     * The PreviewPanel has registered itself as an event listener with the currently displayed
+     * BibtexEntry. If the entry changes, an event is received here, and we can update the
+     * preview immediately.
+     */
+    public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
+        /*if (entry != null)
+            System.out.println("Updating: "+entry.getCiteKey());*/
+        
+        update();
+    }
 }
diff --git a/src/java/net/sf/jabref/PreviewPrefsTab.java b/src/java/net/sf/jabref/PreviewPrefsTab.java
index e5cb9b3..1c1c177 100644
--- a/src/java/net/sf/jabref/PreviewPrefsTab.java
+++ b/src/java/net/sf/jabref/PreviewPrefsTab.java
@@ -215,4 +215,8 @@ public class PreviewPrefsTab extends JPanel implements PrefsTab {
 		return true;
 	}
 
+	public String getTabName() {
+		return Globals.lang("Entry preview");
+	}
+
 }
diff --git a/src/java/net/sf/jabref/SearchManager2.java b/src/java/net/sf/jabref/SearchManager2.java
index 1d953d5..d146fbe 100644
--- a/src/java/net/sf/jabref/SearchManager2.java
+++ b/src/java/net/sf/jabref/SearchManager2.java
@@ -247,7 +247,8 @@ settings.add(select);
         pan.add(help);
         main.add(pan);
         main.setBorder(BorderFactory.createEmptyBorder(1,1,1,1));
-        add(main, BorderLayout.CENTER);
+        
+        setContent(main);
 
     searchField.getInputMap().put(Globals.prefs.getKey("Repeat incremental search"),
                       "repeat");
diff --git a/src/java/net/sf/jabref/SidePaneManager.java b/src/java/net/sf/jabref/SidePaneManager.java
index 34b2ad6..2d13d72 100644
--- a/src/java/net/sf/jabref/SidePaneManager.java
+++ b/src/java/net/sf/jabref/SidePaneManager.java
@@ -40,7 +40,7 @@ import javax.swing.event.ChangeListener;
  * Manages visibility of SideShowComponents in a given newly constructed
  * sidePane.
  * 
- * @version $Revision: 1.20 $ ($Date: 2006/08/30 00:04:12 $)
+ * @version $Revision: 1.22 $ ($Date: 2007/01/25 17:46:57 $)
  * 
  */
 public class SidePaneManager {
@@ -73,6 +73,7 @@ public class SidePaneManager {
 			}
 		});
 		sidep = new SidePane();
+                sidep.setVisible(false);
 	}
 
 	public SidePane getPanel() {
@@ -80,7 +81,7 @@ public class SidePaneManager {
 	}
 
 	public synchronized boolean hasComponent(String name) {
-		return (components.get("name") != null);
+		return (components.get(name) != null);
 	}
 
 	public boolean isComponentVisible(String name) {
@@ -142,6 +143,23 @@ public class SidePaneManager {
 		}
 	}
 
+    public synchronized void hideComponent(String name) {
+	SidePaneComponent comp = (SidePaneComponent)components.get(name);
+	if (comp == null)
+	    return;
+	if (visible.contains(comp)) {
+	    comp.componentClosing();
+	    visible.remove(comp);
+	    updateView();
+	}
+    }
+
+	public synchronized void unregisterComponent(String name) {
+	    components.remove(name);
+	}
+
+
+
 	/**
 	 * Update all side pane components to show information from the given
 	 * BasePanel.
@@ -160,10 +178,19 @@ public class SidePaneManager {
 		if (visible.size() > 0) {
 			boolean wasVisible = sidep.isVisible();
 			sidep.setVisible(true);
-			if (!wasVisible)
-				frame.contentPane.setDividerLocation(getPanel().getPreferredSize().width);
-		} else
-			sidep.setVisible(false);
+			if (!wasVisible) {
+                            int width = Globals.prefs.getInt("sidePaneWidth");
+                            if (width > 0)
+                                frame.contentPane.setDividerLocation(width);
+                            else
+                                frame.contentPane.setDividerLocation(getPanel().getPreferredSize().width);
+                        }
+		} else {
+                    if (sidep.isVisible())
+                        Globals.prefs.putInt("sidePaneWidth", frame.contentPane.getDividerLocation());
+                    sidep.setVisible(false);
+                    
+                }
 	}
 
 	public void revalidate() {
diff --git a/src/java/net/sf/jabref/TabLabelPattern.java b/src/java/net/sf/jabref/TabLabelPattern.java
index 2a2bb5d..435a331 100644
--- a/src/java/net/sf/jabref/TabLabelPattern.java
+++ b/src/java/net/sf/jabref/TabLabelPattern.java
@@ -38,7 +38,8 @@ public class TabLabelPattern extends JPanel implements PrefsTab{
 	
     private JCheckBox dontOverwrite = new JCheckBox(Globals.lang("Do not overwrite existing keys")),
         warnBeforeOverwriting = new JCheckBox(Globals.lang("Warn before overwriting existing keys")),
-        generateOnSave = new JCheckBox(Globals.lang("Generate keys before saving (for entries without a key)"));
+        generateOnSave = new JCheckBox(Globals.lang("Generate keys before saving (for entries without a key)")),
+        autoGenerateOnImport = new JCheckBox(Globals.lang("Generate keys for imported entries"));
 
 
     private JLabel lblEntryType, lblKeyPattern;
@@ -84,6 +85,7 @@ public class TabLabelPattern extends JPanel implements PrefsTab{
          //Globals.prefs.put("basenamePatternReplacement", basenamePatternReplacement.getText());
          Globals.prefs.put("KeyPatternRegex", KeyPatternRegex.getText());
          Globals.prefs.put("KeyPatternReplacement", KeyPatternReplacement.getText());
+         Globals.prefs.putBoolean("generateKeysAfterInspection", autoGenerateOnImport.isSelected());
          Globals.prefs.putBoolean("generateKeysBeforeSaving", generateOnSave.isSelected());
          LabelPatternUtil.updateDefaultPattern();
 
@@ -268,6 +270,9 @@ public class TabLabelPattern extends JPanel implements PrefsTab{
 
         builder.nextLine();
         builder.append(pan);
+        builder.append(autoGenerateOnImport);
+        builder.nextLine();
+        builder.append(pan);
         builder.append(warnBeforeOverwriting);
         builder.append(dontOverwrite);
         builder.nextLine();
@@ -388,6 +393,7 @@ public class TabLabelPattern extends JPanel implements PrefsTab{
         defaultPat.setText(Globals.prefs.get("defaultLabelPattern"));
         dontOverwrite.setSelected(Globals.prefs.getBoolean("avoidOverwritingKey"));
         generateOnSave.setSelected(Globals.prefs.getBoolean("generateKeysBeforeSaving"));
+        autoGenerateOnImport.setSelected(Globals.prefs.getBoolean("generateKeysAfterInspection"));
         warnBeforeOverwriting.setSelected(Globals.prefs.getBoolean("warnBeforeOverwritingKey"));
         // Warning before overwriting is only relevant if overwriting can happen:
         warnBeforeOverwriting.setEnabled(!dontOverwrite.isSelected());
@@ -403,4 +409,8 @@ public class TabLabelPattern extends JPanel implements PrefsTab{
 	    //basenamePatternRegex.setText(Globals.prefs.get("basenamePatternRegex"));
 	    //basenamePatternReplacement.setText(Globals.prefs.get("basenamePatternReplacement"));
     }
+
+	public String getTabName() {
+	    return Globals.lang("Key pattern");
+	}
 }
diff --git a/src/java/net/sf/jabref/TableColumnsTab.java b/src/java/net/sf/jabref/TableColumnsTab.java
index 7cb8951..a190039 100644
--- a/src/java/net/sf/jabref/TableColumnsTab.java
+++ b/src/java/net/sf/jabref/TableColumnsTab.java
@@ -1,25 +1,34 @@
 package net.sf.jabref;
 
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
 import java.util.Vector;
-import javax.swing.*;
-import javax.swing.table.*;
-import java.awt.*;
-import java.awt.event.*;
-import com.jgoodies.forms.layout.*;
-import com.jgoodies.forms.factories.*;
-import com.jgoodies.forms.builder.*;
+
+import javax.swing.AbstractAction;
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.JToolBar;
+import javax.swing.SwingConstants;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
 
 class TableColumnsTab extends JPanel implements PrefsTab {
 
     JabRefPreferences _prefs;
-    private String[] _choices;
     private boolean tableChanged = false;
     private JTable colSetup;
     private int rowCount = -1, ncWidth = -1;
     private Vector tableRows = new Vector(10);
-    private Font font = GUIGlobals.CURRENTFONT,	menuFont;
     private JabRefFrame frame;
-    private int oldMenuFontSize;
 
     class TableRow {
         String name;
@@ -116,10 +125,7 @@ class TableColumnsTab extends JPanel implements PrefsTab {
             ("1dlu, 8dlu, left:pref, 4dlu, fill:pref",//, 4dlu, fill:60dlu, 4dlu, fill:pref",
              "");
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
-        JLabel lab;
         JPanel pan = new JPanel();
-
-
         JPanel tabPanel = new JPanel();
         tabPanel.setLayout(new BorderLayout());
         JScrollPane sp = new JScrollPane
@@ -319,77 +325,7 @@ class TableColumnsTab extends JPanel implements PrefsTab {
         return true;
     }
 
-}
-
-        /*
-        Boolean[] sel = new Boolean[GUIGlobals.ALL_FIELDS.length];
-        boolean found;
-        _choices = GUIGlobals.ALL_FIELDS;
-        _sel = sel;
-        String[] columns = prefs.getStringArray("columnNames");
-        for (int i=0; i<_choices.length; i++) {
-            found = false;
-            for (int j=0; j<columns.length; j++)
-                if (columns[j].equals(_choices[i]))
-                    found = true;
-            if (found)
-                sel[i] = new Boolean(true);
-            else
-                sel[i] = new Boolean(false);
-        }
-
-        TableModel tm = new AbstractTableModel() {
-                public int getRowCount() { return (_choices.length-1)/2; }
-                public int getColumnCount() { return 4; }
-                public Object getValueAt(int row, int column) {
-                    switch (column) {
-                    case 0:
-                        return _choices[row];
-                    case 1:
-                        return _sel[row];
-                    case 2:
-                        return _choices[getRowCount()+row];
-                    case 3:
-                        return _sel[getRowCount()+row];
-                    }
-                    return null; // Unreachable.
-                }
-                public Class getColumnClass(int column) {
-                    if ((column == 0) || (column == 2)) return String.class;
-                    else return Boolean.class;
-                }
-                public boolean isCellEditable(int row, int col) {
-                    if ((col == 1) || (col == 3)) return true;
-                    else return false;
-                }
-                public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
-                    if (columnIndex == 1)
-                        _sel[rowIndex] = (Boolean)aValue;
-                    if (columnIndex == 3)
-                        _sel[getRowCount()+rowIndex] = (Boolean)aValue;
-                }
-
-            };
-
-        JTable table = new JTable(tm);
-        table.setRowSelectionAllowed(false);
-        table.setColumnSelectionAllowed(false);
-        //table.getInputMap().put(GUIGlobals.exitDialog, "close");
-        //table.getActionMap().put("close", new CancelAction());
-        JPanel
-            tablePanel = new JPanel(),
-            innerTablePanel = new JPanel();
-
-        table.setShowVerticalLines(false);
-        innerTablePanel.setBorder(BorderFactory.createEtchedBorder());
-        //innerTablePanel.setBorder(BorderFactory.createLoweredBevelBorder());
-        innerTablePanel.add(table);
-        tablePanel.add(innerTablePanel);
-
-
-        TableColumnModel cm = table.getColumnModel();
-        cm.getColumn(0).setPreferredWidth(90);
-        cm.getColumn(1).setPreferredWidth(25);
-        cm.getColumn(2).setPreferredWidth(90);
-        cm.getColumn(3).setPreferredWidth(25);
-        */
+	public String getTabName() {
+	    return Globals.lang("Entry table columns");
+	}
+}
\ No newline at end of file
diff --git a/src/java/net/sf/jabref/TablePrefsTab.java b/src/java/net/sf/jabref/TablePrefsTab.java
index 6e55c0e..1d1a2a8 100644
--- a/src/java/net/sf/jabref/TablePrefsTab.java
+++ b/src/java/net/sf/jabref/TablePrefsTab.java
@@ -19,6 +19,7 @@ import javax.swing.JTextField;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
+
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 
@@ -286,42 +287,7 @@ class TablePrefsTab extends JPanel implements PrefsTab {
 		return true;
 	}
 
-}
-
-/*
- * Boolean[] sel = new Boolean[GUIGlobals.ALL_FIELDS.length]; boolean found;
- * _choices = GUIGlobals.ALL_FIELDS; _sel = sel; String[] columns =
- * prefs.getStringArray("columnNames"); for (int i=0; i<_choices.length; i++) {
- * found = false; for (int j=0; j<columns.length; j++) if
- * (columns[j].equals(_choices[i])) found = true; if (found) sel[i] = new
- * Boolean(true); else sel[i] = new Boolean(false); }
- * 
- * TableModel tm = new AbstractTableModel() { public int getRowCount() { return
- * (_choices.length-1)/2; } public int getColumnCount() { return 4; } public
- * Object getValueAt(int row, int column) { switch (column) { case 0: return
- * _choices[row]; case 1: return _sel[row]; case 2: return
- * _choices[getRowCount()+row]; case 3: return _sel[getRowCount()+row]; } return
- * null; // Unreachable. } public Class getColumnClass(int column) { if ((column ==
- * 0) || (column == 2)) return String.class; else return Boolean.class; } public
- * boolean isCellEditable(int row, int col) { if ((col == 1) || (col == 3))
- * return true; else return false; } public void setValueAt(Object aValue, int
- * rowIndex, int columnIndex) { if (columnIndex == 1) _sel[rowIndex] =
- * (Boolean)aValue; if (columnIndex == 3) _sel[getRowCount()+rowIndex] =
- * (Boolean)aValue; } };
- * 
- * JTable table = new JTable(tm); table.setRowSelectionAllowed(false);
- * table.setColumnSelectionAllowed(false);
- * //table.getInputMap().put(GUIGlobals.exitDialog, "close");
- * //table.getActionMap().put("close", new CancelAction()); JPanel tablePanel =
- * new JPanel(), innerTablePanel = new JPanel();
- * 
- * table.setShowVerticalLines(false);
- * innerTablePanel.setBorder(BorderFactory.createEtchedBorder());
- * //innerTablePanel.setBorder(BorderFactory.createLoweredBevelBorder());
- * innerTablePanel.add(table); tablePanel.add(innerTablePanel);
- * 
- * 
- * TableColumnModel cm = table.getColumnModel();
- * cm.getColumn(0).setPreferredWidth(90); cm.getColumn(1).setPreferredWidth(25);
- * cm.getColumn(2).setPreferredWidth(90); cm.getColumn(3).setPreferredWidth(25);
- */
+	public String getTabName() {
+		return Globals.lang("Entry table");
+	}
+}
\ No newline at end of file
diff --git a/src/java/net/sf/jabref/Util.java b/src/java/net/sf/jabref/Util.java
index 5f7e582..6ef39aa 100644
--- a/src/java/net/sf/jabref/Util.java
+++ b/src/java/net/sf/jabref/Util.java
@@ -33,7 +33,6 @@
 // modified :  - r.nagel 20.04.2006
 //               make the DateFormatter abstract and splitt the easyDate methode
 //               (now we cannot change the dateformat dynamicly, sorry)
-
 package net.sf.jabref;
 
 import java.awt.BorderLayout;
@@ -54,8 +53,10 @@ import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.net.URLDecoder;
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetEncoder;
 import java.text.NumberFormat;
@@ -65,11 +66,11 @@ import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
+import java.util.GregorianCalendar;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 import java.util.SortedSet;
 import java.util.StringTokenizer;
 import java.util.TreeSet;
@@ -106,15 +107,24 @@ import com.jgoodies.forms.layout.FormLayout;
  * @version 1.0
  */
 public class Util {
-	// A static Object for date formatting. Please do not create the object
-	// here,
-	// because there are some references from the Globals class.....
+
+	/**
+	 * A static Object for date formatting. Please do not create the object
+	 * here, because there are some references from the Globals class.....
+	 * 
+	 */
 	private static SimpleDateFormat dateFormatter = null;
 
-	// Colors are defined here.
+	/*
+	 * Colors are defined here.
+	 * 
+	 */
 	public static Color fieldsCol = new Color(180, 180, 200);
 
-	// Integer values for indicating result of duplicate check (for entries):
+	/*
+	 * Integer values for indicating result of duplicate check (for entries):
+	 * 
+	 */
 	final static int TYPE_MISMATCH = -1, NOT_EQUAL = 0, EQUAL = 1, EMPTY_IN_ONE = 2,
 		EMPTY_IN_TWO = 3;
 
@@ -163,7 +173,6 @@ public class Util {
 
 	public synchronized static String createNeutralId() {
 		return idFormat.format(idCounter++);
-		// return String.valueOf(idCounter++);
 	}
 
 	/**
@@ -186,51 +195,61 @@ public class Util {
 	 * references are enclosed in a pair of '#' characters.
 	 */
 	public static String parseField(String content) {
+		
 		if (content.length() == 0)
 			return content;
-		String toSet = "";
-		boolean string;
-		// Keeps track of whether the next item is
-		// a reference to a string, or normal content. First we must
-		// check which we begin with. We simply check if we can find
-		// a '#' before either '"' or '{'.
-		int hash = content.indexOf('#'), wr1 = content.indexOf('"'), wr2 = content.indexOf('{'), end = content
-			.length();
-		if (hash == -1)
-			hash = end;
-		if (wr1 == -1)
-			wr1 = end;
-		if (wr2 == -1)
-			wr2 = end;
-		string = ((wr1 == end) && (wr2 == end)) || (hash < Math.min(wr1, wr2));
-
-		// System.out.println("FileLoader: "+content+" "+string+" "+hash+"
-		// "+wr1+" "+wr2);
-		StringTokenizer tok = new StringTokenizer(content, "#", true);
-		// 'tok' splits at the '#' sign, and keeps delimiters
-
-		while (tok.hasMoreTokens()) {
-			String str = tok.nextToken();
-			if (str.equals("#"))
-				string = !string;
-			else {
-				if (string) {
-					// This part should normally be a string, but if it's
+		
+		String[] strings = content.split("#");
+		StringBuffer result = new StringBuffer();
+		for (int i = 0; i < strings.length; i++){
+			String s = strings[i].trim();
+			if (s.length() > 0){
+				char c = s.charAt(0);
+				// String reference or not?
+				if (c == '{' || c == '"'){
+					result.append(shaveString(strings[i]));	
+				} else {
+					// This part should normally be a string reference, but if it's
 					// a pure number, it is not.
-					String s = shaveString(str);
+					String s2 = shaveString(s);
 					try {
-						Integer.parseInt(s);
+						Integer.parseInt(s2);
 						// If there's no exception, it's a number.
-						toSet = toSet + s;
+						result.append(s2);
 					} catch (NumberFormatException ex) {
-						toSet = toSet + "#" + shaveString(str) + "#";
+						// otherwise append with hashes...
+						result.append("#").append(s2).append("#");
 					}
+				}
+			}
+		}
+		return result.toString();
+	}
 
-				} else
-					toSet = toSet + shaveString(str);
+	/**
+	 * Will return the publication date of the given bibtex entry in conformance
+	 * to ISO 8601, i.e. either YYYY or YYYY-MM.
+	 * 
+	 * @param entry
+	 * @return will return the publication date of the entry or null if no year
+	 *         was found.
+	 */
+	public static String getPublicationDate(BibtexEntry entry) {
+
+		Object o = entry.getField("year");
+		if (o == null)
+			return null;
+
+		String year = toFourDigitYear(o.toString());
+
+		o = entry.getField("month");
+		if (o != null) {
+			int month = Util.getMonthNumber(o.toString());
+			if (month != -1) {
+				return year + "-" + (month + 1 < 10 ? "0" : "") + (month + 1);
 			}
 		}
-		return toSet;
+		return year;
 	}
 
 	public static String shaveString(String s) {
@@ -274,7 +293,6 @@ public class Util {
 			}
 		}
 		s = s.substring(beg, end);
-		// Util.pr(s);
 		return s;
 	}
 
@@ -474,8 +492,8 @@ public class Util {
 
 			// Find the default directory for this field type:
 			String dir = metaData.getFileDirectory(fieldName);
-			
-			File file = expandFilename(link, new String[]{dir, "."});
+
+			File file = expandFilename(link, new String[] { dir, "." });
 
 			// Check that the file exists:
 			if ((file == null) || !file.exists()) {
@@ -538,8 +556,6 @@ public class Util {
 			} catch (IOException e) {
 				System.err.println("An error occured on the command: "
 					+ Globals.prefs.get("htmlviewer") + " " + link);
-			} catch (URISyntaxException e2) {
-				e2.printStackTrace();
 			}
 		} else if (fieldName.equals("ps")) {
 			try {
@@ -573,8 +589,8 @@ public class Util {
 					 * String[] spl = link.split("\\\\"); StringBuffer sb = new
 					 * StringBuffer(); for (int i = 0; i < spl.length; i++) { if
 					 * (i > 0) sb.append("\\"); if (spl[i].indexOf(" ") >= 0)
-					 * spl[i] = "\"" + spl[i] + "\""; sb.append(spl[i]);
-					 *  } //pr(sb.toString()); link = sb.toString();
+					 * spl[i] = "\"" + spl[i] + "\""; sb.append(spl[i]); }
+					 * //pr(sb.toString()); link = sb.toString();
 					 * 
 					 * String cmd = "cmd.exe /c start " + link;
 					 * 
@@ -660,7 +676,7 @@ public class Util {
 		// Find the default directory for this field type, if any:
 		String dir = metaData.getFileDirectory(extension);
 		if (dir != null) {
-			File tmp = expandFilename(link, new String[]{dir, "."});
+			File tmp = expandFilename(link, new String[] { dir, "." });
 			if (tmp != null)
 				file = tmp;
 		}
@@ -697,11 +713,7 @@ public class Util {
 			if (link.startsWith("doi:"))
 				link = Globals.DOI_LOOKUP_PREFIX + link;
 
-			try {
-				link = sanitizeUrl(link);
-			} catch (URISyntaxException ex) {
-				ex.printStackTrace();
-			}
+			link = sanitizeUrl(link);
 
 			if (Globals.ON_MAC) {
 				String[] cmd = { "/usr/bin/open", "-a", Globals.prefs.get("htmlviewer"), link };
@@ -720,30 +732,31 @@ public class Util {
 	 * Make sure an URL is "portable", in that it doesn't contain bad characters
 	 * that break the open command in some OSes.
 	 * 
+	 * Old Version can be found in CVS version 114 of Util.java.
+	 * 
 	 * @param link
 	 *            The URL to sanitize.
 	 * @return Sanitized URL
 	 */
-	public static String sanitizeUrl(String link) throws URISyntaxException {
-		String scheme = "http";
-		String ssp;
-		if (link.indexOf("//") > 0)
-			ssp = "//" + link.substring(2 + link.indexOf("//"));
-		else
-			ssp = "//" + link;
+	public static String sanitizeUrl(String link) {
+
+		link = link.replaceAll("\\+", "%2B");
 
-        // The following is an ugly hack to fix the problem where a %20 in the
-        // original string (correct encoding of a space) gets returned as %2520
-        // because the URI constructor doesn't recognize that the % is the start of
-        // a sequence. The problem is that other such sequences will meet the same fate.
-        // If we need to take care of all these up front, we might as well not use URI
-        // at all.
-        // Another option is to do two times, hiding the %xx sequences in one of them,
-        // and see if one of the URLs looks good...
-        ssp = ssp.replaceAll("%20", " ");
+		try {
+			link = URLDecoder.decode(link, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+		}
 
-        URI uri = new URI(scheme, ssp, null);
-		return uri.toASCIIString();
+		/**
+		 * Fix for: [ 1574773 ] sanitizeUrl() breaks ftp:// and file:///
+		 * 
+		 * http://sourceforge.net/tracker/index.php?func=detail&aid=1574773&group_id=92314&atid=600306
+		 */
+		try {
+			return new URI(null, link, null).toASCIIString();
+		} catch (URISyntaxException e) {
+			return link;
+		}
 	}
 
 	/**
@@ -776,11 +789,12 @@ public class Util {
 	 * 
 	 * The search pattern will be read from the preferences.
 	 * 
-	 * The [extension]-tags in this pattern will be replace by the given extension parameter.
+	 * The [extension]-tags in this pattern will be replace by the given
+	 * extension parameter.
 	 * 
 	 */
 	public static String findPdf(BibtexEntry entry, String extension, String directory) {
-		return findPdf(entry, extension, new String[]{directory});
+		return findPdf(entry, extension, new String[] { directory });
 	}
 
 	/**
@@ -789,17 +803,17 @@ public class Util {
 	public static String findPdf(BibtexEntry entry, String extension, String[] directories) {
 
 		String regularExpression;
-		if (Globals.prefs.getBoolean(JabRefPreferences.USE_REG_EXP_SEARCH_KEY)){
+		if (Globals.prefs.getBoolean(JabRefPreferences.USE_REG_EXP_SEARCH_KEY)) {
 			regularExpression = Globals.prefs.get(JabRefPreferences.REG_EXP_SEARCH_EXPRESSION_KEY);
 		} else {
-			regularExpression = Globals.prefs.get(JabRefPreferences.DEFAULT_REG_EXP_SEARCH_EXPRESSION_KEY);
+			regularExpression = Globals.prefs
+				.get(JabRefPreferences.DEFAULT_REG_EXP_SEARCH_EXPRESSION_KEY);
 		}
 		regularExpression = regularExpression.replaceAll("\\[extension\\]", extension);
-		
+
 		return findFile(entry, null, directories, regularExpression, true);
 	}
-	
-	
+
 	/**
 	 * Searches the given directory and file name pattern for a file for the
 	 * bibtexentry.
@@ -809,21 +823,17 @@ public class Util {
 	 * http://sourceforge.net/tracker/index.php?func=detail&aid=1503410&group_id=92314&atid=600309
 	 * 
 	 * Requirements:
-	 * 
 	 *  - Be able to find the associated PDF in a set of given directories.
-	 *  
-	 *  - Be able to return a relative path or absolute path. 
-	 *
+	 *  - Be able to return a relative path or absolute path.
 	 *  - Be fast.
-	 *  
 	 *  - Allow for flexible naming schemes in the PDFs.
 	 * 
 	 * Syntax scheme for file:
 	 * <ul>
-	 *   <li>* Any subDir</li>
-	 *   <li>** Any subDir (recursiv)</li>
-	 *   <li>[key] Key from bibtex file and database</li> 
-	 *   <li>.* Anything else is taken to be a Regular expression.</li>
+	 * <li>* Any subDir</li>
+	 * <li>** Any subDir (recursiv)</li>
+	 * <li>[key] Key from bibtex file and database</li>
+	 * <li>.* Anything else is taken to be a Regular expression.</li>
 	 * </ul>
 	 * 
 	 * @param entry
@@ -831,14 +841,13 @@ public class Util {
 	 * @param database
 	 *            non-null
 	 * @param directory
-	 * 				A set of root directories to start the search from.
-	 * 				Paths are returned relative to these directories if
-	 * 				relative is set to true. These directories will not 
-	 * 				be expanded or anything. Use the file attribute for 
-	 * 				this.
+	 *            A set of root directories to start the search from. Paths are
+	 *            returned relative to these directories if relative is set to
+	 *            true. These directories will not be expanded or anything. Use
+	 *            the file attribute for this.
 	 * @param file
 	 *            non-null
-	 *            
+	 * 
 	 * @param relative
 	 *            whether to return relative file paths or absolute ones
 	 * 
@@ -848,10 +857,10 @@ public class Util {
 	public static String findFile(BibtexEntry entry, BibtexDatabase database, String[] directory,
 		String file, boolean relative) {
 
-		for (int i = 0; i < directory.length; i++){
-		
+		for (int i = 0; i < directory.length; i++) {
+
 			String result = findFile(entry, database, directory[i], file, relative);
-			if (result != null){
+			if (result != null) {
 				return result;
 			}
 		}
@@ -871,53 +880,53 @@ public class Util {
 	}
 
 	public static ArrayList parseMethodsCalls(String calls) throws RuntimeException {
-		
+
 		ArrayList result = new ArrayList();
-		
+
 		char[] c = calls.toCharArray();
-		
+
 		int i = 0;
-		
-		while (i < c.length){
-		
+
+		while (i < c.length) {
+
 			int start = i;
-			if (Character.isJavaIdentifierStart(c[i])){
+			if (Character.isJavaIdentifierStart(c[i])) {
 				i++;
-				while (i < c.length && (Character.isJavaIdentifierPart(c[i]) || c[i] == '.')){
+				while (i < c.length && (Character.isJavaIdentifierPart(c[i]) || c[i] == '.')) {
 					i++;
 				}
-				if (i < c.length && c[i] == '('){
-					
+				if (i < c.length && c[i] == '(') {
+
 					String method = calls.substring(start, i);
-					
-					i++; i++; 
-					
+
+					i++;
+					i++;
+
 					int startParam = i;
 					i++;
-					
-					while (i + 1 < c.length && !(c[i] == '"' && c[i+1] == ')')){
+
+					while (i + 1 < c.length && !(c[i] == '"' && c[i + 1] == ')')) {
 						i++;
 					}
-					
+
 					String param = calls.substring(startParam, i);
-					
-					result.add(new String[]{method, param});
+
+					result.add(new String[] { method, param });
 				} else {
 					String method = calls.substring(start, i);
-					result.add(new String[]{method});
+					result.add(new String[] { method });
 				}
 			}
 			i++;
 		}
-		
+
 		return result;
 	}
-	
-	
+
 	/**
-	 * Accepts a string like [author:toLowerCase("escapedstring"),toUpperCase], whereas the first
-	 * string signifies the bibtex-field to get while the others are the names
-	 * of layouters that will be applied.
+	 * Accepts a string like [author:toLowerCase("escapedstring"),toUpperCase],
+	 * whereas the first string signifies the bibtex-field to get while the
+	 * others are the names of layouters that will be applied.
 	 * 
 	 * @param fieldAndFormat
 	 * @param entry
@@ -930,21 +939,21 @@ public class Util {
 		fieldAndFormat = stripBrackets(fieldAndFormat);
 
 		int colon = fieldAndFormat.indexOf(':');
-		
+
 		String beforeColon, afterColon;
-		if (colon == -1){
+		if (colon == -1) {
 			beforeColon = fieldAndFormat;
 			afterColon = null;
 		} else {
 			beforeColon = fieldAndFormat.substring(0, colon);
-			afterColon = fieldAndFormat.substring(colon+1);
+			afterColon = fieldAndFormat.substring(colon + 1);
 		}
 		beforeColon = beforeColon.trim();
-		
-		if (beforeColon.length() == 0){
+
+		if (beforeColon.length() == 0) {
 			return null;
 		}
-		
+
 		String fieldValue = getField(beforeColon, entry, database);
 
 		if (fieldValue == null)
@@ -980,62 +989,69 @@ public class Util {
 
 	/**
 	 * Convenience function for absolute search.
-     *
-     * Uses findFile(BibtexEntry, BibtexDatabase, (String)null, String, false).
+	 * 
+	 * Uses findFile(BibtexEntry, BibtexDatabase, (String)null, String, false).
 	 */
-	public static String findFile(BibtexEntry entry, BibtexDatabase database, String file){
-		return findFile(entry, database, (String)null, file, false);
-	}	
-	
+	public static String findFile(BibtexEntry entry, BibtexDatabase database, String file) {
+		return findFile(entry, database, (String) null, file, false);
+	}
+
 	/**
 	 * Internal Version of findFile, which also accepts a current directory to
 	 * base the search on.
 	 * 
 	 */
-	public static String findFile(BibtexEntry entry,
-		BibtexDatabase database, String directory, String file, boolean relative) {
+	public static String findFile(BibtexEntry entry, BibtexDatabase database, String directory,
+		String file, boolean relative) {
 
 		File root;
-		if (directory == null){
+		if (directory == null) {
 			root = new File(".");
 		} else {
 			root = new File(directory);
 		}
 		if (!root.exists())
 			return null;
-	
+
 		String found = findFile(entry, database, root, file);
-		
-		if (directory == null || !relative){
+                
+		if (directory == null || !relative) {
 			return found;
 		}
-		
-		if (found != null){
+                
+		if (found != null) {
 			try {
 				/**
 				 * [ 1601651 ] PDF subdirectory - missing first character
 				 * 
 				 * http://sourceforge.net/tracker/index.php?func=detail&aid=1601651&group_id=92314&atid=600306
 				 */
-				return found.substring(root.getCanonicalPath().length());
+                            // Changed by M. Alver 2007.01.04:
+                            // Remove first character if it is a directory separator character:
+                            String tmp = found.substring(root.getCanonicalPath().length());
+                            if ((tmp.length() > 1) && (tmp.charAt(0) == File.separatorChar))
+                                tmp = tmp.substring(1);
+                            return tmp;
+				//return found.substring(root.getCanonicalPath().length());
 			} catch (IOException e) {
 				return null;
 			}
 		}
 		return null;
 	}
-	
+
 	/**
-	 * The actual work-horse. Will find absolute filepaths starting from the given directory using the given regular expression string for search.
+	 * The actual work-horse. Will find absolute filepaths starting from the
+	 * given directory using the given regular expression string for search.
 	 */
-	protected static String findFile(BibtexEntry entry,
-		BibtexDatabase database, File directory, String file) {
+	protected static String findFile(BibtexEntry entry, BibtexDatabase database, File directory,
+		String file) {
 
-		if (file.startsWith("/")){
+		if (file.startsWith("/")) {
 			directory = new File(".");
 			file = file.substring(1);
 		}
-		
+
 		// Escape handling...
 		Matcher m = Pattern.compile("([^\\\\])\\\\([^\\\\])").matcher(file);
 		StringBuffer s = new StringBuffer();
@@ -1045,16 +1061,16 @@ public class Util {
 		m.appendTail(s);
 		file = s.toString();
 		String[] fileParts = file.split("/");
-		
+
 		if (fileParts.length == 0)
 			return null;
-		
-		if (fileParts.length > 1){
+
+		if (fileParts.length > 1) {
 
 			for (int i = 0; i < fileParts.length - 1; i++) {
 
-				String dirToProcess = fileParts[i];	
-				
+				String dirToProcess = fileParts[i];
+
 				dirToProcess = expandBrackets(dirToProcess, entry, database);
 
 				if (dirToProcess.matches("^.:$")) { // Windows Drive Letter
@@ -1078,8 +1094,8 @@ public class Util {
 
 					for (int sub = 0; sub < subDirs.length; sub++) {
 						if (subDirs[sub].isDirectory()) {
-							String result = findFile(entry, database,
-								subDirs[sub], restOfFileString);
+							String result = findFile(entry, database, subDirs[sub],
+								restOfFileString);
 							if (result != null)
 								return result;
 						}
@@ -1120,7 +1136,8 @@ public class Util {
 					return null;
 				}
 
-				final Pattern toMatch = Pattern.compile(dirToProcess.replaceAll("\\\\\\\\", "\\\\"));
+				final Pattern toMatch = Pattern
+					.compile(dirToProcess.replaceAll("\\\\\\\\", "\\\\"));
 
 				File[] matches = directory.listFiles(new FilenameFilter() {
 					public boolean accept(File arg0, String arg1) {
@@ -1140,7 +1157,8 @@ public class Util {
 		// Last step check if the given file can be found in this directory
 		String filenameToLookFor = expandBrackets(fileParts[fileParts.length - 1], entry, database);
 
-		final Pattern toMatch = Pattern.compile("^" + filenameToLookFor.replaceAll("\\\\\\\\", "\\\\") + "$");
+		final Pattern toMatch = Pattern.compile("^"
+			+ filenameToLookFor.replaceAll("\\\\\\\\", "\\\\") + "$");
 
 		File[] matches = directory.listFiles(new FilenameFilter() {
 			public boolean accept(File arg0, String arg1) {
@@ -1216,20 +1234,21 @@ public class Util {
 	 * Converts a relative filename to an absolute one, if necessary. Returns
 	 * null if the file does not exist.
 	 * 
-	 * Will look in each of the given dirs starting from the beginning and returning the first found file to match if any.
+	 * Will look in each of the given dirs starting from the beginning and
+	 * returning the first found file to match if any.
 	 */
 	public static File expandFilename(String name, String[] dir) {
-		
+
 		for (int i = 0; i < dir.length; i++) {
 			File result = expandFilename(name, dir[i]);
-			if (result != null){
+			if (result != null) {
 				return result;
 			}
 		}
-	
+
 		return null;
 	}
-	
+
 	/**
 	 * Converts a relative filename to an absolute one, if necessary. Returns
 	 * null if the file does not exist.
@@ -2119,42 +2138,46 @@ public class Util {
 		return (s.equals("0") || (s.indexOf(Globals.prefs.WRAPPED_USERNAME) >= 0));
 	}
 
-    /**
-     * Set a given field to a given value for all entries in a Collection.
-     * This method DOES NOT update any UndoManager, but returns a relevant
-     * CompoundEdit that should be registered by the caller.
-     *
-     * @param entries The entries to set the field for.
-     * @param field The name of the field to set.
-     * @param text The value to set. This value can be null, indicating that the
-     *      field should be cleared.
-     * @param overwriteValues Indicate whether the value should be set even if
-     *      an entry already has the field set.
-     * @return A CompoundEdit for the entire operation.
-     */
-    public static UndoableEdit massSetField(Collection entries,
-                                            String field, String text,
-                                            boolean overwriteValues) {
-        
-        NamedCompound ce = new NamedCompound(Globals.lang("Set field"));
-        for (Iterator i = entries.iterator(); i.hasNext();) {
-            BibtexEntry entry = (BibtexEntry) i.next();
-            Object oldVal = entry.getField(field);
-            // If we are not allowed to overwrite values, check if there is a nonempty
-            // value already for this entry:
-            if (!overwriteValues && (oldVal != null) && (((String)oldVal).length() > 0))
-                continue;
-            if (text != null)
-                entry.setField(field, text);
-            else
-                entry.clearField(field);
-            ce.addEdit(new UndoableFieldChange(entry, field, oldVal, text));
-        }
-        ce.end();
-        return ce;
-    }
-
-    /**
+	/**
+	 * Set a given field to a given value for all entries in a Collection. This
+	 * method DOES NOT update any UndoManager, but returns a relevant
+	 * CompoundEdit that should be registered by the caller.
+	 * 
+	 * @param entries
+	 *            The entries to set the field for.
+	 * @param field
+	 *            The name of the field to set.
+	 * @param text
+	 *            The value to set. This value can be null, indicating that the
+	 *            field should be cleared.
+	 * @param overwriteValues
+	 *            Indicate whether the value should be set even if an entry
+	 *            already has the field set.
+	 * @return A CompoundEdit for the entire operation.
+	 */
+	public static UndoableEdit massSetField(Collection entries, String field, String text,
+		boolean overwriteValues) {
+
+		NamedCompound ce = new NamedCompound(Globals.lang("Set field"));
+		for (Iterator i = entries.iterator(); i.hasNext();) {
+			BibtexEntry entry = (BibtexEntry) i.next();
+			Object oldVal = entry.getField(field);
+			// If we are not allowed to overwrite values, check if there is a
+			// nonempty
+			// value already for this entry:
+			if (!overwriteValues && (oldVal != null) && (((String) oldVal).length() > 0))
+				continue;
+			if (text != null)
+				entry.setField(field, text);
+			else
+				entry.clearField(field);
+			ce.addEdit(new UndoableFieldChange(entry, field, oldVal, text));
+		}
+		ce.end();
+		return ce;
+	}
+
+	/**
 	 * Make a list of supported character encodings that can encode all
 	 * characters in the given String.
 	 * 
@@ -2172,7 +2195,6 @@ public class Util {
 		}
 		return encodings;
 	}
-	
 
 	/**
 	 * Will convert a two digit year using the following scheme (describe at
@@ -2189,14 +2211,14 @@ public class Util {
 	 * @return
 	 */
 	public static String toFourDigitYear(String year) {
-		if (thisYear == 0){
+		if (thisYear == 0) {
 			thisYear = Calendar.getInstance().get(Calendar.YEAR);
 		}
 		return toFourDigitYear(year, thisYear);
 	}
-	
+
 	public static int thisYear;
-	
+
 	/**
 	 * Will convert a two digit year using the following scheme (describe at
 	 * http://www.filemaker.com/help/02-Adding%20and%20view18.html):
@@ -2222,7 +2244,7 @@ public class Util {
 
 			if (yearNumber == thisYearTwoDigits) {
 				return String.valueOf(thisYear);
-			} 
+			}
 			// 20 , 90
 			// 99 > 30
 			if ((yearNumber + 100 - thisYearTwoDigits) % 100 > 30) {
@@ -2242,36 +2264,33 @@ public class Util {
 			return year;
 		}
 	}
-	
+
 	/**
 	 * Will return an integer indicating the month of the entry from 0 to 11.
 	 * 
 	 * -1 signals a unknown month string.
 	 * 
 	 * This method accepts three types of months given:
-	 * 
-	 * - Single and Double Digit months from 1 to 12 (01 to 12)
-	 * 
-	 * - 3 Digit BibTex strings (jan
-	 * 
-	 * - Full English Month identifiers.
+	 *  - Single and Double Digit months from 1 to 12 (01 to 12)
+	 *  - 3 Digit BibTex strings (jan, feb, mar...)
+	 *  - Full English Month identifiers.
 	 * 
 	 * @param month
 	 * @return
 	 */
-	public static int getMonthNumber(String month){
-		
-		month = month.toLowerCase();
-		
-		for (int i = 0; i < Globals.MONTHS.length; i++){
-			if (month.startsWith(Globals.MONTHS[i])){
+	public static int getMonthNumber(String month) {
+
+		month = month.replaceAll("#", "").toLowerCase();
+
+		for (int i = 0; i < Globals.MONTHS.length; i++) {
+			if (month.startsWith(Globals.MONTHS[i])) {
 				return i;
 			}
 		}
-		
+
 		try {
 			return Integer.parseInt(month) - 1;
-		} catch (NumberFormatException e){
+		} catch (NumberFormatException e) {
 		}
 		return -1;
 	}
diff --git a/src/java/net/sf/jabref/XmpPrefsTab.java b/src/java/net/sf/jabref/XmpPrefsTab.java
new file mode 100644
index 0000000..6450b5d
--- /dev/null
+++ b/src/java/net/sf/jabref/XmpPrefsTab.java
@@ -0,0 +1,240 @@
+package net.sf.jabref;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.util.Vector;
+
+import javax.swing.AbstractAction;
+import javax.swing.BorderFactory;
+import javax.swing.JCheckBox;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.JToolBar;
+import javax.swing.SwingConstants;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ * Preference Tab for XMP.
+ * 
+ * Allows the user to enable and configure the XMP privacy filter.
+ * 
+ * @author $Author: coezbek $
+ * @version $Revision: 1.1 $ ($Date: 2007/01/22 23:00:47 $)
+ * 
+ */
+class XmpPrefsTab extends JPanel implements PrefsTab {
+
+	boolean tableChanged = false;
+
+	int rowCount;
+
+	JTable table;
+
+	JCheckBox privacyFilterCheckBox = new JCheckBox(Globals
+		.lang("Do not write the following fields to XMP Metadata:"));
+
+	Vector tableRows = new Vector(10);
+
+	/**
+	 * Customization of external program paths.
+	 */
+	public XmpPrefsTab() {
+		setLayout(new BorderLayout());
+
+		TableModel tm = new AbstractTableModel() {
+			public int getRowCount() {
+				return rowCount;
+			}
+
+			public int getColumnCount() {
+				return 1;
+			}
+
+			public Object getValueAt(int row, int column) {
+				if (row >= tableRows.size())
+					return "";
+				Object rowContent = tableRows.elementAt(row);
+				if (rowContent == null)
+					return "";
+				return rowContent;
+			}
+
+			public String getColumnName(int col) {
+				return Globals.lang("Field to filter");
+			}
+
+			public Class getColumnClass(int column) {
+				return String.class;
+			}
+
+			public boolean isCellEditable(int row, int col) {
+				return true;
+			}
+
+			public void setValueAt(Object value, int row, int col) {
+				tableChanged = true;
+
+				if (tableRows.size() <= row) {
+					tableRows.setSize(row + 1);
+				}
+
+				tableRows.setElementAt(value, row);
+			}
+
+		};
+
+		table = new JTable(tm);
+		TableColumnModel cm = table.getColumnModel();
+		cm.getColumn(0).setPreferredWidth(140);
+
+		FormLayout layout = new FormLayout("1dlu, 8dlu, left:pref, 4dlu, fill:pref", "");
+		DefaultFormBuilder builder = new DefaultFormBuilder(layout);
+		JPanel pan = new JPanel();
+
+		JPanel tablePanel = new JPanel();
+		tablePanel.setLayout(new BorderLayout());
+		JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+			JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+		table.setPreferredScrollableViewportSize(new Dimension(250, 200));
+		scrollPane.setMinimumSize(new Dimension(250, 300));
+		tablePanel.add(scrollPane, BorderLayout.CENTER);
+
+		JToolBar toolbar = new JToolBar(SwingConstants.VERTICAL);
+		toolbar.setFloatable(false);
+		toolbar.setBorder(null);
+		toolbar.add(new AddRowAction());
+		toolbar.add(new DeleteRowAction());
+
+		tablePanel.add(toolbar, BorderLayout.EAST);
+
+		// Build Prefs Tabs
+		builder.appendSeparator(Globals.lang("XMP Export Privacy Settings"));
+		builder.nextLine();
+
+		builder.append(pan);
+		builder.append(privacyFilterCheckBox);
+		builder.nextLine();
+
+		builder.append(pan);
+		builder.append(tablePanel);
+		builder.nextLine();
+
+		pan = builder.getPanel();
+		pan.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+		add(pan, BorderLayout.CENTER);
+	}
+
+	class DeleteRowAction extends AbstractAction {
+		public DeleteRowAction() {
+			super("Delete row", GUIGlobals.getImage("remove"));
+			putValue(SHORT_DESCRIPTION, Globals.lang("Delete rows"));
+		}
+
+		public void actionPerformed(ActionEvent e) {
+			int[] rows = table.getSelectedRows();
+			if (rows.length == 0)
+				return;
+
+			for (int i = rows.length - 1; i >= 0; i--) {
+				if (rows[i] < tableRows.size()) {
+					tableRows.remove(rows[i]);
+				}
+			}
+			rowCount -= rows.length;
+			if (rows.length > 1)
+				table.clearSelection();
+			table.revalidate();
+			table.repaint();
+			tableChanged = true;
+		}
+	}
+
+	class AddRowAction extends AbstractAction {
+		public AddRowAction() {
+			super("Add row", GUIGlobals.getImage("add"));
+			putValue(SHORT_DESCRIPTION, Globals.lang("Insert rows"));
+		}
+
+		public void actionPerformed(ActionEvent e) {
+			int[] rows = table.getSelectedRows();
+			if (rows.length == 0) {
+				// No rows selected, so we just add one at the end.
+				rowCount++;
+				table.revalidate();
+				table.repaint();
+				return;
+			}
+			for (int i = 0; i < rows.length; i++) {
+				if (rows[i] + i < tableRows.size())
+					tableRows.add(rows[i] + i, "");
+			}
+			rowCount += rows.length;
+			if (rows.length > 1)
+				table.clearSelection();
+			table.revalidate();
+			table.repaint();
+			tableChanged = true;
+		}
+	}
+
+	/**
+	 * Load settings from the preferences and initialize the table.
+	 */
+	public void setValues() {
+		tableRows.clear();
+		String[] names = JabRefPreferences.getInstance().getStringArray("xmpPrivacyFilters");
+		for (int i = 0; i < names.length; i++) {
+			tableRows.add(names[i]);
+		}
+		rowCount = tableRows.size() + 5;
+
+		privacyFilterCheckBox.setSelected(JabRefPreferences.getInstance().getBoolean(
+			"useXmpPrivacyFilter"));
+	}
+
+	/**
+	 * Store changes to table preferences. This method is called when the user
+	 * clicks Ok.
+	 * 
+	 */
+	public void storeSettings() {
+
+		if (table.isEditing()) {
+			int col = table.getEditingColumn();
+			int row = table.getEditingRow();
+			table.getCellEditor(row, col).stopCellEditing();
+		}
+
+		// Now we need to make sense of the contents the user has made to the
+		// table setup table.
+		if (tableChanged) {
+
+			// First we remove all rows with empty names.
+			for (int i = tableRows.size() - 1; i >= 0; i--) {
+				if (tableRows.elementAt(i).equals(""))
+					tableRows.removeElementAt(i);
+			}
+
+			// Finally, we store the new preferences.
+			JabRefPreferences.getInstance().putStringArray("xmpPrivacyFilters",
+				(String[]) tableRows.toArray(new String[tableRows.size()]));
+		}
+
+		JabRefPreferences.getInstance().putBoolean("useXmpPrivacyFilter", privacyFilterCheckBox.isSelected());
+	}
+
+	public boolean readyToClose() {
+		return true;
+	}
+
+	public String getTabName() {
+		return Globals.lang("XMP metadata");
+	}
+}
diff --git a/src/java/net/sf/jabref/bst/Bst.java b/src/java/net/sf/jabref/bst/Bst.java
deleted file mode 100644
index 708a0c1..0000000
--- a/src/java/net/sf/jabref/bst/Bst.java
+++ /dev/null
@@ -1,1943 +0,0 @@
-package net.sf.jabref.bst;
-// $ANTLR 3.0b4 bst.g 2006-09-17 01:45:41
-
-import org.antlr.runtime.*;
-import java.util.Stack;
-import java.util.List;
-import java.util.ArrayList;
-
-
-import org.antlr.runtime.tree.*;
-
-public class Bst extends Parser {
-    public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "IDLIST", "STACK", "ENTRY", "COMMANDS", "STRINGS", "INTEGERS", "FUNCTION", "MACRO", "STRING", "READ", "EXECUTE", "ITERATE", "REVERSE", "SORT", "IDENTIFIER", "INTEGER", "QUOTED", "LETTER", "NUMERAL", "WS", "LINE_COMMENT", "'{'", "'}'", "'<'", "'>'", "'='", "'+'", "'-'", "':='", "'*'", "'add.period$'", "'call.type$'", "'change.case$'", "'chr.to.int$'", "'cite$'", "'duplicat$'", "'empty$'", "'format.name$'", "'if$'", "'int.to.chr$'", "'int.to. [...]
-    };
-    public static final int LETTER=21;
-    public static final int ENTRY=6;
-    public static final int INTEGERS=9;
-    public static final int WS=23;
-    public static final int COMMANDS=7;
-    public static final int STRING=12;
-    public static final int EXECUTE=14;
-    public static final int LINE_COMMENT=24;
-    public static final int SORT=17;
-    public static final int STACK=5;
-    public static final int REVERSE=16;
-    public static final int QUOTED=20;
-    public static final int INTEGER=19;
-    public static final int ITERATE=15;
-    public static final int FUNCTION=10;
-    public static final int EOF=-1;
-    public static final int STRINGS=8;
-    public static final int IDENTIFIER=18;
-    public static final int MACRO=11;
-    public static final int IDLIST=4;
-    public static final int NUMERAL=22;
-    public static final int READ=13;
-
-        public Bst(TokenStream input) {
-            super(input);
-        }
-        
-    protected TreeAdaptor adaptor = new CommonTreeAdaptor();
-
-    public void setTreeAdaptor(TreeAdaptor adaptor) {
-        this.adaptor = adaptor;
-    }
-    public TreeAdaptor getTreeAdaptor() {
-        return adaptor;
-    }
-
-    public String[] getTokenNames() { return tokenNames; }
-    public String getGrammarFileName() { return "bst.g"; }
-
-
-    public static class program_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start program
-    // bst.g:14:1: program : ( commands )+ -> ^( COMMANDS ( commands )+ ) ;
-    public program_return program() throws RecognitionException {   
-        program_return retval = new program_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        commands_return commands1 = null;
-
-        List list_commands=new ArrayList();
-
-        try {
-            // bst.g:14:11: ( ( commands )+ -> ^( COMMANDS ( commands )+ ) )
-            // bst.g:14:11: ( commands )+
-            {
-            // bst.g:14:11: ( commands )+
-            int cnt1=0;
-            loop1:
-            do {
-                int alt1=2;
-                int LA1_0 = input.LA(1);
-                if ( (LA1_0==ENTRY||(LA1_0>=STRINGS && LA1_0<=MACRO)||(LA1_0>=READ && LA1_0<=SORT)) ) {
-                    alt1=1;
-                }
-
-
-                switch (alt1) {
-            	case 1 :
-            	    // bst.g:14:11: commands
-            	    {
-            	    pushFollow(FOLLOW_commands_in_program45);
-            	    commands1=commands();
-            	    _fsp--;
-
-            	    list_commands.add(commands1.tree);
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt1 >= 1 ) break loop1;
-                        EarlyExitException eee =
-                            new EarlyExitException(1, input);
-                        throw eee;
-                }
-                cnt1++;
-            } while (true);
-
-
-            // AST REWRITE
-            int i_0 = 0;
-            retval.tree = root_0;
-            root_0 = (Object)adaptor.nil();
-            // 14:21: -> ^( COMMANDS ( commands )+ )
-            {
-                // bst.g:14:24: ^( COMMANDS ( commands )+ )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot(adaptor.create(COMMANDS, "COMMANDS"), root_1);
-
-                // bst.g:14:35: ( commands )+
-                {
-                int n_1 = list_commands == null ? 0 : list_commands.size();
-                 
-
-
-                if ( n_1==0 ) throw new RuntimeException("Must have more than one element for (...)+ loops");
-                for (int i_1=0; i_1<n_1; i_1++) {
-                    adaptor.addChild(root_1, list_commands.get(i_1));
-
-                }
-                }
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-            retval.stop = input.LT(-1);
-
-                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        return retval;
-    }
-    // $ANTLR end program
-
-    public static class commands_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start commands
-    // bst.g:16:1: commands : ( STRINGS^^ idList | INTEGERS^^ idList | FUNCTION^^ id stack | MACRO^^ id '{'! STRING '}'! | READ^^ | EXECUTE^^ '{'! function '}'! | ITERATE^^ '{'! function '}'! | REVERSE^^ '{'! function '}'! | ENTRY^^ idList0 idList0 idList0 | SORT^^ );
-    public commands_return commands() throws RecognitionException {   
-        commands_return retval = new commands_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token STRINGS2=null;
-        Token INTEGERS4=null;
-        Token FUNCTION6=null;
-        Token MACRO9=null;
-        Token char_literal11=null;
-        Token STRING12=null;
-        Token char_literal13=null;
-        Token READ14=null;
-        Token EXECUTE15=null;
-        Token char_literal16=null;
-        Token char_literal18=null;
-        Token ITERATE19=null;
-        Token char_literal20=null;
-        Token char_literal22=null;
-        Token REVERSE23=null;
-        Token char_literal24=null;
-        Token char_literal26=null;
-        Token ENTRY27=null;
-        Token SORT31=null;
-        idList_return idList3 = null;
-
-        idList_return idList5 = null;
-
-        id_return id7 = null;
-
-        stack_return stack8 = null;
-
-        id_return id10 = null;
-
-        function_return function17 = null;
-
-        function_return function21 = null;
-
-        function_return function25 = null;
-
-        idList0_return idList028 = null;
-
-        idList0_return idList029 = null;
-
-        idList0_return idList030 = null;
-
-
-        Object STRINGS2_tree=null;
-        Object INTEGERS4_tree=null;
-        Object FUNCTION6_tree=null;
-        Object MACRO9_tree=null;
-        Object char_literal11_tree=null;
-        Object STRING12_tree=null;
-        Object char_literal13_tree=null;
-        Object READ14_tree=null;
-        Object EXECUTE15_tree=null;
-        Object char_literal16_tree=null;
-        Object char_literal18_tree=null;
-        Object ITERATE19_tree=null;
-        Object char_literal20_tree=null;
-        Object char_literal22_tree=null;
-        Object REVERSE23_tree=null;
-        Object char_literal24_tree=null;
-        Object char_literal26_tree=null;
-        Object ENTRY27_tree=null;
-        Object SORT31_tree=null;
-
-        try {
-            // bst.g:17:4: ( STRINGS^^ idList | INTEGERS^^ idList | FUNCTION^^ id stack | MACRO^^ id '{'! STRING '}'! | READ^^ | EXECUTE^^ '{'! function '}'! | ITERATE^^ '{'! function '}'! | REVERSE^^ '{'! function '}'! | ENTRY^^ idList0 idList0 idList0 | SORT^^ )
-            int alt2=10;
-            switch ( input.LA(1) ) {
-            case STRINGS:
-                alt2=1;
-                break;
-            case INTEGERS:
-                alt2=2;
-                break;
-            case FUNCTION:
-                alt2=3;
-                break;
-            case MACRO:
-                alt2=4;
-                break;
-            case READ:
-                alt2=5;
-                break;
-            case EXECUTE:
-                alt2=6;
-                break;
-            case ITERATE:
-                alt2=7;
-                break;
-            case REVERSE:
-                alt2=8;
-                break;
-            case ENTRY:
-                alt2=9;
-                break;
-            case SORT:
-                alt2=10;
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("16:1: commands : ( STRINGS^^ idList | INTEGERS^^ idList | FUNCTION^^ id stack | MACRO^^ id '{'! STRING '}'! | READ^^ | EXECUTE^^ '{'! function '}'! | ITERATE^^ '{'! function '}'! | REVERSE^^ '{'! function '}'! | ENTRY^^ idList0 idList0 idList0 | SORT^^ );", 2, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt2) {
-                case 1 :
-                    // bst.g:17:4: STRINGS^^ idList
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    STRINGS2=(Token)input.LT(1);
-                    match(input,STRINGS,FOLLOW_STRINGS_in_commands65); 
-                    STRINGS2_tree = (Object)adaptor.create(STRINGS2);
-                    root_0 = (Object)adaptor.becomeRoot(STRINGS2_tree, root_0);
-
-                    pushFollow(FOLLOW_idList_in_commands68);
-                    idList3=idList();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, idList3.tree);
-
-                    }
-                    break;
-                case 2 :
-                    // bst.g:18:4: INTEGERS^^ idList
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    INTEGERS4=(Token)input.LT(1);
-                    match(input,INTEGERS,FOLLOW_INTEGERS_in_commands73); 
-                    INTEGERS4_tree = (Object)adaptor.create(INTEGERS4);
-                    root_0 = (Object)adaptor.becomeRoot(INTEGERS4_tree, root_0);
-
-                    pushFollow(FOLLOW_idList_in_commands76);
-                    idList5=idList();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, idList5.tree);
-
-                    }
-                    break;
-                case 3 :
-                    // bst.g:19:4: FUNCTION^^ id stack
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    FUNCTION6=(Token)input.LT(1);
-                    match(input,FUNCTION,FOLLOW_FUNCTION_in_commands81); 
-                    FUNCTION6_tree = (Object)adaptor.create(FUNCTION6);
-                    root_0 = (Object)adaptor.becomeRoot(FUNCTION6_tree, root_0);
-
-                    pushFollow(FOLLOW_id_in_commands84);
-                    id7=id();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, id7.tree);
-                    pushFollow(FOLLOW_stack_in_commands86);
-                    stack8=stack();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, stack8.tree);
-
-                    }
-                    break;
-                case 4 :
-                    // bst.g:20:4: MACRO^^ id '{'! STRING '}'!
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    MACRO9=(Token)input.LT(1);
-                    match(input,MACRO,FOLLOW_MACRO_in_commands91); 
-                    MACRO9_tree = (Object)adaptor.create(MACRO9);
-                    root_0 = (Object)adaptor.becomeRoot(MACRO9_tree, root_0);
-
-                    pushFollow(FOLLOW_id_in_commands94);
-                    id10=id();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, id10.tree);
-                    char_literal11=(Token)input.LT(1);
-                    match(input,25,FOLLOW_25_in_commands96); 
-                    STRING12=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_commands99); 
-                    STRING12_tree = (Object)adaptor.create(STRING12);
-                    adaptor.addChild(root_0, STRING12_tree);
-
-                    char_literal13=(Token)input.LT(1);
-                    match(input,26,FOLLOW_26_in_commands101); 
-
-                    }
-                    break;
-                case 5 :
-                    // bst.g:21:4: READ^^
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    READ14=(Token)input.LT(1);
-                    match(input,READ,FOLLOW_READ_in_commands107); 
-                    READ14_tree = (Object)adaptor.create(READ14);
-                    root_0 = (Object)adaptor.becomeRoot(READ14_tree, root_0);
-
-
-                    }
-                    break;
-                case 6 :
-                    // bst.g:22:4: EXECUTE^^ '{'! function '}'!
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    EXECUTE15=(Token)input.LT(1);
-                    match(input,EXECUTE,FOLLOW_EXECUTE_in_commands113); 
-                    EXECUTE15_tree = (Object)adaptor.create(EXECUTE15);
-                    root_0 = (Object)adaptor.becomeRoot(EXECUTE15_tree, root_0);
-
-                    char_literal16=(Token)input.LT(1);
-                    match(input,25,FOLLOW_25_in_commands116); 
-                    pushFollow(FOLLOW_function_in_commands119);
-                    function17=function();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, function17.tree);
-                    char_literal18=(Token)input.LT(1);
-                    match(input,26,FOLLOW_26_in_commands121); 
-
-                    }
-                    break;
-                case 7 :
-                    // bst.g:23:4: ITERATE^^ '{'! function '}'!
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    ITERATE19=(Token)input.LT(1);
-                    match(input,ITERATE,FOLLOW_ITERATE_in_commands127); 
-                    ITERATE19_tree = (Object)adaptor.create(ITERATE19);
-                    root_0 = (Object)adaptor.becomeRoot(ITERATE19_tree, root_0);
-
-                    char_literal20=(Token)input.LT(1);
-                    match(input,25,FOLLOW_25_in_commands130); 
-                    pushFollow(FOLLOW_function_in_commands133);
-                    function21=function();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, function21.tree);
-                    char_literal22=(Token)input.LT(1);
-                    match(input,26,FOLLOW_26_in_commands135); 
-
-                    }
-                    break;
-                case 8 :
-                    // bst.g:24:4: REVERSE^^ '{'! function '}'!
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    REVERSE23=(Token)input.LT(1);
-                    match(input,REVERSE,FOLLOW_REVERSE_in_commands141); 
-                    REVERSE23_tree = (Object)adaptor.create(REVERSE23);
-                    root_0 = (Object)adaptor.becomeRoot(REVERSE23_tree, root_0);
-
-                    char_literal24=(Token)input.LT(1);
-                    match(input,25,FOLLOW_25_in_commands144); 
-                    pushFollow(FOLLOW_function_in_commands147);
-                    function25=function();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, function25.tree);
-                    char_literal26=(Token)input.LT(1);
-                    match(input,26,FOLLOW_26_in_commands149); 
-
-                    }
-                    break;
-                case 9 :
-                    // bst.g:25:4: ENTRY^^ idList0 idList0 idList0
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    ENTRY27=(Token)input.LT(1);
-                    match(input,ENTRY,FOLLOW_ENTRY_in_commands155); 
-                    ENTRY27_tree = (Object)adaptor.create(ENTRY27);
-                    root_0 = (Object)adaptor.becomeRoot(ENTRY27_tree, root_0);
-
-                    pushFollow(FOLLOW_idList0_in_commands158);
-                    idList028=idList0();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, idList028.tree);
-                    pushFollow(FOLLOW_idList0_in_commands160);
-                    idList029=idList0();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, idList029.tree);
-                    pushFollow(FOLLOW_idList0_in_commands162);
-                    idList030=idList0();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, idList030.tree);
-
-                    }
-                    break;
-                case 10 :
-                    // bst.g:26:4: SORT^^
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    SORT31=(Token)input.LT(1);
-                    match(input,SORT,FOLLOW_SORT_in_commands167); 
-                    SORT31_tree = (Object)adaptor.create(SORT31);
-                    root_0 = (Object)adaptor.becomeRoot(SORT31_tree, root_0);
-
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-            retval.stop = input.LT(-1);
-
-                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        return retval;
-    }
-    // $ANTLR end commands
-
-    public static class identifier_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start identifier
-    // bst.g:28:1: identifier : IDENTIFIER ;
-    public identifier_return identifier() throws RecognitionException {   
-        identifier_return retval = new identifier_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token IDENTIFIER32=null;
-
-        Object IDENTIFIER32_tree=null;
-
-        try {
-            // bst.g:29:4: ( IDENTIFIER )
-            // bst.g:29:4: IDENTIFIER
-            {
-            root_0 = (Object)adaptor.nil();
-
-            IDENTIFIER32=(Token)input.LT(1);
-            match(input,IDENTIFIER,FOLLOW_IDENTIFIER_in_identifier178); 
-            IDENTIFIER32_tree = (Object)adaptor.create(IDENTIFIER32);
-            adaptor.addChild(root_0, IDENTIFIER32_tree);
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-            retval.stop = input.LT(-1);
-
-                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        return retval;
-    }
-    // $ANTLR end identifier
-
-    public static class id_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start id
-    // bst.g:31:1: id : '{'! identifier '}'! ;
-    public id_return id() throws RecognitionException {   
-        id_return retval = new id_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token char_literal33=null;
-        Token char_literal35=null;
-        identifier_return identifier34 = null;
-
-
-        Object char_literal33_tree=null;
-        Object char_literal35_tree=null;
-
-        try {
-            // bst.g:32:4: ( '{'! identifier '}'! )
-            // bst.g:32:4: '{'! identifier '}'!
-            {
-            root_0 = (Object)adaptor.nil();
-
-            char_literal33=(Token)input.LT(1);
-            match(input,25,FOLLOW_25_in_id188); 
-            pushFollow(FOLLOW_identifier_in_id191);
-            identifier34=identifier();
-            _fsp--;
-
-            adaptor.addChild(root_0, identifier34.tree);
-            char_literal35=(Token)input.LT(1);
-            match(input,26,FOLLOW_26_in_id193); 
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-            retval.stop = input.LT(-1);
-
-                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        return retval;
-    }
-    // $ANTLR end id
-
-    public static class idList_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start idList
-    // bst.g:34:1: idList : '{' ( identifier )+ '}' -> ^( IDLIST ( identifier )+ ) ;
-    public idList_return idList() throws RecognitionException {   
-        idList_return retval = new idList_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token char_literal36=null;
-        Token char_literal38=null;
-        identifier_return identifier37 = null;
-
-        List list_identifier=new ArrayList();
-        List list_26=new ArrayList();
-        List list_25=new ArrayList();
-        Object char_literal36_tree=null;
-        Object char_literal38_tree=null;
-
-        try {
-            // bst.g:35:4: ( '{' ( identifier )+ '}' -> ^( IDLIST ( identifier )+ ) )
-            // bst.g:35:4: '{' ( identifier )+ '}'
-            {
-            char_literal36=(Token)input.LT(1);
-            match(input,25,FOLLOW_25_in_idList205); 
-            list_25.add(char_literal36);
-
-            // bst.g:35:8: ( identifier )+
-            int cnt3=0;
-            loop3:
-            do {
-                int alt3=2;
-                int LA3_0 = input.LA(1);
-                if ( (LA3_0==IDENTIFIER) ) {
-                    alt3=1;
-                }
-
-
-                switch (alt3) {
-            	case 1 :
-            	    // bst.g:35:8: identifier
-            	    {
-            	    pushFollow(FOLLOW_identifier_in_idList207);
-            	    identifier37=identifier();
-            	    _fsp--;
-
-            	    list_identifier.add(identifier37.tree);
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt3 >= 1 ) break loop3;
-                        EarlyExitException eee =
-                            new EarlyExitException(3, input);
-                        throw eee;
-                }
-                cnt3++;
-            } while (true);
-
-            char_literal38=(Token)input.LT(1);
-            match(input,26,FOLLOW_26_in_idList210); 
-            list_26.add(char_literal38);
-
-
-            // AST REWRITE
-            int i_0 = 0;
-            retval.tree = root_0;
-            root_0 = (Object)adaptor.nil();
-            // 35:24: -> ^( IDLIST ( identifier )+ )
-            {
-                // bst.g:35:27: ^( IDLIST ( identifier )+ )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot(adaptor.create(IDLIST, "IDLIST"), root_1);
-
-                // bst.g:35:36: ( identifier )+
-                {
-                int n_1 = list_identifier == null ? 0 : list_identifier.size();
-                 
-
-
-                if ( n_1==0 ) throw new RuntimeException("Must have more than one element for (...)+ loops");
-                for (int i_1=0; i_1<n_1; i_1++) {
-                    adaptor.addChild(root_1, list_identifier.get(i_1));
-
-                }
-                }
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-            retval.stop = input.LT(-1);
-
-                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        return retval;
-    }
-    // $ANTLR end idList
-
-    public static class idList0_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start idList0
-    // bst.g:37:1: idList0 : '{' ( identifier )* '}' -> ^( IDLIST ( identifier )* ) ;
-    public idList0_return idList0() throws RecognitionException {   
-        idList0_return retval = new idList0_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token char_literal39=null;
-        Token char_literal41=null;
-        identifier_return identifier40 = null;
-
-        List list_identifier=new ArrayList();
-        List list_26=new ArrayList();
-        List list_25=new ArrayList();
-        Object char_literal39_tree=null;
-        Object char_literal41_tree=null;
-
-        try {
-            // bst.g:38:4: ( '{' ( identifier )* '}' -> ^( IDLIST ( identifier )* ) )
-            // bst.g:38:4: '{' ( identifier )* '}'
-            {
-            char_literal39=(Token)input.LT(1);
-            match(input,25,FOLLOW_25_in_idList0230); 
-            list_25.add(char_literal39);
-
-            // bst.g:38:8: ( identifier )*
-            loop4:
-            do {
-                int alt4=2;
-                int LA4_0 = input.LA(1);
-                if ( (LA4_0==IDENTIFIER) ) {
-                    alt4=1;
-                }
-
-
-                switch (alt4) {
-            	case 1 :
-            	    // bst.g:38:8: identifier
-            	    {
-            	    pushFollow(FOLLOW_identifier_in_idList0232);
-            	    identifier40=identifier();
-            	    _fsp--;
-
-            	    list_identifier.add(identifier40.tree);
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop4;
-                }
-            } while (true);
-
-            char_literal41=(Token)input.LT(1);
-            match(input,26,FOLLOW_26_in_idList0235); 
-            list_26.add(char_literal41);
-
-
-            // AST REWRITE
-            int i_0 = 0;
-            retval.tree = root_0;
-            root_0 = (Object)adaptor.nil();
-            // 38:24: -> ^( IDLIST ( identifier )* )
-            {
-                // bst.g:38:27: ^( IDLIST ( identifier )* )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot(adaptor.create(IDLIST, "IDLIST"), root_1);
-
-                // bst.g:38:36: ( identifier )*
-                {
-                int n_1 = list_identifier == null ? 0 : list_identifier.size();
-                 
-
-
-                for (int i_1=0; i_1<n_1; i_1++) {
-                    adaptor.addChild(root_1, list_identifier.get(i_1));
-
-                }
-                }
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-            retval.stop = input.LT(-1);
-
-                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        return retval;
-    }
-    // $ANTLR end idList0
-
-    public static class function_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start function
-    // bst.g:40:1: function : ( '<' | '>' | '=' | '+' | '-' | ':=' | '*' | 'add.period$' | 'call.type$' | 'change.case$' | 'chr.to.int$' | 'cite$' | 'duplicat$' | 'empty$' | 'format.name$' | 'if$' | 'int.to.chr$' | 'int.to.str$' | 'missing$' | 'newline$' | 'num.names$' | 'pop$' | 'preamble$' | 'purify$' | 'quote$' | 'skip$' | 'stack$' | 'substring$' | 'swap$' | 'text.length$' | 'text.prefix$' | 'top$' | 'type$' | 'warning$' | 'while$' | 'width$' | 'write$' | identifier );
-    public function_return function() throws RecognitionException {   
-        function_return retval = new function_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token char_literal42=null;
-        Token char_literal43=null;
-        Token char_literal44=null;
-        Token char_literal45=null;
-        Token char_literal46=null;
-        Token string_literal47=null;
-        Token char_literal48=null;
-        Token string_literal49=null;
-        Token string_literal50=null;
-        Token string_literal51=null;
-        Token string_literal52=null;
-        Token string_literal53=null;
-        Token string_literal54=null;
-        Token string_literal55=null;
-        Token string_literal56=null;
-        Token string_literal57=null;
-        Token string_literal58=null;
-        Token string_literal59=null;
-        Token string_literal60=null;
-        Token string_literal61=null;
-        Token string_literal62=null;
-        Token string_literal63=null;
-        Token string_literal64=null;
-        Token string_literal65=null;
-        Token string_literal66=null;
-        Token string_literal67=null;
-        Token string_literal68=null;
-        Token string_literal69=null;
-        Token string_literal70=null;
-        Token string_literal71=null;
-        Token string_literal72=null;
-        Token string_literal73=null;
-        Token string_literal74=null;
-        Token string_literal75=null;
-        Token string_literal76=null;
-        Token string_literal77=null;
-        Token string_literal78=null;
-        identifier_return identifier79 = null;
-
-
-        Object char_literal42_tree=null;
-        Object char_literal43_tree=null;
-        Object char_literal44_tree=null;
-        Object char_literal45_tree=null;
-        Object char_literal46_tree=null;
-        Object string_literal47_tree=null;
-        Object char_literal48_tree=null;
-        Object string_literal49_tree=null;
-        Object string_literal50_tree=null;
-        Object string_literal51_tree=null;
-        Object string_literal52_tree=null;
-        Object string_literal53_tree=null;
-        Object string_literal54_tree=null;
-        Object string_literal55_tree=null;
-        Object string_literal56_tree=null;
-        Object string_literal57_tree=null;
-        Object string_literal58_tree=null;
-        Object string_literal59_tree=null;
-        Object string_literal60_tree=null;
-        Object string_literal61_tree=null;
-        Object string_literal62_tree=null;
-        Object string_literal63_tree=null;
-        Object string_literal64_tree=null;
-        Object string_literal65_tree=null;
-        Object string_literal66_tree=null;
-        Object string_literal67_tree=null;
-        Object string_literal68_tree=null;
-        Object string_literal69_tree=null;
-        Object string_literal70_tree=null;
-        Object string_literal71_tree=null;
-        Object string_literal72_tree=null;
-        Object string_literal73_tree=null;
-        Object string_literal74_tree=null;
-        Object string_literal75_tree=null;
-        Object string_literal76_tree=null;
-        Object string_literal77_tree=null;
-        Object string_literal78_tree=null;
-
-        try {
-            // bst.g:41:4: ( '<' | '>' | '=' | '+' | '-' | ':=' | '*' | 'add.period$' | 'call.type$' | 'change.case$' | 'chr.to.int$' | 'cite$' | 'duplicat$' | 'empty$' | 'format.name$' | 'if$' | 'int.to.chr$' | 'int.to.str$' | 'missing$' | 'newline$' | 'num.names$' | 'pop$' | 'preamble$' | 'purify$' | 'quote$' | 'skip$' | 'stack$' | 'substring$' | 'swap$' | 'text.length$' | 'text.prefix$' | 'top$' | 'type$' | 'warning$' | 'while$' | 'width$' | 'write$' | identifier )
-            int alt5=38;
-            switch ( input.LA(1) ) {
-            case 27:
-                alt5=1;
-                break;
-            case 28:
-                alt5=2;
-                break;
-            case 29:
-                alt5=3;
-                break;
-            case 30:
-                alt5=4;
-                break;
-            case 31:
-                alt5=5;
-                break;
-            case 32:
-                alt5=6;
-                break;
-            case 33:
-                alt5=7;
-                break;
-            case 34:
-                alt5=8;
-                break;
-            case 35:
-                alt5=9;
-                break;
-            case 36:
-                alt5=10;
-                break;
-            case 37:
-                alt5=11;
-                break;
-            case 38:
-                alt5=12;
-                break;
-            case 39:
-                alt5=13;
-                break;
-            case 40:
-                alt5=14;
-                break;
-            case 41:
-                alt5=15;
-                break;
-            case 42:
-                alt5=16;
-                break;
-            case 43:
-                alt5=17;
-                break;
-            case 44:
-                alt5=18;
-                break;
-            case 45:
-                alt5=19;
-                break;
-            case 46:
-                alt5=20;
-                break;
-            case 47:
-                alt5=21;
-                break;
-            case 48:
-                alt5=22;
-                break;
-            case 49:
-                alt5=23;
-                break;
-            case 50:
-                alt5=24;
-                break;
-            case 51:
-                alt5=25;
-                break;
-            case 52:
-                alt5=26;
-                break;
-            case 53:
-                alt5=27;
-                break;
-            case 54:
-                alt5=28;
-                break;
-            case 55:
-                alt5=29;
-                break;
-            case 56:
-                alt5=30;
-                break;
-            case 57:
-                alt5=31;
-                break;
-            case 58:
-                alt5=32;
-                break;
-            case 59:
-                alt5=33;
-                break;
-            case 60:
-                alt5=34;
-                break;
-            case 61:
-                alt5=35;
-                break;
-            case 62:
-                alt5=36;
-                break;
-            case 63:
-                alt5=37;
-                break;
-            case IDENTIFIER:
-                alt5=38;
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("40:1: function : ( '<' | '>' | '=' | '+' | '-' | ':=' | '*' | 'add.period$' | 'call.type$' | 'change.case$' | 'chr.to.int$' | 'cite$' | 'duplicat$' | 'empty$' | 'format.name$' | 'if$' | 'int.to.chr$' | 'int.to.str$' | 'missing$' | 'newline$' | 'num.names$' | 'pop$' | 'preamble$' | 'purify$' | 'quote$' | 'skip$' | 'stack$' | 'substring$' | 'swap$' | 'text.length$' | 'text.prefix$' | 'top$' | 'type$' | 'warning$' | 'while$' | 'width$' | 'write$ [...]
-
-                throw nvae;
-            }
-
-            switch (alt5) {
-                case 1 :
-                    // bst.g:41:4: '<'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    char_literal42=(Token)input.LT(1);
-                    match(input,27,FOLLOW_27_in_function254); 
-                    char_literal42_tree = (Object)adaptor.create(char_literal42);
-                    adaptor.addChild(root_0, char_literal42_tree);
-
-
-                    }
-                    break;
-                case 2 :
-                    // bst.g:41:10: '>'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    char_literal43=(Token)input.LT(1);
-                    match(input,28,FOLLOW_28_in_function258); 
-                    char_literal43_tree = (Object)adaptor.create(char_literal43);
-                    adaptor.addChild(root_0, char_literal43_tree);
-
-
-                    }
-                    break;
-                case 3 :
-                    // bst.g:41:16: '='
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    char_literal44=(Token)input.LT(1);
-                    match(input,29,FOLLOW_29_in_function262); 
-                    char_literal44_tree = (Object)adaptor.create(char_literal44);
-                    adaptor.addChild(root_0, char_literal44_tree);
-
-
-                    }
-                    break;
-                case 4 :
-                    // bst.g:41:22: '+'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    char_literal45=(Token)input.LT(1);
-                    match(input,30,FOLLOW_30_in_function266); 
-                    char_literal45_tree = (Object)adaptor.create(char_literal45);
-                    adaptor.addChild(root_0, char_literal45_tree);
-
-
-                    }
-                    break;
-                case 5 :
-                    // bst.g:41:28: '-'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    char_literal46=(Token)input.LT(1);
-                    match(input,31,FOLLOW_31_in_function270); 
-                    char_literal46_tree = (Object)adaptor.create(char_literal46);
-                    adaptor.addChild(root_0, char_literal46_tree);
-
-
-                    }
-                    break;
-                case 6 :
-                    // bst.g:41:34: ':='
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal47=(Token)input.LT(1);
-                    match(input,32,FOLLOW_32_in_function274); 
-                    string_literal47_tree = (Object)adaptor.create(string_literal47);
-                    adaptor.addChild(root_0, string_literal47_tree);
-
-
-                    }
-                    break;
-                case 7 :
-                    // bst.g:41:41: '*'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    char_literal48=(Token)input.LT(1);
-                    match(input,33,FOLLOW_33_in_function278); 
-                    char_literal48_tree = (Object)adaptor.create(char_literal48);
-                    adaptor.addChild(root_0, char_literal48_tree);
-
-
-                    }
-                    break;
-                case 8 :
-                    // bst.g:41:47: 'add.period$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal49=(Token)input.LT(1);
-                    match(input,34,FOLLOW_34_in_function282); 
-                    string_literal49_tree = (Object)adaptor.create(string_literal49);
-                    adaptor.addChild(root_0, string_literal49_tree);
-
-
-                    }
-                    break;
-                case 9 :
-                    // bst.g:41:63: 'call.type$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal50=(Token)input.LT(1);
-                    match(input,35,FOLLOW_35_in_function286); 
-                    string_literal50_tree = (Object)adaptor.create(string_literal50);
-                    adaptor.addChild(root_0, string_literal50_tree);
-
-
-                    }
-                    break;
-                case 10 :
-                    // bst.g:41:78: 'change.case$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal51=(Token)input.LT(1);
-                    match(input,36,FOLLOW_36_in_function290); 
-                    string_literal51_tree = (Object)adaptor.create(string_literal51);
-                    adaptor.addChild(root_0, string_literal51_tree);
-
-
-                    }
-                    break;
-                case 11 :
-                    // bst.g:41:95: 'chr.to.int$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal52=(Token)input.LT(1);
-                    match(input,37,FOLLOW_37_in_function294); 
-                    string_literal52_tree = (Object)adaptor.create(string_literal52);
-                    adaptor.addChild(root_0, string_literal52_tree);
-
-
-                    }
-                    break;
-                case 12 :
-                    // bst.g:42:4: 'cite$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal53=(Token)input.LT(1);
-                    match(input,38,FOLLOW_38_in_function299); 
-                    string_literal53_tree = (Object)adaptor.create(string_literal53);
-                    adaptor.addChild(root_0, string_literal53_tree);
-
-
-                    }
-                    break;
-                case 13 :
-                    // bst.g:42:14: 'duplicat$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal54=(Token)input.LT(1);
-                    match(input,39,FOLLOW_39_in_function303); 
-                    string_literal54_tree = (Object)adaptor.create(string_literal54);
-                    adaptor.addChild(root_0, string_literal54_tree);
-
-
-                    }
-                    break;
-                case 14 :
-                    // bst.g:42:28: 'empty$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal55=(Token)input.LT(1);
-                    match(input,40,FOLLOW_40_in_function307); 
-                    string_literal55_tree = (Object)adaptor.create(string_literal55);
-                    adaptor.addChild(root_0, string_literal55_tree);
-
-
-                    }
-                    break;
-                case 15 :
-                    // bst.g:42:39: 'format.name$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal56=(Token)input.LT(1);
-                    match(input,41,FOLLOW_41_in_function311); 
-                    string_literal56_tree = (Object)adaptor.create(string_literal56);
-                    adaptor.addChild(root_0, string_literal56_tree);
-
-
-                    }
-                    break;
-                case 16 :
-                    // bst.g:42:56: 'if$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal57=(Token)input.LT(1);
-                    match(input,42,FOLLOW_42_in_function315); 
-                    string_literal57_tree = (Object)adaptor.create(string_literal57);
-                    adaptor.addChild(root_0, string_literal57_tree);
-
-
-                    }
-                    break;
-                case 17 :
-                    // bst.g:42:64: 'int.to.chr$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal58=(Token)input.LT(1);
-                    match(input,43,FOLLOW_43_in_function319); 
-                    string_literal58_tree = (Object)adaptor.create(string_literal58);
-                    adaptor.addChild(root_0, string_literal58_tree);
-
-
-                    }
-                    break;
-                case 18 :
-                    // bst.g:42:80: 'int.to.str$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal59=(Token)input.LT(1);
-                    match(input,44,FOLLOW_44_in_function323); 
-                    string_literal59_tree = (Object)adaptor.create(string_literal59);
-                    adaptor.addChild(root_0, string_literal59_tree);
-
-
-                    }
-                    break;
-                case 19 :
-                    // bst.g:42:96: 'missing$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal60=(Token)input.LT(1);
-                    match(input,45,FOLLOW_45_in_function327); 
-                    string_literal60_tree = (Object)adaptor.create(string_literal60);
-                    adaptor.addChild(root_0, string_literal60_tree);
-
-
-                    }
-                    break;
-                case 20 :
-                    // bst.g:43:4: 'newline$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal61=(Token)input.LT(1);
-                    match(input,46,FOLLOW_46_in_function332); 
-                    string_literal61_tree = (Object)adaptor.create(string_literal61);
-                    adaptor.addChild(root_0, string_literal61_tree);
-
-
-                    }
-                    break;
-                case 21 :
-                    // bst.g:43:17: 'num.names$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal62=(Token)input.LT(1);
-                    match(input,47,FOLLOW_47_in_function336); 
-                    string_literal62_tree = (Object)adaptor.create(string_literal62);
-                    adaptor.addChild(root_0, string_literal62_tree);
-
-
-                    }
-                    break;
-                case 22 :
-                    // bst.g:43:32: 'pop$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal63=(Token)input.LT(1);
-                    match(input,48,FOLLOW_48_in_function340); 
-                    string_literal63_tree = (Object)adaptor.create(string_literal63);
-                    adaptor.addChild(root_0, string_literal63_tree);
-
-
-                    }
-                    break;
-                case 23 :
-                    // bst.g:43:41: 'preamble$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal64=(Token)input.LT(1);
-                    match(input,49,FOLLOW_49_in_function344); 
-                    string_literal64_tree = (Object)adaptor.create(string_literal64);
-                    adaptor.addChild(root_0, string_literal64_tree);
-
-
-                    }
-                    break;
-                case 24 :
-                    // bst.g:43:55: 'purify$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal65=(Token)input.LT(1);
-                    match(input,50,FOLLOW_50_in_function348); 
-                    string_literal65_tree = (Object)adaptor.create(string_literal65);
-                    adaptor.addChild(root_0, string_literal65_tree);
-
-
-                    }
-                    break;
-                case 25 :
-                    // bst.g:43:67: 'quote$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal66=(Token)input.LT(1);
-                    match(input,51,FOLLOW_51_in_function352); 
-                    string_literal66_tree = (Object)adaptor.create(string_literal66);
-                    adaptor.addChild(root_0, string_literal66_tree);
-
-
-                    }
-                    break;
-                case 26 :
-                    // bst.g:43:78: 'skip$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal67=(Token)input.LT(1);
-                    match(input,52,FOLLOW_52_in_function356); 
-                    string_literal67_tree = (Object)adaptor.create(string_literal67);
-                    adaptor.addChild(root_0, string_literal67_tree);
-
-
-                    }
-                    break;
-                case 27 :
-                    // bst.g:43:88: 'stack$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal68=(Token)input.LT(1);
-                    match(input,53,FOLLOW_53_in_function360); 
-                    string_literal68_tree = (Object)adaptor.create(string_literal68);
-                    adaptor.addChild(root_0, string_literal68_tree);
-
-
-                    }
-                    break;
-                case 28 :
-                    // bst.g:43:99: 'substring$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal69=(Token)input.LT(1);
-                    match(input,54,FOLLOW_54_in_function364); 
-                    string_literal69_tree = (Object)adaptor.create(string_literal69);
-                    adaptor.addChild(root_0, string_literal69_tree);
-
-
-                    }
-                    break;
-                case 29 :
-                    // bst.g:44:4: 'swap$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal70=(Token)input.LT(1);
-                    match(input,55,FOLLOW_55_in_function369); 
-                    string_literal70_tree = (Object)adaptor.create(string_literal70);
-                    adaptor.addChild(root_0, string_literal70_tree);
-
-
-                    }
-                    break;
-                case 30 :
-                    // bst.g:44:14: 'text.length$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal71=(Token)input.LT(1);
-                    match(input,56,FOLLOW_56_in_function373); 
-                    string_literal71_tree = (Object)adaptor.create(string_literal71);
-                    adaptor.addChild(root_0, string_literal71_tree);
-
-
-                    }
-                    break;
-                case 31 :
-                    // bst.g:44:31: 'text.prefix$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal72=(Token)input.LT(1);
-                    match(input,57,FOLLOW_57_in_function377); 
-                    string_literal72_tree = (Object)adaptor.create(string_literal72);
-                    adaptor.addChild(root_0, string_literal72_tree);
-
-
-                    }
-                    break;
-                case 32 :
-                    // bst.g:44:48: 'top$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal73=(Token)input.LT(1);
-                    match(input,58,FOLLOW_58_in_function381); 
-                    string_literal73_tree = (Object)adaptor.create(string_literal73);
-                    adaptor.addChild(root_0, string_literal73_tree);
-
-
-                    }
-                    break;
-                case 33 :
-                    // bst.g:44:57: 'type$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal74=(Token)input.LT(1);
-                    match(input,59,FOLLOW_59_in_function385); 
-                    string_literal74_tree = (Object)adaptor.create(string_literal74);
-                    adaptor.addChild(root_0, string_literal74_tree);
-
-
-                    }
-                    break;
-                case 34 :
-                    // bst.g:44:67: 'warning$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal75=(Token)input.LT(1);
-                    match(input,60,FOLLOW_60_in_function389); 
-                    string_literal75_tree = (Object)adaptor.create(string_literal75);
-                    adaptor.addChild(root_0, string_literal75_tree);
-
-
-                    }
-                    break;
-                case 35 :
-                    // bst.g:44:80: 'while$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal76=(Token)input.LT(1);
-                    match(input,61,FOLLOW_61_in_function393); 
-                    string_literal76_tree = (Object)adaptor.create(string_literal76);
-                    adaptor.addChild(root_0, string_literal76_tree);
-
-
-                    }
-                    break;
-                case 36 :
-                    // bst.g:44:91: 'width$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal77=(Token)input.LT(1);
-                    match(input,62,FOLLOW_62_in_function397); 
-                    string_literal77_tree = (Object)adaptor.create(string_literal77);
-                    adaptor.addChild(root_0, string_literal77_tree);
-
-
-                    }
-                    break;
-                case 37 :
-                    // bst.g:45:4: 'write$'
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    string_literal78=(Token)input.LT(1);
-                    match(input,63,FOLLOW_63_in_function402); 
-                    string_literal78_tree = (Object)adaptor.create(string_literal78);
-                    adaptor.addChild(root_0, string_literal78_tree);
-
-
-                    }
-                    break;
-                case 38 :
-                    // bst.g:45:15: identifier
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_identifier_in_function406);
-                    identifier79=identifier();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, identifier79.tree);
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-            retval.stop = input.LT(-1);
-
-                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        return retval;
-    }
-    // $ANTLR end function
-
-    public static class stack_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start stack
-    // bst.g:47:1: stack : '{' ( stackitem )+ '}' -> ^( STACK ( stackitem )+ ) ;
-    public stack_return stack() throws RecognitionException {   
-        stack_return retval = new stack_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token char_literal80=null;
-        Token char_literal82=null;
-        stackitem_return stackitem81 = null;
-
-        List list_stackitem=new ArrayList();
-        List list_26=new ArrayList();
-        List list_25=new ArrayList();
-        Object char_literal80_tree=null;
-        Object char_literal82_tree=null;
-
-        try {
-            // bst.g:48:4: ( '{' ( stackitem )+ '}' -> ^( STACK ( stackitem )+ ) )
-            // bst.g:48:4: '{' ( stackitem )+ '}'
-            {
-            char_literal80=(Token)input.LT(1);
-            match(input,25,FOLLOW_25_in_stack417); 
-            list_25.add(char_literal80);
-
-            // bst.g:48:8: ( stackitem )+
-            int cnt6=0;
-            loop6:
-            do {
-                int alt6=2;
-                int LA6_0 = input.LA(1);
-                if ( (LA6_0==STRING||(LA6_0>=IDENTIFIER && LA6_0<=QUOTED)||LA6_0==25||(LA6_0>=27 && LA6_0<=63)) ) {
-                    alt6=1;
-                }
-
-
-                switch (alt6) {
-            	case 1 :
-            	    // bst.g:48:8: stackitem
-            	    {
-            	    pushFollow(FOLLOW_stackitem_in_stack419);
-            	    stackitem81=stackitem();
-            	    _fsp--;
-
-            	    list_stackitem.add(stackitem81.tree);
-
-            	    }
-            	    break;
-
-            	default :
-            	    if ( cnt6 >= 1 ) break loop6;
-                        EarlyExitException eee =
-                            new EarlyExitException(6, input);
-                        throw eee;
-                }
-                cnt6++;
-            } while (true);
-
-            char_literal82=(Token)input.LT(1);
-            match(input,26,FOLLOW_26_in_stack422); 
-            list_26.add(char_literal82);
-
-
-            // AST REWRITE
-            int i_0 = 0;
-            retval.tree = root_0;
-            root_0 = (Object)adaptor.nil();
-            // 48:23: -> ^( STACK ( stackitem )+ )
-            {
-                // bst.g:48:26: ^( STACK ( stackitem )+ )
-                {
-                Object root_1 = (Object)adaptor.nil();
-                root_1 = (Object)adaptor.becomeRoot(adaptor.create(STACK, "STACK"), root_1);
-
-                // bst.g:48:34: ( stackitem )+
-                {
-                int n_1 = list_stackitem == null ? 0 : list_stackitem.size();
-                 
-
-
-                if ( n_1==0 ) throw new RuntimeException("Must have more than one element for (...)+ loops");
-                for (int i_1=0; i_1<n_1; i_1++) {
-                    adaptor.addChild(root_1, list_stackitem.get(i_1));
-
-                }
-                }
-
-                adaptor.addChild(root_0, root_1);
-                }
-
-            }
-
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-            retval.stop = input.LT(-1);
-
-                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        return retval;
-    }
-    // $ANTLR end stack
-
-    public static class stackitem_return extends ParserRuleReturnScope {
-        Object tree;
-        public Object getTree() { return tree; }
-    };
-
-    // $ANTLR start stackitem
-    // bst.g:50:1: stackitem : ( function | STRING | INTEGER | QUOTED | stack );
-    public stackitem_return stackitem() throws RecognitionException {   
-        stackitem_return retval = new stackitem_return();
-        retval.start = input.LT(1);
-
-        Object root_0 = null;
-
-        Token STRING84=null;
-        Token INTEGER85=null;
-        Token QUOTED86=null;
-        function_return function83 = null;
-
-        stack_return stack87 = null;
-
-
-        Object STRING84_tree=null;
-        Object INTEGER85_tree=null;
-        Object QUOTED86_tree=null;
-
-        try {
-            // bst.g:51:4: ( function | STRING | INTEGER | QUOTED | stack )
-            int alt7=5;
-            switch ( input.LA(1) ) {
-            case IDENTIFIER:
-            case 27:
-            case 28:
-            case 29:
-            case 30:
-            case 31:
-            case 32:
-            case 33:
-            case 34:
-            case 35:
-            case 36:
-            case 37:
-            case 38:
-            case 39:
-            case 40:
-            case 41:
-            case 42:
-            case 43:
-            case 44:
-            case 45:
-            case 46:
-            case 47:
-            case 48:
-            case 49:
-            case 50:
-            case 51:
-            case 52:
-            case 53:
-            case 54:
-            case 55:
-            case 56:
-            case 57:
-            case 58:
-            case 59:
-            case 60:
-            case 61:
-            case 62:
-            case 63:
-                alt7=1;
-                break;
-            case STRING:
-                alt7=2;
-                break;
-            case INTEGER:
-                alt7=3;
-                break;
-            case QUOTED:
-                alt7=4;
-                break;
-            case 25:
-                alt7=5;
-                break;
-            default:
-                NoViableAltException nvae =
-                    new NoViableAltException("50:1: stackitem : ( function | STRING | INTEGER | QUOTED | stack );", 7, 0, input);
-
-                throw nvae;
-            }
-
-            switch (alt7) {
-                case 1 :
-                    // bst.g:51:4: function
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_function_in_stackitem441);
-                    function83=function();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, function83.tree);
-
-                    }
-                    break;
-                case 2 :
-                    // bst.g:52:4: STRING
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    STRING84=(Token)input.LT(1);
-                    match(input,STRING,FOLLOW_STRING_in_stackitem446); 
-                    STRING84_tree = (Object)adaptor.create(STRING84);
-                    adaptor.addChild(root_0, STRING84_tree);
-
-
-                    }
-                    break;
-                case 3 :
-                    // bst.g:53:4: INTEGER
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    INTEGER85=(Token)input.LT(1);
-                    match(input,INTEGER,FOLLOW_INTEGER_in_stackitem452); 
-                    INTEGER85_tree = (Object)adaptor.create(INTEGER85);
-                    adaptor.addChild(root_0, INTEGER85_tree);
-
-
-                    }
-                    break;
-                case 4 :
-                    // bst.g:54:4: QUOTED
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    QUOTED86=(Token)input.LT(1);
-                    match(input,QUOTED,FOLLOW_QUOTED_in_stackitem458); 
-                    QUOTED86_tree = (Object)adaptor.create(QUOTED86);
-                    adaptor.addChild(root_0, QUOTED86_tree);
-
-
-                    }
-                    break;
-                case 5 :
-                    // bst.g:55:4: stack
-                    {
-                    root_0 = (Object)adaptor.nil();
-
-                    pushFollow(FOLLOW_stack_in_stackitem463);
-                    stack87=stack();
-                    _fsp--;
-
-                    adaptor.addChild(root_0, stack87.tree);
-
-                    }
-                    break;
-
-            }
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-            retval.stop = input.LT(-1);
-
-                retval.tree = (Object)adaptor.rulePostProcessing(root_0);
-                adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);
-
-        }
-        return retval;
-    }
-    // $ANTLR end stackitem
-
-
- 
-
-    public static final BitSet FOLLOW_commands_in_program45 = new BitSet(new long[]{0x000000000003EF42L});
-    public static final BitSet FOLLOW_STRINGS_in_commands65 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_idList_in_commands68 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_INTEGERS_in_commands73 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_idList_in_commands76 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_FUNCTION_in_commands81 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_id_in_commands84 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_stack_in_commands86 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_MACRO_in_commands91 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_id_in_commands94 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_commands96 = new BitSet(new long[]{0x0000000000001000L});
-    public static final BitSet FOLLOW_STRING_in_commands99 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_26_in_commands101 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_READ_in_commands107 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_EXECUTE_in_commands113 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_commands116 = new BitSet(new long[]{0xFFFFFFFFF8040000L});
-    public static final BitSet FOLLOW_function_in_commands119 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_26_in_commands121 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ITERATE_in_commands127 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_commands130 = new BitSet(new long[]{0xFFFFFFFFF8040000L});
-    public static final BitSet FOLLOW_function_in_commands133 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_26_in_commands135 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_REVERSE_in_commands141 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_commands144 = new BitSet(new long[]{0xFFFFFFFFF8040000L});
-    public static final BitSet FOLLOW_function_in_commands147 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_26_in_commands149 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ENTRY_in_commands155 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_idList0_in_commands158 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_idList0_in_commands160 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_idList0_in_commands162 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_SORT_in_commands167 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_IDENTIFIER_in_identifier178 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_25_in_id188 = new BitSet(new long[]{0x0000000000040000L});
-    public static final BitSet FOLLOW_identifier_in_id191 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_26_in_id193 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_25_in_idList205 = new BitSet(new long[]{0x0000000000040000L});
-    public static final BitSet FOLLOW_identifier_in_idList207 = new BitSet(new long[]{0x0000000004040000L});
-    public static final BitSet FOLLOW_26_in_idList210 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_25_in_idList0230 = new BitSet(new long[]{0x0000000004040000L});
-    public static final BitSet FOLLOW_identifier_in_idList0232 = new BitSet(new long[]{0x0000000004040000L});
-    public static final BitSet FOLLOW_26_in_idList0235 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_27_in_function254 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_28_in_function258 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_29_in_function262 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_30_in_function266 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_31_in_function270 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_32_in_function274 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_33_in_function278 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_34_in_function282 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_35_in_function286 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_36_in_function290 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_37_in_function294 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_38_in_function299 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_39_in_function303 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_40_in_function307 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_41_in_function311 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_42_in_function315 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_43_in_function319 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_44_in_function323 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_45_in_function327 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_46_in_function332 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_47_in_function336 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_48_in_function340 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_49_in_function344 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_50_in_function348 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_51_in_function352 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_52_in_function356 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_53_in_function360 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_54_in_function364 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_55_in_function369 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_56_in_function373 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_57_in_function377 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_58_in_function381 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_59_in_function385 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_60_in_function389 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_61_in_function393 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_62_in_function397 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_63_in_function402 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_identifier_in_function406 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_25_in_stack417 = new BitSet(new long[]{0xFFFFFFFFFA1C1000L});
-    public static final BitSet FOLLOW_stackitem_in_stack419 = new BitSet(new long[]{0xFFFFFFFFFE1C1000L});
-    public static final BitSet FOLLOW_26_in_stack422 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_function_in_stackitem441 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_STRING_in_stackitem446 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_INTEGER_in_stackitem452 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_QUOTED_in_stackitem458 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_stack_in_stackitem463 = new BitSet(new long[]{0x0000000000000002L});
-
-}
\ No newline at end of file
diff --git a/src/java/net/sf/jabref/collab/FileUpdatePanel.java b/src/java/net/sf/jabref/collab/FileUpdatePanel.java
index 0d7c3b6..02f1e31 100644
--- a/src/java/net/sf/jabref/collab/FileUpdatePanel.java
+++ b/src/java/net/sf/jabref/collab/FileUpdatePanel.java
@@ -10,6 +10,8 @@ import java.io.File;
 
 public class FileUpdatePanel extends SidePaneComponent implements ActionListener {
 
+    public static final String NAME = "fileUpdate";
+
 	JButton test = new JButton(Globals.lang("Review changes"));
 
 	BasePanel panel;
@@ -46,6 +48,14 @@ public class FileUpdatePanel extends SidePaneComponent implements ActionListener
 	}
 
 	/**
+	 * Unregister when this component closes. We need that to avoid showing
+	 * two such external change warnings at the same time, only the latest one.
+	 */
+	public void componentClosing() {
+	    manager.unregisterComponent(NAME);
+	}
+
+	/**
 	 * actionPerformed
 	 * 
 	 * @param e
diff --git a/src/java/net/sf/jabref/collab/GroupChange.java b/src/java/net/sf/jabref/collab/GroupChange.java
index dea681e..81c1237 100644
--- a/src/java/net/sf/jabref/collab/GroupChange.java
+++ b/src/java/net/sf/jabref/collab/GroupChange.java
@@ -28,6 +28,10 @@ public class GroupChange extends Change {
             root.setGroup(m_changedGroups.getGroup());
             for (int i = 0; i < m_changedGroups.getChildCount(); ++i)        
                 root.add(((GroupTreeNode) m_changedGroups.getChildAt(i)).deepCopy());
+            // the group tree is now appled to a different BibtexDatabase than it was created
+            // for, which affects groups such as ExplicitGroup (which links to BibtexEntry objects).
+            // We must traverse the tree and refresh all groups:
+            root.refreshGroupsForNewDatabase(panel.database());
         }
         panel.getGroupSelector().revalidateGroups();
         undoEdit.addEdit(undo);
diff --git a/src/java/net/sf/jabref/export/ExportFormats.java b/src/java/net/sf/jabref/export/ExportFormats.java
index c1a5274..a06af41 100644
--- a/src/java/net/sf/jabref/export/ExportFormats.java
+++ b/src/java/net/sf/jabref/export/ExportFormats.java
@@ -87,7 +87,16 @@ public class ExportFormats {
 		return sb.toString();
 	}
 
-	/**
+    /**
+     * Get a Map of all export formats.
+     * @return A Map containing all export formats, mapped to their console names.
+     */
+    public static Map getExportFormats() {
+        // It is perhaps overly paranoid to make a defensive copy in this case:
+        return Collections.unmodifiableMap(exportFormats);
+    }
+
+    /**
 	 * Look up the named export format.
 	 * 
 	 * @param consoleName
diff --git a/src/java/net/sf/jabref/export/ExportToClipboardAction.java b/src/java/net/sf/jabref/export/ExportToClipboardAction.java
new file mode 100644
index 0000000..f6ce8a2
--- /dev/null
+++ b/src/java/net/sf/jabref/export/ExportToClipboardAction.java
@@ -0,0 +1,142 @@
+package net.sf.jabref.export;
+
+import net.sf.jabref.*;
+import net.sf.jabref.gui.MainTable;
+
+import javax.swing.*;
+import java.util.*;
+import java.io.*;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.Transferable;
+import java.awt.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: alver
+ * Date: Dec 12, 2006
+ * Time: 6:22:25 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class ExportToClipboardAction extends AbstractWorker {
+    String message = null;
+    private JabRefFrame frame;
+    private BibtexDatabase database;
+
+    public ExportToClipboardAction(JabRefFrame frame, BibtexDatabase database) {
+        this.frame = frame;
+        this.database = database;
+    }
+    public void run() {
+        BasePanel panel = frame.basePanel();
+        if (panel == null)
+            return;
+        if (panel.getSelectedEntries().length == 0) {
+            message = Globals.lang("No entries selected") + ".";
+            getCallBack().update();
+            return;
+        }
+
+        Map m = ExportFormats.getExportFormats();
+        ExportFormat[] formats = new ExportFormat[m.size()];
+        int piv=0;
+        for (Iterator iterator = m.keySet().iterator(); iterator.hasNext();) {
+            formats[piv++] = (ExportFormat)m.get(iterator.next());
+        }
+        //ExportFormat[] formats = (ExportFormat[])(m.entrySet().toArray
+        //        (new ExportFormat[m.size()]));
+
+        // Make a list of possible formats:
+        /*Map formats = new HashMap();
+        formats.put("BibTeXML", "bibtexml");
+        formats.put("DocBook", "docbook");
+        formats.put("HTML", "html");
+        formats.put("RTF (Harvard)", "harvard/harvard");
+        formats.put("Simple HTML", "simplehtml");
+        for (int i = 0; i < Globals.prefs.customExports.size(); i++) {
+            Object o = (Globals.prefs.customExports.getElementAt(i))[0];
+            formats.put(o, o);
+        }*/
+        String[] array = new String[formats.length];
+        for (int i=0; i<formats.length; i++) {
+            array[i] = formats[i].getDisplayName();
+        }
+        //Arrays.sort(array);
+        JList list = new JList(array);
+        list.setBorder(BorderFactory.createEtchedBorder());
+        list.setSelectionInterval(0, 0);
+        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+        int answer = JOptionPane.showOptionDialog(frame, list, Globals.lang("Select format"),
+            JOptionPane.YES_NO_OPTION,
+            JOptionPane.QUESTION_MESSAGE, null,
+            new String[]{Globals.lang("Ok"), Globals.lang("Cancel")},
+            Globals.lang("Ok"));
+
+        if (answer == JOptionPane.NO_OPTION)
+            return;
+
+        ExportFormat format = formats[list.getSelectedIndex()];
+
+        /*final boolean custom = (list.getSelectedIndex() >= Globals.STANDARD_EXPORT_COUNT);
+        String dir = null;
+        if (custom) {
+            int index = list.getSelectedIndex() - Globals.STANDARD_EXPORT_COUNT;
+            dir = (String) (Globals.prefs.customExports.getElementAt(index)[1]);
+            File f = new File(dir);
+            lfName = f.getName();
+            lfName = lfName.substring(0, lfName.indexOf("."));
+            // Remove file name - we want the directory only.
+            dir = f.getParent() + System.getProperty("file.separator");
+        }
+        final String format = lfName,
+                directory = dir;
+        */
+        File tmp = null;
+        Reader reader = null;
+        try {
+            // To simplify the exporter API we simply do a normal export to a temporary
+            // file, and read the contents afterwards:
+            tmp = File.createTempFile("jabrefCb", ".tmp");
+            tmp.deleteOnExit();
+            BibtexEntry[] bes = panel.getSelectedEntries();
+            HashSet entries = new HashSet(bes.length);
+            for (int i = 0; i < bes.length; i++)
+                entries.add(bes[i].getId());
+            // Write to file:
+            format.performExport(database, tmp.getPath(), panel.getEncoding(), entries);
+            // Read the file and put the contents on the clipboard:
+            StringBuffer sb = new StringBuffer();
+            reader = new InputStreamReader(new FileInputStream(tmp), panel.getEncoding());
+            int s;
+            while ((s = reader.read()) != -1) {
+                sb.append((char)s);
+            }
+            ClipboardOwner owner = new ClipboardOwner() {
+                public void lostOwnership(Clipboard clipboard, Transferable content) {
+                }
+            };
+            //StringSelection ss = new StringSelection(sw.toString());
+            RtfSelection rs = new RtfSelection(sb.toString());
+            Toolkit.getDefaultToolkit().getSystemClipboard()
+                    .setContents(rs, owner);
+            message = Globals.lang("Entries exported to clipboard") + ": " + bes.length;
+
+        } catch (Exception e) {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+            message = Globals.lang("Error exporting to clipboard");
+            return;
+        } finally {
+            // Clean up:
+            if (tmp != null)
+                tmp.delete();
+            if (reader != null)
+                try { reader.close(); } catch (IOException ex) { ex.printStackTrace(); }
+        }
+
+    }
+
+    public void update() {
+        frame.output(message);
+    }
+
+}
diff --git a/src/java/net/sf/jabref/export/layout/Layout.java b/src/java/net/sf/jabref/export/layout/Layout.java
index 2345c82..bf3a260 100755
--- a/src/java/net/sf/jabref/export/layout/Layout.java
+++ b/src/java/net/sf/jabref/export/layout/Layout.java
@@ -38,7 +38,7 @@ import java.io.IOException;
  * DOCUMENT ME!
  *
  * @author $author$
- * @version $Revision: 1.8 $
+ * @version $Revision: 1.9 $
  */
 public class Layout
 {
@@ -140,8 +140,6 @@ public class Layout
         }
     }
 
-    //~ Methods ////////////////////////////////////////////////////////////////
-
     /**
      * Returns the processed bibtex entry. If the database argument is
      * null, no string references will be resolved. Otherwise all valid
@@ -150,14 +148,11 @@ public class Layout
      */
     public String doLayout(BibtexEntry bibtex, BibtexDatabase database)
     {
-        //System.out.println("LAYOUT: " + bibtex.getId());
         StringBuffer sb = new StringBuffer(100);
-        String fieldText;
-        boolean previousSkipped = false;
 
         for (int i = 0; i < layoutEntries.length; i++)
         {
-            fieldText = layoutEntries[i].doLayout(bibtex, database);
+            String fieldText = layoutEntries[i].doLayout(bibtex, database);
 
             // 2005.05.05 M. Alver
             // The following change means we treat null fields as "". This is to fix the
@@ -165,47 +160,8 @@ public class Layout
             // no side effects.
             if (fieldText == null)
                 fieldText = "";
-            /*if (fieldText == null)
-            {
-                if ((i + 1) < layoutEntries.length)
-                {
-                    if (layoutEntries[i + 1].doLayout(bibtex, database).trim().length() == 0)
-                    {
-                        //sb.append("MISSING");
-                        i++;
-                        previousSkipped = true;
-
-                        continue;
-                    }
-                }
-            }
-            else*/
-            {
-                // if previous was skipped --> remove leading line breaks
-                if (previousSkipped)
-                {
-                    int eol = 0;
-
-                    while ((eol < fieldText.length()) &&
-                            ((fieldText.charAt(eol) == '\n') ||
-                            (fieldText.charAt(eol) == '\r')))
-                    {
-                        eol++;
-                    }
-
-                    if (eol < fieldText.length())
-                    {
-                        sb.append(fieldText.substring(eol));
-                    }
-                }
-                else
-                {
-                    //System.out.println("ENTRY-BLOCK: " + layoutEntries[i].doLayout(bibtex));
-                    sb.append(fieldText);
-                }
-            }
-
-            previousSkipped = false;
+            
+            sb.append(fieldText);
         }
 
         return sb.toString();
diff --git a/src/java/net/sf/jabref/export/layout/LayoutEntry.java b/src/java/net/sf/jabref/export/layout/LayoutEntry.java
index 6d2e3f3..3d3dc19 100755
--- a/src/java/net/sf/jabref/export/layout/LayoutEntry.java
+++ b/src/java/net/sf/jabref/export/layout/LayoutEntry.java
@@ -42,7 +42,7 @@ import wsi.ra.types.StringInt;
  * DOCUMENT ME!
  * 
  * @author $author$
- * @version $Revision: 1.15 $
+ * @version $Revision: 1.16 $
  */
 public class LayoutEntry {
 	// ~ Instance fields
@@ -161,32 +161,16 @@ public class LayoutEntry {
 		}
 	}
 
-	// ~ Methods
-	// ////////////////////////////////////////////////////////////////
-
 	public String doLayout(BibtexEntry bibtex, BibtexDatabase database) {
 
-		if (type == LayoutHelper.IS_LAYOUT_TEXT) {
+		switch (type) {
+		case LayoutHelper.IS_LAYOUT_TEXT:
 			return text;
-		} else if (type == LayoutHelper.IS_SIMPLE_FIELD) {
-			if (text.equals("bibtextype")) {
-				return bibtex.getType().getName();
-			}
-
-			String field = getField(bibtex, text, database);
-
-			if (field == null) {
-
-				return null;
-			} else {
-
-				return field;
-
-			}
-		} else if ((type == LayoutHelper.IS_FIELD_START) || (type == LayoutHelper.IS_GROUP_START)) {
-
+		case LayoutHelper.IS_SIMPLE_FIELD:
+			return getField(bibtex, text, database);
+		case LayoutHelper.IS_FIELD_START:
+		case LayoutHelper.IS_GROUP_START: {
 			String field = getField(bibtex, text, database);
-			// String field = (String) bibtex.getField(text);
 
 			if ((field == null)
 				|| ((type == LayoutHelper.IS_GROUP_START) && (field.equalsIgnoreCase(LayoutHelper
@@ -203,14 +187,11 @@ public class LayoutEntry {
 				for (int i = 0; i < layoutEntries.length; i++) {
 					fieldText = layoutEntries[i].doLayout(bibtex, database);
 
-					// System.out.println("'" + fieldText + "'");
 					if (fieldText == null) {
 						if ((i + 1) < layoutEntries.length) {
 							if (layoutEntries[i + 1].doLayout(bibtex, database).trim().length() == 0) {
-								// System.out.println("MISSING: "+bibtex);
 								i++;
 								previousSkipped = true;
-
 								continue;
 							}
 						}
@@ -240,9 +221,11 @@ public class LayoutEntry {
 
 				return sb.toString();
 			}
-		} else if ((type == LayoutHelper.IS_FIELD_END) || (type == LayoutHelper.IS_GROUP_END)) {
-		} else if (type == LayoutHelper.IS_OPTION_FIELD) {
-			// System.out.println("doLayout IS_OPTION_FIELD '"+text+"'");
+		}
+		case LayoutHelper.IS_FIELD_END:
+		case LayoutHelper.IS_GROUP_END:
+			return "";
+		case LayoutHelper.IS_OPTION_FIELD: {
 			String fieldEntry;
 
 			if (text.equals("bibtextype")) {
@@ -253,9 +236,6 @@ public class LayoutEntry {
 				String field = text.startsWith("\\") ? getField(bibtex, text.substring(1), database)
 					: getText(text, database);
 				// changed section end - arudert
-
-				// String field = (String) bibtex.getField(text);
-
 				if (field == null) {
 					fieldEntry = "";
 				} else {
@@ -272,12 +252,9 @@ public class LayoutEntry {
 
 			return fieldEntry;
 		}
-
-		// else if (type == LayoutHelper.IS_OPTION_FIELD_PARAM)
-		// {
-		// }
-
-		return "";
+		default:
+			return "";
+		}
 	}
 
 	// added section - begin (arudert)
diff --git a/src/java/net/sf/jabref/export/layout/format/HTMLChars.java b/src/java/net/sf/jabref/export/layout/format/HTMLChars.java
index f012d60..17c7ff8 100644
--- a/src/java/net/sf/jabref/export/layout/format/HTMLChars.java
+++ b/src/java/net/sf/jabref/export/layout/format/HTMLChars.java
@@ -1,179 +1,210 @@
 package net.sf.jabref.export.layout.format;
 
-import net.sf.jabref.export.layout.*;
 import net.sf.jabref.Globals;
+import net.sf.jabref.export.layout.LayoutFormatter;
 
+/**
+ * This formatter escapes characters so they are suitable for HTML.
+ * 
+ * @version $Revision: 1.10 $ ($Date: 2007/01/19 00:12:49 $)
+ */
 public class HTMLChars implements LayoutFormatter {
 
-
-  public String format(String field) {
-    int i;
-    field = firstFormat(field);
-
-    StringBuffer sb = new StringBuffer("");
-    StringBuffer currentCommand = null;
-    char c;
-    boolean escaped = false, incommand = false;
-    for (i=0; i<field.length(); i++) {
-      c = field.charAt(i);
-      if (escaped && (c == '\\')) {
-        sb.append('\\');
-        escaped = false;
-      }
-      else if (c == '\\') {
-        escaped = true;
-        incommand = true;
-        currentCommand = new StringBuffer();
-      }
-      else if (!incommand && (c=='{' || c=='}')) {
-        // Swallow the brace.
-      }
-      else if (Character.isLetter((char)c) ||
-               (Globals.SPECIAL_COMMAND_CHARS.indexOf(""+(char)c) >= 0)) {
-        escaped = false;
-        if (!incommand)
-          sb.append((char)c);
-          // Else we are in a command, and should not keep the letter.
-        else {
-          currentCommand.append( (char) c);
-
-          testCharCom: if ((currentCommand.length() == 1)
-              && (Globals.SPECIAL_COMMAND_CHARS.indexOf(currentCommand.toString()) >= 0)) {
-            // This indicates that we are in a command of the type \^o or \~{n}
-            if (i >= field.length()-1)
-              break testCharCom;
-
-            String command = currentCommand.toString();
-            i++;
-            c = field.charAt(i);
-            //System.out.println("next: "+(char)c);
-            String combody;
-            if (c == '{') {
-              IntAndString part = getPart(field, i, false);
-              i += part.i;
-              combody = part.s;
-            }
-            else {
-              combody = field.substring(i,i+1);
-              //System.out.println("... "+combody);
-            }
-            Object result = Globals.HTMLCHARS.get(command+combody);
-	    
-            if (result != null)
-              sb.append((String)result);
-
-            incommand = false;
-            escaped = false;
-
-          }
-
-        }
-
-      }
-      else {
-        String argument = null;
-
-        if (!incommand) {
-          sb.append((char)c);
-        }
-        else if (Character.isWhitespace(c) || c == '{') {
-          // First test if we are already at the end of the string.
-          //if (i >= field.length()-1)
-          //  break testContent;
-
-          String command = currentCommand.toString();
-          // Then test if we are dealing with a italics or bold command.
-          // If so, handle.
-          if (command.equals("emph") || command.equals("textit")) {
-            IntAndString part = getPart(field, i, true);
-              
-            i += part.i;
-              sb.append("<em>").append(part.s).append("</em>");
-          }
-          else if (command.equals("textbf")) {
-            IntAndString part = getPart(field, i, true);
-            i += part.i;
-              sb.append("<b>").append(part.s).append("</b>");
-          }
-          else {
-            IntAndString part = getPart(field, i, true);
-            i += part.i; argument = part.s;
-          }
-        }
-        else if (c == '}') {
-          argument = "";
-        }
-        else {
-            /* TODO: this point is reached, apparently, if a command is terminated in a
-             * strange way, such as with "$\omega$". Also, the command "\&" causes us
-             * to get here. The former issue is maybe a little difficult to address, since
-             * it involves the LaTeX math mode. We don't have a complete LaTeX parser, so
-             * maybe it's better to ignore these commands?
-            */
-          //System.err.println("Unreachable code?? '"+field+"'");
-        }
-        if (argument != null) {
-          // handle common case of general latex command
-          String command  = currentCommand.toString();
-          Object result = Globals.HTMLCHARS.get(command+argument);
-          //System.out.print("command: "+command+", arg: "+argument);
-          //System.out.print(", result: ");
-          // If found, then use translated version. If not, then keep the
-          // text of the parameter intact.
-          if (result != null) {
-            //System.out.println((String)result);
-            sb.append((String)result);
-          } else {
-            //System.out.println(argument);
-            sb.append(argument);
-          }
-        }
-        incommand = false;
-        escaped = false;
-      }
-    }
-
-    return sb.toString();
-        //field.replaceAll("\\\\emph", "").replaceAll("\\\\em", "").replaceAll("\\\\textbf", "");
-  }
-
-  private String firstFormat(String s) {
-    return s.replaceAll("&|\\\\&","&").replaceAll("[\\n]{1,}","<p>");//.replaceAll("--", "—");
-  }
-
-  private IntAndString getPart(String text, int i, boolean terminateOnEndBraceOnly) {
-    char c;
-    int count = 0;//, i=index;
-    StringBuffer part = new StringBuffer();
-    // advance to first char and skip wihitespace
-    i++;
-    for ( ; i < text.length() ; ++i) {
-      if (!Character.isWhitespace(text.charAt(i)))
-        break;
-    }
-    // then grab whathever is the first token (counting braces)
-    for ( ; i < text.length() ; ++i) {
-      c = text.charAt(i);
-      if (!terminateOnEndBraceOnly && count == 0 && Character.isWhitespace(c)) {
-        i--; // end argument and leave whitespace for further processing
-        break;
-      }
-      if (c == '}' && --count < 0)
-        break;
-      else if (c == '{')
-        count++;
-      part.append((char)c);
-    }
-    //System.out.println("part: "+part.toString()+"\nformatted: "+format(part.toString()));
-    return new IntAndString(part.length(), format(part.toString()));
-  }
-
-  private class IntAndString{
-    public int i;
-    String s;
-    public IntAndString(int i, String s) {
-      this.i = i;
-      this.s = s;
-    }
-  }
+	public String format(String field) {
+		int i;
+		field = field.replaceAll("&|\\\\&", "&").replaceAll("[\\n]{1,}", "<p>");
+
+		StringBuffer sb = new StringBuffer();
+		StringBuffer currentCommand = null;
+		
+		char c;
+		boolean escaped = false, incommand = false;
+		
+		for (i = 0; i < field.length(); i++) {
+			c = field.charAt(i);
+			if (escaped && (c == '\\')) {
+				sb.append('\\');
+				escaped = false;
+			} else if (c == '\\') {
+				if (incommand){
+					/* Close Command */
+					String command = currentCommand.toString();
+					Object result = Globals.HTMLCHARS.get(command);
+					if (result != null) {
+						sb.append((String) result);
+					} else {
+						sb.append(command);
+					}
+				}
+				escaped = true;
+				incommand = true;
+				currentCommand = new StringBuffer();
+			} else if (!incommand && (c == '{' || c == '}')) {
+				// Swallow the brace.
+			} else if (Character.isLetter((char) c)
+				|| (Globals.SPECIAL_COMMAND_CHARS.indexOf("" + (char) c) >= 0)) {
+				escaped = false;
+				if (!incommand)
+					sb.append((char) c);
+					// Else we are in a command, and should not keep the letter.
+				else {
+					currentCommand.append((char) c);
+
+					testCharCom: if ((currentCommand.length() == 1)
+						&& (Globals.SPECIAL_COMMAND_CHARS.indexOf(currentCommand.toString()) >= 0)) {
+						// This indicates that we are in a command of the type
+						// \^o or \~{n}
+						if (i >= field.length() - 1)
+							break testCharCom;
+
+						String command = currentCommand.toString();
+						i++;
+						c = field.charAt(i);
+						// System.out.println("next: "+(char)c);
+						String combody;
+						if (c == '{') {
+							IntAndString part = getPart(field, i, false);
+							i += part.i;
+							combody = part.s;
+						} else {
+							combody = field.substring(i, i + 1);
+							// System.out.println("... "+combody);
+						}
+						Object result = Globals.HTMLCHARS.get(command + combody);
+
+						if (result != null)
+							sb.append((String) result);
+
+						incommand = false;
+						escaped = false;
+					} else { 
+						//	Are we already at the end of the string?
+						if (i + 1 == field.length()){
+							String command = currentCommand.toString();
+							Object result = Globals.HTMLCHARS.get(command);
+							/* If found, then use translated version. If not,
+							 * then keep
+							 * the text of the parameter intact.
+							 */
+							if (result != null) {
+								sb.append((String) result);
+							} else {
+								sb.append(command);
+							}
+							
+						}
+					}
+				}
+			} else {
+				String argument = null;
+
+				if (!incommand) {
+					sb.append((char) c);
+				} else if (Character.isWhitespace(c) || c == '{') {
+					// First test if we are already at the end of the string.
+					// if (i >= field.length()-1)
+					// break testContent;
+
+					String command = currentCommand.toString();
+					// Then test if we are dealing with a italics or bold
+					// command.
+					// If so, handle.
+					if (command.equals("emph") || command.equals("textit")) {
+						IntAndString part = getPart(field, i, true);
+
+						i += part.i;
+						sb.append("<em>").append(part.s).append("</em>");
+					} else if (command.equals("textbf")) {
+						IntAndString part = getPart(field, i, true);
+						i += part.i;
+						sb.append("<b>").append(part.s).append("</b>");
+					} else if (c == '{'){
+						IntAndString part = getPart(field, i, true);
+						i += part.i;
+						argument = part.s;
+						if (argument != null) {
+							// handle common case of general latex command
+							Object result = Globals.HTMLCHARS.get(command + argument);
+							// System.out.print("command: "+command+", arg: "+argument);
+							// System.out.print(", result: ");
+							// If found, then use translated version. If not, then keep
+							// the
+							// text of the parameter intact.
+							if (result != null) {
+								sb.append((String) result);
+							} else {
+								sb.append(argument);
+							}
+						}
+					} else {
+						Object result = Globals.HTMLCHARS.get(command);
+						if (result != null) {
+							sb.append((String) result);
+						} else {
+							sb.append(command);
+						}
+						sb.append(' ');
+					}
+				} else if (c == '}') {
+					argument = "";
+				} else {
+					/*
+					 * TODO: this point is reached, apparently, if a command is
+					 * terminated in a strange way, such as with "$\omega$".
+					 * Also, the command "\&" causes us to get here. The former
+					 * issue is maybe a little difficult to address, since it
+					 * involves the LaTeX math mode. We don't have a complete
+					 * LaTeX parser, so maybe it's better to ignore these
+					 * commands?
+					 */
+				}
+				
+				incommand = false;
+				escaped = false;
+			}
+		}
+
+		return sb.toString();
+	}
+
+	private IntAndString getPart(String text, int i, boolean terminateOnEndBraceOnly) {
+		char c;
+		int count = 0;
+		
+		StringBuffer part = new StringBuffer();
+		
+		// advance to first char and skip wihitespace
+		i++;
+		while (i < text.length() && Character.isWhitespace(text.charAt(i))){
+			i++;
+		}
+		
+		// then grab whathever is the first token (counting braces)
+		while (i < text.length()){
+			c = text.charAt(i);
+			if (!terminateOnEndBraceOnly && count == 0 && Character.isWhitespace(c)) {
+				i--; // end argument and leave whitespace for further
+					 // processing
+				break;
+			}
+			if (c == '}' && --count < 0)
+				break;
+			else if (c == '{')
+				count++;
+			part.append((char) c);
+			i++;
+		}
+		return new IntAndString(part.length(), format(part.toString()));
+	}
+
+	private class IntAndString {
+		public int i;
+
+		String s;
+
+		public IntAndString(int i, String s) {
+			this.i = i;
+			this.s = s;
+		}
+	}
 }
diff --git a/src/java/net/sf/jabref/export/layout/format/RTFChars.java b/src/java/net/sf/jabref/export/layout/format/RTFChars.java
index 6b47cf9..e5fbb5e 100644
--- a/src/java/net/sf/jabref/export/layout/format/RTFChars.java
+++ b/src/java/net/sf/jabref/export/layout/format/RTFChars.java
@@ -17,7 +17,7 @@ import net.sf.jabref.Globals;
  *   4.) Take special care to save all unicode characters correctly. 
  * 
  * @author $Author: coezbek $
- * @version $Revision: 1.6 $ ($Date: 2006/10/31 21:55:04 $)
+ * @version $Revision: 1.7 $ ($Date: 2007/01/19 00:12:49 $)
  *
  */
 public class RTFChars implements LayoutFormatter {
@@ -128,7 +128,7 @@ public class RTFChars implements LayoutFormatter {
 
 	private IntAndString getPart(String text, int i) {
 		char c;
-		int count = 0;// , i=index;
+		int count = 0;
 		StringBuffer part = new StringBuffer();
 		while ((count >= 0) && (i < text.length())) {
 			i++;
@@ -140,8 +140,6 @@ public class RTFChars implements LayoutFormatter {
 
 			part.append((char) c);
 		}
-		// System.out.println("part: "+part.toString()+"\nformatted:
-		// "+format(part.toString()));
 		return new IntAndString(part.length(), format(part.toString()));
 	}
 
diff --git a/src/java/net/sf/jabref/external/AutoSetExternalFileForEntries.java b/src/java/net/sf/jabref/external/AutoSetExternalFileForEntries.java
index ca81823..4cab039 100644
--- a/src/java/net/sf/jabref/external/AutoSetExternalFileForEntries.java
+++ b/src/java/net/sf/jabref/external/AutoSetExternalFileForEntries.java
@@ -11,6 +11,7 @@ import java.awt.*;
 import java.awt.event.ActionListener;
 import java.awt.event.ActionEvent;
 import java.util.Vector;
+import java.util.Collection;
 
 import com.jgoodies.forms.layout.FormLayout;
 import com.jgoodies.forms.builder.DefaultFormBuilder;
@@ -42,12 +43,15 @@ public class AutoSetExternalFileForEntries extends AbstractWorker {
     }
 
     public void init() {
-
         // Get all entries, and make sure there are selected entries:
     	sel = panel.getSelectedEntries();
     	if (sel.length < 1) {
-            goOn = false;
-            return;
+	    // No entries selected. Assume all entries should be treated:
+	    Collection col = panel.database().getEntries();
+	    sel = new BibtexEntry[col.size()];
+	    sel = (BibtexEntry[])col.toArray(sel);
+            //goOn = false;
+            //return;
         }
 
         // Ask about rules for the operation:
@@ -67,12 +71,17 @@ public class AutoSetExternalFileForEntries extends AbstractWorker {
     }
 
     public void run() {
-
         if (!goOn){
             panel.output(Globals.lang("No entries selected."));
             return;
         }
-
+	panel.frame().setProgressBarValue(0);
+	panel.frame().setProgressBarVisible(true);
+	int weightAutoSet = 10; // autoSet takes 10 (?) times longer than checkExisting
+	int progressBarMax = (autoSet ? weightAutoSet*sel.length : 0) 
+	    + (checkExisting ? sel.length : 0);
+	panel.frame().setProgressBarMaximum(progressBarMax);
+	int progress = 0;
         skipped=0;
         entriesChanged=0;
         brokenLinks=0;
@@ -80,7 +89,7 @@ public class AutoSetExternalFileForEntries extends AbstractWorker {
 
         final OpenFileFilter off = Util.getFileFilterForField(fieldName);
 
-        ExternalFilePanel extPan = new ExternalFilePanel(fieldName, panel.metaData(), null, off);
+        ExternalFilePanel extPan = new ExternalFilePanel(fieldName, panel.metaData(), null, null, off);
         FieldTextField editor = new FieldTextField(fieldName, "", false);
 
         // Find the default directory for this field type:
@@ -89,6 +98,9 @@ public class AutoSetExternalFileForEntries extends AbstractWorker {
         // First we try to autoset fields
         if (autoSet) {
             for (int i=0; i<sel.length; i++) {
+		progress += weightAutoSet;
+		panel.frame().setProgressBarValue(progress);
+
                 final Object old = sel[i].getField(fieldName);
                 // Check if a link is already set, and if so, if we are allowed to overwrite it:
                 if ((old != null) && !old.equals("") && !overWriteAllowed)
@@ -117,6 +129,7 @@ public class AutoSetExternalFileForEntries extends AbstractWorker {
         // The following loop checks all external links that are already set.
         if (checkExisting) {
             mainLoop: for (int i=0; i<sel.length; i++) {
+		panel.frame().setProgressBarValue(progress++);
                 final Object old = sel[i].getField(fieldName);
                 // Check if a link is set:
                 if ((old != null) && !((String)old).equals("")) {
@@ -176,6 +189,7 @@ public class AutoSetExternalFileForEntries extends AbstractWorker {
 
         panel.output(Globals.lang("Finished synchronizing %0 links. Entries changed%c %1.",
                 new String[] {fieldName.toUpperCase(), String.valueOf(entriesChanged)}));
+	panel.frame().setProgressBarVisible(false);
         if (entriesChanged > 0) {
             panel.markBaseChanged();
         }
diff --git a/src/java/net/sf/jabref/external/ExternalFilePanel.java b/src/java/net/sf/jabref/external/ExternalFilePanel.java
index 1c30a49..5e05c17 100644
--- a/src/java/net/sf/jabref/external/ExternalFilePanel.java
+++ b/src/java/net/sf/jabref/external/ExternalFilePanel.java
@@ -41,8 +41,8 @@ import net.sf.jabref.util.XMPUtil;
  * 
  * Current Version:
  * 
- * @author $Author: coezbek $
- * @version $Revision: 1.19 $ ($Date: 2006/09/01 20:59:39 $)
+ * @author $Author: mortenalver $
+ * @version $Revision: 1.23 $ ($Date: 2007/01/04 19:48:37 $)
  * 
  */
 public class ExternalFilePanel extends JPanel {
@@ -51,7 +51,9 @@ public class ExternalFilePanel extends JPanel {
 
 	private EntryEditor entryEditor;
 
-	private JabRefFrame frame;
+    private FieldEditor fieldEditor;
+
+    private JabRefFrame frame;
 
 	private OpenFileFilter off;
 
@@ -60,10 +62,12 @@ public class ExternalFilePanel extends JPanel {
 	private MetaData metaData;
 
 	public ExternalFilePanel(final String fieldName, final MetaData metaData,
-		final BibtexEntry entry, final OpenFileFilter off) {
+		final BibtexEntry entry, final FieldEditor editor, final OpenFileFilter off) {
 		this(null, metaData, null, fieldName, off, null);
 		this.entry = entry;
-	}
+        this.entryEditor = null;
+        this.fieldEditor = editor;
+    }
 
 	public ExternalFilePanel(final JabRefFrame frame, final MetaData metaData,
 		final EntryEditor entryEditor, final String fieldName, final OpenFileFilter off,
@@ -73,8 +77,9 @@ public class ExternalFilePanel extends JPanel {
 		this.metaData = metaData;
 		this.off = off;
 		this.entryEditor = entryEditor;
+        this.fieldEditor = null;
 
-		setLayout(new GridLayout(2, 2));
+        setLayout(new GridLayout(2, 2));
 
 		browseBut = new JButton(Globals.lang("Browse"));
 		download = new JButton(Globals.lang("Download"));
@@ -139,39 +144,56 @@ public class ExternalFilePanel extends JPanel {
 			frame.output(s);
 	}
 
-	public void pushXMP(String fieldName, FieldEditor editor) {
+	public void pushXMP(final String fieldName, final FieldEditor editor) {
 
-		// Find the default directory for this field type, if any:
-		String dir = metaData.getFileDirectory(fieldName);
-		File file = null;
-		if (dir != null) {
-			File tmp = Util.expandFilename(editor.getText(), new String[] { dir, "." });
-			if (tmp != null)
-				file = tmp;
-		}
 
-		if (file == null) {
-			file = new File(editor.getText());
-		}
+		(new Thread() {
+			public void run() {
 
-		if (file == null) {
-			output(Globals.lang("No file associated"));
-		}
+				output(Globals.lang("Looking for pdf..."));
+				
+				// Find the default directory for this field type, if any:
+				String dir = metaData.getFileDirectory(fieldName);
+				File file = null;
+				if (dir != null) {
+					File tmp = Util.expandFilename(editor.getText(), new String[] { dir, "." });
+					if (tmp != null)
+						file = tmp;
+				}
 
-		try {
-			XMPUtil.writeXMP(file, getEntry());
-			output(Globals.lang("Wrote BibtexEntry as XMP to " + file.getName()));
-		} catch (IOException e) {
-			JOptionPane.showMessageDialog(editor.getParent(), Globals
-				.lang("Error writing XMP to file: " + e.getLocalizedMessage()), Globals
-				.lang("Writing XMP"), JOptionPane.ERROR_MESSAGE);
-			Globals.logger("Error while writing XMP " + file.getAbsolutePath());
-		} catch (TransformerException e) {
-			JOptionPane.showMessageDialog(editor.getParent(), Globals
-				.lang("Error converting Bibtex to XMP: " + e.getLocalizedMessage()), Globals
-				.lang("Writing XMP"), JOptionPane.ERROR_MESSAGE);
-			Globals.logger("Error while converting BibtexEntry to XMP " + file.getAbsolutePath());
-		}
+				if (file == null) {
+					file = new File(editor.getText());
+				}
+
+				if (file == null) {
+					output(Globals.lang("No file associated"));
+					return;
+				}
+				
+				final File finalFile = file;
+
+				output(Globals.lang("Writing XMP to '%0'...", finalFile.getName()));
+				try {
+					XMPUtil.writeXMP(finalFile, getEntry());
+					output(Globals.lang("Wrote XMP to '%0'.", finalFile.getName()));
+				} catch (IOException e) {
+					JOptionPane.showMessageDialog(editor.getParent(), Globals.lang(
+						"Error writing XMP to file: %0", e.getLocalizedMessage()), Globals
+						.lang("Writing XMP"), JOptionPane.ERROR_MESSAGE);
+					Globals.logger(Globals.lang("Error while writing XMP %0", finalFile
+						.getAbsolutePath()));
+					output(Globals.lang("Error writing XMP to '%0'...", finalFile.getName()));
+					
+				} catch (TransformerException e) {
+					JOptionPane.showMessageDialog(editor.getParent(), Globals.lang(
+						"Error converting Bibtex to XMP: %0", e.getLocalizedMessage()), Globals
+						.lang("Writing XMP"), JOptionPane.ERROR_MESSAGE);
+					Globals.logger(Globals.lang("Error while converting BibtexEntry to XMP %0",
+						finalFile.getAbsolutePath()));
+					output(Globals.lang("Error converting XMP to '%0'...", finalFile.getName()));
+				}
+			}
+		}).start();
 	}
 
 	public void browseFile(final String fieldName, final FieldEditor editor) {
@@ -234,7 +256,7 @@ public class ExternalFilePanel extends JPanel {
 		if (entryEditor != null)
 			targetEntry = entryEditor.getEntry();
 		else
-			targetEntry = null;
+			targetEntry = entry;
 
 		(new Thread() {
 
@@ -321,14 +343,18 @@ public class ExternalFilePanel extends JPanel {
 					 * Check if we should update the editor text field, or
 					 * update the target entry directly:
 					 */
-					if (entryEditor == null || entryEditor.getEntry() != targetEntry) {
+                    if (entryEditor == null || entryEditor.getEntry() != targetEntry) {
 						/*
 						 * Editor has probably changed to show a different
 						 * entry. So we must update the target entry directly
 						 * and not set the text of the editor.
 						 */
 						targetEntry.setField(fieldName, textToSet);
-						updateEditor = false;
+                        if (fieldEditor != null) {
+                            fieldEditor.setText(textToSet);
+                            fieldEditor.setEnabled(true);
+                        }
+                        updateEditor = false;
 					} else {
 						/*
 						 * Need to set the fieldEditor first before running
@@ -360,7 +386,7 @@ public class ExternalFilePanel extends JPanel {
 						fieldEditor.setText(originalText);
 						fieldEditor.setEnabled(true);
 					}
-				}
+                }
 			}
 		}).start();
 	}
@@ -411,7 +437,8 @@ public class ExternalFilePanel extends JPanel {
 
 				String found = Util.findPdf(getEntry(), fieldName, (String[]) list
 					.toArray(new String[list.size()]));// , off);
-
+                                        
+                                
 				// To activate findFile:
 				// String found = Util.findFile(getEntry(), null, dir,
 				// ".*[bibtexkey].*");
diff --git a/src/java/net/sf/jabref/external/PushToEmacs.java b/src/java/net/sf/jabref/external/PushToEmacs.java
index c88183e..9f110b8 100644
--- a/src/java/net/sf/jabref/external/PushToEmacs.java
+++ b/src/java/net/sf/jabref/external/PushToEmacs.java
@@ -43,14 +43,24 @@ public class PushToEmacs implements PushToApplication {
 
         couldNotConnect=false;
         couldNotRunClient=false;
-        StringBuffer command = new StringBuffer("(insert\"\\\\")
-                .append(Globals.prefs.get("citeCommand")).append("{");
-
         try {
-            command.append(keys);
-            command.append("}\")");
-            String[] com = new String[]{"gnuclient", "-batch", "-eval",
-                command.toString()};
+            String[] com = Globals.ON_WIN ?
+                // Windows gnuclient escaping:
+                // java string: "(insert \\\"\\\\cite{Blah2001}\\\")";
+                // so cmd receives: (insert \"\\cite{Blah2001}\")
+                // so emacs receives: (insert "\cite{Blah2001}")
+                new String[] {"gnuclient", "-qe",
+                "(insert \\\"\\\\" + Globals.prefs.get("citeCommand") +
+                        "{" + keys + "}\\\")"}
+            :
+                // Linux gnuclient escaping:
+                // java string: "(insert \"\\\\cite{Blah2001}\")"
+                // so sh receives: (insert "\\cite{Blah2001}")
+                // so emacs receives: (insert "\cite{Blah2001}")
+                new String[] {"gnuclient", "-batch", "-eval",
+                "(insert \"\\\\" + Globals.prefs.get("citeCommand") +
+                       "{" + keys + "}\")"};
+
             final Process p = Runtime.getRuntime().exec(com);
 
             Runnable errorListener = new Runnable() {
@@ -66,6 +76,7 @@ public class PushToEmacs implements PushToApplication {
                     }
                     // Error stream has been closed. See if there were any errors:
                     if (sb.toString().trim().length() > 0) {
+			System.out.println(sb.toString());
                         couldNotConnect = true;
                         return;
                     }
diff --git a/src/java/net/sf/jabref/groups/AbstractGroup.java b/src/java/net/sf/jabref/groups/AbstractGroup.java
index a16f135..61e838f 100644
--- a/src/java/net/sf/jabref/groups/AbstractGroup.java
+++ b/src/java/net/sf/jabref/groups/AbstractGroup.java
@@ -210,4 +210,16 @@ public abstract class AbstractGroup {
 	// using fromString(String).
 
 	// by general AbstractGroup contract, equals() must be implemented
+        
+        /**
+         * Update the group, if necessary, to handle the situation where the group
+         * is applied to a different BibtexDatabase than it was created for. This
+         * is for instance used when updating the group tree due to an external change.
+         *
+         * @param db The database to refresh for.
+         */
+        public void refreshForNewDatabase(BibtexDatabase db) {
+            // Default is to do nothing. Group types that are affected by a change
+            // of database must override this method.
+        }
 }
diff --git a/src/java/net/sf/jabref/groups/ExplicitGroup.java b/src/java/net/sf/jabref/groups/ExplicitGroup.java
index 8ab2a9c..2e7fc38 100644
--- a/src/java/net/sf/jabref/groups/ExplicitGroup.java
+++ b/src/java/net/sf/jabref/groups/ExplicitGroup.java
@@ -237,4 +237,29 @@ public class ExplicitGroup extends AbstractGroup implements SearchRule {
         }
         return sb.toString();
     }
+    
+    /**
+     * Update the group to handle the situation where the group
+     * is applied to a different BibtexDatabase than it was created for.
+     * This group type contains a Set of BibtexEntry objects, and these will not
+     * be the same objects as in the new database. We must reset the entire Set with
+     * matching entries from the new database.
+     *
+     * @param db The database to refresh for.
+     */
+        public void refreshForNewDatabase(BibtexDatabase db) {
+            Set newSet = new HashSet();
+            for (Iterator i=m_entries.iterator(); i.hasNext();) {
+                BibtexEntry entry = (BibtexEntry)i.next();
+                BibtexEntry sameEntry = db.getEntryByKey(entry.getCiteKey());
+                /*if (sameEntry == null) {
+                    System.out.println("Error: could not find entry '"+entry.getCiteKey()+"'");
+                } else {
+                    System.out.println("'"+entry.getCiteKey()+"' ok");
+                }*/
+                newSet.add(sameEntry);
+            }
+            m_entries.clear();
+            m_entries.addAll(newSet);
+        }
 }
diff --git a/src/java/net/sf/jabref/groups/GroupTreeNode.java b/src/java/net/sf/jabref/groups/GroupTreeNode.java
index 2d1e5e2..b9fc263 100644
--- a/src/java/net/sf/jabref/groups/GroupTreeNode.java
+++ b/src/java/net/sf/jabref/groups/GroupTreeNode.java
@@ -104,7 +104,22 @@ public class GroupTreeNode extends DefaultMutableTreeNode implements
 			copy.add(((GroupTreeNode) getChildAt(i)).deepCopy());
 		return copy;
 	}
-
+        
+        /**
+         * Update all groups, if necessary, to handle the situation where the group
+         * tree is applied to a different BibtexDatabase than it was created for. This
+         * is for instance used when updating the group tree due to an external change.
+         *
+         * @param db The database to refresh for.
+         */
+        public void refreshGroupsForNewDatabase(BibtexDatabase db) {
+            for (int i = 0; i < getChildCount(); ++i) {
+                GroupTreeNode node = (GroupTreeNode)getChildAt(i);
+                node.getGroup().refreshForNewDatabase(db);
+                node.refreshGroupsForNewDatabase(db);
+            }
+        }
+      
 	/**
 	 * @return An indexed path from the root node to this node. The elements in
 	 *         the returned array represent the child index of each node in the
diff --git a/src/java/net/sf/jabref/groups/GroupsPrefsTab.java b/src/java/net/sf/jabref/groups/GroupsPrefsTab.java
index ca6f518..8b00528 100644
--- a/src/java/net/sf/jabref/groups/GroupsPrefsTab.java
+++ b/src/java/net/sf/jabref/groups/GroupsPrefsTab.java
@@ -118,4 +118,8 @@ public class GroupsPrefsTab extends JPanel implements PrefsTab {
 		return true;
 	}
 
+	public String getTabName() {
+		return Globals.lang("Groups");
+	}
+
 }
diff --git a/src/java/net/sf/jabref/gui/AttachFileDialog.java b/src/java/net/sf/jabref/gui/AttachFileDialog.java
index 21f105e..d059390 100644
--- a/src/java/net/sf/jabref/gui/AttachFileDialog.java
+++ b/src/java/net/sf/jabref/gui/AttachFileDialog.java
@@ -65,7 +65,7 @@ public class AttachFileDialog extends JDialog {
     private void initGui() {
 
         final ExternalFilePanel extPan = new ExternalFilePanel(fieldName, metaData, entry,
-                      Util.getFileFilterForField(fieldName));
+                      editor, Util.getFileFilterForField(fieldName));
 
         browse.addActionListener(new ActionListener () {
             public void actionPerformed(ActionEvent event) {
diff --git a/src/java/net/sf/jabref/gui/ImportInspectionDialog.java b/src/java/net/sf/jabref/gui/ImportInspectionDialog.java
index e475789..64058a5 100644
--- a/src/java/net/sf/jabref/gui/ImportInspectionDialog.java
+++ b/src/java/net/sf/jabref/gui/ImportInspectionDialog.java
@@ -31,21 +31,22 @@ import ca.odell.glazedlists.swing.TableComparatorChooser;
 import ca.odell.glazedlists.swing.EventTableModel;
 import ca.odell.glazedlists.swing.EventSelectionModel;
 
+
 /**
- * Created by IntelliJ IDEA.
- * User: alver
- * Date: 20.mar.2005
- * Time: 22:02:35
- * To change this template use File | Settings | File Templates.
+ * Dialog to allow the selection of entries as part of an Import
+ * 
+ * @author alver
+ * @author $Author: coezbek $
+ * @version $Revision: 1.27 $ ($Date: 2006/12/04 14:37:01 $)
+ *
  */
 public class ImportInspectionDialog extends JDialog {
+	
     private ImportInspectionDialog ths = this;
     private BasePanel panel;
     private JabRefFrame frame;
     private MetaData metaData;
     private UIFSplitPane contentPane = new UIFSplitPane(UIFSplitPane.VERTICAL_SPLIT);
-    //private MyTableModel tableModel = new MyTableModel();
-    //private JTable table = new MyTable(tableModel);
     private JTable glTable;
     private TableComparatorChooser comparatorChooser;
     private EventSelectionModel selectionModel;
@@ -64,11 +65,11 @@ public class ImportInspectionDialog extends JDialog {
     private JPopupMenu popup = new JPopupMenu();
     private JButton selectAll = new JButton(Globals.lang("Select all"));
     private JButton deselectAll = new JButton(Globals.lang("Deselect all"));
+    private JButton deselectAllDuplicates = new JButton(Globals.lang("Deselect all duplicates"));
     private JButton stop = new JButton(Globals.lang("Stop"));
     private JButton delete = new JButton(Globals.lang("Delete"));
     private JButton help = new JButton(Globals.lang("Help"));
     private PreviewPanel preview;
-    private ListSelectionListener previewListener = null;
     private boolean generatedKeys = false; // Set to true after keys have been generated.
     private boolean defaultSelected = true;
     private Rectangle toRect = new Rectangle(0, 0, 1, 1);
@@ -87,7 +88,6 @@ public class ImportInspectionDialog extends JDialog {
         URL_COL = 4,
         PAD = 5;
 
-
     /**
      * The "defaultSelected" boolean value determines if new entries added are selected for import or not.
      * This value is true by default.
@@ -137,7 +137,6 @@ public class ImportInspectionDialog extends JDialog {
         setupComparatorChooser();
         glTable.addMouseListener(new TableClickListener());
 
-
         setWidths();
 
         getContentPane().setLayout(new BorderLayout());
@@ -145,7 +144,6 @@ public class ImportInspectionDialog extends JDialog {
         JPanel centerPan = new JPanel();
         centerPan.setLayout(new BorderLayout());
 
-        //contentPane.setTopComponent(new JScrollPane(table));
         contentPane.setTopComponent(new JScrollPane(glTable));
         contentPane.setBottomComponent(new JScrollPane(preview));
 
@@ -181,6 +179,7 @@ public class ImportInspectionDialog extends JDialog {
         ButtonStackBuilder builder = new ButtonStackBuilder();
         builder.addGridded(selectAll);
         builder.addGridded(deselectAll);
+        builder.addGridded(deselectAllDuplicates);
         builder.addRelatedGap();
         builder.addGridded(delete);
         builder.addRelatedGap();
@@ -197,6 +196,8 @@ public class ImportInspectionDialog extends JDialog {
         stop.addActionListener(new StopListener());
         selectAll.addActionListener(new SelectionButton(true));
         deselectAll.addActionListener(new SelectionButton(false));
+        deselectAllDuplicates.addActionListener(new DeselectDuplicatesButtonListener());
+        deselectAllDuplicates.setEnabled(false);
         delete.addActionListener(deleteListener);
         help.addActionListener(new HelpAction(frame.helpDiag, GUIGlobals.importInspectionHelp));
         getContentPane().add(bb.getPanel(), BorderLayout.SOUTH);
@@ -241,6 +242,7 @@ public class ImportInspectionDialog extends JDialog {
             if (((panel != null) && (Util.containsDuplicate(panel.database(), entry) != null))
                 || (internalDuplicate(this.entries, entry) != null)) {
                 entry.setGroupHit(true);
+                deselectAllDuplicates.setEnabled(true);
             }
             this.entries.getReadWriteLock().writeLock().lock();
             this.entries.add(entry);
@@ -602,7 +604,6 @@ public class ImportInspectionDialog extends JDialog {
     }
 
     private void setWidths() {
-        DeleteListener deleteListener = new DeleteListener();
         TableColumnModel cm = glTable.getColumnModel();
         cm.getColumn(0).setPreferredWidth(55);
         cm.getColumn(0).setMinWidth(55);
@@ -694,7 +695,18 @@ public class ImportInspectionDialog extends JDialog {
             glTable.repaint();
         }
     }
-
+    
+    class DeselectDuplicatesButtonListener implements ActionListener {
+        public void actionPerformed(ActionEvent event) {
+            for (int i = 0; i < glTable.getRowCount(); i++) {
+                if(glTable.getValueAt(i, DUPL_COL) != null){
+                	glTable.setValueAt(Boolean.valueOf(false), i, 0);
+                }
+            }
+            glTable.repaint();
+        }
+    }
+    
     class EntrySelectionListener implements ListEventListener {
 
         public void listChanged(ListEvent listEvent) {
@@ -732,7 +744,6 @@ public class ImportInspectionDialog extends JDialog {
         public void mouseReleased(MouseEvent e) {
             // Check if the user has right-clicked. If so, open the right-click menu.
             if (e.isPopupTrigger()) {
-                int[] rows = glTable.getSelectedRows();
                 popup.show(glTable, e.getX(), e.getY());
                 return;
             }
@@ -741,7 +752,6 @@ public class ImportInspectionDialog extends JDialog {
         public void mousePressed(MouseEvent e) {
             // Check if the user has right-clicked. If so, open the right-click menu.
             if (e.isPopupTrigger()) {
-                int[] rows = glTable.getSelectedRows();
                 popup.show(glTable, e.getX(), e.getY());
                 return;
             }
diff --git a/src/java/net/sf/jabref/gui/MainTableFormat.java b/src/java/net/sf/jabref/gui/MainTableFormat.java
index 4efa940..a6e404e 100644
--- a/src/java/net/sf/jabref/gui/MainTableFormat.java
+++ b/src/java/net/sf/jabref/gui/MainTableFormat.java
@@ -1,20 +1,19 @@
 package net.sf.jabref.gui;
 
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import net.sf.jabref.AuthorList;
+import net.sf.jabref.BasePanel;
+import net.sf.jabref.BibtexEntry;
+import net.sf.jabref.BibtexFields;
+import net.sf.jabref.GUIGlobals;
+import net.sf.jabref.Globals;
+import net.sf.jabref.SearchRuleSet;
+import net.sf.jabref.Util;
 import ca.odell.glazedlists.gui.TableFormat;
-import ca.odell.glazedlists.SortedList;
-import ca.odell.glazedlists.FilterList;
 import ca.odell.glazedlists.matchers.Matcher;
-import ca.odell.glazedlists.swing.EventTableModel;
-import ca.odell.glazedlists.swing.EventSelectionModel;
-import ca.odell.glazedlists.swing.TableComparatorChooser;
-import net.sf.jabref.*;
-import net.sf.jabref.imports.ImportFormatReader;
-
-import javax.swing.*;
-import java.util.*;
-import java.awt.*;
-import java.awt.event.ActionListener;
-import java.awt.event.ActionEvent;
 
 /**
  * Created by IntelliJ IDEA.
diff --git a/src/java/net/sf/jabref/gui/MainTableSelectionListener.java b/src/java/net/sf/jabref/gui/MainTableSelectionListener.java
index f19f8d1..656d056 100644
--- a/src/java/net/sf/jabref/gui/MainTableSelectionListener.java
+++ b/src/java/net/sf/jabref/gui/MainTableSelectionListener.java
@@ -35,8 +35,11 @@ public class MainTableSelectionListener implements ListEventListener, MouseListe
     // Register the last character pressed to quick jump in the table. Together
     // with storing the last row number jumped to, this is used to let multiple
     // key strokes cycle between all entries starting with the same letter:
-    private int lastPressed = '\n';
+    private int[] lastPressed = new int[20];
+    private int lastPressedCount = 0;
     private int lastQuickJumpRow = -1;
+    private long lastPressedTime = 0;
+    private long QUICK_JUMP_TIMEOUT = 2000;
 
     //private int lastCharPressed = -1;
 
@@ -363,7 +366,16 @@ public class MainTableSelectionListener implements ListEventListener, MouseListe
         if ((!e.isActionKey()) && Character.isLetterOrDigit(e.getKeyChar())
 	    //&& !e.isControlDown() && !e.isAltDown() && !e.isMetaDown()) {
 	    && (e.getModifiers() == 0)) {
+            long time = System.currentTimeMillis();
+            if (time - lastPressedTime > QUICK_JUMP_TIMEOUT)
+                lastPressedCount = 0; // Reset last pressed character
+            // Update timestamp:
+            lastPressedTime = time;
+            // Add the new char to the search array:
             int c = e.getKeyChar();
+            if (lastPressedCount < lastPressed.length)
+                lastPressed[lastPressedCount++] = c;
+
             int sortingColumn = table.getSortingColumn(0);
             if (sortingColumn == -1)
                 return; // No sorting? TODO: look up by author, etc.?
@@ -371,12 +383,11 @@ public class MainTableSelectionListener implements ListEventListener, MouseListe
             // such as binary search. But the table may not be sorted properly,
             // due to marked entries, search etc., which rules out the binary search.
             int startRow = 0;
-            if ((c == lastPressed) && (lastQuickJumpRow >= 0)) {
+            /*if ((c == lastPressed) && (lastQuickJumpRow >= 0)) {
                 if (lastQuickJumpRow < table.getRowCount()-1)
                     startRow = lastQuickJumpRow+1;
-            }
+            }*/
 
-            lastPressed = c;
             boolean done = false;
             while (!done) {
                 for (int i=startRow; i<table.getRowCount(); i++) {
@@ -384,12 +395,20 @@ public class MainTableSelectionListener implements ListEventListener, MouseListe
                     if (o == null)
                         continue;
                     String s = o.toString().toLowerCase();
-                    if ((s.length() >= 1) && (s.charAt(0) == c)) {
-                        table.setRowSelectionInterval(i, i);
-                        table.ensureVisible(i);
-                        lastQuickJumpRow = i;
-                        return;
-                    }
+                    if (s.length() >= lastPressedCount)
+                        for (int j=0; j<lastPressedCount; j++) {
+                            if (s.charAt(j) != lastPressed[j])
+                                break; // Escape the loop immediately when we find a mismatch
+                            else if (j == lastPressedCount-1) {
+                                // We found a match:
+                                table.setRowSelectionInterval(i, i);
+                                table.ensureVisible(i);
+                                lastQuickJumpRow = i;
+                                return;
+                            }
+                        }
+                    //if ((s.length() >= 1) && (s.charAt(0) == c)) {
+                    //}
                 }
                 // Finished, no result. If we didn't start at the beginning of
                 // the table, try that. Otherwise, exit the while loop.
@@ -400,6 +419,9 @@ public class MainTableSelectionListener implements ListEventListener, MouseListe
 
             }
             
+        } else if (e.getKeyChar() == KeyEvent.VK_ESCAPE) {
+            lastPressedCount = 0;
+
         }
     }
 
@@ -414,6 +436,6 @@ public class MainTableSelectionListener implements ListEventListener, MouseListe
     }
 
     public void focusLost(FocusEvent e) {
-        lastPressed = -1; // Reset quick jump when focus is lost.
+        lastPressedCount = 0; // Reset quick jump when focus is lost.
     }
 }
diff --git a/src/java/net/sf/jabref/imports/BibtexParser.java b/src/java/net/sf/jabref/imports/BibtexParser.java
index fe297e6..20dd13b 100644
--- a/src/java/net/sf/jabref/imports/BibtexParser.java
+++ b/src/java/net/sf/jabref/imports/BibtexParser.java
@@ -1,5 +1,5 @@
 /*
- Copyright (C) 2003-06 David Weitzman, Nizar N. Batada, Morten O. Alver
+ Copyright (C) 2003-06 David Weitzman, Nizar N. Batada, Morten O. Alver, Christopher Oezbek
 
  All programs in this directory and
  subdirectories are published under the GNU General Public License as
@@ -31,6 +31,8 @@ import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.PushbackReader;
 import java.io.Reader;
+import java.io.StringReader;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.regex.Pattern;
@@ -69,6 +71,7 @@ import net.sf.jabref.Util;
  * @author Christopher Oezbek 
  */
 public class BibtexParser {
+	
 	private PushbackReader _in;
 
 	private BibtexDatabase _db;
@@ -105,15 +108,49 @@ public class BibtexParser {
 		BibtexParser parser = new BibtexParser(in);
 		return parser.parse();
 	}
-
+	
+	
+	/**
+	 * Parses BibtexEntries from the given string and returns the collection of all entries found.
+	 * 
+	 * @param bibtexString
+	 * 
+	 * @return Returns null if an error occurred, returns an empty collection if no entries where found. 
+	 */
+	public static Collection fromString(String bibtexString){
+		StringReader reader = new StringReader(bibtexString);
+		BibtexParser parser = new BibtexParser(reader); 
+		try {
+			return parser.parse().getDatabase().getEntries();
+		} catch (Exception e){
+			return null;
+		}
+	}
+	
+	/**
+	 * Parses BibtexEntries from the given string and returns one entry found (or null if none found)
+	 * 
+	 * It is undetermined which entry is returned, so use this in case you know there is only one entry in the string.
+	 * 
+	 * @param bibtexString
+	 * 
+	 * @return The bibtexentry or null if non was found or an error occurred.
+	 */
+	public static BibtexEntry singleFromString(String bibtexString) {
+		Collection c = fromString(bibtexString);
+		if (c == null){
+			return null;
+		}
+		return (BibtexEntry)c.iterator().next();
+	}	
+	
 	/**
 	 * Check whether the source is in the correct format for this importer.
 	 */
 	public static boolean isRecognizedFormat(Reader inOrig) throws IOException {
-		// Our strategy is to look for the "PY <year>" line.
+		// Our strategy is to look for the "@<type>    {" line.
 		BufferedReader in = new BufferedReader(inOrig);
 
-		// Pattern pat1 = Pattern.compile("PY: \\d{4}");
 		Pattern pat1 = Pattern.compile("@[a-zA-Z]*\\s*\\{");
 
 		String str;
@@ -486,7 +523,7 @@ public class BibtexParser {
 	private String parseFieldContent() throws IOException {
 		skipWhitespace();
 		StringBuffer value = new StringBuffer();
-		int c, j = '.';
+		int c = '.';
 
 		while (((c = peek()) != ',') && (c != '}') && (c != ')')) {
 
diff --git a/src/java/net/sf/jabref/imports/CiteSeerFetcherPanel.java b/src/java/net/sf/jabref/imports/CiteSeerFetcherPanel.java
index 9f09ed6..0560ca8 100644
--- a/src/java/net/sf/jabref/imports/CiteSeerFetcherPanel.java
+++ b/src/java/net/sf/jabref/imports/CiteSeerFetcherPanel.java
@@ -1,9 +1,6 @@
 package net.sf.jabref.imports;
 
-import java.awt.BorderLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
+import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.Arrays;
@@ -62,7 +59,7 @@ public class CiteSeerFetcherPanel extends SidePaneComponent implements ActionLis
         this.citeSeerFetcher = fetcher;
         helpBut.addActionListener(help);
         helpBut.setMargin(new Insets(0, 0, 0, 0));
-        //tf.setMinimumSize(new Dimension(1,1));
+        tf.setPreferredSize(new Dimension(1,tf.getPreferredSize().height));
         //add(hd, BorderLayout.NORTH);
         //ok.setToolTipText(Globals.lang("Fetch Medline"));
         JPanel main = new JPanel();
diff --git a/src/java/net/sf/jabref/imports/FieldContentParser.java b/src/java/net/sf/jabref/imports/FieldContentParser.java
index db582a2..fd2afa9 100644
--- a/src/java/net/sf/jabref/imports/FieldContentParser.java
+++ b/src/java/net/sf/jabref/imports/FieldContentParser.java
@@ -163,7 +163,7 @@ public class FieldContentParser {
 
             res.deleteCharAt(q);
             res.insert(q, Globals.NEWLINE+"\t");
-            p = q+1;
+            p = q+Globals.NEWLINE_LENGTH;
 
         }
     }
diff --git a/src/java/net/sf/jabref/imports/GeneralFetcher.java b/src/java/net/sf/jabref/imports/GeneralFetcher.java
index f1c0e7b..e39ef09 100644
--- a/src/java/net/sf/jabref/imports/GeneralFetcher.java
+++ b/src/java/net/sf/jabref/imports/GeneralFetcher.java
@@ -46,6 +46,7 @@ public class GeneralFetcher extends SidePaneComponent implements ActionListener
         help = new HelpAction(Globals.helpDiag, fetcher.getHelpPage(), "Help");
         helpBut.addActionListener(help);
         helpBut.setMargin(new Insets(0, 0, 0, 0));
+        tf.setPreferredSize(new Dimension(1,tf.getPreferredSize().height));
 
         JPanel main = new JPanel();
         main.setLayout(gbl);
diff --git a/src/java/net/sf/jabref/imports/ImportFormats.java b/src/java/net/sf/jabref/imports/ImportFormats.java
index 3006c36..62b6ed3 100644
--- a/src/java/net/sf/jabref/imports/ImportFormats.java
+++ b/src/java/net/sf/jabref/imports/ImportFormats.java
@@ -97,7 +97,6 @@ public class ImportFormats {
                                 Globals.lang("Import"), JOptionPane.ERROR_MESSAGE);
                         return;
                     }
-
                     ImportMenuItem imi = new ImportMenuItem(frame,
                             openInNew, format);
                     imi.automatedImport(new String[] {file.getAbsolutePath()});
diff --git a/src/java/net/sf/jabref/imports/ImportMenuItem.java b/src/java/net/sf/jabref/imports/ImportMenuItem.java
index 9df3097..7dcf879 100644
--- a/src/java/net/sf/jabref/imports/ImportMenuItem.java
+++ b/src/java/net/sf/jabref/imports/ImportMenuItem.java
@@ -1,6 +1,7 @@
 package net.sf.jabref.imports;
 
 import net.sf.jabref.*;
+import net.sf.jabref.labelPattern.LabelPatternUtil;
 import net.sf.jabref.undo.NamedCompound;
 import net.sf.jabref.undo.UndoableInsertEntry;
 import net.sf.jabref.undo.UndoableRemoveEntry;
@@ -135,6 +136,7 @@ public class ImportMenuItem extends JMenuItem implements ActionListener {
                         diag.setVisible(true);
                         diag.toFront();
                     } else {
+                        boolean generateKeys = Globals.prefs.getBoolean("generateKeysAfterInspection");
                         NamedCompound ce = new NamedCompound(Globals.lang("Import entries"));
                         for (Iterator i = bibtexResult.getDatabase().getEntries().iterator();
                              i.hasNext();) {
@@ -158,6 +160,12 @@ public class ImportMenuItem extends JMenuItem implements ActionListener {
                                 // Add the entry, if we are supposed to:
                                 if (keepEntry) {
                                     toAddTo.insertEntry(entry);
+                                    // Generate key, if we are supposed to:
+                                    if (generateKeys) {
+                                        LabelPatternUtil.makeLabel(Globals.prefs.getKeyPattern(), toAddTo, entry);
+                                        //System.out.println("gen:"+entry.getCiteKey());
+                                    }
+                                    
                                     ce.addEdit(new UndoableInsertEntry(toAddTo, entry, panel));
                                 }
                             } catch (KeyCollisionException e) {
diff --git a/src/java/net/sf/jabref/imports/MedlineFetcher.java b/src/java/net/sf/jabref/imports/MedlineFetcher.java
index f74e480..18a489b 100644
--- a/src/java/net/sf/jabref/imports/MedlineFetcher.java
+++ b/src/java/net/sf/jabref/imports/MedlineFetcher.java
@@ -79,7 +79,7 @@ public class MedlineFetcher extends SidePaneComponent implements Runnable,
         help = new HelpAction(Globals.helpDiag, GUIGlobals.medlineHelp, "Help");
         helpBut.addActionListener(help);
         helpBut.setMargin(new Insets(0,0,0,0));
-        //tf.setMinimumSize(new Dimension(1,1));
+        tf.setPreferredSize(new Dimension(1,tf.getPreferredSize().height));
         //add(hd, BorderLayout.NORTH);
         //ok.setToolTipText(Globals.lang("Fetch Medline"));
         JPanel main = new JPanel();
diff --git a/src/java/net/sf/jabref/imports/OAI2Fetcher.java b/src/java/net/sf/jabref/imports/OAI2Fetcher.java
index e01f129..8fd973f 100644
--- a/src/java/net/sf/jabref/imports/OAI2Fetcher.java
+++ b/src/java/net/sf/jabref/imports/OAI2Fetcher.java
@@ -1,12 +1,13 @@
 package net.sf.jabref.imports;
 
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Reader;
 import java.io.UnsupportedEncodingException;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLEncoder;
-import java.util.Calendar;
 import java.util.Date;
 
 import javax.swing.JOptionPane;
@@ -15,12 +16,17 @@ import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
 import javax.xml.parsers.SAXParserFactory;
 
+import net.sf.jabref.BibtexEntry;
+import net.sf.jabref.BibtexEntryType;
+import net.sf.jabref.GUIGlobals;
+import net.sf.jabref.Globals;
+import net.sf.jabref.JabRefFrame;
+import net.sf.jabref.Util;
+import net.sf.jabref.gui.ImportInspectionDialog;
+
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 
-import net.sf.jabref.*;
-import net.sf.jabref.gui.ImportInspectionDialog;
-
 /**
  * 
  * This class can be used to access any archive offering an OAI2 interface. By
@@ -29,8 +35,8 @@ import net.sf.jabref.gui.ImportInspectionDialog;
  * @author Ulrich Stärk
  * @author Christian Kopf
  * 
- * @version $Revision: 1.1 $ ($Date: 2006/11/24 15:29:11 $)
- *
+ * @version $Revision: 1.2 $ ($Date: 2007/01/08 15:26:55 $)
+ * 
  */
 public class OAI2Fetcher implements EntryFetcher, Runnable {
 
@@ -69,11 +75,11 @@ public class OAI2Fetcher implements EntryFetcher, Runnable {
 	private JabRefFrame frame;
 
 	/* some archives - like arxive.org - might expect of you to wait some time */
-	
-	private boolean shouldWait(){
+
+	private boolean shouldWait() {
 		return waitTime > 0;
 	}
-	
+
 	private long waitTime = -1;
 
 	private Date lastCall;
@@ -123,14 +129,15 @@ public class OAI2Fetcher implements EntryFetcher, Runnable {
 	/**
 	 * Construct the query URL
 	 * 
-	 * @param be
-	 *            The BibtexEntry containing the field OAI2_IDENTIFIER_FIELD
+	 * @param key
+	 *            The key of the OAI2 entry that the url should poitn to.
+	 *            
 	 * @return a String denoting the query URL
 	 */
-	public String constructUrl(BibtexEntry be) {
+	public String constructUrl(String key) {
 		String identifier = "";
 		try {
-			identifier = URLEncoder.encode((String) be.getField(OAI2_IDENTIFIER_FIELD), "UTF-8");
+			identifier = URLEncoder.encode((String) key, "UTF-8");
 		} catch (UnsupportedEncodingException e) {
 			return "";
 		}
@@ -143,33 +150,66 @@ public class OAI2Fetcher implements EntryFetcher, Runnable {
 		sb.append("&metadataPrefix=").append(oai2MetaDataPrefix);
 		return sb.toString();
 	}
+	
+	/**
+	 * Strip subccategories from ArXiv key.
+	 * 
+	 * @param key The key to fix.
+	 * @return Fixed key.
+	 */
+	public static String fixKey(String key){
+		int dot = key.indexOf('.');
+		int slash = key.indexOf('/');
+		
+		if (dot > -1 && dot < slash)
+			key = key.substring(0, dot) + key.substring(slash, key.length());
+	
+		return key;
+	}
 
 	/**
 	 * Import an entry from an OAI2 archive. The BibtexEntry provided has to
 	 * have the field OAI2_IDENTIFIER_FIELD set to the search string.
 	 * 
-	 * @param be
-	 *            The BibtexEntry to store the results in.
+	 * @param key
+	 *            The OAI2 key to fetch from ArXiv.
+	 * @return The imnported BibtexEntry or null if none.
 	 */
-	public void importOai2Entry(BibtexEntry be) {
-		String url = constructUrl(be);
+	public BibtexEntry importOai2Entry(String key) {
+		/**
+		 * Fix for problem reported in mailing-list: 
+		 *   https://sourceforge.net/forum/message.php?msg_id=4087158
+		 */
+		key = fixKey(key);
+		
+		String url = constructUrl(key);
 		try {
 			URL oai2Url = new URL(url);
 			HttpURLConnection oai2Connection = (HttpURLConnection) oai2Url.openConnection();
 			oai2Connection.setRequestProperty("User-Agent", "Jabref");
 			InputStream inputStream = oai2Connection.getInputStream();
+	
+			/* create an empty BibtexEntry and set the oai2identifier field */
+			BibtexEntry be = new BibtexEntry(Util.createNeutralId(), BibtexEntryType.ARTICLE);
+			be.setField(OAI2_IDENTIFIER_FIELD, key);
 			DefaultHandler handlerBase = new OAI2Handler(be);
 			/* parse the result */
 			saxParser.parse(inputStream, handlerBase);
+			return be;
 		} catch (IOException e) {
 			JOptionPane.showMessageDialog(frame, Globals.lang(
 				"An Exception ocurred while accessing '%0'", url)
 				+ "\n\n" + e.toString(), Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE);
 		} catch (SAXException e) {
 			JOptionPane.showMessageDialog(frame, Globals.lang(
-				"An SAXException ocurred while parsing '%0'", url), Globals.lang(getKeyName()),
-				JOptionPane.ERROR_MESSAGE);
-		}
+				"An SAXException ocurred while parsing '%0':", url)
+				+ "\n\n" + e.getMessage(), Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE);
+		} catch (RuntimeException e){
+			JOptionPane.showMessageDialog(frame, Globals.lang(
+				"An Error occurred while fetching from OAI2 source (%0):", url)
+				+ "\n\n" + e.getMessage(), Globals.lang(getKeyName()), JOptionPane.ERROR_MESSAGE);
+		} 
+		return null;
 	}
 
 	public String getHelpPage() {
@@ -242,17 +282,16 @@ public class OAI2Fetcher implements EntryFetcher, Runnable {
 				/* the cancel button has been hit */
 				if (!shouldContinue)
 					break;
-				/* create an empty BibtexEntry and set the oai2identifier field */
-				BibtexEntry be = new BibtexEntry(Util.createNeutralId(), BibtexEntryType.ARTICLE);
-				be.setField(OAI2_IDENTIFIER_FIELD, key);
-				/* query the archive and load the results into the BibtexEntry */
-				importOai2Entry(be);
 				
+				/* query the archive and load the results into the BibtexEntry */
+				BibtexEntry be = importOai2Entry(key);
+
 				if (shouldWait())
 					lastCall = new Date();
 				
 				/* add the entry to the inspection dialog */
-				dialog.addEntry(be);
+				if (be != null)
+					dialog.addEntry(be);
 
 				/* update the dialogs progress bar */
 				dialog.setProgress(i + 1, keys.length);
diff --git a/src/java/net/sf/jabref/imports/OAI2Handler.java b/src/java/net/sf/jabref/imports/OAI2Handler.java
index c259bcd..0094ee5 100644
--- a/src/java/net/sf/jabref/imports/OAI2Handler.java
+++ b/src/java/net/sf/jabref/imports/OAI2Handler.java
@@ -13,7 +13,7 @@ import org.xml.sax.helpers.DefaultHandler;
  * @author Ulrich Stärk
  * @author Christian Kopf
  * 
- * @version $Revision: 1.1 $ ($Date: 2006/11/24 15:29:11 $)
+ * @version $Revision: 1.2 $ ($Date: 2007/01/08 15:26:55 $)
  *
  */
 public class OAI2Handler extends DefaultHandler {
@@ -40,7 +40,8 @@ public class OAI2Handler extends DefaultHandler {
 
 	
 	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-		if(localName.equals("id")) {
+		
+        if(localName.equals("id")) {
 			nextField = "id";
 			assigned = true;
 		} else if(localName.equals("keyname")) {
@@ -70,7 +71,10 @@ public class OAI2Handler extends DefaultHandler {
 		} else if(localName.equals("report-no")) {
 			nextField = "reportno";
 			assigned = true;
-		}
+		} else if(localName.equals("error")) {
+		    nextField = "error";
+            assigned = true;
+        }
 	}
 
 	
@@ -87,7 +91,9 @@ public class OAI2Handler extends DefaultHandler {
 	public void characters(char[] ch, int start, int length) throws SAXException {
 		String content = new String(ch,start,length);
 		if(assigned) {
-			if(nextField.equals("id")) {
+		    if (nextField.equals("error")) {
+                throw new RuntimeException(content);
+            } else if(nextField.equals("id")) {
 				be.setField("eprint",content);
 			} else if(nextField.equals("keyname")) {
 				keyname = content;
@@ -124,8 +130,4 @@ public class OAI2Handler extends DefaultHandler {
 			assigned = false;
 		}
 	}
-	
-	
-	
-	
 }
diff --git a/src/java/net/sf/jabref/imports/SilverPlatterImporter.java b/src/java/net/sf/jabref/imports/SilverPlatterImporter.java
index 02cc51f..53faa46 100644
--- a/src/java/net/sf/jabref/imports/SilverPlatterImporter.java
+++ b/src/java/net/sf/jabref/imports/SilverPlatterImporter.java
@@ -129,12 +129,24 @@ public class SilverPlatterImporter extends ImportFormat {
                         m = frest.indexOf(", ");
                         if (m + 2 < frest.length()){
                             String yr = frest.substring(m + 2).trim();
-                            h.put("year", yr);
+                            try {
+                                Integer.parseInt(yr);
+                                h.put("year", yr);
+                            } catch (NumberFormatException ex) {
+                                // Let's assume that this wasn't a number, since it
+                                // couldn't be parsed as an integer.
+                            }
+
                         }
+
                     }
+                } else if (f3.equals("AF")) {
+                    h.put("school", frest.trim());
+
                 }else if (f3.equals("DT")){
                     frest = frest.trim();
                     if (frest.equals("Monograph")) Type = "book";
+                    else if (frest.startsWith("Dissertation")) Type = "phdthesis";
                     else if (frest.toLowerCase().indexOf("journal") >= 0) Type = "article";
                     else if (frest.equals("Contribution") || frest.equals("Chapter")){
                         Type = "incollection";
diff --git a/src/java/net/sf/jabref/labelPattern/LabelPatternUtil.java b/src/java/net/sf/jabref/labelPattern/LabelPatternUtil.java
index 10b314e..069d9a6 100644
--- a/src/java/net/sf/jabref/labelPattern/LabelPatternUtil.java
+++ b/src/java/net/sf/jabref/labelPattern/LabelPatternUtil.java
@@ -368,6 +368,7 @@ public class LabelPatternUtil {
         // No dupes found, so we can just go ahead.
         if (!_label.equals(oldKey))
             _db.setCiteKeyForEntry(_entry.getId(), _label);
+        
     }
     else {
 
@@ -407,7 +408,7 @@ public class LabelPatternUtil {
             _db.setCiteKeyForEntry(_entry.getId(), moddedKey);
         }
     }
-
+    
     return _entry;
     /** End of edit, Morten Alver 2004.02.04.  */
 
diff --git a/src/java/net/sf/jabref/util/XMPSchemaBibtex.java b/src/java/net/sf/jabref/util/XMPSchemaBibtex.java
index 75a08b4..5a85193 100644
--- a/src/java/net/sf/jabref/util/XMPSchemaBibtex.java
+++ b/src/java/net/sf/jabref/util/XMPSchemaBibtex.java
@@ -1,18 +1,22 @@
 package net.sf.jabref.util;
 
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 import javax.xml.transform.TransformerException;
 
 import net.sf.jabref.AuthorList;
 import net.sf.jabref.BibtexEntry;
 import net.sf.jabref.BibtexEntryType;
+import net.sf.jabref.JabRefPreferences;
 import net.sf.jabref.Util;
 
 import org.jempbox.xmp.XMPMetadata;
@@ -46,8 +50,8 @@ public class XMPSchemaBibtex extends XMPSchema {
 	 * @param element
 	 *            The existing XML element.
 	 */
-	public XMPSchemaBibtex(Element e) {
-		super(e);
+	public XMPSchemaBibtex(Element e, String namespace) {
+		super(e, KEY);
 	}
 
 	protected String makeProperty(String propertyName) {
@@ -123,16 +127,37 @@ public class XMPSchemaBibtex extends XMPSchema {
 		super.addSequenceDateValue(makeProperty(field), date);
 	}
 
+	public static String getContents(NodeList seqList) {
+
+		Element seqNode = (Element) seqList.item(0);
+		StringBuffer seq = null;
+
+		NodeList items = seqNode.getElementsByTagName("rdf:li");
+		for (int j = 0; j < items.getLength(); j++) {
+			Element li = (Element) items.item(j);
+			if (seq == null) {
+				seq = new StringBuffer();
+			} else {
+				seq.append(" and ");
+			}
+			seq.append(getTextContent(li));
+		}
+		if (seq != null) {
+			return seq.toString();
+		}
+		return null;
+	}
+
 	/**
-	 * Returns a map of all properties and their values. LIs in seqs are
-	 * concatenated using " and ".
+	 * Returns a map of all properties and their values. LIs and bags in seqs
+	 * are concatenated using " and ".
 	 * 
 	 * @return Map from name of textproperty (String) to value (String). For
 	 *         instance: "year" => "2005". Empty map if none found.
 	 * @throws TransformerException
 	 */
-	public Map getAllProperties() {
-		NodeList nodes = getElement().getChildNodes();
+	public static Map getAllProperties(XMPSchema schema, String namespaceName) {
+		NodeList nodes = schema.getElement().getChildNodes();
 
 		Map result = new HashMap();
 
@@ -152,41 +177,41 @@ public class XMPSchemaBibtex extends XMPSchema {
 			String nodeName = node.getNodeName();
 
 			String[] split = nodeName.split(":");
-			if (split.length == 2 && split[0].equals("bibtex")) {
 
+			if (split.length == 2 && split[0].equals(namespaceName)) {
 				NodeList seqList = ((Element) node).getElementsByTagName("rdf:Seq");
 				if (seqList.getLength() > 0) {
-					Element seqNode = (Element) seqList.item(0);
-					StringBuffer seq = null;
-
-					NodeList items = seqNode.getElementsByTagName("rdf:li");
-					for (int j = 0; j < items.getLength(); j++) {
-						Element li = (Element) items.item(j);
-						if (seq == null) {
-							seq = new StringBuffer();
-						} else {
-							seq.append(" and ");
-						}
-						seq.append(getTextContent(li));
-					}
+
+					String seq = getContents(seqList);
+
 					if (seq != null) {
-						result.put(split[1], seq.toString());
+						result.put(split[1], seq);
 					}
 				} else {
-					result.put(split[1], getTextContent(node));
+					NodeList bagList = ((Element) node).getElementsByTagName("rdf:Bag");
+					if (bagList.getLength() > 0) {
+
+						String seq = getContents(bagList);
+
+						if (seq != null) {
+							result.put(split[1], seq);
+						}
+					} else {
+						result.put(split[1], getTextContent(node));
+					}
 				}
 			}
 		}
 
 		// Then check Attributes
-		NamedNodeMap attrs = getElement().getAttributes();
+		NamedNodeMap attrs = schema.getElement().getAttributes();
 		int m = attrs.getLength();
 		for (int j = 0; j < m; j++) {
 			Node attr = attrs.item(j);
 
 			String nodeName = attr.getNodeName();
 			String[] split = nodeName.split(":");
-			if (split.length == 2 && split[0].equals("bibtex")) {
+			if (split.length == 2 && split[0].equals(namespaceName)) {
 				result.put(split[1], attr.getNodeValue());
 			}
 		}
@@ -206,7 +231,7 @@ public class XMPSchemaBibtex extends XMPSchema {
 		Iterator it = entries.iterator();
 		while (it.hasNext()) {
 			Map.Entry entry = (Map.Entry) it.next();
-			String key = (String)entry.getKey();
+			String key = (String) entry.getKey();
 			if (preserveWhiteSpace.containsKey(key))
 				continue;
 			entry.setValue(((String) entry.getValue()).replaceAll("\\s+", " ").trim());
@@ -214,7 +239,7 @@ public class XMPSchemaBibtex extends XMPSchema {
 
 		return result;
 	}
-	
+
 	public static HashMap preserveWhiteSpace = new HashMap();
 	static {
 		preserveWhiteSpace.put("abstract", null);
@@ -225,13 +250,30 @@ public class XMPSchemaBibtex extends XMPSchema {
 	public void setBibtexEntry(BibtexEntry entry) {
 		// Set all the values including key and entryType
 		Object[] fields = entry.getAllFields();
+		Object[] results;
+		int resultsSize;
+		
+		JabRefPreferences prefs = JabRefPreferences.getInstance();
+		if (prefs.getBoolean("useXmpPrivacyFilter")) {
+			TreeSet filters = new TreeSet(Arrays.asList(prefs.getStringArray("xmpPrivacyFilter")));
+			results = new Object[fields.length];
+			resultsSize = 0;
+			for (int i = 0; i < fields.length; i++) {
+				if (!filters.contains(fields[i])) {
+					results[resultsSize++] = fields[i];
+				}
+			}
+		} else {
+			results = fields;
+			resultsSize = fields.length;
+		}
 
-		for (int i = 0; i < fields.length; i++) {
-			if (fields[i].equals("author") || fields[i].equals("editor")) {
-				setPersonList(fields[i].toString(), entry.getField(fields[i].toString()).toString());
+		for (int i = 0; i < resultsSize; i++){
+			String s = results[i].toString();
+			if (s.equals("author") || s.equals("editor")) {
+				setPersonList(s, entry.getField(s).toString());
 			} else {
-				setTextProperty(fields[i].toString(), entry.getField(fields[i].toString())
-					.toString());
+				setTextProperty(s, entry.getField(s).toString());
 			}
 		}
 		setTextProperty("entrytype", entry.getType().getName());
@@ -249,7 +291,7 @@ public class XMPSchemaBibtex extends XMPSchema {
 		BibtexEntry e = new BibtexEntry(Util.createNeutralId(), t);
 
 		// Get Text Properties
-		Map text = getAllProperties();
+		Map text = getAllProperties(this, "bibtex");
 		text.remove("entrytype");
 		e.setField(text);
 		return e;
diff --git a/src/java/net/sf/jabref/util/XMPUtil.java b/src/java/net/sf/jabref/util/XMPUtil.java
index 42dd697..a8f5bd1 100644
--- a/src/java/net/sf/jabref/util/XMPUtil.java
+++ b/src/java/net/sf/jabref/util/XMPUtil.java
@@ -9,25 +9,43 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 import javax.xml.transform.TransformerException;
 
+import net.sf.jabref.AuthorList;
 import net.sf.jabref.BibtexEntry;
+import net.sf.jabref.BibtexEntryType;
 import net.sf.jabref.Globals;
 import net.sf.jabref.JabRefPreferences;
+import net.sf.jabref.Util;
 import net.sf.jabref.imports.BibtexParser;
 import net.sf.jabref.imports.ParserResult;
 
+import org.jempbox.impl.DateConverter;
 import org.jempbox.impl.XMLUtil;
 import org.jempbox.xmp.XMPMetadata;
+import org.jempbox.xmp.XMPSchema;
+import org.jempbox.xmp.XMPSchemaDublinCore;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
 import org.pdfbox.exceptions.COSVisitorException;
 import org.pdfbox.pdmodel.PDDocument;
 import org.pdfbox.pdmodel.PDDocumentCatalog;
+import org.pdfbox.pdmodel.PDDocumentInformation;
 import org.pdfbox.pdmodel.common.PDMetadata;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 /**
  * XMPUtils provide support for reading and writing BibTex data as XMP-Metadata
@@ -35,7 +53,11 @@ import org.pdfbox.pdmodel.common.PDMetadata;
  * 
  * @author Christopher Oezbek <oezi at oezi.de>
  * 
- * @version $Revision: 1.2 $ ($Date: 2006/08/13 13:17:52 $)
+ * TODO: 
+ * 
+ * Synchronization
+ * 
+ * @version $Revision: 1.4 $ ($Date: 2007/01/22 23:00:46 $)
  */
 public class XMPUtil {
 
@@ -78,8 +100,7 @@ public class XMPUtil {
 	}
 
 	/**
-	 * Try to read the given BibTexEntry from the XMP-stream of the given
-	 * PDF-file.
+	 * Try to read the BibTexEntries from the XMP-stream of the given PDF-file.
 	 * 
 	 * @param file
 	 *            The file to read from.
@@ -110,24 +131,272 @@ public class XMPUtil {
 	 */
 	public static List readXMP(InputStream inputStream) throws IOException {
 
-		XMPMetadata meta = readRawXMP(inputStream);
+		List result = new LinkedList();
 
-		// If we did not find any metadata, there is nothing to return.
-		if (meta == null)
-			return null;
+		PDDocument document = null;
 
-		List schemas = meta.getSchemasByNamespaceURI(XMPSchemaBibtex.NAMESPACE);
-		List result = new LinkedList();
+		try {
+			document = PDDocument.load(inputStream);
+			if (document.isEncrypted()) {
+				throw new EncryptionNotSupportedException(
+					"Error: Cannot read metadata from encrypted document.");
+			}
 
-		Iterator it = schemas.iterator();
-		while (it.hasNext()) {
-			XMPSchemaBibtex bib = (XMPSchemaBibtex) it.next();
+			XMPMetadata meta = getXMPMetadata(document);
+
+			// If we did not find any metadata, there is nothing to return.
+			if (meta == null)
+				return null;
+
+			List schemas = meta.getSchemasByNamespaceURI(XMPSchemaBibtex.NAMESPACE);
+
+			Iterator it = schemas.iterator();
+			while (it.hasNext()) {
+				XMPSchemaBibtex bib = (XMPSchemaBibtex) it.next();
+
+				result.add(bib.getBibtexEntry());
+			}
+
+			// If we did not find anything have a look if a Dublin Core exists
+			if (result.size() == 0) {
+				schemas = meta.getSchemasByNamespaceURI(XMPSchemaDublinCore.NAMESPACE);
+				it = schemas.iterator();
+				while (it.hasNext()) {
+					XMPSchemaDublinCore dc = (XMPSchemaDublinCore) it.next();
+
+					BibtexEntry entry = getBibtexEntryFromDublinCore(dc);
+
+					if (entry != null)
+						result.add(entry);
+				}
+			}
 
-			result.add(bib.getBibtexEntry());
+			if (result.size() == 0) {
+				BibtexEntry entry = getBibtexEntryFromDocumentInformation(document
+					.getDocumentInformation());
+
+				if (entry != null)
+					result.add(entry);
+			}
+		} finally {
+			if (document != null)
+				document.close();
 		}
 		return result;
 	}
 
+	public static BibtexEntry getBibtexEntryFromDocumentInformation(PDDocumentInformation di) {
+
+		BibtexEntry entry = new BibtexEntry();
+
+		String s = di.getAuthor();
+		if (s != null)
+			entry.setField("author", s);
+
+		s = di.getTitle();
+		if (s != null)
+			entry.setField("title", s);
+
+		s = di.getKeywords();
+		if (s != null)
+			entry.setField("keywords", s);
+
+		s = di.getSubject();
+		if (s != null)
+			entry.setField("abstract", s);
+
+		COSDictionary dict = di.getDictionary();
+		Iterator it = dict.keyList().iterator();
+		while (it.hasNext()) {
+			String key = ((COSName) it.next()).getName();
+			if (key.startsWith("bibtex/")) {
+				String value = dict.getString(key);
+				key = key.substring("bibtex/".length());
+				if (key.equals("entrytype")) {
+					BibtexEntryType type = BibtexEntryType.getStandardType(value);
+					if (type != null)
+						entry.setType(type);
+				} else
+					entry.setField(key, value);
+			}
+		}
+
+		// Return null if no values were found
+		return (entry.getAllFields().length > 0 ? entry : null);
+	}
+
+	public static BibtexEntry getBibtexEntryFromDublinCore(XMPSchemaDublinCore dcSchema) {
+
+		BibtexEntry entry = new BibtexEntry();
+
+		/**
+		 * Contributor -> Editor
+		 */
+		List contributors = dcSchema.getContributors();
+		if (contributors != null) {
+			Iterator it = contributors.iterator();
+			StringBuffer sb = null;
+			while (it.hasNext()) {
+				if (sb != null) {
+					sb.append(" and ");
+				} else {
+					sb = new StringBuffer();
+				}
+				sb.append(it.next());
+			}
+			if (sb != null)
+				entry.setField("editor", sb.toString());
+		}
+
+		/**
+		 * Author -> Creator
+		 */
+		List creators = dcSchema.getCreators();
+		if (creators != null) {
+			Iterator it = creators.iterator();
+			StringBuffer sb = null;
+			while (it.hasNext()) {
+				if (sb != null) {
+					sb.append(" and ");
+				} else {
+					sb = new StringBuffer();
+				}
+				sb.append(it.next());
+			}
+			if (sb != null)
+				entry.setField("author", sb.toString());
+		}
+
+		/**
+		 * Year + Month -> Date
+		 */
+		List dates = dcSchema.getSequenceList("dc:date");
+		if (dates != null && dates.size() > 0) {
+			String date = ((String) dates.get(0)).trim();
+			Calendar c = null;
+			try {
+				c = DateConverter.toCalendar(date);
+			} catch (Exception e) {
+
+			}
+			if (c != null) {
+				entry.setField("year", String.valueOf(c.get(Calendar.YEAR)));
+				if (date.length() > 4) {
+					entry.setField("month", Globals.MONTHS[c.get(Calendar.MONTH)]);
+				}
+			}
+		}
+
+		/**
+		 * Abstract -> Description
+		 */
+		String s = dcSchema.getDescription();
+		if (s != null)
+			entry.setField("abstract", s);
+
+		/**
+		 * Identifier -> DOI
+		 */
+		s = dcSchema.getIdentifier();
+		if (s != null)
+			entry.setField("doi", s);
+
+		/**
+		 * Publisher -> Publisher
+		 */
+		List publishers = dcSchema.getPublishers();
+		if (publishers != null) {
+			Iterator it = dcSchema.getPublishers().iterator();
+			StringBuffer sb = null;
+			while (it.hasNext()) {
+				if (sb != null) {
+					sb.append(" and ");
+				} else {
+					sb = new StringBuffer();
+				}
+				sb.append(it.next());
+			}
+			if (sb != null)
+				entry.setField("publishers", sb.toString());
+		}
+
+		/**
+		 * Relation -> bibtexkey
+		 * 
+		 * We abuse the relationship attribute to store all other values in the
+		 * bibtex document
+		 */
+		List relationships = dcSchema.getRelationships();
+		if (relationships != null) {
+			Iterator it = relationships.iterator();
+			while (it.hasNext()) {
+				s = (String) it.next();
+				if (s.startsWith("bibtex/")) {
+					s = s.substring("bibtex/".length());
+					int i = s.indexOf('/');
+					if (i != -1) {
+						entry.setField(s.substring(0, i), s.substring(i + 1));
+					}
+				}
+			}
+		}
+
+		/**
+		 * Rights -> Rights
+		 */
+		s = dcSchema.getRights();
+		if (s != null)
+			entry.setField("rights", s);
+
+		/**
+		 * Source -> Source
+		 */
+		s = dcSchema.getSource();
+		if (s != null)
+			entry.setField("source", s);
+
+		/**
+		 * Subject -> Keywords
+		 */
+		List subjects = dcSchema.getSubjects();
+		if (subjects != null) {
+			Iterator it = subjects.iterator();
+			StringBuffer sb = null;
+			while (it.hasNext()) {
+				if (sb != null) {
+					sb.append(", ");
+				} else {
+					sb = new StringBuffer();
+				}
+				sb.append(it.next());
+			}
+			if (sb != null)
+				entry.setField("keywords", sb.toString());
+		}
+
+		/**
+		 * Title -> Title
+		 */
+		s = dcSchema.getTitle();
+		if (s != null)
+			entry.setField("title", s);
+
+		/**
+		 * Type -> Type
+		 */
+		List l = dcSchema.getTypes();
+		if (l != null && l.size() > 0) {
+			s = (String) l.get(0);
+			if (s != null) {
+				BibtexEntryType type = BibtexEntryType.getStandardType(s);
+				if (type != null)
+					entry.setType(type);
+			}
+		}
+
+		return (entry.getAllFields().length > 0 ? entry : null);
+	}
+
 	/**
 	 * Try to write the given BibTexEntry in the XMP-stream of the given
 	 * PDF-file.
@@ -153,7 +422,7 @@ public class XMPUtil {
 		TransformerException {
 		List l = new LinkedList();
 		l.add(entry);
-		writeXMP(file, l);
+		writeXMP(file, l, true);
 	}
 
 	/**
@@ -182,7 +451,6 @@ public class XMPUtil {
 		}
 
 		x.save(outputStream);
-
 	}
 
 	/**
@@ -227,16 +495,8 @@ public class XMPUtil {
 				throw new EncryptionNotSupportedException(
 					"Error: Cannot read metadata from encrypted document.");
 			}
-			PDDocumentCatalog catalog = document.getDocumentCatalog();
-			PDMetadata metaRaw = catalog.getMetadata();
 
-			if (metaRaw == null) {
-				return null;
-			}
-
-			XMPMetadata meta = new XMPMetadata(XMLUtil.parse(metaRaw.createInputStream()));
-			meta.addXMLNSMapping(XMPSchemaBibtex.NAMESPACE, XMPSchemaBibtex.class);
-			return meta;
+			return getXMPMetadata(document);
 
 		} finally {
 			if (document != null)
@@ -244,6 +504,19 @@ public class XMPUtil {
 		}
 	}
 
+	protected static XMPMetadata getXMPMetadata(PDDocument document) throws IOException {
+		PDDocumentCatalog catalog = document.getDocumentCatalog();
+		PDMetadata metaRaw = catalog.getMetadata();
+
+		if (metaRaw == null) {
+			return null;
+		}
+
+		XMPMetadata meta = new XMPMetadata(XMLUtil.parse(metaRaw.createInputStream()));
+		meta.addXMLNSMapping(XMPSchemaBibtex.NAMESPACE, XMPSchemaBibtex.class);
+		return meta;
+	}
+
 	/**
 	 * Will read the XMPMetadata from the given pdf file, closing the file
 	 * afterwards.
@@ -263,6 +536,388 @@ public class XMPUtil {
 		}
 	}
 
+	protected static void writeToDCSchema(XMPSchemaDublinCore dcSchema, BibtexEntry entry) {
+
+		// Set all the values including key and entryType
+		Object[] fields = entry.getAllFields();
+
+		for (int j = 0; j < fields.length; j++) {
+
+			if (fields[j].equals("editor")) {
+				String o = entry.getField(fields[j].toString()).toString();
+
+				/**
+				 * Editor -> Contributor
+				 * 
+				 * Field: dc:contributor
+				 * 
+				 * Type: bag ProperName
+				 * 
+				 * Category: External
+				 * 
+				 * Description: Contributors to the resource (other than the
+				 * authors).
+				 * 
+				 * Bibtex-Fields used: editor
+				 */
+
+				String authors = o.toString();
+				AuthorList list = AuthorList.getAuthorList(authors);
+
+				int n = list.size();
+				for (int i = 0; i < n; i++) {
+					dcSchema.addContributor(list.getAuthor(i).getFirstLast(false));
+				}
+				continue;
+			}
+
+			/**
+			 * ? -> Coverage
+			 * 
+			 * Unmapped
+			 * 
+			 * dc:coverage Text External The extent or scope of the resource.
+			 */
+
+			/**
+			 * Author -> Creator
+			 * 
+			 * Field: dc:creator
+			 * 
+			 * Type: seq ProperName
+			 * 
+			 * Category: External
+			 * 
+			 * Description: The authors of the resource (listed in order of
+			 * precedence, if significant).
+			 * 
+			 * Bibtex-Fields used: author
+			 */
+			if (fields[j].equals("author")) {
+				String o = entry.getField(fields[j].toString()).toString();
+				String authors = o.toString();
+				AuthorList list = AuthorList.getAuthorList(authors);
+
+				int n = list.size();
+				for (int i = 0; i < n; i++) {
+					dcSchema.addCreator(list.getAuthor(i).getFirstLast(false));
+				}
+				continue;
+			}
+
+			if (fields[j].equals("month")) {
+				// Dealt with in year
+				continue;
+			}
+
+			if (fields[j].equals("year")) {
+
+				/**
+				 * Year + Month -> Date
+				 * 
+				 * Field: dc:date
+				 * 
+				 * Type: seq Date
+				 * 
+				 * Category: External
+				 * 
+				 * Description: Date(s) that something interesting happened to
+				 * the resource.
+				 * 
+				 * Bibtex-Fields used: year, month
+				 */
+				String publicationDate = Util.getPublicationDate(entry);
+				if (publicationDate != null) {
+					dcSchema.addSequenceValue("dc:date", publicationDate);
+				}
+				continue;
+			}
+			/**
+			 * Abstract -> Description
+			 * 
+			 * Field: dc:description
+			 * 
+			 * Type: Lang Alt
+			 * 
+			 * Category: External
+			 * 
+			 * Description: A textual description of the content of the
+			 * resource. Multiple values may be present for different languages.
+			 * 
+			 * Bibtex-Fields used: abstract
+			 */
+			if (fields[j].equals("abstract")) {
+				String o = entry.getField(fields[j].toString()).toString();
+				dcSchema.setDescription(o.toString());
+				continue;
+			}
+
+			/**
+			 * DOI -> identifier
+			 * 
+			 * Field: dc:identifier
+			 * 
+			 * Type: Text
+			 * 
+			 * Category: External
+			 * 
+			 * Description: Unique identifier of the resource.
+			 * 
+			 * Bibtex-Fields used: doi
+			 */
+			if (fields[j].equals("doi")) {
+				String o = entry.getField(fields[j].toString()).toString();
+				dcSchema.setIdentifier(o.toString());
+				continue;
+			}
+
+			/**
+			 * ? -> Language
+			 * 
+			 * Unmapped
+			 * 
+			 * dc:language bag Locale Internal An unordered array specifying the
+			 * languages used in the resource.
+			 */
+
+			/**
+			 * Publisher -> Publisher
+			 * 
+			 * Field: dc:publisher
+			 * 
+			 * Type: bag ProperName
+			 * 
+			 * Category: External
+			 * 
+			 * Description: Publishers.
+			 * 
+			 * Bibtex-Fields used: doi
+			 */
+			if (fields[j].equals("publisher")) {
+				String o = entry.getField(fields[j].toString()).toString();
+				dcSchema.addPublisher(o.toString());
+				continue;
+			}
+
+			/**
+			 * ? -> Rights
+			 * 
+			 * Unmapped
+			 * 
+			 * dc:rights Lang Alt External Informal rights statement, selected
+			 * by language.
+			 */
+
+			/**
+			 * ? -> Source
+			 * 
+			 * Unmapped
+			 * 
+			 * dc:source Text External Unique identifier of the work from which
+			 * this resource was derived.
+			 */
+
+			/**
+			 * Keywords -> Subject
+			 * 
+			 * Field: dc:subject
+			 * 
+			 * Type: bag Text
+			 * 
+			 * Category: External
+			 * 
+			 * Description: An unordered array of descriptive phrases or
+			 * keywords that specify the topic of the content of the resource.
+			 * 
+			 * Bibtex-Fields used: doi
+			 */
+			if (fields[j].equals("keywords")) {
+				String o = entry.getField(fields[j].toString()).toString();
+				String[] keywords = o.toString().split(",");
+				for (int i = 0; i < keywords.length; i++) {
+					dcSchema.addSubject(keywords[i].trim());
+				}
+				continue;
+			}
+
+			/**
+			 * Title -> Title
+			 * 
+			 * Field: dc:title
+			 * 
+			 * Type: Lang Alt
+			 * 
+			 * Category: External
+			 * 
+			 * Description: The title of the document, or the name given to the
+			 * resource. Typically, it will be a name by which the resource is
+			 * formally known.
+			 * 
+			 * Bibtex-Fields used: title
+			 */
+			if (fields[j].equals("title")) {
+				String o = entry.getField(fields[j].toString()).toString();
+				dcSchema.setTitle(o.toString());
+				continue;
+			}
+
+			/**
+			 * bibtextype -> relation
+			 * 
+			 * Field: dc:relation
+			 * 
+			 * Type: bag Text
+			 * 
+			 * Category: External
+			 * 
+			 * Description: Relationships to other documents.
+			 * 
+			 * Bibtex-Fields used: bibtextype
+			 */
+			/**
+			 * All others (including the bibtex key) get packaged in the
+			 * relation attribute
+			 */
+			String o = entry.getField(fields[j].toString()).toString();
+			dcSchema.addRelation("bibtex/" + fields[j].toString() + "/" + o);
+		}
+
+		/**
+		 * ? -> Format
+		 * 
+		 * Unmapped
+		 * 
+		 * dc:format MIMEType Internal The file format used when saving the
+		 * resource. Tools and applications should set this property to the save
+		 * format of the data. It may include appropriate qualifiers.
+		 */
+		dcSchema.setFormat("application/pdf");
+
+		/**
+		 * Type -> Type
+		 * 
+		 * Field: dc:type
+		 * 
+		 * Type: bag open Choice
+		 * 
+		 * Category: External
+		 * 
+		 * Description: A document type; for example, novel, poem, or working
+		 * paper.
+		 * 
+		 * Bibtex-Fields used: title
+		 */
+		Object o = entry.getType().getName();
+		if (o != null)
+			dcSchema.addType(o.toString());
+	}
+
+	/**
+	 * Try to write the given BibTexEntry as a DublinCore XMP Schema
+	 * 
+	 * Existing DublinCore schemas in the document are not modified.
+	 * 
+	 * @param document
+	 *            The pdf document to write to.
+	 * @param entry
+	 *            The Bibtex entry that is written as a schema.
+	 * @throws IOException
+	 * @throws TransformerException
+	 */
+	public static void writeDublinCore(PDDocument document, BibtexEntry entry) throws IOException,
+		TransformerException {
+
+		List l = new ArrayList();
+		l.add(entry);
+
+		writeDublinCore(document, l);
+	}
+
+	/**
+	 * Try to write the given BibTexEntries as DublinCore XMP Schemas
+	 * 
+	 * Existing DublinCore schemas in the document are removed
+	 * 
+	 * @param document
+	 *            The pdf document to write to.
+	 * @param c
+	 *            The Bibtex entries that are written as schemas
+	 * @throws IOException
+	 * @throws TransformerException
+	 */
+	public static void writeDublinCore(PDDocument document, Collection c) throws IOException,
+		TransformerException {
+
+		PDDocumentCatalog catalog = document.getDocumentCatalog();
+		PDMetadata metaRaw = catalog.getMetadata();
+
+		XMPMetadata meta;
+		if (metaRaw != null) {
+			meta = new XMPMetadata(XMLUtil.parse(metaRaw.createInputStream()));
+		} else {
+			meta = new XMPMetadata();
+		}
+
+		// Remove all current Dublin-Core schemas
+		List schemas = meta.getSchemasByNamespaceURI(XMPSchemaDublinCore.NAMESPACE);
+		Iterator it = schemas.iterator();
+		while (it.hasNext()) {
+			XMPSchema bib = (XMPSchema) it.next();
+			bib.getElement().getParentNode().removeChild(bib.getElement());
+		}
+
+		it = c.iterator();
+		while (it.hasNext()) {
+			BibtexEntry entry = (BibtexEntry) it.next();
+			XMPSchemaDublinCore dcSchema = new XMPSchemaDublinCore(meta);
+			writeToDCSchema(dcSchema, entry);
+			meta.addSchema(dcSchema);
+		}
+
+		// Save to stream and then input that stream to the PDF
+		ByteArrayOutputStream os = new ByteArrayOutputStream();
+		meta.save(os);
+		ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
+		PDMetadata metadataStream = new PDMetadata(document, is, false);
+		catalog.setMetadata(metadataStream);
+	}
+
+	/**
+	 * Try to write the given BibTexEntry in the Document Information (the
+	 * properties of the pdf).
+	 * 
+	 * Existing fields values are overriden if the bibtex entry has the
+	 * corresponding value set.
+	 * 
+	 * @param document
+	 *            The pdf document to write to.
+	 * @param entry
+	 *            The Bibtex entry that is written into the PDF properties.
+	 */
+	public static void writeDocumentInformation(PDDocument document, BibtexEntry entry) {
+
+		PDDocumentInformation di = document.getDocumentInformation();
+
+		// Set all the values including key and entryType
+		Object[] fields = entry.getAllFields();
+
+		for (int i = 0; i < fields.length; i++) {
+			if (fields[i].equals("author")) {
+				di.setAuthor(entry.getField("author").toString());
+			} else if (fields[i].equals("title")) {
+				di.setTitle(entry.getField("title").toString());
+			} else if (fields[i].equals("keywords")) {
+				di.setKeywords(entry.getField("keywords").toString());
+			} else if (fields[i].equals("abstract")) {
+				di.setSubject(entry.getField("abstract").toString());
+			} else {
+				di.setCustomMetadataValue("bibtex/" + fields[i].toString(), entry.getField(
+					fields[i].toString()).toString());
+			}
+		}
+		di.setCustomMetadataValue("bibtex/entrytype", entry.getType().getName());
+	}
+
 	/**
 	 * Try to write the given BibTexEntry in the XMP-stream of the given
 	 * PDF-file.
@@ -277,13 +932,15 @@ public class XMPUtil {
 	 *            The file to write the entries to.
 	 * @param bibtexEntries
 	 *            The entries to write to the file.
+	 * @param writePDFInfo
+	 *            Write information also in PDF document properties
 	 * @throws TransformerException
 	 *             If the entry was malformed or unsupported.
 	 * @throws IOException
 	 *             If the file could not be written to or could not be found.
 	 */
-	public static void writeXMP(File file, Collection bibtexEntries) throws IOException,
-		TransformerException {
+	public static void writeXMP(File file, Collection bibtexEntries, boolean writePDFInfo)
+		throws IOException, TransformerException {
 
 		PDDocument document = null;
 
@@ -293,6 +950,12 @@ public class XMPUtil {
 				throw new EncryptionNotSupportedException(
 					"Error: Cannot add metadata to encrypted document.");
 			}
+
+			if (writePDFInfo && bibtexEntries.size() == 1) {
+				writeDocumentInformation(document, (BibtexEntry) bibtexEntries.iterator().next());
+				writeDublinCore(document, bibtexEntries);
+			}
+
 			PDDocumentCatalog catalog = document.getDocumentCatalog();
 			PDMetadata metaRaw = catalog.getMetadata();
 
@@ -450,7 +1113,7 @@ public class XMPUtil {
 				if (c.size() == 0) {
 					System.err.println("Could not find BibtexEntry in " + args[0]);
 				} else {
-					XMPUtil.writeXMP(new File(args[1]), c);
+					XMPUtil.writeXMP(new File(args[1]), c, false);
 					System.out.println("XMP written.");
 				}
 				break;
@@ -488,7 +1151,7 @@ public class XMPUtil {
 	 * Will try to read XMP metadata from the given file, returning whether
 	 * metadata was found.
 	 * 
-	 * Caution: This method is as expensive as reading the actual metadata
+	 * Caution: This method is as expensive as it is reading the actual metadata
 	 * itself from the PDF.
 	 * 
 	 * @param is
diff --git a/src/java/tests/net/sf/jabref/UtilFindFileTest.java b/src/java/tests/net/sf/jabref/UtilFindFileTest.java
index 35e123b..fb3b323 100644
--- a/src/java/tests/net/sf/jabref/UtilFindFileTest.java
+++ b/src/java/tests/net/sf/jabref/UtilFindFileTest.java
@@ -33,19 +33,19 @@ public class UtilFindFileTest extends FileBasedTestCase {
 	public void testFindFileRelative() throws IOException {
 
 		// Most basic case
-		assertEqualPaths("/HipKro03.pdf", findFile(root.getAbsolutePath() + "/test/",
+		assertEqualPaths("HipKro03.pdf", findFile(root.getAbsolutePath() + "/test/",
 			"[bibtexkey].pdf"));
 
 		// Including directory
-		assertEqualPaths("/test/HipKro03.pdf", findFile(root.getAbsolutePath(),
+		assertEqualPaths("test/HipKro03.pdf", findFile(root.getAbsolutePath(),
 			"test/[bibtexkey].pdf"));
 
 		// No relative paths
-		assertEqualPaths(new File(root, "/test/HipKro03.pdf").getCanonicalPath(), findFile(null,
+		assertEqualPaths(new File(root, "test/HipKro03.pdf").getCanonicalPath(), findFile(null,
 			root.getAbsolutePath() + "/test/" + "[bibtexkey].pdf"));
 
 		// No relative paths
-		assertEqualPaths(new File(root, "/test/HipKro03.pdf").getCanonicalPath(), Util.findFile(
+		assertEqualPaths(new File(root, "test/HipKro03.pdf").getCanonicalPath(), Util.findFile(
 			entry, database, root.getAbsolutePath() + "/test/" + "[bibtexkey].pdf"));
 
 	}
@@ -57,7 +57,7 @@ public class UtilFindFileTest extends FileBasedTestCase {
 
 		{
 			String pdf = Util.findPdf(entry, "pdf", root.getAbsolutePath());
-			assertEqualPaths("/HipKro03 - Hello.pdf", pdf);
+			assertEqualPaths("HipKro03 - Hello.pdf", pdf);
 
 			File fullPath = Util.expandFilename(pdf, root.getAbsolutePath());
 			assertTrue(fullPath.exists());
@@ -65,7 +65,7 @@ public class UtilFindFileTest extends FileBasedTestCase {
 		{
 			String pdf = Util.findPdf(entry, "pdf", root.getAbsolutePath() + "/pdfs/");
 
-			assertEqualPaths("/sub/HipKro03-sub.pdf", pdf);
+			assertEqualPaths("sub/HipKro03-sub.pdf", pdf);
 
 			File fullPath = Util.expandFilename(pdf, root.getAbsolutePath() + "/pdfs/");
 			assertTrue(fullPath.exists());
@@ -78,7 +78,7 @@ public class UtilFindFileTest extends FileBasedTestCase {
 			String[] dirsToSearch = new String[] { root.getAbsolutePath(),
 				root.getAbsolutePath() + "/pdfs/" };
 			String pdf = Util.findPdf(entry, "pdf", dirsToSearch);
-			assertEqualPaths("/HipKro03 - Hello.pdf", pdf);
+			assertEqualPaths("HipKro03 - Hello.pdf", pdf);
 
 			File fullPath = Util.expandFilename(pdf, dirsToSearch);
 			assertTrue(fullPath.exists());
@@ -107,7 +107,7 @@ public class UtilFindFileTest extends FileBasedTestCase {
 			String[] dirsToSearch = new String[] { root.getAbsolutePath() + "/pdfs/",
 				root.getAbsolutePath() };
 			String pdf = Util.findPdf(entry, "pdf", dirsToSearch);
-			assertEqualPaths("/sub/HipKro03-sub.pdf", pdf);
+			assertEqualPaths("sub/HipKro03-sub.pdf", pdf);
 
 			File fullPath = Util.expandFilename(pdf, dirsToSearch);
 			assertTrue(fullPath.exists());
@@ -137,7 +137,7 @@ public class UtilFindFileTest extends FileBasedTestCase {
 	public void testFindFile() throws IOException {
 
 		// Simple case
-		assertEqualPaths("/HipKro03.pdf", Util.findFile(entry, database, root.getAbsolutePath()
+		assertEqualPaths("HipKro03.pdf", Util.findFile(entry, database, root.getAbsolutePath()
 			+ "/test/", "[bibtexkey].pdf", true));
 
 		// Not found
@@ -147,7 +147,7 @@ public class UtilFindFileTest extends FileBasedTestCase {
 		// Test current dir
 		assertEqualPaths(new File(new File("."), "build.xml").getCanonicalPath(), Util.findFile(
 			entry, database, "./build.xml"));
-		assertEqualPaths("/build.xml", Util.findFile(entry, database, ".", "build.xml", true));
+		assertEqualPaths("build.xml", Util.findFile(entry, database, ".", "build.xml", true));
 
 		// Test keys in path and regular expression in file
 		assertEqualPaths(new File(root, "/2003/Paper by HipKro03.pdf").getCanonicalPath(), Util
@@ -163,11 +163,11 @@ public class UtilFindFileTest extends FileBasedTestCase {
 			.getCanonicalPath(), Util.findFile(entry, database, root.getAbsolutePath() + "/*/"
 			+ "[bibtexkey] - Hello\\\\.pdf"));
 
-		assertEqualPaths("/TE.ST", Util.findFile(entry, database, root.getAbsolutePath() + "/test/",
+		assertEqualPaths("TE.ST", Util.findFile(entry, database, root.getAbsolutePath() + "/test/",
 			"TE\\\\.ST", true));
-		assertEqualPaths("/.TEST", Util.findFile(entry, database, root.getAbsolutePath() + "/test/",
+		assertEqualPaths(".TEST", Util.findFile(entry, database, root.getAbsolutePath() + "/test/",
 			"\\\\.TEST", true));
-		assertEqualPaths("/TEST[", Util.findFile(entry, database, root.getAbsolutePath() + "/test/",
+		assertEqualPaths("TEST[", Util.findFile(entry, database, root.getAbsolutePath() + "/test/",
 			"TEST\\\\[", true));
 
 		// Test *
diff --git a/src/java/tests/net/sf/jabref/UtilTest.java b/src/java/tests/net/sf/jabref/UtilTest.java
index 043008f..480c339 100644
--- a/src/java/tests/net/sf/jabref/UtilTest.java
+++ b/src/java/tests/net/sf/jabref/UtilTest.java
@@ -33,6 +33,28 @@ public class UtilTest extends TestCase {
 		assertEquals("Aa", Util.nCase("AA"));
 	}
 
+	public void testGetPublicationDate(){
+	
+		assertEquals("2003-02", Util.getPublicationDate(BibtexParser
+			.singleFromString("@ARTICLE{HipKro03, year = {2003}, month = #FEB# }")));
+		
+		assertEquals("2003-03", Util.getPublicationDate(BibtexParser
+			.singleFromString("@ARTICLE{HipKro03, year = {2003}, month = 3 }")));
+		
+		assertEquals("2003", Util.getPublicationDate(BibtexParser
+			.singleFromString("@ARTICLE{HipKro03, year = {2003}}")));
+		
+		assertEquals(null, Util.getPublicationDate(BibtexParser
+			.singleFromString("@ARTICLE{HipKro03, month = 3 }")));
+		
+		assertEquals(null, Util.getPublicationDate(BibtexParser
+			.singleFromString("@ARTICLE{HipKro03, author={bla}}")));
+
+		assertEquals("2003-12", Util.getPublicationDate(BibtexParser
+			.singleFromString("@ARTICLE{HipKro03, year = {03}, month = #DEC# }")));
+		
+	}
+
 	public void testCheckName() {
 		assertEquals("aa.bib", Util.checkName("aa"));
 		assertEquals(".bib", Util.checkName(""));
@@ -274,21 +296,24 @@ public class UtilTest extends TestCase {
 	}
 
     public void testSanitizeUrl() {
-        try {
-
+    
             assertEquals("http://www.vg.no", Util.sanitizeUrl("http://www.vg.no"));
             assertEquals("http://www.vg.no/fil%20e.html",
                     Util.sanitizeUrl("http://www.vg.no/fil e.html"));
             assertEquals("http://www.vg.no/fil%20e.html",
                     Util.sanitizeUrl("http://www.vg.no/fil%20e.html"));
-            assertEquals("http://www.vg.no/fil%20e.html",
+            assertEquals("www.vg.no/fil%20e.html",
                     Util.sanitizeUrl("www.vg.no/fil%20e.html"));
-            
-           
-        } catch (URISyntaxException e) {
-            e.printStackTrace();
-        }
-
+    
+            /**
+             * Additional testcases provided by Hannes Restel and Micha Beckmann.
+             */
+            assertEquals("ftp://www.vg.no", Util.sanitizeUrl("ftp://www.vg.no"));
+            assertEquals("file://doof.txt", Util.sanitizeUrl("file://doof.txt"));            
+            assertEquals("file:///", Util.sanitizeUrl("file:///"));
+            assertEquals("/src/doof.txt", Util.sanitizeUrl("/src/doof.txt"));
+            assertEquals("/", Util.sanitizeUrl("/"));
+            assertEquals("/home/user/example.txt", Util.sanitizeUrl("/home/user/example.txt"));
     }
 
     public void test2to4DigitsYear(){
@@ -335,6 +360,19 @@ public class UtilTest extends TestCase {
     	assertEquals(10,Util.getMonthNumber("nov"));
     	assertEquals(11,Util.getMonthNumber("dec"));
     	
+    	assertEquals(0, Util.getMonthNumber("#jan#"));
+    	assertEquals(1, Util.getMonthNumber("#feb#"));
+    	assertEquals(2, Util.getMonthNumber("#mar#"));
+    	assertEquals(3, Util.getMonthNumber("#apr#"));
+    	assertEquals(4, Util.getMonthNumber("#may#"));
+    	assertEquals(5, Util.getMonthNumber("#jun#"));
+    	assertEquals(6, Util.getMonthNumber("#jul#"));
+    	assertEquals(7, Util.getMonthNumber("#aug#"));
+    	assertEquals(8, Util.getMonthNumber("#sep#"));
+    	assertEquals(9, Util.getMonthNumber("#oct#"));
+    	assertEquals(10,Util.getMonthNumber("#nov#"));
+    	assertEquals(11,Util.getMonthNumber("#dec#"));
+    	
     	assertEquals(0, Util.getMonthNumber("January"));
     	assertEquals(1, Util.getMonthNumber("February"));
     	assertEquals(2, Util.getMonthNumber("March"));
@@ -374,6 +412,7 @@ public class UtilTest extends TestCase {
 
     	assertEquals(-1,Util.getMonthNumber(";lkjasdf"));
     	assertEquals(-1,Util.getMonthNumber("3.2"));
+    	assertEquals(-1,Util.getMonthNumber("#test#"));
     	assertEquals(-1,Util.getMonthNumber(""));
     }
 }
diff --git a/src/java/tests/net/sf/jabref/export/layout/AllTests.java b/src/java/tests/net/sf/jabref/export/layout/AllTests.java
index 4e4225e..e55883e 100644
--- a/src/java/tests/net/sf/jabref/export/layout/AllTests.java
+++ b/src/java/tests/net/sf/jabref/export/layout/AllTests.java
@@ -8,8 +8,9 @@ public class AllTests {
 	public static Test suite() {
 		TestSuite suite = new TestSuite("Test for test.net.sf.jabref.layout");
 		//$JUnit-BEGIN$
-		suite.addTestSuite(LayoutTest.class);
 		suite.addTestSuite(RTFCharsTest.class);
+		suite.addTestSuite(LayoutTest.class);
+		suite.addTestSuite(HTMLCharsTest.class);
 		//$JUnit-END$
 		return suite;
 	}
diff --git a/src/java/tests/net/sf/jabref/export/layout/HTMLCharsTest.java b/src/java/tests/net/sf/jabref/export/layout/HTMLCharsTest.java
new file mode 100644
index 0000000..0d968d3
--- /dev/null
+++ b/src/java/tests/net/sf/jabref/export/layout/HTMLCharsTest.java
@@ -0,0 +1,49 @@
+package tests.net.sf.jabref.export.layout;
+
+import junit.framework.TestCase;
+import net.sf.jabref.export.layout.LayoutFormatter;
+import net.sf.jabref.export.layout.format.HTMLChars;
+
+public class HTMLCharsTest extends TestCase {
+
+	public void testBasicFormat() {
+
+		LayoutFormatter layout = new HTMLChars();
+
+		assertEquals("", layout.format(""));
+
+		assertEquals("hallo", layout.format("hallo"));
+
+		assertEquals("R�flexions sur le timing de la quantit�", layout
+			.format("R�flexions sur le timing de la quantit�"));
+
+		assertEquals("hállo", layout.format("h\\'allo"));
+		
+		assertEquals("ı ı", layout.format("\\i \\i"));
+		assertEquals("ı", layout.format("\\i"));
+		assertEquals("ı", layout.format("\\{i}"));
+		assertEquals("ıı", layout.format("\\i\\i"));
+		
+		assertEquals("Ŀı", layout.format("\\Lmidot\\i"));
+		
+		assertEquals("ñ ñ í ı ı", layout.format("\\~{n} \\~n \\'i \\i \\i"));
+	}
+
+	public void testLaTeXHighlighting() {
+
+		LayoutFormatter layout = new HTMLChars();
+
+		assertEquals("<em>hallo</em>", layout.format("\\emph{hallo}"));
+		assertEquals("<em>hallo</em>", layout.format("{\\emph hallo}"));
+
+		assertEquals("<em>hallo</em>", layout.format("\\textit{hallo}"));
+		assertEquals("<em>hallo</em>", layout.format("{\\textit hallo}"));
+
+		assertEquals("<b>hallo</b>", layout.format("\\textbf{hallo}"));
+		assertEquals("<b>hallo</b>", layout.format("{\\textbf hallo}"));
+	}
+
+	/*
+	 * Is missing a lot of test cases for the individual chars...
+	 */
+}
\ No newline at end of file
diff --git a/src/java/tests/net/sf/jabref/export/layout/LayoutTest.java b/src/java/tests/net/sf/jabref/export/layout/LayoutTest.java
index 55ce9d7..469fa18 100644
--- a/src/java/tests/net/sf/jabref/export/layout/LayoutTest.java
+++ b/src/java/tests/net/sf/jabref/export/layout/LayoutTest.java
@@ -7,6 +7,7 @@ import java.util.Collection;
 import junit.framework.TestCase;
 import net.sf.jabref.BibtexEntry;
 import net.sf.jabref.Globals;
+import net.sf.jabref.JabRefPreferences;
 import net.sf.jabref.export.layout.Layout;
 import net.sf.jabref.export.layout.LayoutHelper;
 import net.sf.jabref.imports.BibtexParser;
@@ -14,15 +15,19 @@ import net.sf.jabref.imports.ParserResult;
 
 public class LayoutTest extends TestCase {
 
+	/**
+	 * Initialize Preferences.
+	 */
 	protected void setUp() throws Exception {
 		super.setUp();
+		if (Globals.prefs == null) {
+			Globals.prefs = JabRefPreferences.getInstance();
+		}
 	}
 
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-	/* TEST DATA */
+	/**
+	 * Return Test data.
+	 */
 	public String t1BibtexString() {
 		return "@article{canh05,\n"
 			+ "  author = {This\nis\na\ntext},\n"
@@ -55,14 +60,18 @@ public class LayoutTest extends TestCase {
 		return sb.toString();
 	}
 
+	public void testLayoutBibtextype() throws Exception {
+		assertEquals("Other", layout("\\bibtextype", "@other{bla, author={This\nis\na\ntext}}"));
+		assertEquals("Article", layout("\\bibtextype", "@article{bla, author={This\nis\na\ntext}}"));
+		assertEquals("Misc", layout("\\bibtextype", "@misc{bla, author={This\nis\na\ntext}}"));
+	}
+
 	public void testHTMLChar() throws Exception {
 		String layoutText = layout("\\begin{author}\\format[HTMLChars]{\\author}\\end{author} ",
 			"@other{bla, author={This\nis\na\ntext}}");
 
 		assertEquals("This is a text ", layoutText);
 
-		// This fails!
-
 		layoutText = layout("\\begin{author}\\format[HTMLChars]{\\author}\\end{author}",
 			"@other{bla, author={This\nis\na\ntext}}");
 
@@ -72,7 +81,6 @@ public class LayoutTest extends TestCase {
 			"@other{bla, author={This\nis\na\n\ntext}}");
 
 		assertEquals("This is a<p>text ", layoutText);
-
 	}
 
 	/**
@@ -82,19 +90,12 @@ public class LayoutTest extends TestCase {
 	 */
 	public void testLayout() throws Exception {
 
-		String layoutFile = "<font face=\"arial\">\\begin{abstract}<BR><BR><b>Abstract: </b> \\format[HTMLChars]{\\abstract} \\end{abstract}</font>";
-
-		StringReader sr = new StringReader(layoutFile.replaceAll("__NEWLINE__", "\n"));
-		Layout layout = new LayoutHelper(sr).getLayoutFromText(Globals.FORMATTER_PACKAGE);
-
-		StringBuffer sb = new StringBuffer();
-		sb.append(layout.doLayout(t1BibtexEntry(), null));
-		String layoutText = sb.toString();
+		String layoutText = layout(
+			"<font face=\"arial\">\\begin{abstract}<BR><BR><b>Abstract: </b> \\format[HTMLChars]{\\abstract}\\end{abstract}</font>",
+			t1BibtexString());
 
 		assertEquals(
 			"<font face=\"arial\"><BR><BR><b>Abstract: </b> ñ ñ í ı ı</font>",
 			layoutText);
-
 	}
-
 }
diff --git a/src/java/tests/net/sf/jabref/export/layout/RTFCharsTest.java b/src/java/tests/net/sf/jabref/export/layout/RTFCharsTest.java
index 867e912..fd25b5d 100644
--- a/src/java/tests/net/sf/jabref/export/layout/RTFCharsTest.java
+++ b/src/java/tests/net/sf/jabref/export/layout/RTFCharsTest.java
@@ -18,6 +18,7 @@ public class RTFCharsTest extends TestCase {
 		assertEquals("R\\u233?flexions sur le timing de la quantit\\u233?", layout.format("R�flexions sur le timing de la quantit�"));
 
 		assertEquals("h\\u225allo", layout.format("h\\'allo"));
+		assertEquals("h\\u225allo", layout.format("h\\'allo"));
 	}
 
 	public void testLaTeXHighlighting(){
diff --git a/src/java/tests/net/sf/jabref/imports/AllTests.java b/src/java/tests/net/sf/jabref/imports/AllTests.java
index 01fa995..ec76c56 100644
--- a/src/java/tests/net/sf/jabref/imports/AllTests.java
+++ b/src/java/tests/net/sf/jabref/imports/AllTests.java
@@ -8,10 +8,9 @@ public class AllTests {
 	public static Test suite() {
 		TestSuite suite = new TestSuite("Test for tests.net.sf.jabref.imports");
 		//$JUnit-BEGIN$
-		suite.addTestSuite(IsiImporterTest.class);
-		suite.addTestSuite(AutoImportTest.class);
-		suite.addTestSuite(BibtexParserTest.class);
 		suite.addTestSuite(OAI2ImportTest.class);
+		suite.addTestSuite(BibtexParserTest.class);
+		suite.addTestSuite(IsiImporterTest.class);
 		//$JUnit-END$
 		return suite;
 	}
diff --git a/src/java/tests/net/sf/jabref/imports/AutoImportTest.java b/src/java/tests/net/sf/jabref/imports/AutoImportTest.java
deleted file mode 100644
index 97e87fb..0000000
--- a/src/java/tests/net/sf/jabref/imports/AutoImportTest.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package tests.net.sf.jabref.imports;
-
-import junit.framework.TestCase;
-
-public class AutoImportTest extends TestCase {
-
-	public void testAutoImport(){
-		fail();
-	}
-	
-}
diff --git a/src/java/tests/net/sf/jabref/imports/BibtexParserTest.java b/src/java/tests/net/sf/jabref/imports/BibtexParserTest.java
index f3aeb9f..e922998 100644
--- a/src/java/tests/net/sf/jabref/imports/BibtexParserTest.java
+++ b/src/java/tests/net/sf/jabref/imports/BibtexParserTest.java
@@ -3,11 +3,11 @@ package tests.net.sf.jabref.imports;
 import java.io.IOException;
 import java.io.StringReader;
 import java.util.Collection;
+import java.util.Iterator;
 
 import junit.framework.TestCase;
 import net.sf.jabref.BibtexEntry;
 import net.sf.jabref.BibtexEntryType;
-import net.sf.jabref.KeyCollisionException;
 import net.sf.jabref.imports.BibtexParser;
 import net.sf.jabref.imports.ParserResult;
 
@@ -96,6 +96,79 @@ public class BibtexParserTest extends TestCase {
 			"This was created with JabRef 2.1 beta 2." + "\n" + "Encoding: Cp1252" + "\n")));
 	}
 
+	public void testFromString() throws Exception {
+
+		{ // Simple case
+			Collection c = BibtexParser.fromString("@article{test,author={Ed von Test}}");
+			assertEquals(1, c.size());
+
+			BibtexEntry e = (BibtexEntry) c.iterator().next();
+			assertEquals("test", e.getCiteKey());
+			assertEquals(2, e.getAllFields().length);
+			Object[] o = e.getAllFields();
+			assertTrue(o[0].toString().equals("author") || o[1].toString().equals("author"));
+			assertEquals("Ed von Test", e.getField("author"));
+		}
+		{ // Empty String
+			Collection c = BibtexParser.fromString("");
+			assertEquals(0, c.size());
+
+		}
+		{ // Error
+			Collection c = BibtexParser.fromString("@@article@@{{{{{{}");
+			assertEquals(null, c);
+		}
+
+	}
+
+	public void testFromSingle2() {
+		/**
+		 * More
+		 */
+		Collection c = BibtexParser.fromString("@article{canh05,"
+			+ "  author = {Crowston, K. and Annabi, H.},\n" + "  title = {Title A}}\n"
+			+ "@inProceedings{foo," + "  author={Norton Bar}}");
+
+		assertEquals(2, c.size());
+
+		Iterator i = c.iterator();
+		BibtexEntry a = (BibtexEntry) i.next();
+		BibtexEntry b = (BibtexEntry) i.next();
+
+		if (a.getCiteKey().equals("foo")) {
+			BibtexEntry tmp = a;
+			a = b;
+			b = tmp;
+		}
+
+		assertEquals("canh05", a.getCiteKey());
+		assertEquals("Crowston, K. and Annabi, H.", a.getField("author"));
+		assertEquals("Title A", a.getField("title"));
+		assertEquals(BibtexEntryType.ARTICLE, a.getType());
+
+		assertEquals("foo", b.getCiteKey());
+		assertEquals("Norton Bar", b.getField("author"));
+		assertEquals(BibtexEntryType.INPROCEEDINGS, b.getType());
+	}
+
+	public void testFromStringSingle() {
+		BibtexEntry a = BibtexParser.singleFromString("@article{canh05,"
+			+ "  author = {Crowston, K. and Annabi, H.},\n" + "  title = {Title A}}\n");
+
+		assertEquals("canh05", a.getCiteKey());
+		assertEquals("Crowston, K. and Annabi, H.", a.getField("author"));
+		assertEquals("Title A", a.getField("title"));
+		assertEquals(BibtexEntryType.ARTICLE, a.getType());
+		
+		BibtexEntry b = BibtexParser.singleFromString("@article{canh05,"
+			+ "  author = {Crowston, K. and Annabi, H.},\n" + "  title = {Title A}}\n"
+			+ "@inProceedings{foo," + "  author={Norton Bar}}");
+
+		if (!(b.getCiteKey().equals("canh05") || b.getCiteKey().equals("foo"))){
+			fail();
+		}
+	}
+
 	public void testParse() throws IOException {
 
 		// Test Standard parsing
@@ -133,16 +206,15 @@ public class BibtexParserTest extends TestCase {
 		BibtexEntry e2 = (BibtexEntry) c.iterator().next();
 
 		assertNotSame(e.getId(), e2.getId());
-		
+
 		Object[] o = e.getAllFields();
-		for (int i = 0; i < o.length; i++){
-			if (!e.getField(o[i].toString()).equals(e2.getField(o[i].toString()))){
+		for (int i = 0; i < o.length; i++) {
+			if (!e.getField(o[i].toString()).equals(e2.getField(o[i].toString()))) {
 				fail("e and e2 differ in field " + o[i].toString());
 			}
 		}
 	}
 
-	
 	/**
 	 * Test for [ 1594123 ] Failure to import big numbers
 	 * 
@@ -151,34 +223,26 @@ public class BibtexParserTest extends TestCase {
 	 * @throws IOException
 	 */
 	public void testBigNumbers() throws IOException {
-		
+
 		ParserResult result = BibtexParser.parse(new StringReader("@article{canh05,"
-			+ "isbn = 1234567890123456789,\n"
-			+ "isbn2 = {1234567890123456789},\n"
-			+ "small = 1234,\n"
-			+ "}"));
+			+ "isbn = 1234567890123456789,\n" + "isbn2 = {1234567890123456789},\n"
+			+ "small = 1234,\n" + "}"));
 
 		Collection c = result.getDatabase().getEntries();
 		BibtexEntry e = (BibtexEntry) c.iterator().next();
 
-		assertEquals("1234567890123456789", (String)e.getField("isbn"));
-		assertEquals("1234567890123456789", (String)e.getField("isbn2"));
-		assertEquals("1234", (String)e.getField("small"));
+		assertEquals("1234567890123456789", (String) e.getField("isbn"));
+		assertEquals("1234567890123456789", (String) e.getField("isbn2"));
+		assertEquals("1234", (String) e.getField("small"));
 	}
-	
+
 	public void testBigNumbers2() throws IOException {
 
-		
-		ParserResult result = BibtexParser.parse(new StringReader("" +
-				"@string{bourdieu = {Bourdieu, Pierre}}" +
-				"@book{bourdieu-2002-questions-sociologie, " +
-				"	Address = {Paris}," +
-				"	Author = bourdieu," +
-				"	Isbn = 2707318256," +
-				"	Publisher = {Minuit}," +
-				"	Title = {Questions de sociologie}," +
-				"	Year = 2002" +
-				"}"));
+		ParserResult result = BibtexParser.parse(new StringReader(""
+			+ "@string{bourdieu = {Bourdieu, Pierre}}"
+			+ "@book{bourdieu-2002-questions-sociologie, " + "	Address = {Paris},"
+			+ "	Author = bourdieu," + "	Isbn = 2707318256," + "	Publisher = {Minuit},"
+			+ "	Title = {Questions de sociologie}," + "	Year = 2002" + "}"));
 
 		Collection c = result.getDatabase().getEntries();
 		assertEquals(1, c.size());
@@ -187,30 +251,35 @@ public class BibtexParserTest extends TestCase {
 
 		assertEquals("bourdieu-2002-questions-sociologie", e.getCiteKey());
 		assertEquals(BibtexEntryType.BOOK, e.getType());
-		assertEquals("2707318256", (String)e.getField("isbn"));
-		assertEquals("Paris", (String)e.getField("address"));
-		assertEquals("Minuit", (String)e.getField("publisher"));
-		assertEquals("Questions de sociologie", (String)e.getField("Title"));
-		assertEquals("#bourdieu#", (String)e.getField("Author"));
-		assertEquals("2002", (String)e.getField("Year"));
+		assertEquals("2707318256", (String) e.getField("isbn"));
+		assertEquals("Paris", (String) e.getField("address"));
+		assertEquals("Minuit", (String) e.getField("publisher"));
+		assertEquals("Questions de sociologie", (String) e.getField("title"));
+		assertEquals("#bourdieu#", (String) e.getField("author"));
+		assertEquals("2002", (String) e.getField("year"));
 	}
 
 	public void testNewlineHandling() throws IOException {
 
-		ParserResult result = BibtexParser.parse(new StringReader("@article{canh05,"
+		BibtexEntry e = BibtexParser.singleFromString("@article{canh05," +
+				"a = {a\nb}," +
+				"b = {a\n\nb}," +
+				"c = {a\n \nb}," +
+				"d = {a \n \n b},"
 			+ "title = {\nHallo \nWorld \nthis \n is\n\nnot \n\nan \n\n exercise \n \n.\n \n\n},\n"
 			+ "tabs = {\nHallo \tWorld \tthis \t is\t\tnot \t\tan \t\n exercise \t \n.\t \n\t},\n"
-			+ "}"));
-
-		Collection c = result.getDatabase().getEntries();
-		assertEquals(1, c.size());
-
-		BibtexEntry e = (BibtexEntry) c.iterator().next();
-
+			+ "}");
+		
 		assertEquals("canh05", e.getCiteKey());
 		assertEquals(BibtexEntryType.ARTICLE, e.getType());
 
-		assertEquals("Hallo World this is not an exercise .", (String)e.getField("title"));
-		assertEquals("Hallo World this is not an exercise .", (String)e.getField("tabs"));
+		assertEquals("a b", (String)e.getField("a"));
+		assertEquals("a\nb", (String)e.getField("b"));
+		assertEquals("a b", (String)e.getField("c"));
+		assertEquals("a b", (String)e.getField("d"));
+		
+		// I think the last \n is a bug in the parser...
+		assertEquals("Hallo World this is\nnot \nan \n exercise . \n\n", (String) e.getField("title"));
+		assertEquals("Hallo World this isnot an exercise . ", (String) e.getField("tabs"));
 	}
 }
\ No newline at end of file
diff --git a/src/java/tests/net/sf/jabref/imports/OAI2ImportTest.java b/src/java/tests/net/sf/jabref/imports/OAI2ImportTest.java
index fa6c4b2..80ca18e 100644
--- a/src/java/tests/net/sf/jabref/imports/OAI2ImportTest.java
+++ b/src/java/tests/net/sf/jabref/imports/OAI2ImportTest.java
@@ -18,7 +18,7 @@ import net.sf.jabref.imports.*;
  * @author Ulrich Stärk
  * @author Christian Kopf
  * 
- * @version $Revision: 1.1 $ ($Date: 2006/11/24 15:29:11 $)
+ * @version $Revision: 1.2 $ ($Date: 2007/01/08 15:26:55 $)
  *
  */
 public class OAI2ImportTest extends TestCase {
@@ -78,22 +78,37 @@ public class OAI2ImportTest extends TestCase {
 	
 	public void testUrlConstructor() {
 		OAI2Fetcher fetcher = new OAI2Fetcher();
-		be.setField(OAI2Fetcher.OAI2_IDENTIFIER_FIELD, "hep-ph/0408155");
-		assertEquals("http://arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3Ahep-ph%2F0408155&metadataPrefix=arXiv",fetcher.constructUrl(be));
+		assertEquals("http://arxiv.org/oai2?verb=GetRecord&identifier=oai%3AarXiv.org%3Ahep-ph%2F0408155&metadataPrefix=arXiv",fetcher.constructUrl("hep-ph/0408155"));
 	}
 	
-	/*
-	public void testOnline() {
+	public void testFixKey(){
+		assertEquals("", OAI2Fetcher.fixKey(""));
+		assertEquals("test", OAI2Fetcher.fixKey("test"));
+        assertEquals("math/0601001", OAI2Fetcher.fixKey("math.RA/0601001"));
+        assertEquals("math/0601001", OAI2Fetcher.fixKey("math.QA/0601001"));
+        assertEquals("hep-ph/0408155",OAI2Fetcher.fixKey("hep-ph/0408155"));
+	}
+	
+	public void testOnline() throws InterruptedException {
+        try {
+            OAI2Fetcher fetcher = new OAI2Fetcher();
+            be = fetcher.importOai2Entry("math.QA/0601001");
+            assertEquals("math/0601001",(String)be.getField("eprint"));
+        } catch (Exception e) {
+            fail();
+            e.printStackTrace();
+        }
+        
+        Thread.sleep(30000);
+        
 		try {
 			OAI2Fetcher fetcher = new OAI2Fetcher();
-			be.setField(OAI2Fetcher.OAI2_IDENTIFIER_FIELD, "hep-ph/0408155");
-			
-			fetcher.importOai2Entry(be);
+			be = fetcher.importOai2Entry("hep-ph/0408155");
 			
 			assertEquals("hep-ph/0408155",(String)be.getField("eprint"));
 		} catch (Exception e) {
-			//fail("Exception");
+			fail();
 			e.printStackTrace();
 		}
-	}*/
+	}
 }
diff --git a/src/java/tests/net/sf/jabref/util/XMPSchemaBibtexTest.java b/src/java/tests/net/sf/jabref/util/XMPSchemaBibtexTest.java
index 7ea7d28..cdcf834 100644
--- a/src/java/tests/net/sf/jabref/util/XMPSchemaBibtexTest.java
+++ b/src/java/tests/net/sf/jabref/util/XMPSchemaBibtexTest.java
@@ -46,7 +46,7 @@ public class XMPSchemaBibtexTest extends JabRefTestCase {
 		DocumentBuilder builder = builderFactory.newDocumentBuilder();
 		Element e = builder.newDocument().createElement("rdf:Description");
 
-		XMPSchemaBibtex bibtex = new XMPSchemaBibtex(e);
+		XMPSchemaBibtex bibtex = new XMPSchemaBibtex(e, "bibtex");
 
 		assertEquals(e, bibtex.getElement());
 		assertEquals("rdf:Description", bibtex.getElement().getTagName());
@@ -201,7 +201,7 @@ public class XMPSchemaBibtexTest extends JabRefTestCase {
 		bibtex.setTextProperty("note", "BlaBla Ta Ta\nHello World");
 		bibtex.setPersonList("author", "Mouse, Mickey and Bond, James");
 		
-		Map s = bibtex.getAllProperties();
+		Map s = XMPSchemaBibtex.getAllProperties(bibtex, "bibtex");
 		
 		assertEquals(5, s.size());
 		assertTrue(s.containsKey("title"));
diff --git a/src/java/tests/net/sf/jabref/util/XMPUtilTest.java b/src/java/tests/net/sf/jabref/util/XMPUtilTest.java
index 7067c07..4fcb4fe 100644
--- a/src/java/tests/net/sf/jabref/util/XMPUtilTest.java
+++ b/src/java/tests/net/sf/jabref/util/XMPUtilTest.java
@@ -11,11 +11,13 @@ import java.io.PrintStream;
 import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.TimeZone;
+import java.util.TreeSet;
 
 import javax.xml.transform.TransformerException;
 
@@ -177,12 +179,22 @@ public class XMPUtilTest extends TestCase {
 	}
 
 	public BibtexEntry t3BibtexEntry() {
-		BibtexEntry e = new BibtexEntry(Util.createNeutralId(), BibtexEntryType.OTHER);
+		BibtexEntry e = new BibtexEntry();
+		e.setType(BibtexEntryType.INPROCEEDINGS);
 		e.setField("title", "Hypersonic ultra-sound");
 		e.setField("bibtexkey", "Clarkson06");
 		e.setField("author", "Kelly Clarkson and Ozzy Osbourne");
+		e.setField("journal", "International Journal of High Fidelity");
+		e.setField("booktitle", "Catch-22");
 		e.setField("editor", "Huey Duck and Dewey Duck and Louie Duck");
 		e.setField("pdf", "YeKis03 - Towards.pdf");
+		e.setField("keywords", "peanut,butter,jelly");
+		e.setField("year", "1982");
+		e.setField("month", "#jul#");
+		e
+			.setField(
+				"abstract",
+				"The success of the Linux operating system has demonstrated the viability of an alternative form of software development � open source software � that challenges traditional assumptions about software markets. Understanding what drives open source developers to participate in open source projects is crucial for assessing the impact of open source software. This article identifies two broad types of motivations that account for their participation in open source projects. The first ca [...]
 		return e;
 	}
 
@@ -192,11 +204,24 @@ public class XMPUtilTest extends TestCase {
 
 	public String t3XMP() {
 		return bibtexDescription("<bibtex:title>Hypersonic ultra-sound</bibtex:title>\n"
-			+ "<bibtex:author><rdf:Seq>\n" + "  <rdf:li>Kelly Clarkson</rdf:li>"
-			+ "  <rdf:li>Ozzy Osbourne</rdf:li>" + "</rdf:Seq></bibtex:author>"
-			+ "<bibtex:editor><rdf:Seq>" + "  <rdf:li>Huey Duck</rdf:li>"
-			+ "  <rdf:li>Dewey Duck</rdf:li>" + "  <rdf:li>Louie Duck</rdf:li>"
-			+ "</rdf:Seq></bibtex:editor>" + "<bibtex:bibtexkey>Clarkson06</bibtex:bibtexkey>");
+			+ "<bibtex:author><rdf:Seq>\n"
+			+ "  <rdf:li>Kelly Clarkson</rdf:li>"
+			+ "  <rdf:li>Ozzy Osbourne</rdf:li>"
+			+ "</rdf:Seq></bibtex:author>"
+			+ "<bibtex:editor><rdf:Seq>"
+			+ "  <rdf:li>Huey Duck</rdf:li>"
+			+ "  <rdf:li>Dewey Duck</rdf:li>"
+			+ "  <rdf:li>Louie Duck</rdf:li>"
+			+ "</rdf:Seq></bibtex:editor>"
+			+ "<bibtex:bibtexkey>Clarkson06</bibtex:bibtexkey>"
+			+ "<bibtex:journal>Internation Journal of High Fidelity</bibtex:journal>"
+			+ "<bibtex:booktitle>Catch-22</bibtex:booktitle>"
+			+ "<bibtex:pdf>YeKis03 - Towards.pdf</bibtex:pdf>"
+			+ "<bibtex:keywords>peanut,butter,jelly</bibtex:keywords>"
+			+ "<bibtex:entrytype>Inproceedings</bibtex:entrytype>"
+			+ "<bibtex:year>1982</bibtex:year>"
+			+ "<bibtex:month>#jul#</bibtex:month>"
+			+ "<bibtex:abstract>The success of the Linux operating system has demonstrated the viability of an alternative form of software development � open source software � that challenges traditional assumptions about software markets. Understanding what drives open source developers to participate in open source projects is crucial for assessing the impact of open source software. This article identifies two broad types of motivations that account for their participation in open source proj [...]
 	}
 
 	/**
@@ -286,6 +311,74 @@ public class XMPUtilTest extends TestCase {
 	}
 
 	/**
+	 * Make sure that the privacy filter works.
+	 * 
+	 * @throws IOException Should not happen.
+	 * @throws TransformerException Should not happen.
+	 */
+	public void testPrivacyFilter() throws IOException, TransformerException {
+
+		JabRefPreferences prefs = JabRefPreferences.getInstance();
+
+		boolean use = prefs.getBoolean("useXmpPrivacyFilter");
+		String[] privacyFilters = prefs.getStringArray("xmpPrivacyFilters");
+
+		try {
+			{ // First set:
+				prefs.putBoolean("useXmpPrivacyFilter", true);
+				prefs.putStringArray("xmpPrivacyFilter", new String[] { "author;title;note" });
+
+				BibtexEntry e = t1BibtexEntry();
+
+				XMPUtil.writeXMP(pdfFile, e);
+
+				List l = XMPUtil.readXMP(pdfFile.getAbsoluteFile());
+				assertEquals(1, l.size());
+				BibtexEntry x = (BibtexEntry) l.get(0);
+
+				TreeSet ts = new TreeSet(Arrays.asList(x.getAllFields()));
+
+				assertEquals(8, ts.size());
+
+				ts.contains("bibtextype");
+				ts.contains("bibtexkey");
+				ts.contains("booktitle");
+				ts.contains("year");
+				ts.contains("owner");
+				ts.contains("timestamp");
+				ts.contains("year");
+				ts.contains("url");
+			}
+			{ // First set:
+				prefs.putBoolean("useXmpPrivacyFilter", true);
+				prefs.putStringArray("xmpPrivacyFilter",
+					new String[] { "author;title;note;booktitle;year;owner;timestamp" });
+
+				BibtexEntry e = t1BibtexEntry();
+
+				XMPUtil.writeXMP(pdfFile, e);
+
+				List l = XMPUtil.readXMP(pdfFile.getAbsoluteFile());
+				assertEquals(1, l.size());
+				BibtexEntry x = (BibtexEntry) l.get(0);
+
+				TreeSet ts = new TreeSet(Arrays.asList(x.getAllFields()));
+
+				assertEquals(8, ts.size());
+
+				ts.contains("bibtextype");
+				ts.contains("bibtexkey");
+				ts.contains("year");
+				ts.contains("url");
+			}
+
+		} finally {
+			prefs.putBoolean("useXmpPrivacyFilter", use);
+			prefs.putStringArray("xmpPrivacyFilter", privacyFilters);
+		}
+	}
+
+	/**
 	 * Are authors and editors correctly read?
 	 * 
 	 * @throws Exception
@@ -430,8 +523,8 @@ public class XMPUtilTest extends TestCase {
 
 		{
 			String bibtex = "<bibtex:title>\nHallo\nWorld \nthis \n is\n\nnot \n\nan \n\n exercise \n \n.\n \n\n</bibtex:title>\n"
-				+ "<bibtex:tabs>\nHallo\tWorld \tthis \t is\t\tnot \t\tan \t\n exercise \t \n.\t \n\t</bibtex:tabs>\n" +
-						"<bibtex:abstract>\n\nAbstract preserve\n\t Whitespace\n\n</bibtex:abstract>";
+				+ "<bibtex:tabs>\nHallo\tWorld \tthis \t is\t\tnot \t\tan \t\n exercise \t \n.\t \n\t</bibtex:tabs>\n"
+				+ "<bibtex:abstract>\n\nAbstract preserve\n\t Whitespace\n\n</bibtex:abstract>";
 
 			writeManually(pdfFile, bibtexXPacket(bibtexDescription(bibtex)));
 
@@ -492,14 +585,34 @@ public class XMPUtilTest extends TestCase {
 			+ "  <xapMM:VersionID>" + "   <rdf:Seq>" + "    <rdf:li>17</rdf:li>" + "   </rdf:Seq>"
 			+ "  </xapMM:VersionID>" + " </rdf:Description>" + ""
 			+ " <rdf:Description rdf:about=''" + "  xmlns:dc='http://purl.org/dc/elements/1.1/'>"
+			+ "  <dc:format>application/pdf</dc:format>" + "</rdf:Description>";
+
+		writeManually(pdfFile, bibtexXPacket(s));
+
+		// Nothing there yet, but should not crash
+		assertEquals(0, XMPUtil.readXMP(pdfFile).size());
+
+		s = " <rdf:Description rdf:about=''" + "  xmlns:xmp='http://ns.adobe.com/xap/1.0/'>"
+			+ "  <xmp:CreatorTool>Acrobat PDFMaker 7.0.7</xmp:CreatorTool>"
+			+ "  <xmp:ModifyDate>2006-08-07T18:50:24+02:00</xmp:ModifyDate>"
+			+ "  <xmp:CreateDate>2006-08-07T14:44:24+02:00</xmp:CreateDate>"
+			+ "  <xmp:MetadataDate>2006-08-07T18:50:24+02:00</xmp:MetadataDate>"
+			+ " </rdf:Description>" + "" + " <rdf:Description rdf:about=''"
+			+ "  xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/'>"
+			+ "  <xapMM:DocumentID>uuid:843cd67d-495e-4c1e-a4cd-64178f6b3299</xapMM:DocumentID>"
+			+ "  <xapMM:InstanceID>uuid:1e56b4c0-6782-440d-ba76-d2b3d87547d1</xapMM:InstanceID>"
+			+ "  <xapMM:VersionID>" + "   <rdf:Seq>" + "    <rdf:li>17</rdf:li>" + "   </rdf:Seq>"
+			+ "  </xapMM:VersionID>" + " </rdf:Description>" + ""
+			+ " <rdf:Description rdf:about=''" + "  xmlns:dc='http://purl.org/dc/elements/1.1/'>"
 			+ "  <dc:format>application/pdf</dc:format>" + "  <dc:title>" + "   <rdf:Alt>"
 			+ "    <rdf:li xml:lang='x-default'>Questionnaire.pdf</rdf:li>" + "   </rdf:Alt>"
 			+ "  </dc:title>" + "" + "</rdf:Description>";
 
 		writeManually(pdfFile, bibtexXPacket(s));
 
-		// Nothing there yet, but should not crash
-		assertEquals(0, XMPUtil.readXMP(pdfFile).size());
+		// Title is Questionnaire.pdf so the DublinCore fallback should hit
+		// in...
+		assertEquals(1, XMPUtil.readXMP(pdfFile).size());
 
 		{
 			// Now write new packet and check if it was correctly written
@@ -551,7 +664,7 @@ public class XMPUtilTest extends TestCase {
 				Calendar c = Calendar.getInstance();
 				c.clear();
 				c.set(Calendar.YEAR, 2006);
-				c.set(Calendar.MONTH, 8);
+				c.set(Calendar.MONTH, Calendar.AUGUST);
 				c.set(Calendar.DATE, 7);
 				c.set(Calendar.HOUR, 14);
 				c.set(Calendar.MINUTE, 44);
@@ -632,7 +745,7 @@ public class XMPUtilTest extends TestCase {
 				Calendar c = Calendar.getInstance();
 				c.clear();
 				c.set(Calendar.YEAR, 2006);
-				c.set(Calendar.MONTH, 8);
+				c.set(Calendar.MONTH, 7);
 				c.set(Calendar.DATE, 7);
 				c.set(Calendar.HOUR, 14);
 				c.set(Calendar.MINUTE, 44);
@@ -697,6 +810,8 @@ public class XMPUtilTest extends TestCase {
 		assertEquals(expected.getCiteKey(), actual.getCiteKey());
 		assertEquals(expected.getType(), actual.getType());
 
+		assertEquals(expected.getAllFields().length, actual.getAllFields().length);
+
 		Object[] o = expected.getAllFields();
 
 		for (int i = 0; i < o.length; i++) {
@@ -730,7 +845,8 @@ public class XMPUtilTest extends TestCase {
 		assertTrue(0 < xmp.indexOf("xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'")
 			|| 0 < xmp.indexOf("xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""));
 		assertTrue(0 < xmp.indexOf("<rdf:Description"));
-		assertTrue(0 < xmp.indexOf("<?xpacket end='w'?>") || 0 < xmp.indexOf("<?xpacket end=\"w\"?>"));
+		assertTrue(0 < xmp.indexOf("<?xpacket end='w'?>")
+			|| 0 < xmp.indexOf("<?xpacket end=\"w\"?>"));
 
 		/* Test contents of string */
 		writeManually(pdfFile, xmp);
@@ -799,7 +915,7 @@ public class XMPUtilTest extends TestCase {
 		l.add(t2BibtexEntry());
 		l.add(t3BibtexEntry());
 
-		XMPUtil.writeXMP(pdfFile, l);
+		XMPUtil.writeXMP(pdfFile, l, false);
 
 		l = XMPUtil.readXMP(pdfFile);
 
@@ -818,6 +934,144 @@ public class XMPUtilTest extends TestCase {
 		assertEquals(t3BibtexEntry(), b);
 	}
 
+	public void testReadWriteDC() throws IOException, TransformerException {
+		List l = new LinkedList();
+		l.add(t3BibtexEntry());
+
+		XMPUtil.writeXMP(pdfFile, l, true);
+
+		PDDocument document = PDDocument.load(pdfFile.getAbsoluteFile());
+		try {
+			if (document.isEncrypted()) {
+				System.err.println("Error: Cannot add metadata to encrypted document.");
+				System.exit(1);
+			}
+
+			assertEquals("Kelly Clarkson and Ozzy Osbourne", document.getDocumentInformation()
+				.getAuthor());
+			assertEquals("Hypersonic ultra-sound", document.getDocumentInformation().getTitle());
+			assertEquals("Huey Duck and Dewey Duck and Louie Duck", document
+				.getDocumentInformation().getCustomMetadataValue("bibtex/editor"));
+			assertEquals("Clarkson06", document.getDocumentInformation().getCustomMetadataValue(
+				"bibtex/bibtexkey"));
+			assertEquals("peanut,butter,jelly", document.getDocumentInformation().getKeywords());
+
+			assertEquals(t3BibtexEntry(), XMPUtil.getBibtexEntryFromDocumentInformation(document
+				.getDocumentInformation()));
+
+			PDDocumentCatalog catalog = document.getDocumentCatalog();
+			PDMetadata metaRaw = catalog.getMetadata();
+
+			if (metaRaw == null) {
+				fail();
+			}
+
+			XMPMetadata meta = new XMPMetadata(XMLUtil.parse(metaRaw.createInputStream()));
+			meta.addXMLNSMapping(XMPSchemaBibtex.NAMESPACE, XMPSchemaBibtex.class);
+
+			// Check Dublin Core
+			List schemas = meta.getSchemasByNamespaceURI("http://purl.org/dc/elements/1.1/");
+
+			assertEquals(1, schemas.size());
+
+			XMPSchemaDublinCore dcSchema = (XMPSchemaDublinCore) schemas.iterator().next();
+			assertNotNull(dcSchema);
+
+			assertEquals("Hypersonic ultra-sound", dcSchema.getTitle());
+			assertEquals("1982-07", dcSchema.getSequenceList("dc:date").get(0));
+			assertEquals("Kelly Clarkson", dcSchema.getCreators().get(0));
+			assertEquals("Ozzy Osbourne", dcSchema.getCreators().get(1));
+			assertEquals("Huey Duck", dcSchema.getContributors().get(0));
+			assertEquals("Dewey Duck", dcSchema.getContributors().get(1));
+			assertEquals("Louie Duck", dcSchema.getContributors().get(2));
+			assertEquals("Inproceedings", dcSchema.getTypes().get(0));
+			assertEquals("bibtex/bibtexkey/Clarkson06", dcSchema.getRelationships().get(0));
+			assertEquals("peanut", dcSchema.getSubjects().get(0));
+			assertEquals("butter", dcSchema.getSubjects().get(1));
+			assertEquals("jelly", dcSchema.getSubjects().get(2));
+
+			/**
+			 * Bibtexkey, Journal, pdf, booktitle
+			 */
+			assertEquals(4, dcSchema.getRelationships().size());
+
+			assertEquals(t3BibtexEntry(), XMPUtil.getBibtexEntryFromDublinCore(dcSchema));
+
+		} finally {
+			document.close();
+		}
+
+	}
+
+	public void testWriteSingleUpdatesDCAndInfo() throws IOException, TransformerException {
+		List l = new LinkedList();
+		l.add(t3BibtexEntry());
+
+		XMPUtil.writeXMP(pdfFile, l, true);
+
+		PDDocument document = PDDocument.load(pdfFile.getAbsoluteFile());
+		try {
+			if (document.isEncrypted()) {
+				System.err.println("Error: Cannot add metadata to encrypted document.");
+				System.exit(1);
+			}
+
+			assertEquals("Kelly Clarkson and Ozzy Osbourne", document.getDocumentInformation()
+				.getAuthor());
+			assertEquals("Hypersonic ultra-sound", document.getDocumentInformation().getTitle());
+			assertEquals("Huey Duck and Dewey Duck and Louie Duck", document
+				.getDocumentInformation().getCustomMetadataValue("bibtex/editor"));
+			assertEquals("Clarkson06", document.getDocumentInformation().getCustomMetadataValue(
+				"bibtex/bibtexkey"));
+			assertEquals("peanut,butter,jelly", document.getDocumentInformation().getKeywords());
+
+			assertEquals(t3BibtexEntry(), XMPUtil.getBibtexEntryFromDocumentInformation(document
+				.getDocumentInformation()));
+
+			PDDocumentCatalog catalog = document.getDocumentCatalog();
+			PDMetadata metaRaw = catalog.getMetadata();
+
+			if (metaRaw == null) {
+				fail();
+			}
+
+			XMPMetadata meta = new XMPMetadata(XMLUtil.parse(metaRaw.createInputStream()));
+			meta.addXMLNSMapping(XMPSchemaBibtex.NAMESPACE, XMPSchemaBibtex.class);
+
+			// Check Dublin Core
+			List schemas = meta.getSchemasByNamespaceURI("http://purl.org/dc/elements/1.1/");
+
+			assertEquals(1, schemas.size());
+
+			XMPSchemaDublinCore dcSchema = (XMPSchemaDublinCore) schemas.iterator().next();
+			assertNotNull(dcSchema);
+
+			assertEquals("Hypersonic ultra-sound", dcSchema.getTitle());
+			assertEquals("1982-07", dcSchema.getSequenceList("dc:date").get(0));
+			assertEquals("Kelly Clarkson", dcSchema.getCreators().get(0));
+			assertEquals("Ozzy Osbourne", dcSchema.getCreators().get(1));
+			assertEquals("Huey Duck", dcSchema.getContributors().get(0));
+			assertEquals("Dewey Duck", dcSchema.getContributors().get(1));
+			assertEquals("Louie Duck", dcSchema.getContributors().get(2));
+			assertEquals("Inproceedings", dcSchema.getTypes().get(0));
+			assertEquals("bibtex/bibtexkey/Clarkson06", dcSchema.getRelationships().get(0));
+			assertEquals("peanut", dcSchema.getSubjects().get(0));
+			assertEquals("butter", dcSchema.getSubjects().get(1));
+			assertEquals("jelly", dcSchema.getSubjects().get(2));
+
+			/**
+			 * Bibtexkey, Journal, pdf, booktitle
+			 */
+			assertEquals(4, dcSchema.getRelationships().size());
+
+			assertEquals(t3BibtexEntry(), XMPUtil.getBibtexEntryFromDublinCore(dcSchema));
+
+		} finally {
+			document.close();
+		}
+
+	}
+
 	public void testReadRawXMP() throws Exception {
 
 		ParserResult result = BibtexParser
@@ -840,7 +1094,7 @@ public class XMPUtilTest extends TestCase {
 		XMPMetadata metadata = XMPUtil.readRawXMP(pdfFile);
 
 		List schemas = metadata.getSchemas();
-		assertEquals(1, schemas.size());
+		assertEquals(2, schemas.size());
 		schemas = metadata.getSchemasByNamespaceURI(XMPSchemaBibtex.NAMESPACE);
 		assertEquals(1, schemas.size());
 		XMPSchemaBibtex bib = (XMPSchemaBibtex) schemas.get(0);
@@ -956,14 +1210,15 @@ public class XMPUtilTest extends TestCase {
 			assertTrue(0 < xmp.indexOf("xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'")
 				|| 0 < xmp.indexOf("xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\""));
 			assertTrue(0 < xmp.indexOf("<rdf:Description"));
-			assertTrue(0 < xmp.indexOf("<?xpacket end='w'?>") || 0 < xmp.indexOf("<?xpacket end=\"w\"?>"));
+			assertTrue(0 < xmp.indexOf("<?xpacket end='w'?>")
+				|| 0 < xmp.indexOf("<?xpacket end=\"w\"?>"));
 
 			/* Test contents of string */
 			writeManually(pdfFile, xmp);
 			List l = XMPUtil.readXMP(pdfFile);
 			assertEquals(1, l.size());
 
-			assertEquals(t1BibtexEntry(), (BibtexEntry)l.get(0));
+			assertEquals(t1BibtexEntry(), (BibtexEntry) l.get(0));
 		}
 	}
 
diff --git a/src/resource/JabRef_de.properties b/src/resource/JabRef_de.properties
index 9c0bd26..363e078 100644
--- a/src/resource/JabRef_de.properties
+++ b/src/resource/JabRef_de.properties
@@ -4,15 +4,15 @@
 
 !This_is_a_simple_copy_and_paste_dialog._First_load_or_paste_some_text_into_the_text_input_area._After_that,_you_can_mark_text_and_assign_it_to_a_bibtex_field.=Dies_ist_ein_einfacher_Copy_&_Paste-Dialog._Nachdem_Text_in_das_Texteingabefeld_geladen_oder_kopiert_wurde,_k\u00f6nnen_Sie_Textteile_markieren_und_ihnen_ein_BibTeX-Feld_zuordnen.
 
-%0_contains_the_Regular_Expression_<b>%1</b>=%0_den_Regul\u00E4ren_Ausdruck_<b>%1</b>_enth\u00E4lt
+%0_contains_the_Regular_Expression_<b>%1</b>=%0_den_regul\u00e4ren_Ausdruck_<b>%1</b>_enth\u00e4lt
 
 %0_contains_the_term_<b>%1</b>=%0_den_Ausdruck_<b>%1</b>_enth\u00E4lt
 
-%0_doesn't_contain_the_Regular_Expression_<b>%1</b>=%0_nicht_den_Regul\u00E4ren_Ausdruck_<b>%1</b>_enth\u00E4lt
+%0_doesn't_contain_the_Regular_Expression_<b>%1</b>=%0_nicht_den_regul\u00e4ren_Ausdruck_<b>%1</b>_enth\u00e4lt
 
 %0_doesn't_contain_the_term_<b>%1</b>=%0_nicht_den_Ausdruck_<b>%1</b>_enth\u00E4lt
 
-%0_doesn't_match_the_Regular_Expression_<b>%1</b>=%0_nicht_exakt_dem_Regul\u00E4ren_Ausdruck_<b>%1</b>_entspricht
+%0_doesn't_match_the_Regular_Expression_<b>%1</b>=%0_nicht_exakt_dem_regul\u00e4ren_Ausdruck_<b>%1</b>_entspricht
 
 %0_doesn't_match_the_term_<b>%1</b>=%0_nicht_exakt_dem_Ausdruck_<b>%1</b>_entspricht
 
@@ -20,7 +20,7 @@
 
 %0_import_cancelled.=%0_Importierung_abgebrochen
 
-%0_matches_the_Regular_Expression_<b>%1</b>=%0_exakt_dem_Regul\u00E4ren_Ausdruck_<b>%1</b>_entspricht
+%0_matches_the_Regular_Expression_<b>%1</b>=%0_exakt_dem_regul\u00e4ren_Ausdruck_<b>%1</b>_entspricht
 
 %0_matches_the_term_<b>%1</b>=%0_exakt_dem_Ausdruck_<b>%1</b>_entspricht
 
@@ -118,7 +118,7 @@ and=und
 
 and_the_class_must_be_available_in_your_classpath_next_time_you_start_JabRef.=Au\u00DFerdem_muss_die_Klasse_beim_n\u00E4chsten_Start_von_JabRef_durch_den_"Classpath"_erreichbar_sein.
 
-any_field_that_matches_the_regular_expression_<b>%0</b>=ein_beliebiges_Feld,_auf_das_der_Regul\u00E4re_Ausdruck_<b>%0</b>_passt,
+any_field_that_matches_the_regular_expression_<b>%0</b>=ein_beliebiges_Feld,_auf_das_der_regul\u00e4re_Ausdruck_<b>%0</b>_passt,
 
 Appearance=Erscheinungsbild
 
@@ -214,11 +214,11 @@ BibTeX_key_is_unique.=Der_BibTeX-Key_ist_eindeutig.
 
 BibTeX_key_not_set._Enter_a_name_for_the_downloaded_file=Kein_BibTeX-Key_vorhanden._Bitte_Dateinamen_zum_Download_angeben
 
-BibTeX_source=BibTeX_Quelltext
+BibTeX_source=BibTeX-Quelltext
 
 BibTeXML=BibTeXML
 
-BibTeXML_File=BibTeXML_Datei
+BibTeXML_File=BibTeXML-Datei
 
 Binding=Tastenk\u00FCrzel
 
@@ -300,7 +300,7 @@ CiteSeer_Error=CiteSeer-Fehler
 
 CiteSeer_Fetch_Error=Fehler_beim_Abrufen_von_CiteSeer
 
-CiteSeer_import_entries=CiteSeer_Eintr\u00E4ge_importieren
+CiteSeer_import_entries=CiteSeer-Eintr\u00e4ge_importieren
 
 CiteSeer_Import_Error=Fehler_beim_Import_von_CiteSeer
 
@@ -470,7 +470,7 @@ Date_format=Datumsformat
 
 Default=Standard
 
-Default_encoding=Standard_Zeichenkodierung
+Default_encoding=Standard-Zeichenkodierung
 
 Default_grouping_field=Standard_Gruppierungs-Feld
 
@@ -530,7 +530,7 @@ Display_all_error_messages=Zeige_alle_Fehlermeldugen
 
 Display_help_on_command_line_options=Zeige_Kommandozeilenhilfe
 
-Display_imported_entries_in_an_inspection_window_before_they_are_added.=Importierte_Eintr\u00e4ge_im_Kontrollfenster_anzeigen_bevor_sie_hinzugef\u00fcgt_werden.
+Display_imported_entries_in_an_inspection_window_before_they_are_added.=Importierte_Eintr\u00e4ge_im_Kontrollfenster_anzeigen,_bevor_sie_hinzugef\u00fcgt_werden
 
 Display_only_entries_belonging_to_all_selected_groups.=Nur_Eintr\u00E4ge_anzeigen,_die_zu_allen_ausgew\u00E4hlten_Gruppen_geh\u00F6ren.
 
@@ -572,7 +572,7 @@ duplicate_BibTeX_key=doppelter_BibTeX-Key
 
 Duplicate_BibTeX_key.=Doppelter_BibTeX-Key.
 
-duplicate_BibTeX_key.=doppelter_BibTeX-Key
+duplicate_BibTeX_key.=doppelter_BibTeX-Key.
 
 Duplicate_BibTeX_key._Grouping_may_not_work_for_this_entry.=Doppelter_BibTeX-Key._Es_kann_sein,_dass_die_Gruppierung_f\u00fcr_diesen_Eintrag_nicht_funktioniert.
 
@@ -640,7 +640,7 @@ entries_into_new_database=Eintr\u00E4ge_in_neue_Datei
 
 entry=Eintrag
 
-Entry_editor=Editor
+Entry_editor=Eintragseditor
 
 # The following lines correspond to names of key bindings:
 Entry_editor,_next_entry=Eintragseditor,_n\u00E4chster_Eintrag
@@ -730,11 +730,11 @@ Failed_to_read_groups_data_(unsupported_version:_%0)=Gruppen_konnten_nicht_einge
 
 Fetch=Abrufen
 
-Fetch_Articles_Citing_your_Database=Literaturangaben_abrufen,_die_mit_Datens\u00E4tzen_ihrer_Datei_\u00FCbereinstimmen
+Fetch_Articles_Citing_your_Database=Literaturangaben_abrufen,_die_Ihre_Datei_zitieren
 
-Fetch_Citations_from_CiteSeer=Literaturangaben_von_CiteSeer_abrufen
+Fetch_Citations_from_CiteSeer=Zitierende_Literatur_von_CiteSeer_abrufen
 
-Fetch_citations_from_CiteSeer=Eintr\u00E4ge_von_CiteSeer_holen
+Fetch_citations_from_CiteSeer=Zitierende_Literatur_von_CiteSeer_abrufen
 
 Fetch_CiteSeer=CiteSeer_abrufen
 
@@ -981,7 +981,7 @@ Include_abstracts=Abstracts_ber\u00fccksichtigen
 
 Include_subgroups=Untergruppen_ber\u00fccksichtigen
 
-Include_subgroups\:_When_selected,_view_entries_contained_in_this_group_or_its_subgroups=Untergruppen_ber\u00fccksichtigen\:_Wenn_ausgew\u00e4hlt,_werden_Eintr\u00e4ge_dieser_Gruppe_und_ihrer_Untergruppen_angezeigt
+Include_subgroups\:_When_selected,_view_entries_contained_in_this_group_or_its_subgroups=Untergruppen_ber\u00fccksichtigen\:_Eintr\u00e4ge_dieser_Gruppe_und_ihrer_Untergruppen_anzeigen
 
 Incremental=Direkt
 
@@ -991,7 +991,7 @@ Incremental_search_failed._Repeat_to_search_from_top.=Direkte_Suche_fehlgeschlag
 
 Independent=Unabh\u00E4ngig
 
-Independent_group\:_When_selected,_view_only_this_group's_entries=Unabh\u00e4ngige_Gruppen\:_Wenn_ausgew\u00e4hlt,_werden_nur_die_Eintr\u00e4ge_dieser_Gruppe_angezeigt
+Independent_group\:_When_selected,_view_only_this_group's_entries=Unabh\u00e4ngige_Gruppen\:_Nur_die_Eintr\u00e4ge_dieser_Gruppe_anzeigen
 
 Initially_show_groups_tree_expanded=Baumansicht_der_Gruppen_standardm\u00e4\u00dfig_aufklappen
 
@@ -1193,11 +1193,11 @@ new=neu
 
 New_article=Neuer_Eintrag_'article'
 
-New_BibTeX_database=Neue_BibTeX_Datei
+New_BibTeX_database=Neue_BibTeX-Datei
 
-New_BibTeX_entry=Neuer_BibTeX_Eintrag
+New_BibTeX_entry=Neuer_BibTeX-Eintrag
 
-New_BibTeX_subdatabase=Neue_BibTeX_Teildatei
+New_BibTeX_subdatabase=Neue_BibTeX-Teildatei
 
 New_book=Neuer_Eintrag_'book'
 
@@ -1241,7 +1241,7 @@ No_%0_found=Kein_%0_gefunden
 
 No_actual_changes_found.=Keine_aktuellen_\u00c4nderungen_gefunden.
 
-no_base-bibtex-file_specified=keine_Bibtex_Datenbank_angegeben!
+no_base-bibtex-file_specified=keine_Bibtex-Datei_angegeben!
 
 No_custom_imports_registered_yet.=Noch_keine_externen_Importfilter_registriert.
 
@@ -1312,11 +1312,11 @@ Open=\u00D6ffnen
 
 open=\u00F6ffnen
 
-Open_BibTeX_database=BibTeX_Datei_\u00F6ffnen
+Open_BibTeX_database=BibTeX-Datei_\u00f6ffnen
 
 Open_database=Datei_\u00F6ffnen
 
-Open_editor_when_a_new_entry_is_created=Editor_\u00F6ffnen,_wenn_ein_neuer_Eintrag_angelegt_wird
+Open_editor_when_a_new_entry_is_created=Eintragseditor_\u00f6ffnen,_wenn_ein_neuer_Eintrag_angelegt_wird
 
 Open_file=Datei_\u00F6ffnen
 
@@ -1370,13 +1370,13 @@ Pasted=Eingef\u00FCgt
 
 Path_to_HTML_viewer=Pfad_zum_HTML-Browser
 
-Path_to_LyX_pipe=Pfad_zur_LyX_pipe
+Path_to_LyX_pipe=Pfad_zur_LyX-pipe
 
 Path_to_PDF_viewer=Pfad_zum_PDF-Anzeigeprogramm
 
 Path_to_PS_viewer=Pfad_zum_PS-Anzeigeprogramm
 
-Path_to_WinEdt.exe=Pfad_zu_WinEdt.exe
+Path_to_WinEdt.exe=Pfad_zu_WinEdt
 
 Paths_to_external_programs=Pfad_zu_externen_Programmen
 
@@ -1493,7 +1493,7 @@ Reference_database=Referenz-Datenbank
 # The next two lines are used like in "References found: 1  Number of references to fetch?"
 References_found=Literaturangaben_gefunden
 
-Refine_supergroup\:_When_selected,_view_entries_contained_in_both_this_group_and_its_supergroup=Obergruppe_verfeinern\:_Wenn_ausgew\u00e4hlt,_werden_Eintr\u00e4ge_aus_dieser_Gruppe_und_ihrer_\u00fcbergeordneten_Gruppe_angezeigt
+Refine_supergroup\:_When_selected,_view_entries_contained_in_both_this_group_and_its_supergroup=Obergruppe_einbeziehen\:_Eintr\u00e4ge_aus_dieser_Gruppe_und_ihrer_\u00fcbergeordneten_Gruppe_anzeigen
 
 Refresh_view=Ansicht_aktualisieren
 
@@ -1715,7 +1715,7 @@ Short_form=Kurzform
 
 Shortcut=Tastenk\u00FCrzel
 
-Show/edit_BibTeX_source=BibTeX_Quelltext_anzeigen
+Show/edit_BibTeX_source=BibTeX-Quelltextpanel_anzeigen
 
 Show_'Firstname_Lastname'='Vorname_Nachname'_anzeigen
 
@@ -1723,9 +1723,9 @@ Show_'Lastname,_Firstname'='Nachname,_Vorname'_anzeigen
 
 Show_abstract=Zeige_abstract
 
-Show_BibTeX_source_by_default=Quelltext_standardm\u00E4\u00DFig_anzeigen
+Show_BibTeX_source_by_default=Quelltextpanel_standardm\u00e4\u00dfig_anzeigen
 
-Show_BibTeX_source_panel=BibTeX_Quelltextpanel_anzeigen
+Show_BibTeX_source_panel=BibTeX-Quelltextpanel_anzeigen
 
 Show_CiteSeer_column=CiteSeer-Spalte_anzeigen
 
@@ -1761,9 +1761,9 @@ Show_required_fields=Ben\u00F6tigte_Felder_anzeigen
 
 Show_URL/DOI_column=URL/DOI-Spalte_anzeigen
 
-Show_warning_dialog_when_a_duplicate_BibTeX_key_is_entered=Warnmeldung_anzeigen,_wenn_ein_doppelter_BibTeX-Key_eingegeben_wird.
+Show_warning_dialog_when_a_duplicate_BibTeX_key_is_entered=Warnmeldung_bei_doppeltem_BibTeX-Key_anzeigen
 
-Show_warning_dialog_when_an_empty_BibTeX_key_is_entered=Warnung_anzeigen_wenn_ein_leerer_BibTeX-Key_angegeben_wird
+Show_warning_dialog_when_an_empty_BibTeX_key_is_entered=Warnmeldung_bei_leerem_BibTeX-Key_anzeigen
 
 Simple_HTML=Einfaches_HTML
 
@@ -1884,7 +1884,7 @@ The_label_of_the_string_can_not_contain_the_'#'_character.=Der_Name_des_Strings_
 
 The_output_option_depends_on_a_valid_import_option.=Die_Ausgabe-Option_beruht_auf_einer_g\u00fcltigen_Import-Option.
 
-The_regular_expression_<b>%0</b>_is_invalid%c=Der_Regul\u00E4re_Ausdruck_<b>%0</b>_ist_ung\u00FCltig%c
+The_regular_expression_<b>%0</b>_is_invalid%c=Der_regul\u00e4re_Ausdruck_<b>%0</b>_ist_ung\u00fcltig%c
 
 The_search_is_case_insensitive.=Gro\u00DF-/Kleinschreibung_wird_nicht_unterschieden.
 
@@ -1914,13 +1914,13 @@ This_group_contains_entries_based_on_manual_assignment._Entries_can_be_assigned_
 
 This_group_contains_entries_in_which=Diese_Gruppe_enth\u00E4lt_Eintr\u00E4ge,_bei_denen
 
-This_group_contains_entries_in_which_any_field_contains_the_regular_expression_<b>%0</b>=Diese_Gruppe_enth\u00E4lt_Eintr\u00E4ge,_in_denen_ein_beliebiges_Feld_den_Regul\u00E4ren_Ausdruck_<b>%0</b>_enth\u00E4lt.
+This_group_contains_entries_in_which_any_field_contains_the_regular_expression_<b>%0</b>=Diese_Gruppe_enth\u00e4lt_Eintr\u00e4ge,_in_denen_ein_beliebiges_Feld_den_regul\u00e4ren_Ausdruck_<b>%0</b>_enth\u00e4lt.
 
 This_group_contains_entries_in_which_any_field_contains_the_term_<b>%0</b>=Diese_Gruppe_enth\u00E4lt_Eintr\u00E4ge,_in_denen_ein_beliebiges_Feld_den_Ausdruck_<b>%0</b>_enth\u00E4lt.
 
 This_group_contains_entries_whose_<b>%0</b>_field_contains_the_keyword_<b>%1</b>=Diese_Gruppe_enth\u00e4lt_Eintrage,_deren_Feld_<b>%0</b>_das_Stichwort_<b>%1</b>_enth\u00e4lt
 
-This_group_contains_entries_whose_<b>%0</b>_field_contains_the_regular_expression_<b>%1</b>=Diese_Gruppe_enth\u00E4lt_Eintrage,_deren_Feld_<b>%0</b>_den_Regul\u00E4ren_Ausdruck_<b>%1</b>_enth\u00E4lt
+This_group_contains_entries_whose_<b>%0</b>_field_contains_the_regular_expression_<b>%1</b>=Diese_Gruppe_enth\u00e4lt_Eintrage,_deren_Feld_<b>%0</b>_den_regul\u00e4ren_Ausdruck_<b>%1</b>_enth\u00e4lt
 
 This_is_a_simple_copy_and_paste_dialog._First_load_or_paste_some_text_into_the_text_input_area._After_that,_you_can_mark_text_and_assign_it_to_a_bibtex_field.=Dies_ist_ein_einfacher_Copy_&_Paste-Dialog._F\u00FCgen_sie_zun\u00E4chst_Text_in_das_Eingabefeld_ein._Anschlie\u00DFend_k\u00F6nen_Sie_Textstellen_markieren_und_einem_BibTeX-Feld_zuordnen.
 
@@ -1970,7 +1970,7 @@ Union=Vereinigung
 
 unknown_bibtex_entries=unbekannte_BibTeX-Eintr\u00E4ge
 
-Unknown_bibtex_entries=Fehlende_BibTeX_Eintr\u00E4ge
+Unknown_bibtex_entries=Unbekannte_BibTeX_Eintr\u00e4ge
 
 unknown_edit=unbekannter_Bearbeitungsschritt
 
@@ -2016,7 +2016,7 @@ Use_antialiasing_font=Antialias-Schrift_benutzen
 
 Use_antialiasing_font_in_table=Gegl\u00E4ttete_Schriftart_verwenden_(in_der_Tabelle)
 
-Use_inspection_window_also_when_a_single_entry_is_imported.=Kontrollfenster_benutzen,_auch_wenn_nur_ein_Eintrag_importiert_wird.
+Use_inspection_window_also_when_a_single_entry_is_imported.=Kontrollfenster_benutzen,_auch_wenn_nur_ein_Eintrag_importiert_wird
 
 Use_other_look_and_feel=anderes_"look_and_feel"_benutzen
 
@@ -2052,7 +2052,7 @@ web_link=Web-Link
 
 What_do_you_want_to_do?=Was_m\u00f6chten_Sie_tun?
 
-When_adding/removing_keywords,_separate_them_by=Beim_Hinzuf\u00fcgen_oder_L\u00f6schen_von_Stichw\u00f6rtern_folgendes_Trennzeichen_benutzen
+When_adding/removing_keywords,_separate_them_by=Trennzeichen_zwischen_Stichw\u00f6rtern_im_Gruppierungs-Feld:
 
 with=mit
 
@@ -2108,8 +2108,8 @@ Use_native_file_dialog=Plattformabh\u00E4ngigen_Dateidialog_verwenden
 
 XMP-annotated_PDF=PDF_mit_XMP-Anmerkungen
 PDF_and_PS_links=PDF_und_PS-Links
-Use_Regular_Expression_Search=Suche_mit_Regul\u00e4rem_Ausdruck_benutzen
-Help_on_Regular_Expression_Search=Hilfe_zur_Suche_mit_Regul\u00e4rem_Ausdruck
+Use_Regular_Expression_Search=Suche_mit_regul\u00e4rem_Ausdruck_benutzen
+Help_on_Regular_Expression_Search=Hilfe_zur_Suche_mit_regul\u00e4rem_Ausdruck
 writeXMP=XMP_schreiben
 Will_write_XMP-metadata_to_the_PDFs_linked_from_selected_entries.=Schreibe_XMP-Metadaten_in_die_PDFs,_die_mit_den_ausgew\u00e4hlten_Eintr\u00e4gen_verlinkt_sind.
 Select_external_application=Externe_Anwendung_ausw\u00e4hlen
@@ -2166,8 +2166,23 @@ exists.Overwrite?=ist_vorhanden._\u00dcberschreiben?
 File_exists=Datei_ist_vorhanden
 No_file_associated=Keine_Datei_zugeordnet
 Exported_%0_entries_to_file=%0_Eintr\u00e4ge_wurden_exportiert_in_die_Datei
-Formatter_Name=
-Format_String=
-Help_on_Name_Formatting=
-Special_Name_Formatters=
-Name_formatter=
+Formatter_Name=Name_des_Formatierers
+Format_String=Formatier-Ausdruck
+Help_on_Name_Formatting=Hilfe_zum_Namens-Formatierer
+Special_Name_Formatters=Spezielle_Namens-Formatierer
+Name_formatter=Namens-Formatierer
+Deselect_all_duplicates=Auswahl_der_Duplikate_aufheben
+Error_exporting_to_clipboard=Fehler_beim_Exportieren_in_die_Zwischenablage
+
+
+Generate_keys_for_imported_entries=Keys_f\u00fcr_importierte_Eintr\u00e4ge_generieren
+Fetch_ArXiv.org=ArXiv.org_abrufen
+Looking_for_pdf...=Suche_nach_pdf...
+Correct_the_entry,_and_reopen_editor_to_display/edit_source.=Korrigiere_den_Eintrag_und_\u00f6ffne_den_Eintragseditor_um_den_BibTeX-Quelltext_zu_zeigen/bearbeiten
+
+Field_to_filter=Feld_f\u00fcr_Filter
+XMP_Export_Privacy_Settings=Sicherheits-Einstellungen_f\u00fcr_den_XMP-Export
+
+Do_not_write_the_following_fields_to_XMP_Metadata\:=Folgende_Felder_nicht_in_die_XMP-Metadaten_schreiben:
+
+XMP_metadata=XMP-Metadaten
diff --git a/src/resource/JabRef_du.properties b/src/resource/JabRef_du.properties
index fc3a557..cba32d2 100644
--- a/src/resource/JabRef_du.properties
+++ b/src/resource/JabRef_du.properties
@@ -2169,3 +2169,19 @@ Format_String=
 Help_on_Name_Formatting=
 Special_Name_Formatters=
 Name_formatter=
+Deselect_all_duplicates=
+Error_exporting_to_clipboard=
+
+Generate_keys_for_imported_entries=
+Looking_for_pdf...=
+
+Correct_the_entry,_and_reopen_editor_to_display/edit_source.=
+Fetch_ArXiv.org=
+
+Field_to_filter=
+XMP_Export_Privacy_Settings=
+
+
+Do_not_write_the_following_fields_to_XMP_Metadata\:=
+
+XMP_metadata=XPM_metadata
diff --git a/src/resource/JabRef_en.properties b/src/resource/JabRef_en.properties
index e21da45..665faf7 100644
--- a/src/resource/JabRef_en.properties
+++ b/src/resource/JabRef_en.properties
@@ -2116,18 +2116,16 @@ New_field_value=New_field_value
 Overwrite_existing_field_values=Overwrite_existing_field_values
 Include_entries=Include_entries
 Selected_entries=Selected_entries
-
-Write_XMP=Write_XMP
 Fetch_CiteSeer_by_ID=Fetch_CiteSeer_by_ID
 Push_entries_to_external_application_(%0)=Push_entries_to_external_application_(%0)
+
+Write_XMP=Write_XMP
 Writing_XMP=Writing_XMP
 HTML_table=HTML_table
-HTML_table_(with_Abstract_&_BibTeX)=HTML_table_(with_Abstract_&_BibTeX)
 Set/clear_fields=Set/clear_fields
-Set_fields=Set_fields
 Clear_fields=Clear_fields
-
-Exported_%0_entries_to_file=Exported_%0_entries_to_file
+Set_fields=Set_fields
+HTML_table_(with_Abstract_&_BibTeX)=HTML_table_(with_Abstract_&_BibTeX)
 
 OpenOffice_Calc=OpenOffice_Calc
 OpenDocument_Spreadsheet=OpenDocument_Spreadsheet
@@ -2152,9 +2150,21 @@ Link_from_entry=Link_from_entry
 exists.Overwrite?=exists._Overwrite?
 File_exists=File_exists
 No_file_associated=No_file_associated
+
+Exported_%0_entries_to_file=Exported_%0_entries_to_file
 Formatter_Name=Formatter_Name
 Format_String=Format_String
 Help_on_Name_Formatting=Help_on_Name_Formatting
 Special_Name_Formatters=Special_Name_Formatters
 Name_formatter=Name_formatter
-
+Deselect_all_duplicates=Deselect_all_duplicates
+Error_exporting_to_clipboard=Error_exporting_to_clipboard
+Generate_keys_for_imported_entries=Generate_keys_for_imported_entries
+Fetch_ArXiv.org=Fetch_ArXiv.org
+Looking_for_pdf...=Looking_for_pdf...
+Correct_the_entry,_and_reopen_editor_to_display/edit_source.=Correct_the_entry,_and_reopen_editor_to_display/edit_source.
+Field_to_filter=Field_to_filter
+XMP_Export_Privacy_Settings=XMP_Export_Privacy_Settings
+
+Do_not_write_the_following_fields_to_XMP_Metadata\:=Do_not_write_the_following_fields_to_XMP_Metadata:
+XMP_metadata=XMP_metadata
\ No newline at end of file
diff --git a/src/resource/JabRef_fr.properties b/src/resource/JabRef_fr.properties
index 916619c..c0021a1 100644
--- a/src/resource/JabRef_fr.properties
+++ b/src/resource/JabRef_fr.properties
@@ -1132,3 +1132,17 @@ Format_String=Cha\u00EEne_de_format
 Help_on_Name_Formatting=Aide_sur_le_formatage_des_noms
 Special_Name_Formatters=Formateurs_de_nom_sp\u00e9ciaux
 Name_formatter=Formateur_de_nom
+Deselect_all_duplicates=D\u00e9s\u00e9lectionner_tous_les_doublons
+Error_exporting_to_clipboard=Erreur_lors_de_l'exportation_vers_le_presse-papiers
+Generate_keys_for_imported_entries=G\u00e9n\u00e9rer_les_clefs_pour_les_entr\u00e9es_import\u00e9es
+Looking_for_pdf...=Recherche_de_pdf...
+
+Correct_the_entry,_and_reopen_editor_to_display/edit_source.=Corrigez_l'entr\u00e9e_et_r\u00e9-ouvrir_l'\u00e9diteur_pour_afficher/\u00e9diter_la source.
+Fetch_ArXiv.org=Recherche_ArXiv.org
+
+Field_to_filter=Champ_vers_filtre
+XMP_Export_Privacy_Settings=Param\u00E8tres_de_confidentialit\u00e9_pour_l'exportation_XMP
+
+Do_not_write_the_following_fields_to_XMP_Metadata\:=Ne_pas_\u00e9crire_les_champs_suivants_dans_les_m\u00e9ta-donn\u00e9es_XMP_\:
+
+XMP_metadata=M\u00e9tadonn\u00e9es_XMP
diff --git a/src/resource/JabRef_it.properties b/src/resource/JabRef_it.properties
index 7feeb3a..1c8d569 100644
--- a/src/resource/JabRef_it.properties
+++ b/src/resource/JabRef_it.properties
@@ -376,11 +376,11 @@ Fetch=Recupera
 Fetch_Articles_Citing_your_Database=Recupera_gli_articoli_che_citano_il_tuo_database
 Fetch_Citations_from_CiteSeer=Recupera_Citazioni_da_CiteSeer
 Fetch_citations_from_CiteSeer=Recupera_citazioni_da_CiteSeer
-Fetch_CiteSeer=Recupers_CiteSeer
-Fetch_Medline=Recupera_Medline
-fetch_Medline=recupera_Medline
-Fetch_Medline_by_author=Recupera_Medline_per_autore
-Fetch_Medline_by_ID=Recupera_Medline_per_ID
+Fetch_CiteSeer=Recupera_da_CiteSeer
+Fetch_Medline=Recupera_da_Medline
+fetch_Medline=recupera_da_Medline
+Fetch_Medline_by_author=Recupera_da_Medline_per_autore
+Fetch_Medline_by_ID=Recupera_da_Medline_per_ID
 Fetched_all_citations_from_target_database.=Tutte_le_citazioni_sono_state_recuperate_dal_database.
 Fetching_Citations=Recupero_delle_citazioni_in_corso
 Fetching_Identifiers=Recupero_degli_identificatori_in_corso
@@ -656,7 +656,7 @@ not_found=non_trovato
 Not_saved_(empty_session)=Non_salvato_(sessione_vuota)
 Note_that_the_entry_causing_the_problem_has_been_selected.=Nota:_la_voce_responsabile_del_problema_\u00e8_stata_selezionata.
 Note_that_the_new_definitions_will_not_be_compatible_with_previous_JabRef_versions.=Nota:_le_nuove_definizioni_non_saranno_compatibili_con_precedenti_versioni_di_JabRef.
-Note_that_you_must_specify_the_fully_qualified_class_name_for_the_look_and_feel,=Nota:_\u00e8_necessario_specificare_il_nome_di_classe_completo_per_il_"look_and_feel",
+Note_that_you_must_specify_the_fully_qualified_class_name_for_the_look_and_feel,=Nota:_\u00e8_necessario_specificare_il_nome_di_classe_completo_per_il_"Look-and-Feel",
 Nothing_to_redo=Niente_da_ripetere
 Nothing_to_undo=Niente_da_annullare
 Number_of_references_to_fetch?=Numero_di_riferimenti_da_recuperare?
@@ -1038,7 +1038,7 @@ usage=uso
 Use_antialiasing_font=Usa_font_con_antialising
 Use_antialiasing_font_in_table=Usa_font_con_antialising_nella_tabella
 Use_inspection_window_also_when_a_single_entry_is_imported.=Usa_la_finestra_di_ispezione_anche_per_l'importazione_di_una_singola_voce.
-Use_other_look_and_feel=Usa_un_altro_"look_and_feel"
+Use_other_look_and_feel=Usa_un_altro_"Look-and-Feel"
 Use_regular_expressions=Utilizza_espressioni_regolari
 Use_the_following_delimiter=Utilizza_il_delimitatore_seguente
 Use_the_following_delimiter_character(s)=Utilizza_i_caratteri_di_delimitazione_seguenti
@@ -1148,9 +1148,24 @@ Link_from_entry=Collegamento_da_voce
 exists.Overwrite?=esiste._Sovrascrivere?
 File_exists=Il_file_esiste
 No_file_associated=Nessun_file_associato
-Exported_%0_entries_to_file=
-Formatter_Name=
-Format_String=
-Help_on_Name_Formatting=
-Special_Name_Formatters=
-Name_formatter=
+Exported_%0_entries_to_file=%0_voci_esportate_nel_file
+Formatter_Name=Nome_della_formattazione
+Format_String=Stringa_di_formattazione
+Help_on_Name_Formatting=Aiuto_sulla_formattazione_dei_nomi
+Special_Name_Formatters=Formattazioni_speciali_dei_nomi
+Name_formatter=Formattazione_dei_nomi
+Deselect_all_duplicates=Deseleziona_tutti_i_duplicati
+Error_exporting_to_clipboard=Errore_durante_l'esportazione_negli_appunti
+
+
+Generate_keys_for_imported_entries=Genera_chiavi_per_le_voci_importate
+Looking_for_pdf...=Ricerca_del_file_pdf...
+Correct_the_entry,_and_reopen_editor_to_display/edit_source.=Correggi_la_voce_e_riapri_la_scheda_"Sorgente_BibTeX"_per_visualizzare/modificare_il_codice_sorgente_BibTeX.
+Fetch_ArXiv.org=Recupera_da_ArXiv.org
+
+Field_to_filter=Campi_da_filtrare
+XMP_Export_Privacy_Settings=Impostazioni_per_la_riservatezza_dei_dati_XMP_esportati
+
+Do_not_write_the_following_fields_to_XMP_Metadata\:=Non_scrivere_i_dati_dei_campi_seguenti_nei_metadati_XMP:
+
+XMP_metadata=Metadati_XMP
diff --git a/src/resource/JabRef_no.properties b/src/resource/JabRef_no.properties
index 86bfc73..2b3e61f 100644
--- a/src/resource/JabRef_no.properties
+++ b/src/resource/JabRef_no.properties
@@ -1101,32 +1101,48 @@ Set/clear_fields=Sett/fjern_felter
 Clear_fields=Slett_felter
 Set_fields=Sett_felter
 
-OpenOffice_Calc=
-OpenDocument_Spreadsheet=
+OpenOffice_Calc=OpenOffice_Calc
+OpenDocument_Spreadsheet=OpenDocument_Spreadsheet
+
+Skipped_entry.=Hoppet_over_enhet.
+Error_occured_when_parsing_entry=En_feil_oppsto_ved_lesing_av_enhet
+Operation_canceled.\n=Operasjonen_avbrutt.\n
+Error_while_writing=En_feil_oppsto_ved_skriving
+Skipped_-_PDF_does_not_exist=Hoppet_over_-_PDF-filen_finnes_ikke
+Use_custom_icon_theme=Bruk_egendefinert_ikonsett
+Custom_icon_theme=Egendefinert_ikonsett
+Custom_icon_theme_file=Ikonsettfil
+Unable_to_read_icon_theme_file=Kunne_ikke_lese_ikonsettfil
+Unable_to_read_default_icon_theme.=Kunne_ikke_lese_standard_ikonsettfil.
+Could_not_find_image_file=Kunne_ikke_finne_bilde
+Set_field=Sett_felt
+No_entries_selected.=Ingen_enheter_valgt.
+Link_from_new_entries.=Lenk_fra_nye_enheter.
+Link_from_new_entry=Lenk_fra_ny_enhet
+Link_from_entries.=Lenk_fra_enheter.
+Link_from_entry=Lenk_fra_enhet
+exists.Overwrite?=eksisterer._Skriv_over?
+File_exists=Filen_eksisterer
+No_file_associated=Ingen_assosiert_fil
+Exported_%0_entries_to_file=Eksporterte_%0_enheter_til_fil
+Formatter_Name=Navn_p�_formaterer
+Format_String=Formatstreng
+Help_on_Name_Formatting=Hjelp_om_navneformatering
+Special_Name_Formatters=Spesielle_navneformaterere
+Name_formatter=Navneformaterer
+Deselect_all_duplicates=Velg_bort_alle_duplikater
+Error_exporting_to_clipboard=Feil_ved_eksport_til_utklippstavle
+
+Fetch_ArXiv.org=Hent_ArXiv.org
+
+Generate_keys_for_imported_entries=Generer_n\u00f8kler_automatisk_for_importerte_enheter
+Looking_for_pdf...=Ser_etter_pdf...
+
+Correct_the_entry,_and_reopen_editor_to_display/edit_source.=Korrigere_enheten,_og_�pne_enhetsskjemaet_p�_nytt_for_�_vise/redigere_kildekoden.
+
+Field_to_filter=Felt_som_skal_filtreres
+XMP_Export_Privacy_Settings=Innstillinger_for_XMP-eksport
+
+Do_not_write_the_following_fields_to_XMP_Metadata\:=Ikke_skriv_de_f�lgende_feltene_til_XMP-metadata:
+XMP_metadata=XMP-metadata
 
-Skipped_entry.=
-Error_occured_when_parsing_entry=
-Operation_canceled.\n=
-Error_while_writing=
-Skipped_-_PDF_does_not_exist=
-Use_custom_icon_theme=
-Custom_icon_theme=
-Custom_icon_theme_file=
-Unable_to_read_icon_theme_file=
-Unable_to_read_default_icon_theme.=
-Could_not_find_image_file=
-Set_field=
-No_entries_selected.=
-Link_from_new_entries.=
-Link_from_new_entry=
-Link_from_entries.=
-Link_from_entry=
-exists.Overwrite?=
-File_exists=
-No_file_associated=
-Exported_%0_entries_to_file=
-Formatter_Name=
-Format_String=
-Help_on_Name_Formatting=
-Special_Name_Formatters=
-Name_formatter=
diff --git a/src/resource/Menu_de.properties b/src/resource/Menu_de.properties
index a01003e..3482cec 100644
--- a/src/resource/Menu_de.properties
+++ b/src/resource/Menu_de.properties
@@ -195,4 +195,5 @@ Write_XMP-metadata_to_PDFs=XMP-Metadaten_in_PDFs_schreiben
 
 Set/clear_fields=Felder_setzen/l\u00f6schen
 Export_selected_entries=Ausgew\u00e4hlte_Eintr\u00e4ge_exportieren
-Fetch_ArXiv.org=
+Fetch_ArXiv.org=ArXiv.org_abrufen
+Sessions=Sitzungen
diff --git a/src/resource/Menu_du.properties b/src/resource/Menu_du.properties
index 4db6620..b6b968f 100644
--- a/src/resource/Menu_du.properties
+++ b/src/resource/Menu_du.properties
@@ -201,3 +201,5 @@ Set/clear_fields=Instellen/verwijderen_velden
 Export_selected_entries=
 
 Fetch_ArXiv.org=
+
+Sessions=
\ No newline at end of file
diff --git a/src/resource/Menu_en.properties b/src/resource/Menu_en.properties
index ed564f4..34a7c68 100644
--- a/src/resource/Menu_en.properties
+++ b/src/resource/Menu_en.properties
@@ -113,3 +113,4 @@ Set/clear_fields=Set/clear_fields
 
 Export_selected_entries=Export_selected_entries
 Fetch_ArXiv.org=Fetch_ArXiv.org
+Sessions=Sessions
diff --git a/src/resource/Menu_fr.properties b/src/resource/Menu_fr.properties
index c34a905..1cf7b0b 100644
--- a/src/resource/Menu_fr.properties
+++ b/src/resource/Menu_fr.properties
@@ -102,3 +102,4 @@ Set/clear_fields=Configurer/vider_les_champs
 Export_selected_entries=Exporter_les_entr\u00E9es_s\u00E9lectionn\u00E9es
 
 Fetch_ArXiv.org=Recherche_ArXiv.org
+Sessions=Sessions
diff --git a/src/resource/Menu_it.properties b/src/resource/Menu_it.properties
index 3f57a4d..92a9922 100644
--- a/src/resource/Menu_it.properties
+++ b/src/resource/Menu_it.properties
@@ -44,7 +44,7 @@ Insert_selected_citations_into_Emacs=Inserisci_le_citazioni_selezionate_in_Emacs
 Insert_selected_citations_into_LatexEditor=Inserisci_le_citazioni_selezionate_in_LatexEditor
 Insert_selected_citations_into_LyX/Kile=Inserisci_le_citazioni_selezionate_in_&LyX/Kile
 Insert_selected_citations_into_WinEdt=Inserisci_le_citazioni_selezionate_in_&WinEdt
-Integrity_check=&Verifica_di_integrit\u00e0
+Integrity_check=Verifica_di_integrit\u00e0
 # Help
 JabRef_help=&Aiuto_di_JabRef
 Load_session=&Carica_sessione
@@ -109,4 +109,5 @@ Push_entries_to_external_application_(%0)=Invia_le_voci_all'applicazione_esterna
 
 Set/clear_fields=Imposta/svuota_campi
 Export_selected_entries=Esporta_le_voci_selezionate 
-Fetch_ArXiv.org=
+Fetch_ArXiv.org=Recupera_da_ArXiv.org
+Sessions=Sessioni
\ No newline at end of file
diff --git a/src/resource/Menu_no.properties b/src/resource/Menu_no.properties
index c1ad53f..d38d620 100644
--- a/src/resource/Menu_no.properties
+++ b/src/resource/Menu_no.properties
@@ -15,7 +15,7 @@ Custom_export=E&ksterne_eksportfiltre
 Custom_importers=Custom_importers
 Customize_entry_types=&Tilpass_enhetstyper
 Cut=&Klipp_up
-Database_properties=
+Database_properties=Egenskaper_for_database
 Delete=&Slett
 Edit=&Rediger
 # Bibtex
@@ -78,10 +78,10 @@ Save_selected_as_...=Lagre_&valgte_enheter_som_...
 Save_session=Lag&re_tilstand
 # Tools
 Search=&S\u00F8k
-Search_IEEEXplore=
+Search_IEEEXplore=Hent_IEEEXplore
 Select_all=&Velg_alle
 Set_up_general_fields=Sett_opp_&generelle_felter
-Show_error_console=
+Show_error_console=Vis_feilkonsoll
 Sort_tabs=
 Switch_preview_layout=&Skift_layout_p\u00E5_forh\u00E5ndsvisning
 Synchronize_PDF_links=Synkroniser_PDF-lenker
@@ -98,9 +98,9 @@ Unmark_all=F&jern_merking_fra_alle
 Unmark_entries=&Fjern_merking
 Unpack_EndNote_filter_set=Pakk_ut_&EndNote-filtersett
 View=&Vis
-Web_search=
-Import_into_new_database=
-Import_into_current_database=
+Web_search=Webs�k
+Import_into_new_database=Importer_til_ny_database
+Import_into_current_database=Importer_til_den_aktive_databasen
 
 Scan_database...=&Unders\u00F8k_database
 
@@ -108,5 +108,6 @@ Push_entries_to_external_application_(%0)=
 Write_XMP-metadata_to_PDFs=
 
 Set/clear_fields=Sett/fjern_felter
-Export_selected_entries=
-Fetch_ArXiv.org=
+Export_selected_entries=Eksporter_valgte_enheter
+Fetch_ArXiv.org=Hent_ArXiv.org
+Sessions=Tilstander
diff --git a/src/resource/build.properties b/src/resource/build.properties
index 5c6ef37..a93872a 100644
--- a/src/resource/build.properties
+++ b/src/resource/build.properties
@@ -1,3 +1,3 @@
-builddate=November 26 2006
-build=340
-version=2.2b2
\ No newline at end of file
+builddate=January 30 2007
+build=435
+version=2.2
\ No newline at end of file
diff --git a/src/txt/README b/src/txt/README
index c2f1e71..7b3db23 100644
--- a/src/txt/README
+++ b/src/txt/README
@@ -1,6 +1,6 @@
 
-JabRef 2.2 beta 2
------------------
+JabRef 2.2
+----------
 
 
 Introduction:
@@ -80,6 +80,27 @@ If you choose languages other than English, some or all help pages may
 appear in your chosen languages.
 
 Change log:
+
+2.2b3	- Added progress bar to indicate progress when synchronizing PS/PDF links.
+        - Option to autogenerate key for imported entries now also affects entries imported
+          without using the import inspection window.
+        - Modified quick jump behaviour so sequences of letters can be found. Timeout or
+          ESC resets the search.
+        - Improved XMP support: 
+        - JabRef now reads and write DublinCore and Legacy Document Properties
+          Caution needs to be used though since, JabRef does overwrite existing values.
+        - XMP privacy filter can be used to prevent sensible fields to be exported.
+        - Support for OAI2 identifiers with subcategories, e.g. math.RA/0601001
+        - Fixed bug that made explicit groups appear empty after updating group tree from external
+          change.
+        - New windows installer thanks to Uwe St�hr.
+        - [ 1641247 ] Fixed: No update of preview after generating bibtex key
+        - [ 1631548 ] Fixed: Absolute paths should be stored for last open files.
+        - [ 1598777 ] Fixed: Month sorting
+        - [ 1570570 ] New Feature: Deselect all duplicates on import
+        - [ 1574773 ] Fixed: sanitizeUrl() breaks ftp:// and file:///
+        - [ 1609991 ] Fixed: Silverplatter Import: Publisher and Year confused
+        - [ 1608391 ] Fixed: Medline Search Editbox size gets to big
 2.2b2   - Redesigned export functions to simplify GUI and provide "Export selected
           entries" functionality. Export filter is now chosen using the file type
           dropdown menu in the file dialog.
@@ -92,7 +113,7 @@ Change log:
         - [ 1594123 ] Fixed: Failure to import big numbers in Bibtex
         - [ 1594169 ] Fixed: Entry editor navigation between panels faulty
         - [ 1588028 ] Fixed: Export HTML table has relative DOI URL
-		- [ 1601651 ] Fixed: PDF subdirectory - missing first character
+        - [ 1601651 ] Fixed: PDF subdirectory - missing first character
 2.2b    - Added Mark Schenk's advanced HTML export filter.
         - Added options to copy/move/link to dragged linkable file (pdf, ps, etc.).
         - Removed unnecessary output text when scanning for external file changes.
@@ -131,7 +152,7 @@ Change log:
         - [ 1542552 ] Fixed: Wrong author import from ISI file.
         - [ 1534537 ] Fixed: resize groups interface
         - [ 1465610 ] Fixed: (Double-)Names containing hyphen (-) not handled correctly
-		- [ 1436014 ] Fixed: No comma added to separate keywords
+        - [ 1436014 ] Fixed: No comma added to separate keywords
 		- [ 1548875 ] Fixed: download pdf produces unsupported filename
 		- [ 1545601 ] Fixed: downloading pdf corrupts pdf field text
         - [ 1285977 ] Fixed: Impossible to properly sort a numeric field
@@ -554,4 +575,4 @@ http://sourceforge.net/projects/jabref
 
 Corresponding authors:
 mortenalver _ users.sourceforge.net
-nbatada _ users.sourceforge.net
+nbatada _ users.sourceforge.net
\ No newline at end of file
diff --git a/src/windows/nsis/setup.nsi b/src/windows/nsis/setup.nsi
index be360a0..89b50f4 100644
--- a/src/windows/nsis/setup.nsi
+++ b/src/windows/nsis/setup.nsi
@@ -2,9 +2,11 @@
 # 29.12.2005 01:09:51
 
 !ifndef VERSION
-	!define VERSION "2.1"
+	!define VERSION "2.2"
 !endif
 
+!define EXENAME "JabRef-${VERSION}-Setup.exe"
+
 Name "JabRef ${VERSION}"
 
 !define REGKEY "SOFTWARE\$(^Name)"
@@ -17,7 +19,7 @@ Name "JabRef ${VERSION}"
 !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM
 !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\JabRef"
 !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup
-!define MUI_STARTMENUPAGE_DEFAULT_FOLDER "JabRef"
+!define MUI_STARTMENUPAGE_DEFAULT_FOLDER "JabRef ${VERSION}"
 !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-full.ico"
 !define MUI_FINISHPAGE_RUN $INSTDIR/JabRef.exe
 !define MUI_UNFINISHPAGE_NOAUTOCLOSE
@@ -49,7 +51,7 @@ Var StartMenuGroup
 !insertmacro MUI_LANGUAGE English
 
 # Installer attributes
-OutFile JabRefSetup.exe
+OutFile "${EXENAME}"
 InstallDir "$PROGRAMFILES\JabRef"
 CRCCheck on
 XPStyle on

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/jabref.git



More information about the pkg-java-commits mailing list