Index: /trunk/de.ugoe.cs.swe.exercises/.classpath
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/.classpath	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/.classpath	(revision 3)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry exported="true" kind="lib" path="lib/antlr-runtime-3.1.3.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/jna.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/sqljet.1.0.0.b616.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/svnkit-javahl.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/svnkit.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/trilead.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="tests"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="lib/mysql-connector-java-5.1.8-bin.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: /trunk/de.ugoe.cs.swe.exercises/.externalToolBuilders/net.sourceforge.metrics.builder.launch
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/.externalToolBuilders/net.sourceforge.metrics.builder.launch	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/.externalToolBuilders/net.sourceforge.metrics.builder.launch	(revision 3)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="net.sourceforge.metrics.builder"/>
+<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+</launchConfiguration>
Index: /trunk/de.ugoe.cs.swe.exercises/.externalToolBuilders/net.sourceforge.texlipse.builder.TexlipseBuilder.launch
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/.externalToolBuilders/net.sourceforge.texlipse.builder.TexlipseBuilder.launch	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/.externalToolBuilders/net.sourceforge.texlipse.builder.TexlipseBuilder.launch	(revision 3)
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="net.sourceforge.texlipse.builder.TexlipseBuilder"/>
+<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+</launchConfiguration>
Index: /trunk/de.ugoe.cs.swe.exercises/.project
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/.project	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/.project	(revision 3)
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.ugoe.cs.swe.exercises</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>LaunchConfigHandle</key>
+					<value>&lt;project&gt;/.externalToolBuilders/net.sourceforge.texlipse.builder.TexlipseBuilder.launch</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+			<triggers>full,incremental,</triggers>
+			<arguments>
+				<dictionary>
+					<key>LaunchConfigHandle</key>
+					<value>&lt;project&gt;/.externalToolBuilders/net.sourceforge.metrics.builder.launch</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>net.sourceforge.texlipse.builder.TexlipseNature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>net.sourceforge.metrics.nature</nature>
+	</natures>
+</projectDescription>
Index: /trunk/de.ugoe.cs.swe.exercises/.settings/org.eclipse.core.resources.prefs
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/.settings/org.eclipse.core.resources.prefs	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/.settings/org.eclipse.core.resources.prefs	(revision 3)
@@ -0,0 +1,3 @@
+#Thu Oct 15 16:03:49 CEST 2009
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
Index: /trunk/de.ugoe.cs.swe.exercises/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/.settings/org.eclipse.jdt.core.prefs	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/.settings/org.eclipse.jdt.core.prefs	(revision 3)
@@ -0,0 +1,8 @@
+#Mon Oct 05 09:28:24 GMT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
Index: /trunk/de.ugoe.cs.swe.exercises/META-INF/MANIFEST.MF
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/META-INF/MANIFEST.MF	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/META-INF/MANIFEST.MF	(revision 3)
@@ -0,0 +1,22 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Exercises
+Bundle-SymbolicName: de.ugoe.cs.swe.exercises;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: de.ugoe.cs.swe.exercises.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.junit4,
+ net.sourceforge.texlipse;bundle-version="1.3.0",
+ org.eclipse.core.filesystem;bundle-version="1.2.0",
+ org.eclipse.ui.ide;bundle-version="3.5.1"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Bundle-ClassPath: .,
+ lib/mysql-connector-java-5.1.8-bin.jar,
+ lib/antlr-runtime-3.1.3.jar,
+ lib/jna.jar,
+ lib/sqljet.1.0.0.b616.jar,
+ lib/svnkit-javahl.jar,
+ lib/svnkit.jar,
+ lib/trilead.jar
Index: /trunk/de.ugoe.cs.swe.exercises/build.properties
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/build.properties	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/build.properties	(revision 3)
@@ -0,0 +1,17 @@
+output.. = bin/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               .,\
+               icons/,\
+               splash.bmp,\
+               plugin_customization.ini,\
+               lib/mysql-connector-java-5.1.8-bin.jar,\
+               lib/antlr-runtime-3.1.3.jar,\
+               lib/jna.jar,\
+               lib/sqljet.1.0.0.b616.jar,\
+               lib/svnkit-javahl.jar,\
+               lib/svnkit.jar,\
+               lib/trilead.jar
+javacDefaultEncoding.. = UTF-8
+source.. = src/,\
+           tests/
Index: /trunk/de.ugoe.cs.swe.exercises/exerciseSettings
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/exerciseSettings	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/exerciseSettings	(revision 3)
@@ -0,0 +1,12 @@
+#SVN and other Settings included
+#Tue Oct 13 11:52:50 GMT 2009
+mySQLUsername=xprakt1
+svnUsername=bbaum
+mySQLDb=xprakt1
+svnPassword=ipi8hun9
+mySQLPassword=datenbank
+workingDirectory=exerciseManagementSVN
+svnLocation=https\://www.trex.informatik.uni-goettingen.de/svn/sandbox/trunk/SVNTest
+mySQLcheckSSL=true
+mySQLHost=www.trex.informatik.uni-goettingen.de
+myPDFLatexPath=/usr/bin/pdflatex
Index: /trunk/de.ugoe.cs.swe.exercises/exercises.product
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/exercises.product	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/exercises.product	(revision 3)
@@ -0,0 +1,143 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="Exercises" uid="de.ugoe.cs.swe.exercises.product" id="de.ugoe.cs.swe.exercises.product" application="de.ugoe.cs.swe.exercises.application" useFeatures="false" includeLaunchers="true">
+
+   <aboutInfo>
+      <image path="/de.ugoe.cs.swe.exercise/about.png"/>
+      <text>
+         Another great product brought to you by:
+The Exercise Manager Team
+
+Please report any found bugs to /dev/null
+      </text>
+   </aboutInfo>
+
+   <configIni use="default">
+   </configIni>
+
+   <launcherArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts</vmArgsMac>
+   </launcherArgs>
+
+   <windowImages i16="/de.ugoe.cs.swe.exercise/icons/edit-copy16.png" i48="/de.ugoe.cs.swe.exercise/icons/edit-copy48.png"/>
+
+   <splash
+      location="de.ugoe.cs.swe.exercise"
+      startupProgressRect="10,375,580,15"
+      startupMessageRect="10,360,580,20"
+      startupForegroundColor="000000" />
+   <launcher>
+      <solaris/>
+      <win useIco="false">
+         <bmp/>
+      </win>
+   </launcher>
+
+   <vm>
+   </vm>
+
+   <plugins>
+      <plugin id="com.ibm.icu"/>
+      <plugin id="de.ugoe.cs.swe.exercises"/>
+      <plugin id="javax.servlet"/>
+      <plugin id="net.sourceforge.texlipse"/>
+      <plugin id="org.eclipse.ant.core"/>
+      <plugin id="org.eclipse.compare.core"/>
+      <plugin id="org.eclipse.core.commands"/>
+      <plugin id="org.eclipse.core.contenttype"/>
+      <plugin id="org.eclipse.core.databinding"/>
+      <plugin id="org.eclipse.core.databinding.observable"/>
+      <plugin id="org.eclipse.core.databinding.property"/>
+      <plugin id="org.eclipse.core.expressions"/>
+      <plugin id="org.eclipse.core.filebuffers"/>
+      <plugin id="org.eclipse.core.filesystem"/>
+      <plugin id="org.eclipse.core.filesystem.hpux.PA_RISC" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.hpux.ia64_32" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.linux.ppc" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.linux.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.macosx" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.qnx.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.solaris.sparc" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.filesystem.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.jobs"/>
+      <plugin id="org.eclipse.core.net"/>
+      <plugin id="org.eclipse.core.net.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.net.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.net.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.core.resources"/>
+      <plugin id="org.eclipse.core.resources.compatibility" fragment="true"/>
+      <plugin id="org.eclipse.core.resources.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.core.runtime"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.auth"/>
+      <plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
+      <plugin id="org.eclipse.core.variables"/>
+      <plugin id="org.eclipse.debug.core"/>
+      <plugin id="org.eclipse.debug.ui"/>
+      <plugin id="org.eclipse.ecf"/>
+      <plugin id="org.eclipse.ecf.filetransfer"/>
+      <plugin id="org.eclipse.ecf.identity"/>
+      <plugin id="org.eclipse.ecf.provider.filetransfer"/>
+      <plugin id="org.eclipse.ecf.provider.filetransfer.ssl" fragment="true"/>
+      <plugin id="org.eclipse.ecf.ssl" fragment="true"/>
+      <plugin id="org.eclipse.equinox.app"/>
+      <plugin id="org.eclipse.equinox.common"/>
+      <plugin id="org.eclipse.equinox.concurrent"/>
+      <plugin id="org.eclipse.equinox.p2.artifact.repository"/>
+      <plugin id="org.eclipse.equinox.p2.core"/>
+      <plugin id="org.eclipse.equinox.p2.engine"/>
+      <plugin id="org.eclipse.equinox.p2.jarprocessor"/>
+      <plugin id="org.eclipse.equinox.p2.metadata"/>
+      <plugin id="org.eclipse.equinox.p2.metadata.repository"/>
+      <plugin id="org.eclipse.equinox.p2.repository"/>
+      <plugin id="org.eclipse.equinox.preferences"/>
+      <plugin id="org.eclipse.equinox.registry"/>
+      <plugin id="org.eclipse.equinox.security"/>
+      <plugin id="org.eclipse.equinox.security.macosx" fragment="true"/>
+      <plugin id="org.eclipse.equinox.security.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.help"/>
+      <plugin id="org.eclipse.jface"/>
+      <plugin id="org.eclipse.jface.databinding"/>
+      <plugin id="org.eclipse.jface.text"/>
+      <plugin id="org.eclipse.osgi"/>
+      <plugin id="org.eclipse.osgi.services"/>
+      <plugin id="org.eclipse.swt"/>
+      <plugin id="org.eclipse.swt.carbon.macosx" fragment="true"/>
+      <plugin id="org.eclipse.swt.cocoa.macosx" fragment="true"/>
+      <plugin id="org.eclipse.swt.cocoa.macosx.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.ppc" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.s390" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.s390x" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.linux.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.solaris.sparc" fragment="true"/>
+      <plugin id="org.eclipse.swt.gtk.solaris.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.aix.ppc" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.hpux.PA_RISC" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.hpux.ia64_32" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.linux.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.motif.solaris.sparc" fragment="true"/>
+      <plugin id="org.eclipse.swt.photon.qnx.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
+      <plugin id="org.eclipse.swt.wpf.win32.x86" fragment="true"/>
+      <plugin id="org.eclipse.text"/>
+      <plugin id="org.eclipse.ui"/>
+      <plugin id="org.eclipse.ui.carbon" fragment="true"/>
+      <plugin id="org.eclipse.ui.cocoa" fragment="true"/>
+      <plugin id="org.eclipse.ui.console"/>
+      <plugin id="org.eclipse.ui.editors"/>
+      <plugin id="org.eclipse.ui.forms"/>
+      <plugin id="org.eclipse.ui.ide"/>
+      <plugin id="org.eclipse.ui.views"/>
+      <plugin id="org.eclipse.ui.win32" fragment="true"/>
+      <plugin id="org.eclipse.ui.workbench"/>
+      <plugin id="org.eclipse.ui.workbench.texteditor"/>
+      <plugin id="org.hamcrest.core"/>
+      <plugin id="org.junit4"/>
+   </plugins>
+
+
+</product>
Index: /trunk/de.ugoe.cs.swe.exercises/plugin.xml
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/plugin.xml	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/plugin.xml	(revision 3)
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+   <extension
+         id="application"
+         point="org.eclipse.core.runtime.applications">
+      <application>
+         <run
+               class="de.ugoe.cs.swe.exercises.Application">
+         </run>
+      </application>
+   </extension>
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            name="Exercise"
+            class="de.ugoe.cs.swe.exercises.Perspective"
+            id="de.ugoe.cs.swe.exercises.perspective">
+      </perspective>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            category="de.ugoe.cs.swe.exercises.category"
+            class="de.ugoe.cs.swe.exercises.lecturer.ViewLecturer"
+            icon="icons/user-online16.png"
+            id="de.ugoe.cs.swe.exercises.views.lecturer"
+            name="Lecturer"
+            restorable="true">
+      </view>
+      <view
+            category="de.ugoe.cs.swe.exercises.category"
+            class="de.ugoe.cs.swe.exercises.exercise.ViewExercise"
+            icon="icons/edit-copy16.png"
+            id="de.ugoe.cs.swe.exercises.views.exercise"
+            name="Exercises"
+            restorable="true">
+      </view>
+      <view
+            category="de.ugoe.cs.swe.exercises.category"
+            class="de.ugoe.cs.swe.exercises.lecture.GUITreeView"
+            icon="icons/x-office-address-book16.png"
+            id="de.ugoe.cs.swe.exercises.views.tree"
+            name="Lectures"
+            restorable="true">
+      </view>
+      <category
+            id="de.ugoe.cs.swe.exercises.category"
+            name="Exercises">
+      </category>
+   </extension>
+   <extension
+         point="org.eclipse.ui.perspectiveExtensions">
+      <perspectiveExtension
+            targetID="*">
+         <view
+               closeable="false"
+               id="de.ugoe.cs.swe.exercises.views.lecturer"
+               minimized="false"
+               moveable="false"
+               ratio="0.95f"
+               relationship="fast"
+               showTitle="true"
+               standalone="false"
+               visible="true">
+         </view>
+         <view
+               closeable="false"
+               id="de.ugoe.cs.swe.exercises.views.exercise"
+               minimized="false"
+               moveable="false"
+               ratio="0.95f"
+               relationship="fast"
+               showTitle="true"
+               standalone="false"
+               visible="true">
+         </view>
+         <view
+               closeable="false"
+               id="de.ugoe.cs.swe.exercises.views.tree"
+               minimized="false"
+               moveable="false"
+               ratio="0.95f"
+               relationship="fast"
+               showTitle="true"
+               standalone="false"
+               visible="true">
+         </view>
+      </perspectiveExtension>
+   </extension>
+   <extension
+         point="org.eclipse.ui.commands">
+      <command
+            defaultHandler="de.ugoe.cs.swe.exercises.svn.Settings"
+            id="de.ugoe.cs.swe.exercises.commands.svnSettings"
+            name="SVN Settings">
+      </command>
+   </extension>
+   <extension
+         point="org.eclipse.ui.menus">
+      <menuContribution
+            locationURI="menu:org.eclipse.ui.main.menu">
+         <menu
+               label="Options">
+            <command
+                  commandId="de.ugoe.cs.swe.exercises.commands.svnSettings"
+                  icon="icons/system-run16.png"
+                  label="Settings"
+                  style="push">
+            </command>
+         </menu>
+      </menuContribution>
+   </extension>
+   <extension
+         id="product"
+         point="org.eclipse.core.runtime.products">
+      <product
+            application="de.ugoe.cs.swe.exercises.application"
+            name="Exercises">
+         <property
+               name="appName"
+               value="Exercises">
+         </property>
+         <property
+               name="preferenceCustomization"
+               value="plugin_customization.ini">
+         </property>
+         <property name="startupProgressRect" value="10,375,580,15"/>
+         <property
+               name="windowImages"
+               value="/de.ugoe.cs.swe.exercise/icons/edit-copy16.png,/de.ugoe.cs.swe.exercise/icons/edit-copy48.png">
+         </property>
+         <property
+               name="startupForegroundColor"
+               value="000000">
+         </property>
+         <property
+               name="startupMessageRect"
+               value="10,360,580,20">
+         </property>
+         <property
+               name="aboutImage"
+               value="/de.ugoe.cs.swe.exercise/about.png">
+         </property>
+         <property
+               name="aboutText"
+               value="Another great product brought to you by:&#x0A;The Exercise Manager Team&#x0A;&#x0A;Please report any found bugs to /dev/null">
+         </property>
+      </product>
+   </extension>
+</plugin>
Index: /trunk/de.ugoe.cs.swe.exercises/plugin_customization.ini
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/plugin_customization.ini	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/plugin_customization.ini	(revision 3)
@@ -0,0 +1,1 @@
+org.eclipse.ui/SHOW_PROGRESS_ON_STARTUP = true
Index: /trunk/de.ugoe.cs.swe.exercises/schema/exercises-mysql.sql
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/schema/exercises-mysql.sql	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/schema/exercises-mysql.sql	(revision 3)
@@ -0,0 +1,230 @@
+-- phpMyAdmin SQL Dump
+-- version 3.2.2
+-- http://www.phpmyadmin.net
+--
+-- Host: localhost
+-- Erstellungszeit: 19. Oktober 2009 um 10:53
+-- Server Version: 5.0.51
+-- PHP-Version: 5.2.6-1+lenny3
+
+SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
+
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+
+--
+-- Datenbank: `xprakt1`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `exercise`
+--
+
+CREATE TABLE IF NOT EXISTS `exercise` (
+  `id` int(11) NOT NULL auto_increment,
+  `title` varchar(256) NOT NULL,
+  `complexity` tinyint(4) NOT NULL,
+  `revisionnumber` int(11) NOT NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=288 ;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `exercisesheet`
+--
+
+CREATE TABLE IF NOT EXISTS `exercisesheet` (
+  `id` int(11) NOT NULL auto_increment,
+  `number` int(11) NOT NULL,
+  `complexityvalue` tinyint(4) NOT NULL,
+  `revisionnumber` int(11) NOT NULL,
+  `examination` tinyint(1) NOT NULL default '0',
+  `lectureevent` int(11) NOT NULL,
+  `numOfExercises` int(11) NOT NULL,
+  PRIMARY KEY  (`id`),
+  KEY `lectureevent` (`lectureevent`)
+) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=149 ;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `exercisesheet_exercise`
+--
+
+CREATE TABLE IF NOT EXISTS `exercisesheet_exercise` (
+  `exercisesheet` int(11) NOT NULL,
+  `exercise` int(11) NOT NULL,
+  `revisionnumber` int(11) NOT NULL,
+  UNIQUE KEY `exercisesheet_2` (`exercisesheet`,`exercise`),
+  KEY `exercise` (`exercise`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `keyword_exercise`
+--
+
+CREATE TABLE IF NOT EXISTS `keyword_exercise` (
+  `id` int(11) NOT NULL auto_increment,
+  `word` varchar(30) NOT NULL,
+  `exercise` int(11) NOT NULL,
+  PRIMARY KEY  (`id`),
+  KEY `exercise` (`exercise`)
+) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=245 ;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `keyword_exercisesheet`
+--
+
+CREATE TABLE IF NOT EXISTS `keyword_exercisesheet` (
+  `id` int(11) NOT NULL auto_increment,
+  `word` varchar(30) NOT NULL,
+  `exercisesheet` int(11) NOT NULL,
+  PRIMARY KEY  (`id`),
+  KEY `exercisesheet` (`exercisesheet`)
+) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=134 ;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `keyword_lecture`
+--
+
+CREATE TABLE IF NOT EXISTS `keyword_lecture` (
+  `id` int(11) NOT NULL auto_increment,
+  `word` varchar(30) NOT NULL,
+  `lecture` int(11) NOT NULL,
+  PRIMARY KEY  (`id`),
+  KEY `lecture` (`lecture`)
+) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=229 ;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `lecture`
+--
+
+CREATE TABLE IF NOT EXISTS `lecture` (
+  `id` int(11) NOT NULL auto_increment,
+  `name` varchar(80) NOT NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=94 ;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `lectureevent`
+--
+
+CREATE TABLE IF NOT EXISTS `lectureevent` (
+  `id` int(11) NOT NULL auto_increment,
+  `semester` int(11) NOT NULL,
+  `ss_ws` varchar(2) NOT NULL,
+  `lecture` int(11) NOT NULL,
+  PRIMARY KEY  (`id`),
+  KEY `lecture` (`lecture`)
+) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=162 ;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `lectureevent_lecturer`
+--
+
+CREATE TABLE IF NOT EXISTS `lectureevent_lecturer` (
+  `lectureevent` int(11) NOT NULL,
+  `lecturer` int(11) NOT NULL,
+  UNIQUE KEY `lectureevent_2` (`lectureevent`,`lecturer`),
+  KEY `lecturer` (`lecturer`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `lecturer`
+--
+
+CREATE TABLE IF NOT EXISTS `lecturer` (
+  `id` int(11) NOT NULL auto_increment,
+  `lastname` varchar(30) NOT NULL,
+  `firstname` varchar(30) NOT NULL,
+  `title` varchar(20) NOT NULL,
+  PRIMARY KEY  (`id`)
+) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=111 ;
+
+-- --------------------------------------------------------
+
+--
+-- Tabellenstruktur fÃŒr Tabelle `lecture_exercise`
+--
+
+CREATE TABLE IF NOT EXISTS `lecture_exercise` (
+  `lecture` int(11) NOT NULL,
+  `exercise` int(11) NOT NULL,
+  UNIQUE KEY `lecture_2` (`lecture`,`exercise`),
+  KEY `exercise` (`exercise`)
+) ENGINE=InnoDB DEFAULT CHARSET=latin1;
+
+--
+-- Constraints der exportierten Tabellen
+--
+
+--
+-- Constraints der Tabelle `exercisesheet`
+--
+ALTER TABLE `exercisesheet`
+  ADD CONSTRAINT `exercisesheet_ibfk_1` FOREIGN KEY (`lectureevent`) REFERENCES `lectureevent` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+--
+-- Constraints der Tabelle `exercisesheet_exercise`
+--
+ALTER TABLE `exercisesheet_exercise`
+  ADD CONSTRAINT `exercisesheet_exercise_ibfk_1` FOREIGN KEY (`exercisesheet`) REFERENCES `exercisesheet` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  ADD CONSTRAINT `exercisesheet_exercise_ibfk_2` FOREIGN KEY (`exercise`) REFERENCES `exercise` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+--
+-- Constraints der Tabelle `keyword_exercise`
+--
+ALTER TABLE `keyword_exercise`
+  ADD CONSTRAINT `keyword_exercise_ibfk_1` FOREIGN KEY (`exercise`) REFERENCES `exercise` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+--
+-- Constraints der Tabelle `keyword_exercisesheet`
+--
+ALTER TABLE `keyword_exercisesheet`
+  ADD CONSTRAINT `keyword_exercisesheet_ibfk_1` FOREIGN KEY (`exercisesheet`) REFERENCES `exercisesheet` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+--
+-- Constraints der Tabelle `keyword_lecture`
+--
+ALTER TABLE `keyword_lecture`
+  ADD CONSTRAINT `keyword_lecture_ibfk_1` FOREIGN KEY (`lecture`) REFERENCES `lecture` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+--
+-- Constraints der Tabelle `lectureevent`
+--
+ALTER TABLE `lectureevent`
+  ADD CONSTRAINT `lectureevent_ibfk_1` FOREIGN KEY (`lecture`) REFERENCES `lecture` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+--
+-- Constraints der Tabelle `lectureevent_lecturer`
+--
+ALTER TABLE `lectureevent_lecturer`
+  ADD CONSTRAINT `lectureevent_lecturer_ibfk_1` FOREIGN KEY (`lectureevent`) REFERENCES `lectureevent` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  ADD CONSTRAINT `lectureevent_lecturer_ibfk_2` FOREIGN KEY (`lecturer`) REFERENCES `lecturer` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
+--
+-- Constraints der Tabelle `lecture_exercise`
+--
+ALTER TABLE `lecture_exercise`
+  ADD CONSTRAINT `lecture_exercise_ibfk_1` FOREIGN KEY (`lecture`) REFERENCES `lecture` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
+  ADD CONSTRAINT `lecture_exercise_ibfk_2` FOREIGN KEY (`exercise`) REFERENCES `exercise` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/Activator.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/Activator.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/Activator.java	(revision 3)
@@ -0,0 +1,63 @@
+package de.ugoe.cs.swe.exercises;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "de.ugoe.cs.swe.exercise";
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given
+	 * plug-in relative path
+	 *
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/Application.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/Application.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/Application.java	(revision 3)
@@ -0,0 +1,152 @@
+package de.ugoe.cs.swe.exercises;
+
+import java.io.File;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import org.eclipse.equinox.app.IApplication;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.io.SVNRepository;
+import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+
+import de.ugoe.cs.swe.exercises.exercise.ExerciseSVN;
+import de.ugoe.cs.swe.exercises.misc.Model;
+import de.ugoe.cs.swe.exercises.svn.SettingsDialog;
+
+/**
+ * This class controls all aspects of the application's execution
+ */
+public class Application implements IApplication {
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @seeorg.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.
+	 * IApplicationContext)
+	 */
+	public Object start(IApplicationContext context) {
+		Display display = PlatformUI.createDisplay();
+		SettingsDialog settingsDialog = new SettingsDialog(new Shell());
+		/* try{ */
+		if (!settingsDialog.hasSettings())
+			settingsDialog.open();
+		/*
+		 * } catch (NullPointerException ex){ settingsDialog.open(); } catch
+		 * (IllegalArgumentException ex) { settingsDialog.open(); } catch
+		 * (Exception ex) { settingsDialog.open(); }
+		 */
+		try {
+			DAVRepositoryFactory.setup();
+			SVNURL url = SVNURL
+					.parseURIDecoded(settingsDialog.getSVNLocation());
+			SVNRepository repository = SVNRepositoryFactory.create(url);
+			ISVNAuthenticationManager authManager = SVNWCUtil
+					.createDefaultAuthenticationManager(settingsDialog
+							.getSVNUsername(), settingsDialog.getSVNPassword());
+			((SVNRepository) repository).setAuthenticationManager(authManager);
+			repository.testConnection();
+		} catch (SVNException ex) {
+			settingsDialog.open();
+			try {
+				DAVRepositoryFactory.setup();
+				SVNURL url = SVNURL.parseURIDecoded(settingsDialog
+						.getSVNLocation());
+				SVNRepository repository = SVNRepositoryFactory.create(url);
+				ISVNAuthenticationManager authManager = SVNWCUtil
+						.createDefaultAuthenticationManager(settingsDialog
+								.getSVNUsername(), settingsDialog
+								.getSVNPassword());
+				((SVNRepository) repository)
+						.setAuthenticationManager(authManager);
+				repository.testConnection();
+			} catch (SVNException ex1) {
+				return null;
+			}
+		}
+
+		System.setProperty("javax.net.ssl.trustStorePassword", settingsDialog
+				.getMySQLPassword());
+		String path = Model.class.getProtectionDomain().getCodeSource()
+				.getLocation().getPath();
+		if (path.endsWith("bin/"))
+			path = path.replaceFirst("bin/$", "");
+		path += "keystore";
+		System.setProperty("javax.net.ssl.trustStore", path);
+
+		try {
+			// Step 1: Load the JDBC driver.
+			Class.forName("com.mysql.jdbc.Driver").newInstance();
+			// Step 2: Establish the connection to the database.
+			String url = "jdbc:mysql://" + settingsDialog.getMySQLHost() + "/"
+					+ settingsDialog.getMySQLDb() + "?useSSL="
+					+ String.valueOf(settingsDialog.isMySQLcheckSSL());
+			DriverManager.getConnection(url, settingsDialog
+					.getMySQLUsername(), settingsDialog.getMySQLPassword());
+		} catch (SQLException ex) {
+			settingsDialog.open();
+			try {
+				// Step 1: Load the JDBC driver.
+				Class.forName("com.mysql.jdbc.Driver").newInstance();
+				// Step 2: Establish the connection to the database.
+				String url = "jdbc:mysql://" + settingsDialog.getMySQLHost()
+						+ "/" + settingsDialog.getMySQLDb() + "?useSSL="
+						+ String.valueOf(settingsDialog.isMySQLcheckSSL());
+				DriverManager.getConnection(url,
+						settingsDialog.getMySQLUsername(), settingsDialog
+								.getMySQLPassword());
+			} catch (SQLException ex2) {
+				return null;
+			} catch (Exception ex2) {
+				return null;
+			}
+		} catch (Exception ex2) {
+			return null;
+		}
+
+		File file = new File(System.getProperty("user.home")
+				+ "/.exerciseSettings");
+		if (file.exists()) {
+			try {
+				ExerciseSVN.SVNCheckout();
+				int returnCode = PlatformUI.createAndRunWorkbench(display,
+						new ApplicationWorkbenchAdvisor());
+				if (returnCode == PlatformUI.RETURN_RESTART) {
+					return IApplication.EXIT_RESTART;
+				}
+				return IApplication.EXIT_OK;
+
+			} finally {
+				display.dispose();
+			}
+		}
+
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.equinox.app.IApplication#stop()
+	 */
+	public void stop() {
+		final IWorkbench workbench = PlatformUI.getWorkbench();
+		if (workbench == null)
+			return;
+		final Display display = workbench.getDisplay();
+		display.syncExec(new Runnable() {
+			public void run() {
+				if (!display.isDisposed())
+					workbench.close();
+			}
+		});
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/ApplicationActionBarAdvisor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/ApplicationActionBarAdvisor.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/ApplicationActionBarAdvisor.java	(revision 3)
@@ -0,0 +1,59 @@
+package de.ugoe.cs.swe.exercises;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
+import org.eclipse.ui.application.ActionBarAdvisor;
+import org.eclipse.ui.application.IActionBarConfigurer;
+
+/**
+ * An action bar advisor is responsible for creating, adding, and disposing of
+ * the actions added to a workbench window. Each window will be populated with
+ * new actions.
+ */
+public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
+
+	// Actions - important to allocate these only in makeActions, and then use
+	// them
+	// in the fill methods. This ensures that the actions aren't recreated
+	// when fillActionBars is called with FILL_PROXY.
+	private IWorkbenchAction exitAction;
+    private IWorkbenchAction aboutAction;
+    
+	public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
+		super(configurer);
+	}
+
+
+
+	@Override
+	protected void makeActions(final IWorkbenchWindow window) {
+		// Creates the actions and registers them.
+		// Registering is needed to ensure that key bindings work.
+		// The corresponding commands keybindings are defined in the plugin.xml
+		// file.
+		// Registering also provides automatic disposal of the actions when
+		// the window is closed.
+
+		exitAction = ActionFactory.QUIT.create(window);
+		register(exitAction);
+		aboutAction = ActionFactory.ABOUT.create(window);
+		aboutAction.setText("About");
+		register(aboutAction);
+	}
+
+	@Override
+	protected void fillMenuBar(IMenuManager menuBar) {
+		MenuManager fileMenu = new MenuManager("&File");
+		menuBar.add(fileMenu);
+		fileMenu.add(aboutAction);
+		fileMenu.add(exitAction);
+
+		//MenuManager helpMenu = new MenuManager("&Help");
+		//menuBar.add(helpMenu);
+		
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/ApplicationWorkbenchAdvisor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/ApplicationWorkbenchAdvisor.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/ApplicationWorkbenchAdvisor.java	(revision 3)
@@ -0,0 +1,40 @@
+package de.ugoe.cs.swe.exercises;
+
+import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
+import org.eclipse.ui.application.WorkbenchAdvisor;
+import org.eclipse.ui.application.WorkbenchWindowAdvisor;
+
+public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
+
+	private static final String PERSPECTIVE_ID = "de.ugoe.cs.swe.exercises.perspective";
+
+	@Override
+	public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(
+			IWorkbenchWindowConfigurer configurer) {
+
+		PreferenceManager pm = configurer.getWorkbenchConfigurer()
+				.getWorkbench().getPreferenceManager();
+
+		IPreferenceNode texlipse = pm.find("TexlipsePreferencePage");
+
+		texlipse.remove("TexlipseBuilderPreferencePage");
+		texlipse
+				.remove("net.sourceforge.texlipse.properties.ProjectTemplatesPreferencePage");
+		texlipse.remove("TexlipseViewerSettingsPreferencePage");
+		texlipse.remove("BibtexPreferencePage");
+		texlipse.remove("TexlipseSpellChecker");
+
+		WorkbenchWindowAdvisor advisor = new ApplicationWorkbenchWindowAdvisor(
+				configurer);
+
+		return advisor;
+	}
+
+	@Override
+	public String getInitialWindowPerspectiveId() {
+		return PERSPECTIVE_ID;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/ApplicationWorkbenchWindowAdvisor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/ApplicationWorkbenchWindowAdvisor.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/ApplicationWorkbenchWindowAdvisor.java	(revision 3)
@@ -0,0 +1,29 @@
+package de.ugoe.cs.swe.exercises;
+
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.ui.application.ActionBarAdvisor;
+import org.eclipse.ui.application.IActionBarConfigurer;
+import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
+import org.eclipse.ui.application.WorkbenchWindowAdvisor;
+
+public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
+
+	public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
+		super(configurer);
+	}
+
+	@Override
+	public ActionBarAdvisor createActionBarAdvisor(
+			IActionBarConfigurer configurer) {
+		return new ApplicationActionBarAdvisor(configurer);
+	}
+
+	@Override
+	public void preWindowOpen() {
+		IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
+		configurer.setInitialSize(new Point(1600,1200));
+		configurer.setShowCoolBar(false);
+		configurer.setShowStatusLine(false);
+		configurer.setTitle("The Exercise Manager");
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/Perspective.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/Perspective.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/Perspective.java	(revision 3)
@@ -0,0 +1,17 @@
+package de.ugoe.cs.swe.exercises;
+
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+public class Perspective implements IPerspectiveFactory {
+
+	public void createInitialLayout(IPageLayout layout) {
+		layout.setEditorAreaVisible(false);
+		layout.setFixed(true);
+		IFolderLayout mainfolder = layout.createFolder("mainFolder", IPageLayout.TOP, 0.75f, layout.getEditorArea());
+		mainfolder.addView("de.ugoe.cs.swe.exercises.views.tree");
+		mainfolder.addView("de.ugoe.cs.swe.exercises.views.lecturer");
+		mainfolder.addView("de.ugoe.cs.swe.exercises.views.exercise");
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/Exercise.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/Exercise.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/Exercise.java	(revision 3)
@@ -0,0 +1,467 @@
+package de.ugoe.cs.swe.exercises.exercise;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
+import org.tmatesoft.svn.core.wc.SVNClientManager;
+import org.tmatesoft.svn.core.wc.SVNWCClient;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class Exercise extends Model {
+
+	private String title;
+	private String exerciseText;
+	private String solution;
+	private int revisionnumber;
+	private int complexity;
+
+	@Override
+	protected String getTableName() {
+		return "exercise";
+	}
+
+	public Exercise() {
+		super();
+	}
+
+	public Exercise(String title, String exerciseText, String solution,
+			int revisionnumber, int complexity) {
+		super();
+		this.setTitle(title);
+		this.setExerciseText(exerciseText);
+		this.setSolution(solution);
+		this.setRevisionnumber(revisionnumber);
+		this.setComplexity(complexity);
+	}
+
+	public Exercise(String title, String exerciseText, String solution,
+			int complexity) {
+		super();
+		this.setTitle(title);
+		this.setExerciseText(exerciseText);
+		this.setSolution(solution);
+		this.setRevisionnumber(0);
+		this.setComplexity(complexity);
+	}
+
+	public Exercise(int id, String title, String exerciseText, String solution,
+			int revisionnumber, int complexity) {
+
+		super(id);
+		this.setTitle(title);
+		this.setExerciseText(exerciseText);
+		this.setSolution(solution);
+		this.setRevisionnumber(revisionnumber);
+		this.setComplexity(complexity);
+	}
+
+	public boolean equals(Object other) {
+		if (other instanceof Exercise)
+			return ((Exercise) other).getId() == getId();
+		return super.equals(other);
+	}
+
+	private String getRevisionFileName() {
+		return ExerciseSVN.SVNpathRev + "/exercises/" + this.getId() + ".tex";
+	}
+
+	private String getRevisionSolutionFileName() {
+		return ExerciseSVN.SVNpathRev + "/exercises/" + this.getId()
+				+ "solution.tex";
+	}
+
+	private String getFileName() {
+
+		return ExerciseSVN.SVNpath + "/exercises/" + this.getId() + ".tex";
+	}
+
+	private String getSolutionFileName() {
+		return ExerciseSVN.SVNpath + "/exercises/" + this.getId()
+				+ "solution.tex";
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setSolution(String solution) {
+		this.solution = solution;
+	}
+
+	public String getSolution() {
+		return readFromDisk(true);
+	}
+
+	public String getSolution(int revision) {
+		return readFromDisk(revision, true);
+	}
+
+	public void setRevisionnumber(int revisionnumber) {
+		this.revisionnumber = revisionnumber;
+	}
+
+	public int getRevisionnumber() {
+		return revisionnumber;
+	}
+
+	public void setExerciseText(String exerciseText) {
+		this.exerciseText = exerciseText;
+	}
+
+	public String getExerciseText() {
+
+		return readFromDisk(false);
+
+	}
+
+	public String getExerciseText(int revision) {
+
+		return readFromDisk(revision, false);
+
+	}
+
+	public void setComplexity(int complexity) {
+		this.complexity = complexity;
+	}
+
+	public int getComplexity() {
+		return complexity;
+	}
+
+	public static Exercise getItem(int id) {
+		try {
+			return fromStatement(
+					prepareStatement("SELECT * FROM exercise WHERE id =" + id))
+					.get(0);
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	@Override
+	protected void update() throws SQLException {
+
+		update(false);
+
+	}
+
+	protected void update(boolean updateWithoutSaving) throws SQLException {
+		if (!updateWithoutSaving)
+			this.saveToDisk();
+		PreparedStatement statement;
+		statement = prepareStatement("UPDATE exercise SET title=?,  revisionnumber=?, complexity=? WHERE id=?");
+		statement.setInt(4, this.getId());
+		executeSaveStatement(statement);
+
+	}
+
+	protected void executeSaveStatement(PreparedStatement statement)
+			throws SQLException {
+		statement.setString(1, this.getTitle());
+		statement.setInt(2, this.getRevisionnumber());
+		statement.setInt(3, this.getComplexity());
+		statement.executeUpdate();
+
+	}
+
+	@Override
+	protected PreparedStatement insert() throws SQLException {
+		PreparedStatement statement;
+		statement = prepareStatement("INSERT INTO exercise (title, revisionnumber, complexity) VALUES (?,?,?)");
+		executeSaveStatement(statement);
+
+		return statement;
+	}
+
+	public static ArrayList<Exercise> all() {
+		try {
+			return fromStatement(prepareStatement("SELECT * FROM exercise"));
+		} catch (SQLException e) {
+			System.err.println("Got an exception in Exercise.all()! ");
+			System.err.println(e.getMessage());
+		}
+		return null;
+	}
+
+	public static ArrayList<Exercise> allForLecture(int lectureId) {
+		try {
+			return fromStatement(prepareStatement("SELECT * FROM exercise, lecture_exercise WHERE lecture_exercise.exercise=exercise.id AND lecture_exercise.lecture="
+					+ String.valueOf(lectureId) + ";"));
+		} catch (SQLException e) {
+			System.err.println("Got an exception in Exercise.all()! ");
+			System.err.println(e.getMessage());
+		}
+		return null;
+	}
+
+	public static ArrayList<Exercise> fromStatement(PreparedStatement statement)
+			throws SQLException {
+		ResultSet resultset = statement.executeQuery();
+		ArrayList<Exercise> exercises = new ArrayList<Exercise>();
+		while (resultset.next()) {
+			exercises.add(new Exercise(resultset.getInt("id"), resultset
+					.getString("title"), ExerciseSVN.getTextFromSVN(resultset
+					.getInt("revisionnumber")), ExerciseSVN
+					.getTextFromSVN(resultset.getInt("revisionnumber")),
+					resultset.getInt("revisionnumber"), resultset
+							.getInt("complexity")));
+		}
+		return exercises;
+	}
+
+	public ArrayList<Lecture> getLectures() {
+		try {
+			PreparedStatement statement = prepareStatement("SELECT DISTINCT lecture.* FROM exercise, lecture, lecture_exercise WHERE exercise.id = ? AND exercise.id = lecture_exercise.exercise AND lecture.id = lecture_exercise.lecture ORDER BY id");
+			statement.setInt(1, this.getId());
+			return Lecture.fromStatement(statement);
+		} catch (SQLException e) {
+			System.err
+					.println("Got an exception in ExerciseSheet.getLectureEvents()! ");
+			System.err.println(e.getMessage());
+		}
+		return null;
+	}
+
+	public void addLecture(Lecture lecture) {
+		if (this.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Exercise does not exist in the database, yet");
+		if (lecture.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecture does not exist in the database, yet");
+
+		PreparedStatement statement;
+		try {
+			statement = prepareStatement("INSERT INTO lecture_exercise (exercise, lecture) VALUES (?,?)");
+			statement.setInt(1, this.getId());
+			statement.setInt(2, lecture.getId());
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void removeLecture(Lecture lecture) {
+		if (this.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Exercise does not exist in the database, yet");
+		if (lecture.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecture does not exist in the database, yet");
+
+		PreparedStatement statement;
+		try {
+			statement = prepareStatement("DELETE FROM lecture_exercise WHERE exercise=? AND lecture=?");
+			statement.setInt(1, this.getId());
+			statement.setInt(2, lecture.getId());
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void removeExercise(Exercise exercise) {
+
+		PreparedStatement statement;
+		try {
+			statement = prepareStatement("DELETE FROM exercise WHERE id=?");
+			statement.setInt(1, this.getId());
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	@Override
+	public void _delete() {
+
+		removeExercise(this);
+		DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
+		DAVRepositoryFactory.setup();
+
+		SVNClientManager ourClientManager = SVNClientManager.newInstance(
+				options, ExerciseSVN.getUserName(), ExerciseSVN.getPassWord());
+
+		SVNWCClient ourWCClient = new SVNWCClient(ourClientManager, options);
+
+		File[] file = new File[2];
+		file[0] = new File(getFileName());
+		file[1] = new File(getSolutionFileName());
+
+		for (int i = 0; i < file.length; i++) {
+			try {
+				ourWCClient.doDelete(file[i], true, false);
+			} catch (SVNException e) {
+
+				System.err.println(e);
+			}
+		}
+
+		ExerciseSVN.SVNUpdate();
+		ExerciseSVN.SVNcommit();
+
+		// System.out.println("filesystem delete");
+		// for (int i = 0; i < file.length; i++) {
+		//			
+		// file[i].delete();
+		//			
+		// }
+
+	}
+
+	public String readFromDisk(boolean solution) {
+
+		File file;
+		if (solution == false) {
+			file = new File(this.getFileName());
+
+		} else {
+			file = new File(this.getSolutionFileName());
+		}
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		String line;
+		String temp = "";
+		try {
+			while ((line = br.readLine()) != null) {
+				temp += line + "\n";
+			}
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		return temp;
+
+	}
+
+	public String readFromDisk(int revision, boolean solution) {
+
+		File file;
+		if (solution == false) {
+			file = new File(this.getRevisionFileName());
+		} else {
+			file = new File(this.getRevisionSolutionFileName());
+		}
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new FileReader(file));
+		} catch (FileNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		String line;
+		String temp = "";
+		try {
+			while ((line = br.readLine()) != null) {
+				temp += line + "\n";
+			}
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return temp;
+
+	}
+
+	public void saveToDisk() {
+		File fileFolder = new File(ExerciseSVN.SVNpath + "exercises");
+		fileFolder.mkdirs();
+
+		File file = new File(getFileName());
+		File solFile = new File(getSolutionFileName());
+		BufferedWriter bw;
+		BufferedWriter bwSol;
+		try {
+			bw = new BufferedWriter(new FileWriter(file));
+			bwSol = new BufferedWriter(new FileWriter(solFile));
+			bw.write(this.exerciseText);
+			bw.flush();
+			bw.close();
+			System.out.println("writing to: " + file.getAbsolutePath());
+			bwSol.write(this.solution);
+			bwSol.flush();
+			bwSol.close();
+			System.out.println("writing to: " + solFile.getAbsolutePath());
+		} catch (IOException e1) {
+			System.out.println("Error while writing to disk");
+			e1.printStackTrace();
+		}
+
+		File[] fileArray = new File[2];
+		fileArray[0] = file;
+		fileArray[1] = solFile;
+
+		try {
+
+			this.setRevisionnumber((int) ExerciseSVN.SVNAdd(fileArray));
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (SVNException e) {
+			// TODO Auto-generated catch block
+			System.err.println(e);
+		}
+
+		// int revNumber = (int) ExerciseSVN.SVNcommit();
+		//
+		// if (this.getRevisionnumber() != revNumber && revNumber != -1) {
+		// this.setRevisionnumber(revNumber);
+		//
+		// try {
+		// this.update(true);
+		// } catch (SQLException e) {
+		// // TODO Auto-generated catch block
+		// e.printStackTrace();
+		// }
+
+		// try {
+		// int rev = (int) ExerciseSVN.SVNAdd(solFile);
+		// this.setRevisionnumber(rev);
+		// } catch (Exception e) {
+		//
+		// System.out.println("FILE ALREADY EXISTS");
+		// }
+		//
+		// System.out.println("writing to: " + solFile.getAbsolutePath());
+		//
+		// if (this.getRevisionnumber() != revNumber && revNumber != -1) {
+		// this.setRevisionnumber(revNumber);
+		// try {
+		// this.update(true);
+		// } catch (SQLException e) {
+		// // TODO Auto-generated catch block
+		// e.printStackTrace();
+		// }
+		//
+		// }
+		ExerciseSVN.SVNUpdate();
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseContentProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseContentProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseContentProvider.java	(revision 3)
@@ -0,0 +1,18 @@
+package de.ugoe.cs.swe.exercises.exercise;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+class ExerciseContentProvider implements IStructuredContentProvider {
+
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	}
+
+	public void dispose() {
+	}
+
+	public Object[] getElements(Object parent) {
+		return Exercise.all().toArray();
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseFilter.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseFilter.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseFilter.java	(revision 3)
@@ -0,0 +1,29 @@
+package de.ugoe.cs.swe.exercises.exercise;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+public class ExerciseFilter extends ViewerFilter {
+
+	private String searchString = null;
+
+	public void setSearchText(String s) {
+		// Search must be a substring of the existing value
+		if (s == null || s.length() == 0)
+			this.searchString = null;
+		else
+			this.searchString = ".*" + s + ".*";
+	}
+
+	// Filters only for first and last name of the lecturer, not the title or
+	// ID.
+	@Override
+	public boolean select(Viewer viewer, Object parentElement, Object element) {
+		if (searchString == null || searchString.length() == 0) {
+			return true;
+		}
+		Exercise exercise = (Exercise) element;
+		return (exercise.getTitle().toLowerCase() + " " + exercise
+				.getComplexity()).matches(searchString.toLowerCase());
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseKeywordContentProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseKeywordContentProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseKeywordContentProvider.java	(revision 3)
@@ -0,0 +1,34 @@
+package de.ugoe.cs.swe.exercises.exercise;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+
+class ExerciseKeywordContentProvider implements IStructuredContentProvider {
+
+	private int exerciseId;
+
+	public ExerciseKeywordContentProvider(int exerciseId) {
+		this.exerciseId = exerciseId;
+	}
+
+	public ExerciseKeywordContentProvider() {
+		this.exerciseId = -1;
+	}
+
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	}
+
+	public void dispose() {
+	}
+
+	public Object[] getElements(Object parent) {
+		if (this.exerciseId < 0)
+			return new ArrayList<Exercise>().toArray();
+		return CKeyword.getKeywordsForModel(this.exerciseId, CKeyword.EXERCISE)
+				.toArray();
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseLabelProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseLabelProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseLabelProvider.java	(revision 3)
@@ -0,0 +1,32 @@
+package de.ugoe.cs.swe.exercises.exercise;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+class ExerciseLabelProvider extends LabelProvider implements ITableLabelProvider {
+	public String getColumnText(Object obj, int index) {
+		Exercise exercise = (Exercise) obj;
+
+		switch (index) {
+		case 0:
+			return exercise.getTitle();
+		case 1:
+			return String.valueOf(exercise.getComplexity());
+		}
+
+		return null;
+	}
+
+	public Image getColumnImage(Object obj, int index) {
+		return null;
+	}
+
+	@Override
+	public Image getImage(Object obj) {
+		return PlatformUI.getWorkbench().getSharedImages().getImage(
+				ISharedImages.IMG_OBJ_ELEMENT);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseLecturesContentProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseLecturesContentProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseLecturesContentProvider.java	(revision 3)
@@ -0,0 +1,33 @@
+package de.ugoe.cs.swe.exercises.exercise;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+
+class ExerciseLecturesContentProvider implements IStructuredContentProvider {
+
+	private Exercise exercise;
+
+	public ExerciseLecturesContentProvider(Exercise exercise) {
+		this.exercise = exercise;
+	}
+
+	public ExerciseLecturesContentProvider() {
+		this.exercise = null;
+	}
+
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	}
+
+	public void dispose() {
+	}
+
+	public Object[] getElements(Object parent) {
+		if (this.exercise == null)
+			return new ArrayList<Lecture>().toArray();
+		return this.exercise.getLectures().toArray();
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseSVN.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseSVN.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ExerciseSVN.java	(revision 3)
@@ -0,0 +1,264 @@
+package de.ugoe.cs.swe.exercises.exercise;
+
+import java.io.File;
+import java.io.IOException;
+import org.eclipse.swt.widgets.Shell;
+import org.tmatesoft.svn.core.SVNCommitInfo;
+import org.tmatesoft.svn.core.SVNDepth;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
+import org.tmatesoft.svn.core.wc.SVNClientManager;
+import org.tmatesoft.svn.core.wc.SVNCommitClient;
+import org.tmatesoft.svn.core.wc.SVNCommitPacket;
+import org.tmatesoft.svn.core.wc.SVNRevision;
+import org.tmatesoft.svn.core.wc.SVNUpdateClient;
+import org.tmatesoft.svn.core.wc.SVNWCClient;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+
+import de.ugoe.cs.swe.exercises.misc.FileUtils;
+import de.ugoe.cs.swe.exercises.svn.*;
+
+public class ExerciseSVN {
+	private static SettingsDialog svnSettings = new SettingsDialog(new Shell());
+	private static String url = svnSettings.getSVNLocation();
+	private static String userName = svnSettings.getSVNUsername();
+	private static String passWord = svnSettings.getSVNPassword();
+	public static String SVNpathRev = System.getProperty("user.home") + "/"
+			+ svnSettings.getWorkingDirectory() + "/REVISION";
+	public static String SVNpath = System.getProperty("user.home") + "/"
+			+ svnSettings.getWorkingDirectory() + "/";
+
+	public static void SVNCheckout(int revnumber) {
+
+//		System.out.println("Checked out old revision #" + revnumber);
+		DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
+		DAVRepositoryFactory.setup();
+
+		SVNClientManager ourClientManager = SVNClientManager.newInstance(
+				options, userName, passWord);
+		SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
+
+		File dstPath = new File(SVNpathRev);
+
+		String tmp = Integer.toString(revnumber);
+
+		try {
+
+			updateClient.doCheckout(SVNURL.parseURIDecoded(url), dstPath,
+					SVNRevision.parse(tmp), SVNRevision.parse(tmp),
+					SVNDepth.INFINITY, true);
+		} catch (SVNException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	public static void SVNCheckout() {
+
+		DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
+		DAVRepositoryFactory.setup();
+
+		SVNClientManager ourClientManager = SVNClientManager.newInstance(
+				options, userName, passWord);
+		SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
+
+		File dstPath = new File(SVNpath);
+
+		try {
+
+			updateClient
+					.doCheckout(SVNURL.parseURIDecoded(url), dstPath,
+							SVNRevision.HEAD, SVNRevision.HEAD,
+							SVNDepth.INFINITY, true);
+		} catch (SVNException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	@SuppressWarnings("deprecation")
+	public static long SVNcommit() {
+
+		SVNCommitInfo commitInfo = null;
+
+		DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
+		DAVRepositoryFactory.setup();
+
+		SVNClientManager ourClientManager = SVNClientManager.newInstance(
+				options, userName, passWord);
+
+		SVNCommitClient commitClient = ourClientManager.getCommitClient();
+		File[] fileArray = new File[1];
+		fileArray[0] = new File(SVNpath);
+		SVNCommitPacket commitPacket;
+		try {
+			commitPacket = commitClient.doCollectCommitItems(fileArray, true,
+					true, true);
+
+			// System.out.println(commitPacket);
+			// System.out.println("-");
+			commitInfo = (commitClient.doCommit(commitPacket, true,
+					"added files"));
+			System.out.println(commitInfo);
+		} catch (SVNException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		return commitInfo.getNewRevision();
+
+	}
+
+	public static long SVNAdd(File[] file) throws IOException, SVNException {
+
+		DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
+		DAVRepositoryFactory.setup();
+
+		SVNClientManager ourClientManager = SVNClientManager.newInstance(
+				options, userName, passWord);
+
+		SVNWCClient ourWCClient = new SVNWCClient(ourClientManager, options);
+		ourWCClient.doAdd(file[0], true, false, true, SVNDepth.INFINITY, true,
+				true);
+		ourWCClient.doAdd(file[1], true, false, true, SVNDepth.INFINITY, true,
+				true);
+		ExerciseSVN.SVNUpdate();
+		int revNumber = (int) ExerciseSVN.SVNcommit();
+
+		return revNumber;
+
+	}
+
+	public static void SVNAdd(String oldName, String newName) {
+		if (!oldName.endsWith(".pdf"))
+			oldName += ".pdf";
+		if (!newName.endsWith(".pdf"))
+			newName += ".pdf";
+
+		newName = newName.replaceAll(" ", "_");
+
+		// String mv = "mv " + SVNpath + "exercisesheets/" + oldName + " "
+		// + SVNpath + "exercisesheets/" + newName;
+
+		FileUtils.renameFile(oldName, newName);
+
+		// try {
+		// Runtime.getRuntime().exec(mv);
+		// } catch (IOException e1) {
+		// System.err.println(e1);
+		// }
+
+		File file = new File(SVNpath + "exercisesheets/" + newName);
+
+		DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
+		DAVRepositoryFactory.setup();
+
+		SVNClientManager ourClientManager = SVNClientManager.newInstance(
+				options, userName, passWord);
+
+		SVNWCClient ourWCClient = new SVNWCClient(ourClientManager, options);
+		try {
+			ourWCClient.doAdd(file, true, false, true, SVNDepth.INFINITY, true,
+					false);
+		} catch (SVNException e) {
+			// TODO Auto-generated catch block
+			System.err.println(e);
+		}
+
+		ExerciseSVN.SVNUpdate();
+		ExerciseSVN.SVNcommit();
+
+	}
+
+	public static void SVNUpdate() {
+		DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
+		DAVRepositoryFactory.setup();
+
+		SVNClientManager ourClientManager = SVNClientManager.newInstance(
+				options, userName, passWord);
+		SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
+
+		File dstPath = new File(SVNpath);
+
+		try {
+			updateClient.doUpdate(dstPath, SVNRevision.HEAD, SVNDepth.INFINITY,
+					true, true);
+		} catch (SVNException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	@SuppressWarnings("deprecation")
+	public static void SVNExport(File file, int revisionnumber) {
+		DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
+		DAVRepositoryFactory.setup();
+
+		SVNClientManager ourClientManager = SVNClientManager.newInstance(
+				options, userName, passWord);
+		SVNUpdateClient updateClient = ourClientManager.getUpdateClient();
+
+		File dstPath = new File(SVNpath);
+
+		SVNRevision svnrev = SVNRevision.create(revisionnumber);
+
+		try {
+			updateClient.doExport(file, dstPath, SVNRevision.HEAD, svnrev,
+					"/n", true, true);
+		} catch (SVNException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
+	public static void setPassWord(String passWord) {
+		ExerciseSVN.passWord = passWord;
+	}
+
+	public static String getPassWord() {
+		return passWord;
+	}
+
+	public static void setUserName(String userName) {
+		ExerciseSVN.userName = userName;
+	}
+
+	public static String getUserName() {
+		return userName;
+	}
+
+	public static void setUrl(String url) {
+		ExerciseSVN.url = url;
+	}
+
+	public static String getUrl() {
+		return url;
+	}
+
+	public static String getTextFromSVN(int revisionnumber) {
+		// TODO Auto-generated method stub
+		return "";
+	}
+
+	// public static void SVNInit() {
+	//		
+	// System.out.println("pre init");
+	// ExerciseSVN.SVNCheckout();
+	// System.out.println("checkout done");
+	// ArrayList<Exercise > exercises = Exercise.all();
+	// System.out.println("arrayklist done");
+	// for (int i=0;i<exercises.size();i++){
+	//			
+	// System.out.println("id von: " + i + ": " +exercises.get(i).getId());
+	// exercises.get(i).saveToDisk();
+	// System.out.println("savetodisk");
+	// exercises.get(i).readFromDisk();
+	// System.out.println("readfromdisk");
+	// }
+	// System.out.println("init done");
+	//		
+	// }
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ViewExercise.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ViewExercise.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercise/ViewExercise.java	(revision 3)
@@ -0,0 +1,543 @@
+package de.ugoe.cs.swe.exercises.exercise;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.FileStoreEditorInput;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileStore;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.custom.CCombo;
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.lecture.LectureLabelProvider;
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+import de.ugoe.cs.swe.exercises.misc.KeywordLabelProvider;
+import de.ugoe.cs.swe.exercises.svn.SettingsDialog;
+
+import org.eclipse.swt.custom.SashForm;
+
+public class ViewExercise extends ViewPart {
+	private Text searchText;
+	private Text complexityText;
+	private Text titleText;
+	private Text exerciseText;
+	private Text solutionText;
+	private Text keywordText;
+	private Table exercisesTable;
+	private Table keywordsTable;
+	private ExerciseFilter filter;
+	private Exercise selected = null;
+	private Table lecturesTable;
+	private ArrayList<Lecture> lectures;
+	private CCombo lectureCombo;
+	private TableViewer lecturesTableViewer, keywordsTableViewer,
+			exercisesTableViewer;
+
+	public ViewExercise() {
+
+	}
+
+	@Override
+	public void createPartControl(Composite parent) {
+		final ProgressMonitorDialog progress = new ProgressMonitorDialog(
+				getSite().getShell());
+		progress.open();
+
+		parent.setLayout(new GridLayout(4, false));
+		Label lblSearch = new Label(parent, SWT.NONE);
+		lblSearch.setText("Search:");
+		searchText = new Text(parent, SWT.BORDER);
+
+		GridData gridData = new GridData(SWT.FILL, SWT.CENTER, false, false, 1,
+				1);
+		gridData.widthHint = 311;
+		searchText.setLayoutData(gridData);
+		new Label(parent, SWT.NONE);
+		new Label(parent, SWT.NONE);
+
+		exercisesTableViewer = new TableViewer(parent, SWT.BORDER
+				| SWT.FULL_SELECTION);
+		exercisesTable = exercisesTableViewer.getTable();
+		exercisesTable.setHeaderVisible(true);
+		{
+			GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, false, true,
+					2, 1);
+			gridData_1.minimumWidth = 400;
+			gridData_1.widthHint = 400;
+			exercisesTable.setLayoutData(gridData_1);
+		}
+
+		TableColumn tblclmnTitle = new TableColumn(exercisesTable, SWT.LEFT);
+		tblclmnTitle.setWidth(260);
+		tblclmnTitle.setText("Title");
+
+		TableColumn tblclmnComplexity = new TableColumn(exercisesTable,
+				SWT.NONE);
+		tblclmnComplexity.setResizable(false);
+		tblclmnComplexity.setWidth(20);
+		tblclmnComplexity.setText("Complexity");
+		exercisesTableViewer.setContentProvider(new ExerciseContentProvider());
+		exercisesTableViewer.setLabelProvider(new ExerciseLabelProvider());
+		exercisesTableViewer.setInput(getSite());
+		filter = new ExerciseFilter();
+		exercisesTableViewer.addFilter(filter);
+		exercisesTable.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				TableItem item = (TableItem) e.item;
+				selectExercise((Exercise) item.getData());
+				keywordText.setText("");
+				lectureCombo.deselectAll();
+				keywordsTableViewer.refresh();
+			}
+		});
+
+		searchText.addKeyListener(new KeyAdapter() {
+			@Override
+			public void keyReleased(KeyEvent e) {
+				filter.setSearchText(searchText.getText());
+				exercisesTableViewer.refresh();
+				selectExercise(selected);
+			}
+		});
+
+		Composite group = new Composite(parent, SWT.NONE);
+		group.setLayout(new GridLayout(2, false));
+		gridData = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 2);
+		gridData.widthHint = 600;
+		gridData.heightHint = 411;
+		group.setLayoutData(gridData);
+
+		Composite composite_1 = new Composite(group, SWT.NONE);
+		composite_1.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false,
+				false, 1, 1));
+		composite_1.setLayout(new GridLayout(2, false));
+		Label lblTitle = new Label(composite_1, SWT.RIGHT);
+		lblTitle.setText("Title:");
+		titleText = new Text(composite_1, SWT.BORDER);
+		titleText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
+				1, 1));
+		Label lblComplexity = new Label(composite_1, SWT.RIGHT);
+		lblComplexity.setText("Complexity:");
+		complexityText = new Text(composite_1, SWT.BORDER);
+		complexityText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+		new Label(group, SWT.NONE);
+
+		lecturesTableViewer = new TableViewer(group, SWT.BORDER
+				| SWT.FULL_SELECTION);
+		lecturesTable = lecturesTableViewer.getTable();
+		lecturesTable.setHeaderVisible(true);
+		{
+			GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, true, true,
+					1, 1);
+			gridData_1.heightHint = 168;
+			lecturesTable.setLayoutData(gridData_1);
+		}
+
+		TableColumn tblclmnLectures = new TableColumn(lecturesTable, SWT.NONE);
+		tblclmnLectures.setWidth(100);
+		tblclmnLectures.setText("Lectures");
+
+		lecturesTableViewer
+				.setContentProvider(new ExerciseLecturesContentProvider());
+		lecturesTableViewer.setLabelProvider(new LectureLabelProvider());
+		lecturesTableViewer.setInput(getSite());
+
+		Button btnDeleteLecture = new Button(group, SWT.NONE);
+		btnDeleteLecture.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM,
+				false, false, 1, 1));
+		btnDeleteLecture.setText("Remove lecture");
+
+		lectureCombo = new CCombo(group, SWT.BORDER);
+		lectureCombo.setEditable(false);
+		lectureCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+
+		Button btnAddLecture = new Button(group, SWT.NONE);
+		btnAddLecture.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+		btnAddLecture.setText("Add lecture");
+
+		keywordsTableViewer = new TableViewer(group, SWT.BORDER
+				| SWT.FULL_SELECTION | SWT.MULTI);
+
+		keywordsTable = keywordsTableViewer.getTable();
+		keywordsTable.setHeaderVisible(true);
+		{
+			GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, true, true,
+					1, 1);
+			gridData_1.heightHint = 121;
+			keywordsTable.setLayoutData(gridData_1);
+		}
+
+		TableColumn tblclmnKeywords = new TableColumn(keywordsTable, SWT.NONE);
+		tblclmnKeywords.setWidth(100);
+		tblclmnKeywords.setText("Keywords");
+		keywordsTableViewer
+				.setContentProvider(new ExerciseKeywordContentProvider());
+		keywordsTableViewer.setLabelProvider(new KeywordLabelProvider());
+		keywordsTableViewer.setInput(getSite());
+
+		Button btnDeleteKeywords = new Button(group, SWT.NONE);
+		btnDeleteKeywords.addSelectionListener(new SelectionAdapter() {
+			@SuppressWarnings("unchecked")
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				StructuredSelection sel = ((StructuredSelection) keywordsTableViewer
+						.getSelection());
+				if (sel.isEmpty())
+					return;
+				Iterator<CKeyword> keywordsIterator = sel.iterator();
+				while (keywordsIterator.hasNext()) {
+					CKeyword keyword = keywordsIterator.next();
+					CKeyword.deleteKey(keyword.getKeyId(), CKeyword.EXERCISE);
+				}
+
+				keywordsTableViewer.refresh();
+			}
+		});
+		btnDeleteKeywords.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM,
+				false, false, 1, 1));
+		btnDeleteKeywords.setText("Delete keyword");
+
+		Composite composite = new Composite(group, SWT.NONE);
+		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
+				1, 1));
+		GridLayout gridLayout = new GridLayout(1, false);
+		gridLayout.marginHeight = 0;
+		gridLayout.marginWidth = 0;
+		composite.setLayout(gridLayout);
+
+		keywordText = new Text(composite, SWT.BORDER);
+		keywordText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true,
+				false, 1, 1));
+
+		Button btnAddKeyword = new Button(group, SWT.NONE);
+		btnAddKeyword.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (selected == null || keywordText.getText().length() == 0)
+					return;
+				CKeyword.insertKey(new CKeyword(keywordText.getText(), selected
+						.getId()), CKeyword.EXERCISE);
+				keywordText.setText("");
+				keywordText.setFocus();
+				keywordsTableViewer.refresh();
+			}
+		});
+		btnAddKeyword.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+		btnAddKeyword.setText("Add keyword");
+
+		Label lblAufgabentext = new Label(group, SWT.NONE);
+		lblAufgabentext.setText("Exercise:");
+		new Label(group, SWT.NONE);
+
+		exerciseText = new Text(group, SWT.BORDER | SWT.WRAP | SWT.READ_ONLY);
+		gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
+		gridData.heightHint = 156;
+		exerciseText.setLayoutData(gridData);
+
+		Label lblMusterlsung = new Label(group, SWT.NONE);
+		lblMusterlsung.setText("Solution:");
+		new Label(group, SWT.NONE);
+
+		solutionText = new Text(group, SWT.BORDER | SWT.WRAP | SWT.READ_ONLY);
+		gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
+		gridData.heightHint = 160;
+		solutionText.setLayoutData(gridData);
+
+		Button btnEditText = new Button(group, SWT.NONE);
+		btnEditText.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
+				false, 1, 1));
+		btnEditText.setText("Edit exercise");
+		btnEditText.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				SettingsDialog settings = new SettingsDialog(new Shell());
+				PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+						.getActivePage().setEditorAreaVisible(true);
+				File file = new File(System.getProperty("user.home") + "/"
+						+ settings.getWorkingDirectory() + "/exercises/"
+						+ String.valueOf(selected.getId()) + "solution.tex");
+				if (file != null) {
+					IWorkbenchPage page = PlatformUI.getWorkbench()
+							.getActiveWorkbenchWindow().getActivePage();
+					try {
+						IFileStore fileStore = EFS.getStore(file.toURI());
+						page.openEditor(new FileStoreEditorInput(fileStore),
+								"net.sourceforge.texlipse.TexEditor");
+					} catch (CoreException ex) {
+						ex.printStackTrace();
+					}
+				} else if (file != null) {
+					String msg = "File is null: " + file.getName();
+					MessageDialog.openWarning(null, "Problem", msg);
+				}
+
+				file = new File(String.valueOf(System.getProperty("user.home")
+						+ "/" + settings.getWorkingDirectory() + "/exercises/"
+						+ selected.getId())
+						+ ".tex");
+				if (file != null) {
+					IWorkbenchPage page = PlatformUI.getWorkbench()
+							.getActiveWorkbenchWindow().getActivePage();
+					try {
+						IFileStore fileStore = EFS.getStore(file.toURI());
+						page.openEditor(new FileStoreEditorInput(fileStore),
+								"net.sourceforge.texlipse.TexEditor");
+					} catch (CoreException ex) {
+						ex.printStackTrace();
+					}
+				} else if (file != null) {
+					String msg = "File is null: " + file.getName();
+					MessageDialog.openWarning(null, "Problem", msg);
+				}
+			}
+		});
+
+		Button btnSave = new Button(group, SWT.NONE);
+		btnSave.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				if (selected == null)
+					return;
+
+				boolean validComplexity = true;
+				int complexity = -1;
+				try {
+					complexity = Integer.parseInt(complexityText.getText());
+				} catch (Exception exception) {
+				}
+				validComplexity = complexity <= 10 && complexity >= 0;
+
+				if (titleText.getText().length() == 0) {
+					MessageBox validationMessageBox = new MessageBox(getSite()
+							.getShell(), SWT.OK);
+					validationMessageBox.setText("Invalid form data");
+					validationMessageBox
+							.setMessage("Please enter an excercise title.");
+					validationMessageBox.open();
+					return;
+				}
+				if (!validComplexity) {
+					MessageBox validationMessageBox = new MessageBox(getSite()
+							.getShell(), SWT.OK);
+					validationMessageBox.setText("Invalid form data");
+					validationMessageBox
+							.setMessage("Please enter a valid complexity (number between 0 and 10).");
+					validationMessageBox.open();
+					return;
+				}
+
+				PlatformUI.getWorkbench().getActiveWorkbenchWindow()
+						.getActivePage().setEditorAreaVisible(false);
+				IWorkbenchPage page = PlatformUI.getWorkbench()
+						.getActiveWorkbenchWindow().getActivePage();
+				page.closeAllEditors(true);
+
+				selected.setTitle(titleText.getText());
+				selected.setComplexity(complexity);
+				selected.setSolution(selected.getSolution());
+				selected.setExerciseText(selected.getExerciseText());
+
+				progress.open();
+				selected.save();
+				progress.close();
+				exercisesTableViewer.refresh();
+				lecturesTableViewer.refresh();
+				keywordsTableViewer.refresh();
+
+				selectExercise(selected);
+			}
+		});
+
+		gridData = new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1);
+		gridData.widthHint = 93;
+		btnSave.setLayoutData(gridData);
+		btnSave.setText("Save");
+		selectNth(0, exercisesTableViewer, keywordsTableViewer);
+
+		keywordText.addKeyListener(new KeyAdapter() {
+			@Override
+			public void keyReleased(KeyEvent key) {
+				if (key.keyCode == SWT.LF || key.keyCode == SWT.CR) {
+					CKeyword.insertKey(new CKeyword(0, keywordText.getText(),
+							selected.getId()), CKeyword.EXERCISE);
+					keywordText.setText("");
+					keywordText.setFocus();
+					keywordsTableViewer.refresh();
+				}
+			}
+		});
+
+		btnAddLecture.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (selected == null || lectureCombo.getSelectionIndex() < 0)
+					return;
+				selected.addLecture(lectures.get(lectureCombo
+						.getSelectionIndex()));
+				lectureCombo.deselectAll();
+				lecturesTableViewer.refresh();
+			}
+		});
+		btnDeleteLecture.addSelectionListener(new SelectionAdapter() {
+			@SuppressWarnings("unchecked")
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				StructuredSelection sel = ((StructuredSelection) lecturesTableViewer
+						.getSelection());
+				if (sel.isEmpty() || selected == null)
+					return;
+				Iterator<Lecture> lectureIterator = sel.iterator();
+				while (lectureIterator.hasNext()) {
+					Lecture lecture = lectureIterator.next();
+					selected.removeLecture(lecture);
+				}
+
+				lecturesTableViewer.refresh();
+			}
+		});
+
+		SashForm sashForm = new SashForm(parent, SWT.NONE);
+		sashForm.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false,
+				2, 1));
+
+		Button btnAddExercise = new Button(sashForm, SWT.NONE);
+		btnAddExercise.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				Exercise exercise = new Exercise("New exercise", "", "", 5);
+				progress.open();
+				exercise.save();
+				progress.close();
+				exercisesTableViewer.refresh();
+				selectExercise(exercise);
+			}
+		});
+		btnAddExercise.setText("Add Exercise");
+
+		Button btnDeleteExercise = new Button(sashForm, SWT.CENTER);
+		btnDeleteExercise.addSelectionListener(new SelectionAdapter() {
+			@SuppressWarnings("unchecked")
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				int index = indexOfExercise(selected);
+				StructuredSelection sel = ((StructuredSelection) exercisesTableViewer
+						.getSelection());
+
+				if (!sel.isEmpty()) {
+
+					MessageBox deleteMessageBox = new MessageBox(getSite()
+							.getShell(), SWT.YES | SWT.NO);
+					deleteMessageBox.setText("Delete");
+					deleteMessageBox
+							.setMessage("Do you really want to delete this exercise?");
+
+					if (deleteMessageBox.open() == SWT.YES) {
+						progress.open();
+						for (Iterator<Exercise> iterator = sel.iterator(); iterator
+								.hasNext();) {
+							Exercise delexercise = iterator.next();
+							delexercise.delete();
+						}
+						progress.close();
+					}
+
+				}
+				exercisesTableViewer.refresh();
+				selectNth(index, exercisesTableViewer, keywordsTableViewer);
+			}
+		});
+		btnDeleteExercise.setText("Delete Exercise");
+		sashForm.setWeights(new int[] { 1, 1 });
+
+		progress.close();
+	}
+
+	@SuppressWarnings("unchecked")
+	public void selectNth(int index, final TableViewer tableViewer_1_1,
+			final TableViewer keywordsTableViewer) {
+		if (tableViewer_1_1.getTable().getItemCount() > 0) {
+			if (index < 0)
+				index = 0;
+			if (tableViewer_1_1.getTable().getItemCount() <= index)
+				index = tableViewer_1_1.getTable().getItemCount() - 1;
+			tableViewer_1_1.getTable().select(index);
+			StructuredSelection sel = ((StructuredSelection) tableViewer_1_1
+					.getSelection());
+			Iterator<Exercise> iterator = sel.iterator();
+			selectExercise(iterator.next());
+		}
+	}
+
+	@Override
+	public void setFocus() {
+
+	}
+
+	public int indexOfExercise(Exercise exercise) {
+		for (int i = 0; i < exercisesTableViewer.getTable().getItemCount(); i++) {
+			if (((Exercise) exercisesTableViewer.getElementAt(i)).getId() == exercise
+					.getId())
+				return i;
+		}
+		return -1;
+	}
+
+	public void selectExercise(Exercise exercise) {
+
+		lectures = Lecture.all();
+		lectureCombo.removeAll();
+		for (Lecture lecture : lectures) {
+			lectureCombo.add(lecture.getName());
+		}
+
+		for (int i = 0; i < exercisesTableViewer.getTable().getItemCount(); i++) {
+			if (((Exercise) exercisesTableViewer.getElementAt(i)).getId() == exercise
+					.getId()) {
+				exercisesTableViewer.getTable().select(i);
+				selected = exercise;
+				titleText.setText(selected.getTitle());
+				complexityText
+						.setText(String.valueOf(selected.getComplexity()));
+				// exerciseText.setText(selected.getExerciseText());
+				exerciseText.setText(selected.readFromDisk(false));
+				solutionText.setText(selected.readFromDisk(true));
+				keywordsTableViewer
+						.setContentProvider(new ExerciseKeywordContentProvider(
+								selected.getId()));
+				lecturesTableViewer
+						.setContentProvider(new ExerciseLecturesContentProvider(
+								selected));
+				return;
+			}
+		}
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheet.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheet.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheet.java	(revision 3)
@@ -0,0 +1,318 @@
+package de.ugoe.cs.swe.exercises.exercisesheet;
+
+import java.io.File;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
+import org.tmatesoft.svn.core.wc.SVNClientManager;
+import org.tmatesoft.svn.core.wc.SVNWCClient;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.exercise.ExerciseSVN;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class ExerciseSheet extends Model {
+	private int number, revisionNumber, complexityValue, lectureEventId,
+			exerciseMaxRevision, numOfExercises;
+	private boolean examination;
+
+	@Override
+	protected String getTableName() {
+		return "exercisesheet";
+	}
+
+	public static class OutOfRangeException extends RuntimeException {
+		private static final long serialVersionUID = 1L;
+
+		public OutOfRangeException() {
+			super();
+		}
+
+		public OutOfRangeException(String message) {
+			super(message);
+		}
+	}
+
+	public ExerciseSheet(int id, int number, int revisionNumber,
+			int complexityValue, boolean examination, LectureEvent lectureEvent, int numOfExercises) {
+		super(id);
+		this.number = number;
+		this.revisionNumber = revisionNumber;
+		this.setComplexityValue(complexityValue);
+		this.examination = examination;
+		this.lectureEventId = lectureEvent.getId();
+		this.numOfExercises = numOfExercises;
+	}
+
+	public ExerciseSheet(int number, int revisionNumber, int complexityValue,
+			boolean examination, LectureEvent lectureEvent, int numOfExercises) {
+		super();
+		this.number = number;
+		this.revisionNumber = revisionNumber;
+		this.setComplexityValue(complexityValue);
+		this.examination = examination;
+		this.lectureEventId = lectureEvent.getId();
+		this.numOfExercises = numOfExercises;
+	}
+	
+	public ExerciseSheet(LectureEvent lectureEvent) {
+		super();
+		this.number = 1;
+		this.numOfExercises = 5;
+		this.setComplexityValue(20);
+		this.revisionNumber = -1;
+		this.lectureEventId = lectureEvent.getId();
+		this.examination = false;
+	}
+
+	public LectureEvent getLectureEvent() {
+		return LectureEvent.get(lectureEventId);
+	}
+
+	public void setLectureEvent(LectureEvent lectureEvent) {
+		this.lectureEventId = lectureEvent.getId();
+	}
+
+	public int getNumber() {
+		return number;
+	}
+
+	public void setNumber(int number) {
+		this.number = number;
+	}
+
+	public int getRevisionNumber() {
+		return revisionNumber;
+	}
+
+	public void setRevisionNumber(int revisionNumber) {
+		this.revisionNumber = revisionNumber;
+	}
+
+	public int getComplexityValue() {
+		return complexityValue;
+	}
+
+	public void setComplexityValue(int complexityValue) {
+		// if (complexityValue < 0 || complexityValue > 10)
+		// throw new OutOfRangeException(
+		// "Complexity value must be between 0 and 10.");
+		this.complexityValue = complexityValue;
+	}
+
+	public boolean isExamination() {
+		return examination;
+	}
+
+	public void setExamination(boolean examination) {
+		this.examination = examination;
+	}
+
+	@Override
+	protected void update() throws SQLException {
+		PreparedStatement statement = prepareStatement("UPDATE exercisesheet SET number=?, examination=?, revisionnumber=?, complexityvalue=?, lectureevent=?, numOfExercises=? WHERE id=?");
+		statement.setInt(7, this.getId());
+		executeSaveQuery(statement);
+	}
+
+	@Override
+	protected PreparedStatement insert() throws SQLException {
+		PreparedStatement statement = prepareStatement("INSERT INTO exercisesheet (number, examination, revisionnumber, complexityvalue, lectureevent, numOfExercises) VALUES (?,?,?,?,?,?)");
+		executeSaveQuery(statement);
+		return statement;
+	}
+
+	protected void executeSaveQuery(PreparedStatement statement)
+			throws SQLException {
+		statement.setInt(1, this.getNumber());
+		statement.setBoolean(2, this.isExamination());
+		statement.setInt(3, this.returnMaxRevision());
+//		statement.setInt(3, this.getRevisionNumber());
+		statement.setInt(4, this.getComplexityValue());
+		if (this.getLectureEvent().getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"LectureEvent does not exist in the database, yet");
+		statement.setInt(5, this.lectureEventId);
+		statement.setInt(6, this.numOfExercises);
+		statement.executeUpdate();
+	}
+
+	public static ArrayList<ExerciseSheet> all() {
+		try {
+			return fromStatement(prepareStatement("SELECT * FROM exercisesheet ORDER BY number DESC"));
+		} catch (SQLException e) {
+			System.err.println("Got an exception in Lecture.all()! ");
+			System.err.println(e.getMessage());
+		}
+		return null;
+	}
+
+	public static ExerciseSheet getItem(int id) {
+		try {
+			return fromStatement(
+					prepareStatement("SELECT * FROM exercisesheet WHERE id ="
+							+ id)).get(0);
+		} catch (SQLException e) {
+			System.err.println("Got an exception in Lecture.all()! ");
+			System.err.println(e.getMessage());
+		}
+		return null;
+	}
+
+	public static ArrayList<ExerciseSheet> fromStatement(
+			PreparedStatement statement) throws SQLException {
+		ResultSet resultset = statement.executeQuery();
+		ArrayList<ExerciseSheet> lectures = new ArrayList<ExerciseSheet>();
+		while (resultset.next()) {
+			lectures.add(new ExerciseSheet(resultset.getInt("id"), resultset
+					.getInt("number"), resultset.getInt("revisionnumber"),
+					resultset.getInt("complexityvalue"), resultset
+							.getBoolean("examination"), LectureEvent
+							.get(resultset.getInt("lectureevent")), resultset.getInt("numOfExercises")));
+		}
+		return lectures;
+	}
+
+	public int getNumOfExercises() {
+		return numOfExercises;
+	}
+
+	public void setNumOfExercises(int numOfExercises) {
+		this.numOfExercises = numOfExercises;
+	}
+
+	public ArrayList<Exercise> getExercises() {
+		try {
+			PreparedStatement statement = prepareStatement("SELECT DISTINCT exercise.* FROM exercisesheet, exercise, exercisesheet_exercise WHERE exercisesheet.id = ? AND exercisesheet.id = exercisesheet_exercise.exercisesheet AND exercise.id = exercisesheet_exercise.exercise ORDER BY id");
+			statement.setInt(1, this.getId());
+			return Exercise.fromStatement(statement);
+		} catch (SQLException e) {
+			System.err
+					.println("Got an exception in ExerciseSheet.getExercises()! ");
+			System.err.println(e.getMessage());
+		}
+		return null;
+	}
+
+	public void setExerciseMaxRevision(int exerciseMaxRevision) {
+		this.exerciseMaxRevision = exerciseMaxRevision;
+	}
+
+	public int getExerciseMaxRevision() {
+		return exerciseMaxRevision;
+	}
+
+	public void addExercise(Exercise exercise) {
+		if (this.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"ExerciseSheet does not exist in the database, yet");
+		if (exercise.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecture event does not exist in the database, yet");
+
+		PreparedStatement statement;
+		try {
+			statement = prepareStatement("INSERT INTO exercisesheet_exercise (exercisesheet, exercise, revisionnumber) VALUES (?,?,?)");
+			statement.setInt(1, this.getId());
+			statement.setInt(2, exercise.getId());
+			statement.setInt(3, exercise.getRevisionnumber());
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void removeExercise(Exercise exercise) {
+		if (this.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecture does not exist in the database, yet");
+		if (exercise.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecture event does not exist in the database, yet");
+
+		PreparedStatement statement;
+		try {
+			statement = prepareStatement("DELETE FROM exercisesheet_exercise WHERE exercisesheet=? AND exercise=?");
+			statement.setInt(1, this.getId());
+			statement.setInt(2, exercise.getId());
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	public static void deleteDuplicates(int id) {
+		PreparedStatement statement;
+		try {
+			statement = prepareStatement("DELETE FROM exercisesheet_exercise WHERE exercisesheet=?");
+			statement.setInt(1, id);
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public int returnMaxRevision() {
+		PreparedStatement statement;
+		int temp = 0, max = 0;
+		try {
+			if(this.getExercises().size()<=0) return -1;
+			statement = prepareStatement("SELECT revisionnumber FROM exercisesheet_exercise WHERE exercisesheet=?");
+			statement.setInt(1, this.getId());
+			// statement.executeUpdate();
+			ResultSet resultset = statement.executeQuery();
+			resultset.next();
+			max = resultset.getInt("revisionnumber");
+			while (resultset.next()) {
+				temp = resultset.getInt("revisionnumber");
+				if (temp > max)
+					max = temp;
+			}
+			return max;
+		} catch (SQLException e) {
+			e.printStackTrace();
+			
+		}
+
+		return -1;
+	}
+	
+
+	public static void delete(File file) {
+
+		DefaultSVNOptions options = SVNWCUtil.createDefaultOptions(false);
+		DAVRepositoryFactory.setup();
+
+		SVNClientManager ourClientManager = SVNClientManager.newInstance(
+				options, ExerciseSVN.getUserName(), ExerciseSVN.getPassWord());
+
+		SVNWCClient ourWCClient = new SVNWCClient(ourClientManager, options);
+
+		
+				try {
+					ourWCClient.doDelete(file, true, false);
+				} catch (SVNException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			
+		
+	ExerciseSVN.SVNUpdate();
+		ExerciseSVN.SVNcommit();
+
+		// System.out.println("filesystem delete");
+		// for (int i = 0; i < file.length; i++) {
+		//			
+		// file[i].delete();
+		//			
+		// }
+
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetAddDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetAddDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetAddDialog.java	(revision 3)
@@ -0,0 +1,220 @@
+package de.ugoe.cs.swe.exercises.exercisesheet;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+
+public class ExerciseSheetAddDialog extends TitleAreaDialog {
+
+	private Text editNumber;
+	private Text editRevision;
+	private Text editMaxComplexity;
+	private int comboresultIsExam;
+	private int comboresultLectureEvent;
+	private int[] exerciseSheet = {-1, -1, -1, -1, -1};
+	int[] lectureEventsListId;
+	private ArrayList<LectureEvent> lectureEvents = new ArrayList<LectureEvent>();
+	private Shell shell;
+	public int[] getExerciseSheet() {
+		return exerciseSheet;
+	}
+
+	public LectureEvent getComboResultLectureEvent() {
+		return lectureEvents.get(comboresultLectureEvent);
+	}
+	
+	public ExerciseSheetAddDialog(Shell parentShell) {
+		super(parentShell);
+		super.setShellStyle(0);
+		this.shell = parentShell;
+		shell.setEnabled(false);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		parent.getShell().setSize(650, 350);
+		int x = shell.getLocation().x + (shell.getSize().x - parent.getShell().getSize().x)/2;
+		int y = shell.getLocation().y + (shell.getSize().y - parent.getShell().getSize().y)/2;
+		parent.getShell().setLocation(x, y);
+		
+		Control contents = super.createContents(parent);
+		setTitle("Add a new exercise sheet");
+		setMessage("Please enter all the data for the new exercise sheet",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label labelNumber = new Label(parent, SWT.NONE);
+		labelNumber.setText("Number");
+		Text textboxNumber = new Text(parent, SWT.BORDER);
+		textboxNumber.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textboxNumber.addListener(SWT.Verify, new Listener() {
+		      public void handleEvent(Event e) {
+		        String string = e.text;
+		        char[] chars = new char[string.length()];
+		        string.getChars(0, chars.length, chars, 0);
+		        for (int i = 0; i < chars.length; i++) {
+		          if (!('0' <= chars[i] && chars[i] <= '9')) {
+		            e.doit = false;
+		            return;
+		          }
+		        }
+		      }
+		    });
+		editNumber = textboxNumber;
+		
+		Label labelRevision = new Label(parent, SWT.NONE);
+		labelRevision.setText("Revision");
+		Text textboxRevision = new Text(parent, SWT.BORDER);
+		textboxRevision.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textboxRevision.addListener(SWT.Verify, new Listener() {
+		      public void handleEvent(Event e) {
+		        String string = e.text;
+		        char[] chars = new char[string.length()];
+		        string.getChars(0, chars.length, chars, 0);
+		        for (int i = 0; i < chars.length; i++) {
+		          if (!('0' <= chars[i] && chars[i] <= '9')) {
+		            e.doit = false;
+		            return;
+		          }
+		        }
+		      }
+		    });
+		editRevision = textboxRevision;
+		
+		Label labelMaxComplexity = new Label(parent, SWT.NONE);
+		labelMaxComplexity.setText("Desired Complexity:");
+		Text textboxMaxComplexity = new Text(parent, SWT.BORDER);
+		textboxMaxComplexity.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textboxMaxComplexity.addListener(SWT.Verify, new Listener() {
+		      public void handleEvent(Event e) {
+		        String string = e.text;
+		        char[] chars = new char[string.length()];
+		        string.getChars(0, chars.length, chars, 0);
+		        for (int i = 0; i < chars.length; i++) {
+		          if (!('0' <= chars[i] && chars[i] <= '9')) {
+		            e.doit = false;
+		            return;
+		          }
+		        }
+		      }
+		    });
+		editMaxComplexity = textboxMaxComplexity;
+
+		Label labelIsExam = new Label(parent, SWT.NONE);
+		labelIsExam.setText("Is this an exam?");
+
+		final Combo comboIsExam = new Combo(parent, SWT.READ_ONLY);
+		comboIsExam.setItems(new String[] { "No", "Yes" });
+		comboIsExam.setSize(200, 200);
+
+		comboIsExam.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				comboresultIsExam = comboIsExam.getSelectionIndex();
+
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				comboresultIsExam = -1;
+			}
+		});
+
+		Label labelLecture = new Label(parent, SWT.NONE);
+		labelLecture.setText("LectureEvent");
+		lectureEvents = LectureEvent.all();
+		String[] lecturesList = new String[lectureEvents.toArray().length];
+		lectureEventsListId = new int[lectureEvents.toArray().length];
+
+		for (int i = 0; i < lecturesList.length; i++) {
+			lecturesList[i] = (lectureEvents.get(i).getLecture().getName() + ", " + lectureEvents.get(i).getIsSummerSemester() + " " + lectureEvents.get(i).getSemester() );
+			lectureEventsListId[i] = lectureEvents.get(i).getId();
+		}
+
+		final Combo comboLecture = new Combo(parent, SWT.READ_ONLY);
+		comboLecture.setItems(lecturesList);
+		comboLecture.setSize(200, 200);
+		comboLecture.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				comboresultLectureEvent = comboLecture.getSelectionIndex();
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				comboresultLectureEvent = -1;
+			}
+		});
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button buttonOk = new Button(parent, SWT.PUSH);
+		buttonOk.setText("OK");
+		buttonOk.setFont(JFaceResources.getDialogFont());
+		buttonOk.setLayoutData(buttonlayout);
+		buttonOk.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				if (editNumber.getText().length() != 0 ) {
+					exerciseSheet[0] = Integer.parseInt(editNumber.getText());
+					exerciseSheet[1] = Integer.parseInt(editRevision.getText());
+					exerciseSheet[2] = Integer.parseInt(editMaxComplexity.getText());
+					exerciseSheet[3] = comboresultIsExam;
+					exerciseSheet[4] = lectureEventsListId[comboresultLectureEvent];
+
+					shell.setEnabled(true);
+					close();
+
+				} else {
+					setErrorMessage("Please fill out all the data");
+				}
+			}
+		});
+		Button buttonCancel = new Button(parent, SWT.PUSH);
+		buttonCancel.setText("Cancel");
+		buttonCancel.setFont(JFaceResources.getDialogFont());
+		buttonCancel.setLayoutData(buttonlayout);
+		buttonCancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				shell.setEnabled(true);
+				close();
+			}
+		});
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetComposite.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetComposite.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetComposite.java	(revision 3)
@@ -0,0 +1,506 @@
+package de.ugoe.cs.swe.exercises.exercisesheet;
+
+import java.awt.Desktop;
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Label;
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.exercise.ExerciseSVN;
+import de.ugoe.cs.swe.exercises.lecture.GUITreeView;
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+import de.ugoe.cs.swe.exercises.misc.KeywordsCompositeExtender;
+
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSource;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTarget;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.DropTargetEvent;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.custom.SashForm;
+
+public class ExerciseSheetComposite extends Composite {
+
+	private ExerciseSheet selected = null;
+	private KeywordsCompositeExtender keywordsExtender;
+	private Text sheetNumberText;
+	private Text complexityText;
+	private Table currentExercisesTable;
+	private Table possibleExercisesTable;
+	private Label lectureEventLabel;
+	private Button examinationCheck;
+	private TableColumn currentTitle;
+	private TableColumn currentComplexity;
+	private TableColumn possibleTitle;
+	private TableColumn possibleComplexity;
+	private Group group;
+	private SashForm sashForm;
+	private Button generateButton;
+	private Button pdfButton;
+	private Label lblOfExercises;
+	private Text numOfExercisesText;
+	private Button delPDF;
+	private SashForm sashForm_1;
+	private Button previewButton;
+	private Button solutionButton;
+
+	class ExerciseDragger implements DragSourceListener {
+		Table viewer;
+		ExerciseSheetComposite composite;
+		String data;
+		boolean remove;
+
+		public ExerciseDragger(ExerciseSheetComposite composite, Table viewer,
+				boolean remove) {
+			this.viewer = viewer;
+			this.composite = composite;
+			this.remove = remove;
+		}
+
+		public void dragStart(DragSourceEvent event) {
+			event.doit = (selected != null);
+		}
+
+		public void dragSetData(DragSourceEvent event) {
+			data = "";
+			TableItem[] sel = viewer.getSelection();
+
+			for (int i = 0; i < sel.length; i++) {
+				Exercise exercise = (Exercise) sel[i].getData();
+				data += String.valueOf(exercise.getId()) + ",";
+			}
+
+			event.data = data;
+		}
+
+		public void dragFinished(DragSourceEvent event) {
+			if (event.detail == DND.DROP_MOVE && remove) {
+				String[] exerciseList = data.split(",");
+				Exercise itemToDelete;
+				for (int i = 0; i < exerciseList.length; i++) {
+					itemToDelete = Exercise.getItem(Integer
+							.parseInt(exerciseList[i]));
+					selected.removeExercise(itemToDelete);
+				}
+				composite.refreshData();
+			}
+		}
+	}
+
+	class ExerciseDropper extends DropTargetAdapter {
+		ExerciseSheetComposite composite;
+		boolean add;
+
+		public ExerciseDropper(ExerciseSheetComposite composite, boolean add) {
+			this.composite = composite;
+			this.add = add;
+		}
+
+		public void dragOver(DropTargetEvent event) {
+			event.feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_SELECT;
+		}
+
+		public void drop(DropTargetEvent event) {
+			if (event.data == null) {
+				event.detail = DND.DROP_NONE;
+				return;
+			}
+			if (!add)
+				return;
+			String[] exerciseList = ((String) event.data).split(",");
+			Exercise itemToAdd;
+			for (int i = 0; i < exerciseList.length; i++) {
+				itemToAdd = Exercise.getItem(Integer.parseInt(exerciseList[i]));
+				selected.addExercise(itemToAdd);
+			}
+			composite.refreshData();
+		}
+	}
+
+	/**
+	 * Create the composite.
+	 * 
+	 * @param this
+	 * @param style
+	 */
+	public ExerciseSheetComposite(Composite parent, int style) {
+		super(parent, SWT.NONE);
+		setLayout(new GridLayout(4, true));
+
+		group = new Group(this, SWT.NONE);
+		group.setLayout(new GridLayout(2, false));
+		group.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false,
+				2, 6));
+
+		Label sheetLabel = new Label(group, SWT.NONE);
+		sheetLabel.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false,
+				true, 1, 1));
+		sheetLabel.setText("Sheet #");
+
+		sheetNumberText = new Text(group, SWT.BORDER);
+		sheetNumberText.setLayoutData(new GridData(SWT.LEFT, SWT.BOTTOM, false,
+				false, 1, 1));
+
+		lectureEventLabel = new Label(group, SWT.NONE);
+		lectureEventLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
+				false, false, 2, 1));
+		lectureEventLabel.setText("Lecture Event");
+
+		Label complexityLabel = new Label(group, SWT.NONE);
+		complexityLabel.setText("maximal complexity:");
+
+		complexityText = new Text(group, SWT.BORDER);
+
+		lblOfExercises = new Label(group, SWT.NONE);
+		lblOfExercises.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
+				false, 1, 1));
+		lblOfExercises.setText("# of exercises");
+
+		numOfExercisesText = new Text(group, SWT.BORDER);
+		numOfExercisesText.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER,
+				true, false, 1, 1));
+
+		examinationCheck = new Button(group, SWT.CHECK);
+		examinationCheck.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				selected.setExamination(examinationCheck.getSelection());
+			}
+		});
+		examinationCheck.setSelection(true);
+		examinationCheck.setText("is Examination");
+		new Label(group, SWT.NONE);
+
+		sashForm = new SashForm(group, SWT.NONE);
+		sashForm.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, false, false,
+				2, 1));
+
+		final Shell shell = parent.getShell();
+		pdfButton = new Button(sashForm, SWT.NONE);
+		pdfButton.setText("Sheet to PDF");
+		pdfButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				FileDialog fd = new FileDialog(shell, SWT.SAVE);
+				fd.setText("Save exercise sheet");
+				String[] filterExt = { "*.pdf" };
+				fd.setFilterExtensions(filterExt);
+				String path = fd.open();
+				String newFileName = selected.getLectureEvent().getLecture()
+						.getName()
+						+ " Blatt "
+						+ selected.getNumber()
+						+ " "
+						+ selected.getLectureEvent().getSemesterString()
+						+ String.valueOf(selected.getLectureEvent()
+								.getSemester());
+				PdfGenerator.generatePdf(selected, path, true, true);
+				ExerciseSVN.SVNAdd(fd.getFileName(), newFileName);
+
+				ExerciseSheetPDFDialog dialog = new ExerciseSheetPDFDialog(
+						shell, path);
+
+				dialog.open();
+
+			}
+		});
+
+		solutionButton = new Button(sashForm, SWT.NONE);
+		solutionButton.setText("Solutionsheet to PDF");
+		solutionButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				FileDialog fd = new FileDialog(shell, SWT.SAVE);
+				fd.setText("Save solution sheet");
+				String[] filterExt = { "*.pdf" };
+				fd.setFilterExtensions(filterExt);
+				String path = fd.open();
+				String newFileName = selected.getLectureEvent().getLecture()
+						.getName()
+						+ " Blatt "
+						+ selected.getNumber()
+						+ " LÃSUNG "
+						+ selected.getLectureEvent().getSemesterString()
+						+ String.valueOf(selected.getLectureEvent()
+								.getSemester());
+				PdfGenerator.generatePdf(selected, path, true, false);
+				ExerciseSVN.SVNAdd(fd.getFileName(), newFileName);
+
+				ExerciseSheetPDFDialog dialog = new ExerciseSheetPDFDialog(
+						shell, path);
+
+				dialog.open();
+
+			}
+		});
+
+		sashForm.setWeights(new int[] { 1, 1 });
+
+		sashForm_1 = new SashForm(group, SWT.NONE);
+		sashForm_1.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 2, 1));
+
+		delPDF = new Button(sashForm_1, SWT.NONE);
+		delPDF.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				String path = selected.getLectureEvent().getLecture().getName()
+						+ " Blatt "
+						+ selected.getNumber()
+						+ " "
+						+ selected.getLectureEvent().getSemesterString()
+						+ String.valueOf(selected.getLectureEvent()
+								.getSemester());
+
+				String pathSol = selected.getLectureEvent().getLecture()
+						.getName()
+						+ " Blatt "
+						+ selected.getNumber()
+						+ " LÃSUNG "
+						+ selected.getLectureEvent().getSemesterString()
+						+ String.valueOf(selected.getLectureEvent()
+								.getSemester());
+
+				File fileTest = new File(ExerciseSVN.SVNpath
+						+ "exercisesheets/" + path.replaceAll(" ", "_")
+						+ ".pdf");
+				File fileTestSol = new File(ExerciseSVN.SVNpath
+						+ "exercisesheets/" + pathSol.replaceAll(" ", "_")
+						+ ".pdf");
+
+				if (fileTest.exists() || fileTestSol.exists()) {
+					ExerciseSheetPDFDeleteDialog dialog = new ExerciseSheetPDFDeleteDialog(
+							shell, path, pathSol);
+					dialog.open();
+				} else {
+					ExerciseSheetErrorDialog error = new ExerciseSheetErrorDialog(
+							shell);
+					error.open();
+				}
+			}
+		});
+		delPDF.setText("Remove PDF revision");
+
+		previewButton = new Button(sashForm_1, SWT.NONE);
+		previewButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				PdfGenerator.generatePdf(selected, System
+						.getProperty("java.io.tmpdir")
+						+ "/tempPDFfileForPreview.pdf", false, true);
+				try {
+					Desktop d = Desktop.getDesktop();
+					d.open(new File(System.getProperty("java.io.tmpdir")
+							+ "/tempPDFfileForPreview.pdf"));
+
+				} catch (IOException e1) {
+					System.err.println(e1);
+				}
+
+			}
+		});
+		previewButton.setText("PDF preview");
+
+		sashForm_1.setWeights(new int[] { 1, 1 });
+		complexityText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				selected.setComplexityValue((int) Integer
+						.parseInt(complexityText.getText()));
+
+			}
+		});
+		sheetNumberText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				// TODO: Ueberpruefung, ob die Eingabe eine Zahl war
+				selected.setNumber((int) Integer.parseInt(sheetNumberText
+						.getText()));
+				GUITreeView.getTree().getSelection()[0].setText("Sheet "
+						+ sheetNumberText.getText());
+			}
+		});
+
+		Composite keywordComposite = new Composite(this, SWT.NONE);
+		keywordComposite.setLayout(new GridLayout(2, false));
+		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 6);
+		gridData.heightHint = 186;
+		keywordComposite.setLayoutData(gridData);
+		keywordsExtender = new KeywordsCompositeExtender(keywordComposite,
+				CKeyword.EXERCISESHEET);
+		gridData.heightHint = 306;
+
+		Label currentExerciseLabel = new Label(this, SWT.NONE);
+		currentExerciseLabel.setText("current Exercises:");
+
+		generateButton = new Button(this, SWT.NONE);
+		generateButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+		generateButton.addSelectionListener(new SelectionAdapter() {
+
+			public void widgetSelected(SelectionEvent e) {
+				ExerciseSheet.deleteDuplicates(selected.getId());
+				generateSheet();
+				refreshData();
+				save();
+			}
+		});
+		generateButton.setText("Generate Exercises");
+
+		Label possibleExerciseLabel = new Label(this, SWT.NONE);
+		possibleExerciseLabel.setText("possible Exercises:");
+		new Label(this, SWT.NONE);
+
+		currentExercisesTable = new Table(this, SWT.BORDER | SWT.FULL_SELECTION);
+		currentExercisesTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
+				false, true, 2, 1));
+		currentExercisesTable.setHeaderVisible(true);
+		currentExercisesTable.setLinesVisible(true);
+
+		currentTitle = new TableColumn(currentExercisesTable, SWT.NONE);
+		currentTitle.setWidth(200);
+		currentTitle.setText("Title");
+
+		currentComplexity = new TableColumn(currentExercisesTable, SWT.NONE);
+		currentComplexity.setResizable(false);
+		currentComplexity.setWidth(20);
+		currentComplexity.setText("Complexity");
+
+		possibleExercisesTable = new Table(this, SWT.BORDER
+				| SWT.FULL_SELECTION);
+		possibleExercisesTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
+				true, true, 2, 1));
+		possibleExercisesTable.setHeaderVisible(true);
+		possibleExercisesTable.setLinesVisible(true);
+
+		possibleTitle = new TableColumn(possibleExercisesTable, SWT.NONE);
+		possibleTitle.setWidth(200);
+		possibleTitle.setText("Title");
+
+		possibleComplexity = new TableColumn(possibleExercisesTable, SWT.NONE);
+		possibleComplexity.setResizable(false);
+		possibleComplexity.setWidth(20);
+		possibleComplexity.setText("Complexity");
+
+		Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
+		int operations = DND.DROP_MOVE;
+
+		final DragSource sourceCurrent = new DragSource(currentExercisesTable,
+				operations);
+		sourceCurrent.setTransfer(types);
+		sourceCurrent.addDragListener(new ExerciseDragger(this,
+				currentExercisesTable, true));
+
+		DropTarget targetPossible = new DropTarget(possibleExercisesTable,
+				operations);
+		targetPossible.setTransfer(types);
+		targetPossible.addDropListener(new ExerciseDropper(this, false));
+
+		final DragSource sourcePossible = new DragSource(
+				possibleExercisesTable, operations);
+		sourcePossible.setTransfer(types);
+		sourcePossible.addDragListener(new ExerciseDragger(this,
+				possibleExercisesTable, false));
+
+		DropTarget targetCurrent = new DropTarget(currentExercisesTable,
+				operations);
+		targetCurrent.setTransfer(types);
+		targetCurrent.addDropListener(new ExerciseDropper(this, true));
+	}
+
+	public void load(ExerciseSheet exerciseSheet) {
+		this.selected = exerciseSheet;
+		refreshData();
+	}
+
+	public void save() {
+		if (this.selected == null)
+			return;
+		selected.setNumber(Integer.parseInt(sheetNumberText.getText()));
+		selected.setNumOfExercises(Integer.parseInt(numOfExercisesText
+				.getText()));
+		selected.save();
+	}
+
+	public void refreshData() {
+		ExerciseSheet exerciseSheet = this.selected;
+		keywordsExtender.load(exerciseSheet);
+		sheetNumberText.setText("" + exerciseSheet.getNumber());
+		complexityText.setText("" + exerciseSheet.getComplexityValue());
+		numOfExercisesText.setText(String.valueOf(exerciseSheet
+				.getNumOfExercises()));
+		examinationCheck.setSelection(exerciseSheet.isExamination());
+		lectureEventLabel.setText(exerciseSheet.getLectureEvent().getLecture()
+				.getName()
+				+ " "
+				+ exerciseSheet.getLectureEvent().getSemesterString()
+				+ exerciseSheet.getLectureEvent().getSemester());
+
+		ArrayList<Exercise> exercises = exerciseSheet.getExercises();
+		TableItem item;
+		currentExercisesTable.removeAll();
+		for (int i = 0; i < exercises.size(); i++) {
+			item = new TableItem(currentExercisesTable, SWT.NONE);
+			item.setData(exercises.get(i));
+			item.setText(0, exercises.get(i).getTitle());
+			item.setText(1, "" + exercises.get(i).getComplexity());
+		}
+		SheetGenerator possibleExercisesGenerator = new SheetGenerator(selected
+				.getLectureEvent(), CKeyword.getKeywordsForModel(selected
+				.getId(), CKeyword.EXERCISESHEET));
+
+		ArrayList<Exercise> possibleExercises = possibleExercisesGenerator
+				.getValidExercises();
+
+		possibleExercises.removeAll(exercises);
+		possibleExercisesTable.removeAll();
+		for (Exercise exercise : possibleExercises) {
+			item = new TableItem(possibleExercisesTable, SWT.NONE);
+			item.setData(exercise);
+			item.setText(0, exercise.getTitle());
+			item.setText(1, "" + exercise.getComplexity());
+		}
+
+	}
+
+	@Override
+	protected void checkSubclass() {
+		// Disable the check that prevents subclassing of SWT components
+	}
+
+	private void generateSheet() {
+		ExerciseSheet exerciseSheet = selected;
+		SheetGenerator generator = new SheetGenerator(exerciseSheet
+				.getComplexityValue(), exerciseSheet.getLectureEvent(),
+				CKeyword.getKeywordsForModel(exerciseSheet.getId(),
+						CKeyword.EXERCISESHEET), Integer
+						.parseInt(numOfExercisesText.getText()));
+		ArrayList<Exercise> exerciseList = generator.generateExercises();
+		for (int i = 0; i < exerciseList.size(); i++) {
+			exerciseSheet.addExercise(exerciseList.get(i));
+		}
+		exerciseSheet.setExerciseMaxRevision(exerciseSheet.returnMaxRevision());
+
+		exerciseSheet.save();
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetErrorDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetErrorDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetErrorDialog.java	(revision 3)
@@ -0,0 +1,80 @@
+package de.ugoe.cs.swe.exercises.exercisesheet;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+public class ExerciseSheetErrorDialog extends TitleAreaDialog {
+
+	private Shell shell;
+
+	public ExerciseSheetErrorDialog(Shell parentShell) {
+		super(parentShell);
+		super.setShellStyle(0);
+		this.shell = parentShell;
+		shell.setEnabled(false);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Control contents = super.createContents(parent);
+		setTitle("Error");
+		setMessage("An Error has occured!", IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		parent.getShell().setSize(270, 180);
+		int x = shell.getLocation().x
+				+ (shell.getSize().x - parent.getShell().getSize().x) / 2;
+		int y = shell.getLocation().y
+				+ (shell.getSize().y - parent.getShell().getSize().y) / 2;
+		parent.getShell().setLocation(x, y);
+
+		GridLayout layout = new GridLayout(SWT.CENTER, false);
+		layout.numColumns = 1;
+		parent.setLayout(layout);
+		Label labelTitle = new Label(parent, SWT.CENTER);
+		labelTitle.setAlignment(SWT.CENTER);
+		labelTitle.setText("Files not found!");
+
+		// GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		// gd.horizontalSpan = 1;
+		// gd.verticalAlignment = SWT.CENTER;
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 1;
+
+		GridData buttonlayout = new GridData(SWT.CENTER, SWT.CENTER, true, true);
+		buttonlayout.minimumWidth = 200;
+		Button buttonOk = new Button(parent, SWT.PUSH);
+		buttonOk.setAlignment(SWT.CENTER);
+		buttonOk.setText("OK");
+		buttonOk.setFont(JFaceResources.getDialogFont());
+		buttonOk.setLayoutData(buttonlayout);
+		buttonOk.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				shell.setEnabled(true);
+				close();
+
+			}
+		});
+
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetPDFDeleteDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetPDFDeleteDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetPDFDeleteDialog.java	(revision 3)
@@ -0,0 +1,115 @@
+package de.ugoe.cs.swe.exercises.exercisesheet;
+
+import java.io.File;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import de.ugoe.cs.swe.exercises.exercise.ExerciseSVN;
+
+public class ExerciseSheetPDFDeleteDialog extends TitleAreaDialog {
+
+	private String lectureName;
+	private Shell shell;
+	private static String fileName;
+	private static String fileNameSol;
+
+	public String getLecture() {
+		return lectureName;
+	}
+
+	public ExerciseSheetPDFDeleteDialog(Shell parentShell, String file,
+			String solFile) {
+		super(parentShell);
+		super.setShellStyle(0);
+		ExerciseSheetPDFDeleteDialog.fileName = file;
+		ExerciseSheetPDFDeleteDialog.fileNameSol = solFile;
+		this.shell = parentShell;
+		shell.setEnabled(false);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Control contents = super.createContents(parent);
+		setTitle("PDF deletion");
+		setMessage("Removes the PDFs from the Repository.",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		parent.getShell().setSize(500, 170);
+		int x = shell.getLocation().x
+				+ (shell.getSize().x - parent.getShell().getSize().x) / 2;
+		int y = shell.getLocation().y
+				+ (shell.getSize().y - parent.getShell().getSize().y) / 2;
+		parent.getShell().setLocation(x, y);
+
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label label1 = new Label(parent, SWT.NONE);
+		label1.setText("Do you really want to delete the PDF?");
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button button = new Button(parent, SWT.PUSH);
+		button.setText("OK");
+		button.setFont(JFaceResources.getDialogFont());
+		button.setLayoutData(buttonlayout);
+		button.addSelectionListener(new SelectionAdapter() {
+
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				File file = new File(ExerciseSVN.SVNpath + "/exercisesheets/"
+						+ fileName.replaceAll(" ", "_") + ".pdf");
+				File solFile = new File(ExerciseSVN.SVNpath
+						+ "/exercisesheets/" + fileNameSol.replaceAll(" ", "_")
+						+ ".pdf");
+
+				if (file.exists())
+					ExerciseSheet.delete(file);
+				if (solFile.exists())
+					ExerciseSheet.delete(solFile);
+				shell.setEnabled(true);
+				close();
+
+			}
+		});
+		Button cancel = new Button(parent, SWT.PUSH);
+		cancel.setText("Cancel");
+		cancel.setFont(JFaceResources.getDialogFont());
+		cancel.setLayoutData(buttonlayout);
+		cancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				shell.setEnabled(true);
+				close();
+			}
+		});
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetPDFDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetPDFDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/ExerciseSheetPDFDialog.java	(revision 3)
@@ -0,0 +1,118 @@
+package de.ugoe.cs.swe.exercises.exercisesheet;
+
+
+import java.awt.Desktop;
+import java.io.File;
+import java.io.IOException;
+
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+
+public class ExerciseSheetPDFDialog extends TitleAreaDialog {
+
+	private String lectureName;
+	private Shell shell;
+	private static String fileName;
+
+	public String getLecture() {
+		return lectureName;
+	}
+
+	public ExerciseSheetPDFDialog(Shell parentShell, String file) {
+		super(parentShell);
+		super.setShellStyle(0);
+		if(!file.endsWith(".pdf"))
+			file += ".pdf";
+		ExerciseSheetPDFDialog.fileName = file;
+		this.shell = parentShell;
+		shell.setEnabled(false);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Control contents = super.createContents(parent);
+		setTitle("PDF created");
+		File file = new File(fileName);
+		setMessage("PDF " + file.getName() + " was successfully created.",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		parent.getShell().setSize(500, 170);
+		int x = shell.getLocation().x
+				+ (shell.getSize().x - parent.getShell().getSize().x) / 2;
+		int y = shell.getLocation().y
+				+ (shell.getSize().y - parent.getShell().getSize().y) / 2;
+		parent.getShell().setLocation(x, y);
+
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label label1 = new Label(parent, SWT.NONE);
+		label1.setText("Do you want to open the PDF?");
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button button = new Button(parent, SWT.PUSH);
+		button.setText("OK");
+		button.setFont(JFaceResources.getDialogFont());
+		button.setLayoutData(buttonlayout);
+		button.addSelectionListener(new SelectionAdapter() {
+			
+
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				try {
+					Desktop d = Desktop.getDesktop();
+					d.open(new File(ExerciseSheetPDFDialog.fileName));
+				} catch (IOException e1) {
+					// TODO Auto-generated catch block
+					System.err.println(e1);
+				}
+				shell.setEnabled(true);
+				close();
+
+			}
+		});
+		Button cancel = new Button(parent, SWT.PUSH);
+		cancel.setText("Cancel");
+		cancel.setFont(JFaceResources.getDialogFont());
+		cancel.setLayoutData(buttonlayout);
+		cancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				shell.setEnabled(true);
+				close();
+			}
+		});
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/LecturerAddDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/LecturerAddDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/LecturerAddDialog.java	(revision 3)
@@ -0,0 +1,123 @@
+package de.ugoe.cs.swe.exercises.exercisesheet;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class LecturerAddDialog extends TitleAreaDialog {
+
+	private Text addTitle;
+	private Text addFirstName;
+	private Text addLastName;
+	private String[] lecturer = new String[4];
+	private Shell shell;
+
+	public String[] getLecturer() {
+		return lecturer;
+	}
+
+	public LecturerAddDialog(Shell parentShell) {
+		super(parentShell);
+		super.setShellStyle(0);
+		this.shell = parentShell;
+		shell.setEnabled(false);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Control contents = super.createContents(parent);
+		setTitle("Add a new lecturer");
+		setMessage("Please input all the data for the new lecturer",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		parent.getShell().setSize(500, 240);
+		int x = shell.getLocation().x + (shell.getSize().x - parent.getShell().getSize().x)/2;
+		int y = shell.getLocation().y + (shell.getSize().y - parent.getShell().getSize().y)/2;
+		parent.getShell().setLocation(x, y);
+		
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label labelTitle = new Label(parent, SWT.NONE);
+		labelTitle.setText("Title");
+		Text textboxTitle = new Text(parent, SWT.BORDER);
+		textboxTitle.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		addTitle = textboxTitle;
+		Label labelFirstName = new Label(parent, SWT.NONE);
+		labelFirstName.setText("First name");
+		Text textboxFirstName = new Text(parent, SWT.BORDER);
+		textboxFirstName.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		addFirstName = textboxFirstName;
+		Label labelLastName = new Label(parent, SWT.NONE);
+		labelLastName.setText("Last name");
+		Text textboxLastName = new Text(parent, SWT.BORDER);
+		textboxLastName.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		addLastName = textboxLastName;
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button buttonOk = new Button(parent, SWT.PUSH);
+		buttonOk.setText("OK");
+		buttonOk.setFont(JFaceResources.getDialogFont());
+		buttonOk.setLayoutData(buttonlayout);
+		buttonOk.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (addTitle.getText().length() != 0
+						&& addFirstName.getText().length() != 0
+						&& addLastName.getText().length() != 0) {
+					lecturer[0] = "1";
+					lecturer[1] = addTitle.getText();
+					lecturer[2] = addFirstName.getText();
+					lecturer[3] = addLastName.getText();
+					shell.setEnabled(true);
+					close();
+
+				} else {
+					setErrorMessage("Please fill out all the data");
+				}
+			}
+		});
+		Button buttonCancel = new Button(parent, SWT.PUSH);
+		buttonCancel.setText("Cancel");
+		buttonCancel.setFont(JFaceResources.getDialogFont());
+		buttonCancel.setLayoutData(buttonlayout);
+		buttonCancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				shell.setEnabled(true);
+				close();
+			}
+		});
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/PdfGenerator.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/PdfGenerator.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/PdfGenerator.java	(revision 3)
@@ -0,0 +1,160 @@
+package de.ugoe.cs.swe.exercises.exercisesheet;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.Scanner;
+import java.util.regex.Matcher;
+
+import org.eclipse.jface.util.Util;
+import org.eclipse.swt.widgets.Shell;
+
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.exercise.ExerciseSVN;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+import de.ugoe.cs.swe.exercises.misc.FileUtils;
+import de.ugoe.cs.swe.exercises.svn.SettingsDialog;
+
+public class PdfGenerator {
+	public static void generatePdf(ExerciseSheet exercisesheet, String path,
+			boolean copyFile, boolean makeExerciseInsteadOfSolution) {
+		ExerciseSVN.SVNCheckout(exercisesheet.returnMaxRevision());
+		if (!path.endsWith(".pdf"))
+			path += ".pdf";
+
+		SettingsDialog settings = new SettingsDialog(new Shell());
+		ArrayList<String> cmdList = new ArrayList<String>();
+
+		String cmd = "\"" + settings.getmyPDFLatexPath() + "\""
+				+ " -halt-on-error -output-directory=\"";
+		try {
+			File latexFile = File.createTempFile("exercise", ".tex");
+
+			cmdList.add(settings.getmyPDFLatexPath());
+			cmdList.add("-halt-on-error");
+			cmdList.add("-output-directory=" + latexFile.getParent());
+			cmdList.add(latexFile.getAbsolutePath());
+
+			cmd += latexFile.getParent() + "\" \""
+					+ latexFile.getAbsolutePath() + "\"";
+
+			String filename = ExerciseSVN.SVNpath + "/template-";
+
+			if (exercisesheet.isExamination()) {
+				filename += "klausur";
+			} else {
+				filename += "uebung";
+			}
+
+			filename += ".tex";
+
+			File templateFile = new File(filename);
+			String template = "";
+			FileInputStream fstream = new FileInputStream(templateFile);
+			BufferedReader dstream = new BufferedReader(new InputStreamReader(
+					fstream, "UTF8"));
+			String line;
+			while ((line = dstream.readLine()) != null) {
+				template += line + "\n";
+			}
+			dstream.close();
+
+			LectureEvent event = exercisesheet.getLectureEvent();
+			ArrayList<Lecturer> lecturers = event.getLecturers();
+			String lecturersString = "";
+			boolean firstRun = true;
+			for (Lecturer lecturer : lecturers) {
+				if (!firstRun)
+					lecturersString += ", ";
+				lecturersString += lecturer.toString();
+				firstRun = false;
+			}
+			if (lecturersString == "")
+				lecturersString = "!NO LECTURERS FOUND!";
+
+			ArrayList<Exercise> exercises = exercisesheet.getExercises();
+			String exercisesString = "";
+			for (Exercise exercise : exercises) {
+				String text;
+				if (makeExerciseInsteadOfSolution)
+					text = exercise.getExerciseText(exercisesheet
+							.returnMaxRevision());
+				else
+					text = exercise.getSolution(exercisesheet
+							.returnMaxRevision());
+				exercisesString += "\n\\section{" + exercise.getTitle() + "}\n"
+						+ text;
+			}
+
+			String examorunit = "";
+
+			if (exercisesheet.isExamination()) {
+				examorunit = "PrÃŒfung";
+			} else {
+				examorunit = "Ãbungszettel";
+			}
+
+			template = template.replaceAll("(\\W)LECTURE(\\W)", "$1"
+					+ Matcher.quoteReplacement(event.toString()) + "$2");
+			template = template.replaceAll("(\\W)LECTURERS(\\W)", "$1"
+					+ Matcher.quoteReplacement(lecturersString) + "$2");
+			template = template.replaceAll("(\\W)EXAMORUNIT(\\W)", "$1"
+					+ Matcher.quoteReplacement(examorunit) + "$2");
+			template = template.replaceAll("(\\W)SHEETNUMBER(\\W)", "$1"
+					+ Matcher.quoteReplacement(String.valueOf(exercisesheet
+							.getNumber())) + "$2");
+			template = template.replaceAll("(\\W)EXERCISES(\\W)", "$1"
+					+ Matcher.quoteReplacement(exercisesString) + "$2");
+
+			FileOutputStream ofstream = new FileOutputStream(latexFile);
+			BufferedWriter odstream = new BufferedWriter(
+					new OutputStreamWriter(ofstream, "UTF8"));
+			odstream.write(template);
+			odstream.close();
+			ProcessBuilder pb;
+			if (Util.isLinux())
+				pb = new ProcessBuilder(cmdList);
+			else
+				pb = new ProcessBuilder(cmd);
+
+			// pb.directory(latexFile.getParentFile());
+
+			Process p = pb.start();
+
+			Scanner s = new Scanner(p.getInputStream()).useDelimiter("\n");
+			while (s.hasNext()) {
+				System.out.println(s.next());
+			}
+
+			// try {
+			// p.waitFor();
+			// } catch (InterruptedException e) {
+			// // TODO Auto-generated catch block
+			// e.printStackTrace();
+			// }
+
+			File f = new File(path);
+
+			FileUtils.copyFile(new File(latexFile.getAbsolutePath().replaceAll(
+					".tex$", ".pdf")), f);
+
+			if (copyFile)
+				FileUtils.copyFile(f, new File(ExerciseSVN.SVNpath
+						+ "exercisesheets/" + f.getName()));
+
+		} catch (IOException e) {
+			e.printStackTrace();
+			// } catch (InterruptedException e) {
+			// // TODO Auto-generated catch block
+			// e.printStackTrace();
+		}
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/SheetGenerator.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/SheetGenerator.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/exercisesheet/SheetGenerator.java	(revision 3)
@@ -0,0 +1,330 @@
+package de.ugoe.cs.swe.exercises.exercisesheet;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Random;
+
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+import de.ugoe.cs.swe.exercises.misc.QuickSort;
+
+public class SheetGenerator {
+
+	private int desiredAmount;
+	private int maxComplexity;
+	private LectureEvent lectureEvent;
+	private ArrayList<CKeyword> keywords;
+	private ArrayList<Exercise> exercises;
+
+	public SheetGenerator() {
+
+	}
+
+	public SheetGenerator(LectureEvent lectureEvent,
+			ArrayList<CKeyword> keywords) {
+		this.lectureEvent = lectureEvent;
+		this.keywords = keywords;
+	}
+
+	public SheetGenerator(int maxComplexity, LectureEvent lectureEvent,
+			ArrayList<CKeyword> keywords, int desiredAmount) {
+		this.maxComplexity = maxComplexity;
+		this.lectureEvent = lectureEvent;
+		this.keywords = keywords;
+		this.desiredAmount = desiredAmount;
+	}
+
+	public ArrayList<Exercise> getExercises() {
+		return exercises;
+	}
+
+	public int getMaxComplexity() {
+		return maxComplexity;
+	}
+
+	public LectureEvent getLectureEvent() {
+		return lectureEvent;
+	}
+
+	public ArrayList<CKeyword> getKeywords() {
+		return keywords;
+	}
+
+	public ArrayList<Exercise> generateExercises() {
+
+		int currentComplexity = 0;
+
+		ArrayList<ExerciseSheet> exerciseSheetList = ExerciseSheet.all();
+		ArrayList<Exercise> exerciseList = Exercise.all();
+		ArrayList<Exercise> validExerciseList = new ArrayList<Exercise>();
+		ArrayList<Integer> score = new ArrayList<Integer>();
+
+		Iterator<Exercise> exerciseListIterator = exerciseList.iterator();
+		while (exerciseListIterator.hasNext()) {
+			Exercise currentExercise = exerciseListIterator.next();
+			ArrayList<CKeyword> keys = CKeyword.getKeywordsForModel(
+					currentExercise.getId(), CKeyword.EXERCISE);
+
+			Iterator<CKeyword> keysIterator = keys.iterator();
+			while (keysIterator.hasNext()) {
+				CKeyword currentKey = keysIterator.next();
+
+				for (int i = 0; i < keywords.size(); i++) {
+					if (keywords.get(i).getKey().equals(currentKey.getKey())) {
+						if (!validExerciseList.contains(currentExercise))
+							validExerciseList.add(currentExercise);
+						break;
+					}
+				}
+
+			}
+		}
+
+		Iterator<Exercise> validExerciseListIterator = validExerciseList
+				.iterator();
+		int position = 0;
+
+		while (validExerciseListIterator.hasNext()) {
+			Exercise currentValidExercise = validExerciseListIterator.next();
+			score.add(0);
+
+			Iterator<ExerciseSheet> exerciseSheetIterator = exerciseSheetList
+					.iterator();
+			while (exerciseSheetIterator.hasNext()) {
+				ExerciseSheet currentExerciseSheet = exerciseSheetIterator
+						.next();
+
+				for (int i = 0; i < currentExerciseSheet.getExercises().size(); i++) {
+					if (currentExerciseSheet.getExercises().get(i).getId() == currentValidExercise
+							.getId()) {
+						if (lectureEvent.getId() == currentExerciseSheet
+								.getLectureEvent().getId()) {
+							// Make sure that exercises used in the same
+							// lectureEvent are a last resort
+							score.set(position, score.get(position) + 100);
+						}
+
+						score.set(position, score.get(position) + 10);
+					}
+				}
+
+			}
+
+			ArrayList<CKeyword> keys = CKeyword.getKeywordsForModel(
+					currentValidExercise.getId(), CKeyword.EXERCISE);
+			Iterator<CKeyword> keysIterator = keys.iterator();
+			while (keysIterator.hasNext()) {
+				CKeyword currentKey = keysIterator.next();
+				for (int i = 0; i < keywords.size(); i++) {
+					if (keywords.get(i).getKey().equals(currentKey.getKey())) {
+
+						score.set(position, score.get(position) - 10);
+						break;
+					}
+				}
+
+			}
+
+			position++;
+
+		}
+
+		Exercise[] validExerciseListArray = new Exercise[validExerciseList
+				.size()];
+		Integer[] scoreArray = new Integer[score.size()];
+
+		for (int i = 0; i < validExerciseListArray.length; i++) {
+			validExerciseListArray[i] = validExerciseList.get(i);
+		}
+
+		for (int i = 0; i < scoreArray.length; i++) {
+			scoreArray[i] = score.get(i);
+		}
+
+		QuickSort sorter = new QuickSort();
+
+		sorter.quickSort(scoreArray, 0, scoreArray.length - 1,
+				validExerciseListArray);
+
+		validExerciseList.clear();
+
+		for (int i = 0; i < sorter.getExercises().length; i++) {
+			validExerciseList.add(sorter.getExercises()[i]);
+		}
+
+		ArrayList<Integer> validExerciseListComplexities = new ArrayList<Integer>();
+
+		for (int i = 0; i < validExerciseListArray.length; i++) {
+			validExerciseListComplexities.add(validExerciseListArray[i]
+					.getComplexity());
+		}
+
+		exercises = new ArrayList<Exercise>();
+
+		// Stupid linear method of exercise accumulation
+		/*
+		 * for (int i = 0 ; i < validExerciseList.size() && exercises.size() <
+		 * desiredAmount ; i++) { if(currentComplexity +
+		 * validExerciseList.get(i).getComplexity() <= maxComplexity) {
+		 * currentComplexity += validExerciseList.get(i).getComplexity();
+		 * exercises.add(validExerciseList.get(i)); } }
+		 */
+
+		// A.T.T.R.A.C.T.I.V.E.
+		// Awesome totally truthfully random algorithm of counterbalanced task integration for varying entries
+
+		Random rand = new Random();
+		double rightBoundaryFactor = 0.01;
+
+		while (rightBoundaryFactor <= 1.0001) {
+			int run = 0;
+
+			while (run <= 10) {
+				ArrayList<Exercise> validExerciseListTemp = validExerciseList;
+				while (currentComplexity < maxComplexity
+						&& ((int) validExerciseListTemp.size() * rightBoundaryFactor) > 0
+						&& exercises.size() < desiredAmount && run <= 10) {
+
+					int elementIndex = 0;
+					if ((int) ((validExerciseListTemp.size() - 1) * rightBoundaryFactor) > 1) {
+						rand
+								.nextInt((int) ((validExerciseListTemp.size() - 1) * rightBoundaryFactor));
+					}
+					if (currentComplexity
+							+ validExerciseListTemp.get(elementIndex)
+									.getComplexity() > maxComplexity) {
+						validExerciseListTemp.remove(elementIndex);
+						continue;
+					}
+					exercises.add(validExerciseListTemp.get(elementIndex));
+					currentComplexity += validExerciseListTemp
+							.get(elementIndex).getComplexity();
+					validExerciseListTemp.remove(elementIndex);
+				}
+				if (exercises.size() == desiredAmount
+						&& (double) currentComplexity >= 0.75 * maxComplexity) {
+					break;
+				}
+				run++;
+			}
+			if (exercises.size() == desiredAmount
+					&& (double) currentComplexity >= 0.75 * maxComplexity) {
+				break;
+			}
+
+			currentComplexity = 0;
+			rightBoundaryFactor = rightBoundaryFactor + 0.01;
+		}
+
+		return exercises;
+	}
+
+	public ArrayList<Exercise> getValidExercises() {
+		ArrayList<ExerciseSheet> exerciseSheetList = ExerciseSheet.all();
+		ArrayList<Exercise> exerciseList = Exercise.all();
+		ArrayList<Exercise> validExerciseList = new ArrayList<Exercise>();
+		ArrayList<Integer> score = new ArrayList<Integer>();
+
+		Iterator<Exercise> exerciseListIterator = exerciseList.iterator();
+		while (exerciseListIterator.hasNext()) {
+			Exercise currentExercise = exerciseListIterator.next();
+			ArrayList<CKeyword> keys = CKeyword.getKeywordsForModel(
+					currentExercise.getId(), CKeyword.EXERCISE);
+
+			Iterator<CKeyword> keysIterator = keys.iterator();
+			while (keysIterator.hasNext()) {
+				CKeyword currentKey = keysIterator.next();
+
+				for (int i = 0; i < keywords.size(); i++) {
+					if (keywords.get(i).getKey().equals(currentKey.getKey())) {
+						if (!validExerciseList.contains(currentExercise))
+							validExerciseList.add(currentExercise);
+						break;
+					}
+				}
+
+			}
+		}
+
+		Iterator<Exercise> validExerciseListIterator = validExerciseList
+				.iterator();
+		int position = 0;
+
+		while (validExerciseListIterator.hasNext()) {
+			Exercise currentValidExercise = validExerciseListIterator.next();
+			score.add(0);
+
+			Iterator<ExerciseSheet> exerciseSheetIterator = exerciseSheetList
+					.iterator();
+			while (exerciseSheetIterator.hasNext()) {
+				ExerciseSheet currentExerciseSheet = exerciseSheetIterator
+						.next();
+
+				for (int i = 0; i < currentExerciseSheet.getExercises().size(); i++) {
+					if (currentExerciseSheet.getExercises().get(i).getId() == currentValidExercise
+							.getId()) {
+						if (lectureEvent.getId() == currentExerciseSheet
+								.getLectureEvent().getId()) {
+							// Make sure that exercises used in the same
+							// lectureEvent are a last resort
+							score.set(position, score.get(position) + 100);
+						}
+						score.set(position, score.get(position) + 10);
+					}
+				}
+
+			}
+
+			ArrayList<CKeyword> keys = CKeyword.getKeywordsForModel(
+					currentValidExercise.getId(), CKeyword.EXERCISE);
+			Iterator<CKeyword> keysIterator = keys.iterator();
+			while (keysIterator.hasNext()) {
+				CKeyword currentKey = keysIterator.next();
+				for (int i = 0; i < keywords.size(); i++) {
+					if (keywords.get(i).getKey().equals(currentKey.getKey())) {
+						score.set(position, score.get(position) - 10);
+						break;
+					}
+				}
+
+			}
+
+			position++;
+
+		}
+
+		Exercise[] validExerciseListArray = new Exercise[validExerciseList
+				.size()];
+		Integer[] scoreArray = new Integer[score.size()];
+
+		for (int i = 0; i < validExerciseListArray.length; i++) {
+			validExerciseListArray[i] = validExerciseList.get(i);
+		}
+
+		for (int i = 0; i < scoreArray.length; i++) {
+			scoreArray[i] = score.get(i);
+		}
+
+		QuickSort sorter = new QuickSort();
+
+		sorter.quickSort(scoreArray, 0, scoreArray.length - 1,
+				validExerciseListArray);
+
+		if ( sorter.getExercises() == null ) {
+			return validExerciseList;
+		}
+		
+		validExerciseList.clear();
+		
+		for (int i = 0; i < sorter.getExercises().length; i++) {
+			validExerciseList.add(sorter.getExercises()[i]);
+		}
+		return validExerciseList;
+	}
+
+	int[] accumulator() {
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/GUITreeComposite.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/GUITreeComposite.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/GUITreeComposite.java	(revision 3)
@@ -0,0 +1,22 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.swt.layout.GridLayout;
+
+public class GUITreeComposite extends ViewPart {
+
+	//private Tree tree;
+
+	public GUITreeComposite() {
+	}
+
+	@Override
+	public void createPartControl(Composite parent) {
+		parent.setLayout(new GridLayout(1, false));
+	}
+
+	@Override
+	public void setFocus() {
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/GUITreeView.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/GUITreeView.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/GUITreeView.java	(revision 3)
@@ -0,0 +1,290 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+import java.util.ArrayList;
+
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.TreeItem;
+
+import de.ugoe.cs.swe.exercises.exercisesheet.ExerciseSheet;
+import de.ugoe.cs.swe.exercises.exercisesheet.ExerciseSheetComposite;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEventComposite;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.custom.SashForm;
+
+public class GUITreeView extends ViewPart {
+
+	private static Tree tree;
+	private static Menu menu;
+
+	public static Tree getTree() {
+		return tree;
+	}
+
+	private static Group group;
+	private static StackLayout layout = new StackLayout();
+	final static Composite[] composites = new Composite[3];
+	private Button btnSaveChanges;
+	private SashForm sashForm;
+	private Button addLectureButton;
+	private Button deleteLectureButton;
+
+	public GUITreeView() {
+	}
+
+	@Override
+	public void createPartControl(Composite parent) {
+
+		parent.setLayout(new GridLayout(3, false));
+
+		tree = new Tree(parent, SWT.BORDER);
+		tree.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				switchComposite();
+			}
+		});
+
+		menu = new Menu(tree);
+		tree.setMenu(menu);
+		final MenuItem add = new MenuItem(menu, SWT.NONE);
+		add.setText("Add");
+		add.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				Model model = (Model) tree.getSelection()[0].getData();
+				if (model instanceof Lecture) {
+
+					LectureEvent lectureEvent = new LectureEvent(2009, false,
+							(Lecture) model);
+					lectureEvent.save();
+					TreeItem item = new TreeItem(tree.getSelection()[0],
+							SWT.NONE);
+					item.setData(lectureEvent);
+					item.setText(lectureEvent.getLecture().getName()
+							+ " WS2009");
+					GUITreeView.getTree().setSelection(item);
+					GUITreeView.switchComposite();
+
+				} else {
+					ExerciseSheet exerciseSheet;
+					TreeItem item;
+					if (model instanceof LectureEvent) {
+						exerciseSheet = new ExerciseSheet((LectureEvent) model);
+						exerciseSheet.save();
+						item = new TreeItem(tree.getSelection()[0], SWT.NONE);
+					} else {
+						exerciseSheet = new ExerciseSheet(
+								((ExerciseSheet) model).getLectureEvent());
+						exerciseSheet.save();
+						item = new TreeItem(GUITreeView.getTree()
+								.getSelection()[0].getParentItem(), SWT.NONE);
+					}
+					item.setData(exerciseSheet);
+					item.setText("New Sheet");
+					GUITreeView.getTree().setSelection(item);
+					GUITreeView.switchComposite();
+				}
+
+			}
+		});
+
+		MenuItem delete = new MenuItem(menu, SWT.NONE);
+		delete.setText("Delete");
+		delete.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				Model model = (Model) tree.getSelection()[0].getData();
+				model.delete();
+				tree.getSelection()[0].removeAll();
+				tree.getSelection()[0].dispose();
+			}
+		});
+
+		tree.setLinesVisible(true);
+		{
+			GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, false, true,
+					2, 1);
+			gridData_1.widthHint = 400;
+			gridData_1.minimumWidth = 400;
+			tree.setLayoutData(gridData_1);
+		}
+
+		group = new Group(parent, SWT.NONE);
+		group.setLayout(layout);
+		group.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+
+		/*
+		 * GridLayout gridLayout = new GridLayout(1, false);
+		 * gridLayout.marginHeight = 0; gridLayout.marginWidth = 0;
+		 * group.setLayout(gridLayout);
+		 */
+
+		composites[0] = new LectureComposite(group, SWT.NONE);
+		composites[1] = new LectureEventComposite(group, SWT.NONE);
+		composites[2] = new ExerciseSheetComposite(group, SWT.NONE);
+
+		refreshTree();
+		if (tree.getItemCount() > 0)
+			tree.setSelection(tree.getItem(0));
+
+		sashForm = new SashForm(parent, SWT.NONE);
+		sashForm.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM, false, false,
+				2, 1));
+
+		addLectureButton = new Button(sashForm, SWT.NONE);
+		addLectureButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				Lecture lecture = new Lecture("New Lecture");
+				lecture.save();
+				TreeItem lectureItem = new TreeItem(GUITreeView.tree, SWT.NONE);
+				lectureItem.setText("New lecture");
+				lectureItem.setData(lecture);
+				GUITreeView.tree.select(lectureItem);
+				GUITreeView.switchComposite();
+			}
+		});
+		addLectureButton.setText("Add lecture");
+
+		deleteLectureButton = new Button(sashForm, SWT.NONE);
+		deleteLectureButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				TreeItem itemIt = tree.getSelection()[0];
+				while (itemIt.getParentItem() != null)
+					itemIt = itemIt.getParentItem();
+				itemIt.removeAll();
+				Model model = (Model) itemIt.getData();
+				model.delete();
+				itemIt.dispose();
+			}
+		});
+		deleteLectureButton.setText("Delete lecture");
+		sashForm.setWeights(new int[] { 1, 1 });
+
+		btnSaveChanges = new Button(parent, SWT.NONE);
+		btnSaveChanges.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				save();
+			}
+		});
+		btnSaveChanges.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
+				false, 1, 1));
+		btnSaveChanges.setText("Save changes");
+		switchComposite();
+	}
+
+	public static void refreshTree() {
+		tree.removeAll();
+
+		ArrayList<Lecture> lectureList = Lecture.all();
+		if (lectureList == null)
+			return;
+		ArrayList<LectureEvent> lectureEventList;
+		ArrayList<ExerciseSheet> exerciseSheetList;
+
+		TreeItem lectureTree;
+		TreeItem lectureEventTree;
+		TreeItem exerciseSheetTree;
+
+		for (int i = 0; i < lectureList.size(); i++) {
+			lectureTree = new TreeItem(tree, SWT.NONE);
+			lectureTree.setData(lectureList.get(i));
+			lectureTree.setText("" + lectureList.get(i).getName());
+
+			lectureEventList = lectureList.get(i).getLectureEvents();
+			if (lectureEventList == null)
+				continue;
+			for (int j = 0; j < lectureEventList.size(); j++) {
+				lectureEventTree = new TreeItem(lectureTree, SWT.NONE);
+				lectureEventTree.setData(lectureEventList.get(j));
+				String sem;
+				if (lectureEventList.get(j).getIsSummerSemester())
+					sem = "SS";
+				else
+					sem = "WS";
+				lectureEventTree.setText(""
+						+ lectureEventList.get(j).getLecture().getName() + " "
+						+ sem + "" + lectureEventList.get(j).getSemester());
+
+				exerciseSheetList = lectureEventList.get(j).getExerciseSheets();
+				if (exerciseSheetList == null)
+					continue;
+				for (int k = 0; k < exerciseSheetList.size(); k++) {
+					exerciseSheetTree = new TreeItem(lectureEventTree, SWT.NONE);
+					exerciseSheetTree.setData(exerciseSheetList.get(k));
+					exerciseSheetTree.setText("Sheet "
+							+ exerciseSheetList.get(k).getNumber());
+
+				}
+			}
+		}
+	}
+
+	public static void switchComposite() {
+		if (tree.getSelection().length == 0)
+			return;
+		
+		Model model = (Model) tree.getSelection()[0].getData();
+		
+		if (model instanceof Lecture) {
+			layout.topControl = composites[0];
+			((LectureComposite) composites[0]).load((Lecture) model);
+		} else if (model instanceof LectureEvent) {
+			layout.topControl = composites[1];
+			((LectureEventComposite) composites[1]).load((LectureEvent) model);
+		} else if (model instanceof ExerciseSheet) {
+			layout.topControl = composites[2];
+			((ExerciseSheetComposite) composites[2])
+					.load((ExerciseSheet) model);
+		}
+		for (int i = 0; i < 3; i++) {
+			composites[i].setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
+					true, 1, 1));
+		}
+		group.layout();
+		
+		
+	}
+
+	private void save() {
+		if (layout.topControl instanceof LectureComposite) {
+			// Lecture
+			((LectureComposite) layout.topControl).save();
+		} else if (layout.topControl instanceof LectureEventComposite) {
+			// LectureEvent
+			((LectureEventComposite) layout.topControl).save();
+		} else if (layout.topControl instanceof ExerciseSheetComposite) {
+			// TODO: ExerciseSheetComposite
+			((ExerciseSheetComposite) layout.topControl).save();
+		} else if (layout.topControl instanceof LectureComposite) {
+			// TODO: ExerciseComposite
+			((LectureComposite) layout.topControl).save();
+		}
+
+	}
+
+	/*
+	 * private int getId() { return
+	 * (int)((Integer)(tree.getSelection()[0]).getData()); }
+	 */
+
+	@Override
+	public void setFocus() {
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/Lecture.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/Lecture.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/Lecture.java	(revision 3)
@@ -0,0 +1,99 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class Lecture extends Model {
+	private String name;
+
+	@Override
+	protected String getTableName() {
+		return "lecture";
+	}
+
+	public Lecture(String name) {
+		super();
+		this.name = name;
+	}
+
+	public Lecture(int id, String name) {
+		super(id);
+		this.name = name;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@Override
+	protected void update() throws SQLException {
+		PreparedStatement statement = Model
+				.prepareStatement("UPDATE lecture SET name=? WHERE id=?");
+		statement.setString(1, this.getName());
+		statement.setInt(2, this.getId());
+		statement.executeUpdate();
+	}
+
+	@Override
+	protected PreparedStatement insert() throws SQLException {
+		PreparedStatement statement = Model
+				.prepareStatement("INSERT INTO lecture (name) VALUES (?)");
+		statement.setString(1, this.getName());
+		statement.executeUpdate();
+		return statement;
+	}
+
+	public static ArrayList<Lecture> all() {
+		try {
+			return fromStatement(Model
+					.prepareStatement("SELECT * FROM lecture"));
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public static ArrayList<Lecture> fromStatement(PreparedStatement statement)
+			throws SQLException {
+		ResultSet resultset = statement.executeQuery();
+		ArrayList<Lecture> lectures = new ArrayList<Lecture>();
+		while (resultset.next()) {
+			lectures.add(new Lecture(resultset.getInt("id"), resultset
+					.getString("name")));
+		}
+		return lectures;
+	}
+
+	public static Lecture get(int lectureId) {
+		try {
+			PreparedStatement statement = prepareStatement("SELECT * FROM lecture WHERE id=?");
+			statement.setInt(1, lectureId);
+			return fromStatement(statement).get(0);
+		} catch (SQLException e) {
+			e.printStackTrace();
+		} catch (IndexOutOfBoundsException e) {
+		}
+		throw new Model.DoesNotExistException();
+	}
+	public ArrayList<LectureEvent> getLectureEvents () {
+		try {
+			PreparedStatement statement = prepareStatement("SELECT DISTINCT lectureevent.* FROM lecture, lectureevent WHERE lecture.id = ? AND lectureevent.lecture = lecture.id ORDER BY id");
+			statement.setInt(1, this.getId());
+			return LectureEvent.fromStatement(statement);
+		} catch (SQLException e) {
+			System.err
+					.println("Got an exception in Lecture.getLectureEvents()! ");
+			System.err.println(e.getMessage());
+		}
+		return null;
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureAddDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureAddDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureAddDialog.java	(revision 3)
@@ -0,0 +1,104 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class LectureAddDialog extends TitleAreaDialog {
+
+	private Text text1;
+	private String lectureName;
+	private Shell shell;
+
+	public String getLecture() {
+		return lectureName;
+	}
+
+	public LectureAddDialog(Shell parentShell) {
+		super(parentShell);
+		super.setShellStyle(0);
+		this.shell = parentShell;
+		shell.setEnabled(false);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Control contents = super.createContents(parent);
+		setTitle("Add a new lecture");
+		setMessage("Please input all the data for the new lecture",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		parent.getShell().setSize(500, 170);
+		int x = shell.getLocation().x + (shell.getSize().x - parent.getShell().getSize().x)/2;
+		int y = shell.getLocation().y + (shell.getSize().y - parent.getShell().getSize().y)/2;
+		parent.getShell().setLocation(x, y);
+		
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label label1 = new Label(parent, SWT.NONE);
+		label1.setText("Lecture Name:");
+		Text textbox1 = new Text(parent, SWT.BORDER);
+		textbox1.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		text1 = textbox1;
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button button = new Button(parent, SWT.PUSH);
+		button.setText("OK");
+		button.setFont(JFaceResources.getDialogFont());
+		button.setLayoutData(buttonlayout);
+		button.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (text1.getText().length() != 0) {
+					lectureName = text1.getText();
+					shell.setEnabled(true);
+					close();
+
+				} else {
+					setErrorMessage("Please fill out all the data");
+				}
+			}
+		});
+		Button cancel = new Button(parent, SWT.PUSH);
+		cancel.setText("Cancel");
+		cancel.setFont(JFaceResources.getDialogFont());
+		cancel.setLayoutData(buttonlayout);
+		cancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				shell.setEnabled(true);
+				close();
+			}
+		});
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureComposite.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureComposite.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureComposite.java	(revision 3)
@@ -0,0 +1,76 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Label;
+
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+import de.ugoe.cs.swe.exercises.misc.KeywordsCompositeExtender;
+
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.ModifyEvent;
+
+
+public class LectureComposite extends Composite {
+	Text textName;
+	Lecture selected = null;
+	KeywordsCompositeExtender keywordsExtender;
+
+	/**
+	 * Create the composite.
+	 * 
+	 * @param this
+	 * @param style
+	 */
+	public LectureComposite(Composite parent, int style) {
+		super(parent, style);
+		setLayout(new GridLayout(2, false));
+
+		Composite composite = new Composite(this, SWT.NONE);
+		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
+				1, 1));
+		GridLayout gridLayout = new GridLayout(2, false);
+		gridLayout.marginWidth = 0;
+		gridLayout.marginHeight = 0;
+		composite.setLayout(gridLayout);
+
+		Label label = new Label(composite, SWT.NONE);
+		label.setText("Name:");
+		label.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false,
+				1, 1));
+		new Label(this, SWT.NONE);
+
+		textName = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		textName.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				GUITreeView.getTree().getSelection()[0].setText(textName.getText());
+			}
+		});
+		textName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
+				1, 1));
+
+		keywordsExtender = new KeywordsCompositeExtender(this, CKeyword.LECTURE);
+	}
+
+	public void load(Lecture lecture) {
+		this.selected = lecture;
+		textName.setText(lecture.getName());
+		keywordsExtender.load(lecture);
+	}
+
+	public void save() {
+		if (this.selected == null)
+			return;
+		selected.setName(textName.getText());
+		selected.save();
+	}
+
+	@Override
+	protected void checkSubclass() {
+		// Disable the check that prevents subclassing of SWT components
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureContentProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureContentProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureContentProvider.java	(revision 3)
@@ -0,0 +1,18 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+class LectureContentProvider implements IStructuredContentProvider {
+	
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	}
+
+	public void dispose() {
+	}
+
+	public Object[] getElements(Object parent) {
+		return Lecture.all().toArray();
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureFilter.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureFilter.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureFilter.java	(revision 3)
@@ -0,0 +1,29 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+public class LectureFilter extends ViewerFilter {
+
+	private String searchString;
+
+	public void setSearchText(String s) {
+		// Search must be a substring of the existing value
+		this.searchString = ".*" + s + ".*";
+	}
+
+	//Filters only for first and last name of the lecturer, not the title or ID.
+	@Override
+	public boolean select(Viewer viewer, Object parentElement, Object element) {
+		if (searchString == null || searchString.length() == 0) {
+			return true;
+		}
+		Lecture lelement = (Lecture) element;
+		if (lelement.getName().toLowerCase().matches(searchString.toLowerCase())) {
+			return true;
+		}
+		return false;
+	}
+}
+
+	
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureKeywordContentProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureKeywordContentProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureKeywordContentProvider.java	(revision 3)
@@ -0,0 +1,35 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+
+class LectureKeywordContentProvider implements IStructuredContentProvider {
+
+	private int lectureId = 0;
+	
+	public LectureKeywordContentProvider(int lectureId) {
+		this.lectureId = Math.abs(lectureId);
+	}
+	public LectureKeywordContentProvider() {}
+	
+	public void setLectureId(int id) {
+		this.lectureId = Math.abs(id);
+	}
+	
+	public int getLectureId() {
+		return this.lectureId;
+	}
+	
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	}
+
+	public void dispose() {
+	}
+	
+	public Object[] getElements(Object parent) {
+		return CKeyword.getKeywordsForModel(lectureId, CKeyword.LECTURE).toArray();
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureLabelProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureLabelProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/LectureLabelProvider.java	(revision 3)
@@ -0,0 +1,31 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+public class LectureLabelProvider extends LabelProvider implements ITableLabelProvider {
+	public String getColumnText(Object obj, int index) {
+
+		Lecture lecture = (Lecture) obj;
+
+		switch (index) {
+		case 0:
+			return String.valueOf(lecture.getName());
+		}
+
+		return null;
+	}
+
+	public Image getColumnImage(Object obj, int index) {
+		return null;
+	}
+
+	@Override
+	public Image getImage(Object obj) {
+		return PlatformUI.getWorkbench().getSharedImages().getImage(
+				ISharedImages.IMG_OBJ_ELEMENT);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/TreeComposite.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/TreeComposite.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecture/TreeComposite.java	(revision 3)
@@ -0,0 +1,115 @@
+package de.ugoe.cs.swe.exercises.lecture;
+
+import java.util.ArrayList;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.TreeItem;
+
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.exercisesheet.ExerciseSheet;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+
+
+public class TreeComposite extends Composite {
+
+	private Tree tree;
+	
+	public TreeComposite(Composite parent, int style) {
+		super(parent, style);
+		setLayout(new GridLayout(1, false));
+
+		Composite composite = new Composite(this, SWT.NONE);
+		{
+			GridData gridData = new GridData(SWT.FILL, SWT.FILL, false, false,
+					1, 1);
+			gridData.widthHint = 440;
+			gridData.heightHint = 233;
+			composite.setLayoutData(gridData);
+		}
+		GridLayout gridLayout = new GridLayout(2, false);
+		gridLayout.marginWidth = 0;
+		gridLayout.marginHeight = 0;
+		composite.setLayout(gridLayout);
+		
+		tree = new Tree(parent, SWT.BORDER);
+		tree.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+			}
+		});
+
+		tree.setLinesVisible(true);
+		refreshTree();
+	
+	}
+
+	private void refreshTree() {
+		tree.removeAll();
+
+		ArrayList<Lecture> lectureList = Lecture.all();
+		if (lectureList == null)
+			return;
+		ArrayList<LectureEvent> lectureEventList;
+		ArrayList<ExerciseSheet> exerciseSheetList;
+		ArrayList<Exercise> exerciseList;
+
+		TreeItem lectureTree;
+		TreeItem lectureEventTree;
+		TreeItem exerciseSheetTree;
+		TreeItem exerciseTree;
+
+		for (int i = 0; i < lectureList.size(); i++) {
+			lectureTree = new TreeItem(tree, SWT.NONE);
+			lectureTree.setData(lectureList.get(i).getId());
+			lectureTree.setText("" + lectureList.get(i).getName());
+
+			lectureEventList = lectureList.get(i).getLectureEvents();
+			if (lectureEventList == null)
+				continue;
+			for (int j = 0; j < lectureEventList.size(); j++) {
+				lectureEventTree = new TreeItem(lectureTree, SWT.NONE);
+				lectureEventTree.setData(lectureEventList.get(j).getId());
+				String sem;
+				if (lectureEventList.get(j).getIsSummerSemester())
+					sem = "SS";
+				else
+					sem = "WS";
+				lectureEventTree.setText(""
+						+ lectureEventList.get(j).getLecture().getName() + " "
+						+ sem + "" + lectureEventList.get(j).getSemester());
+
+				exerciseSheetList = lectureEventList.get(j).getExerciseSheets();
+				if (exerciseSheetList == null)
+					continue;
+				for (int k = 0; k < exerciseSheetList.size(); k++) {
+					exerciseSheetTree = new TreeItem(lectureEventTree, SWT.NONE);
+					exerciseSheetTree.setData(exerciseSheetList.get(k).getId());
+					exerciseSheetTree.setText("Sheet "
+							+ exerciseSheetList.get(k).getNumber());
+
+					exerciseList = exerciseSheetList.get(k).getExercises();
+					if (exerciseList == null)
+						continue;
+					for (int l = 0; l < exerciseList.size(); l++) {
+						exerciseTree = new TreeItem(exerciseSheetTree, SWT.NONE);
+						exerciseTree.setData(exerciseList.get(l).getId());
+						exerciseTree.setText(""
+								+ exerciseList.get(l).getTitle());
+					}
+				}
+			}
+		}
+	}
+	
+	@Override
+	protected void checkSubclass() {
+		// Disable the check that prevents subclassing of SWT components
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEvent.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEvent.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEvent.java	(revision 3)
@@ -0,0 +1,225 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.*;
+
+import de.ugoe.cs.swe.exercises.exercisesheet.ExerciseSheet;
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class LectureEvent extends Model {
+	public static boolean SS = true;
+	public static boolean WS = false;
+	private int semester;
+	private boolean isSummerSemester;
+	private int lectureId;
+
+	public LectureEvent() {
+
+	}
+
+	public LectureEvent(int id, int semester, boolean isSummerSemester,
+			int lectureId) {
+		super(id);
+		this.semester = semester;
+		this.isSummerSemester = isSummerSemester;
+		this.lectureId = lectureId;
+	}
+
+	public LectureEvent(int semester, boolean isSummerSemester, int lectureId) {
+		super();
+		this.semester = semester;
+		this.isSummerSemester = isSummerSemester;
+		this.lectureId = lectureId;
+	}
+
+	public LectureEvent(int semester, boolean isSummerSemester, Lecture lecture) {
+		super();
+		this.semester = semester;
+		this.isSummerSemester = isSummerSemester;
+		this.lectureId = lecture.getId();
+	}
+
+	@Override
+	public String toString() {
+		return (getLecture().getName() + " " + getSemesterString() + getSemester());
+	}
+
+	@Override
+	protected String getTableName() {
+		return "lectureevent";
+	}
+
+	public int getSemester() {
+		return semester;
+	}
+
+	public void setSemester(int semester) {
+		this.semester = semester;
+	}
+
+	public boolean getIsSummerSemester() {
+		return isSummerSemester;
+	}
+
+	public void setIsSummerSemester(boolean summer) {
+		this.isSummerSemester = summer;
+	}
+
+	public Lecture getLecture() {
+		return Lecture.get(lectureId);
+	}
+
+	public void setLecture(Lecture lecture) {
+		this.lectureId = lecture.getId();
+	}
+
+	public String getSemesterString() {
+		if (isSummerSemester)
+			return "SS";
+		else
+			return "WS";
+	}
+
+	@Override
+	protected void update() throws SQLException {
+		PreparedStatement statement = prepareStatement("UPDATE lectureevent SET semester=?, ss_ws=?, lecture=? WHERE id=?");
+		statement.setInt(4, this.getId());
+		executeSaveStatement(statement);
+	}
+
+	protected void executeSaveStatement(PreparedStatement statement)
+			throws SQLException {
+		statement.setInt(1, this.getSemester());
+		statement.setString(2, this.getSemesterString());
+		if (this.getLecture().getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecture does not exist in the database, yet");
+		statement.setInt(3, this.lectureId);
+		statement.executeUpdate();
+	}
+
+	@Override
+	protected PreparedStatement insert() throws SQLException {
+		PreparedStatement statement = prepareStatement("INSERT INTO lectureevent (semester, ss_ws, lecture) VALUES (?,?,?)");
+		executeSaveStatement(statement);
+		return statement;
+	}
+
+	public static ArrayList<LectureEvent> all() {
+		try {
+			return fromStatement(prepareStatement("SELECT * FROM lectureevent"));
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public static ArrayList<LectureEvent> fromStatement(
+			PreparedStatement statement) throws SQLException {
+		ResultSet resultset = statement.executeQuery();
+		ArrayList<LectureEvent> lectureEvents = new ArrayList<LectureEvent>();
+		while (resultset.next()) {
+			lectureEvents.add(new LectureEvent(resultset.getInt("id"),
+					resultset.getInt("semester"), resultset.getString("ss_ws")
+							.equals("SS"), resultset.getInt("lecture")));
+		}
+		return lectureEvents;
+	}
+
+	public ArrayList<Lecturer> getLecturers() {
+		try {
+			PreparedStatement statement = prepareStatement("SELECT DISTINCT lecturer.* FROM lecturer, lectureevent, lectureevent_lecturer WHERE lectureevent.id = ? AND lectureevent.id = lectureevent_lecturer.lectureevent AND lectureevent_lecturer.lecturer = lecturer.id ORDER BY id");
+			statement.setInt(1, this.getId());
+			return Lecturer.fromStatement(statement);
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+//	private boolean lecturerAlreadyExists(Lecturer lecturer) {
+//		for (Lecturer myLecturer : this.getLecturers()) {
+//			if (myLecturer.getId() == lecturer.getId())
+//				return true;
+//		}
+//
+//		return false;
+//	}
+
+	public void addLecturer(Lecturer lecturer) {
+		if (this.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecture event does not exist in the database, yet");
+		if (lecturer.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecturer does not exist in the database, yet");
+//		if (lecturerAlreadyExists(lecturer))
+//			throw new Model.DoesNotExistException(
+//					"Lecturer is already existant");
+
+		PreparedStatement statement;
+		try {
+			statement = prepareStatement("INSERT INTO lectureevent_lecturer (lectureevent, lecturer) VALUES (?,?)");
+			statement.setInt(1, this.getId());
+			statement.setInt(2, lecturer.getId());
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void clearLecturers() {
+		ArrayList<Lecturer> lecturerArrayList = getLecturers();
+		for (int i = 0; i < lecturerArrayList.size(); i++) {
+			removeLecturer(lecturerArrayList.get(i));
+		}
+	}
+
+	public void removeLecturer(Lecturer lecturer) {
+		if (this.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecture event does not exist in the database, yet");
+		if (lecturer.getId() == Model.UNDEFINED)
+			throw new Model.DoesNotExistException(
+					"Lecturer does not exist in the database, yet");
+
+		PreparedStatement statement;
+		try {
+			statement = prepareStatement("DELETE FROM lectureevent_lecturer WHERE lectureevent=? AND lecturer=?");
+			statement.setInt(1, this.getId());
+			statement.setInt(2, lecturer.getId());
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public ArrayList<ExerciseSheet> getExerciseSheets() {
+		try {
+			PreparedStatement statement = prepareStatement("SELECT DISTINCT exercisesheet.* FROM exercisesheet, lectureevent WHERE lectureevent.id = ? AND lectureevent.id = exercisesheet.lectureevent ORDER BY id");
+			statement.setInt(1, this.getId());
+			return ExerciseSheet.fromStatement(statement);
+		} catch (SQLException e) {
+			System.err
+					.println("Got an exception in LectureEvent.getExerciseSheets()! ");
+			System.err.println(e.getMessage());
+		}
+		return null;
+	}
+
+	public static LectureEvent get(int lectureEventId) {
+		try {
+			PreparedStatement statement = prepareStatement("SELECT * FROM lectureevent WHERE id=?");
+			statement.setInt(1, lectureEventId);
+			return fromStatement(statement).get(0);
+		} catch (SQLException e) {
+			e.printStackTrace();
+		} catch (IndexOutOfBoundsException e) {
+		}
+		throw new Model.DoesNotExistException();
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventAddDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventAddDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventAddDialog.java	(revision 3)
@@ -0,0 +1,230 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+import de.ugoe.cs.swe.exercises.lecturer.LecturerContentProvider;
+import de.ugoe.cs.swe.exercises.lecturer.LecturerLabelProvider;
+
+public class LectureEventAddDialog extends TitleAreaDialog {
+
+	private Text editYear;
+	private int comboresultIsSummerSemester;
+	private int comboresultLecture;
+	private int[] lectureEvent = {-1, -1, -1};
+	int[] lecturesListId;
+	private Lecturer[] lecturerList;
+	private TableViewer viewerLectures;
+
+	private Lecture lecture = new Lecture(null);
+	private ArrayList<Lecture> lectures = new ArrayList<Lecture>();
+	
+	private Shell shell;
+
+	public Lecturer[] getLecturerList() {
+		return lecturerList;
+	}
+
+	public int[] getLectureEvent() {
+		return lectureEvent;
+	}
+
+	public LectureEventAddDialog(Shell parentShell) {
+		super(parentShell);
+		super.setShellStyle(0);
+		this.shell = parentShell;
+		shell.setEnabled(false);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		parent.getShell().setSize(650, 500);
+		int x = shell.getLocation().x + (shell.getSize().x - parent.getShell().getSize().x)/2;
+		int y = shell.getLocation().y + (shell.getSize().y - parent.getShell().getSize().y)/2;
+		parent.getShell().setLocation(x, y);
+		
+		Control contents = super.createContents(parent);
+		setTitle("Add a new lecture Event");
+		setMessage("Please enter all the data for the new lecture Event",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@SuppressWarnings("static-access")
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label labelYear = new Label(parent, SWT.NONE);
+		labelYear.setText("Year");
+		Text textboxYear = new Text(parent, SWT.BORDER);
+		textboxYear.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textboxYear.addListener(SWT.Verify, new Listener() {
+		      public void handleEvent(Event e) {
+		        String string = e.text;
+		        char[] chars = new char[string.length()];
+		        string.getChars(0, chars.length, chars, 0);
+		        for (int i = 0; i < chars.length; i++) {
+		          if (!('0' <= chars[i] && chars[i] <= '9')) {
+		            e.doit = false;
+		            return;
+		          }
+		        }
+		      }
+		    });
+		editYear = textboxYear;
+
+		Label labelIsSummerSemester = new Label(parent, SWT.NONE);
+		labelIsSummerSemester.setText("SS/WS");
+
+		final Combo comboIsSummerSemester = new Combo(parent, SWT.READ_ONLY);
+		comboIsSummerSemester.setItems(new String[] { "Summer semester", "Winter semester" });
+		comboIsSummerSemester.setSize(200, 200);
+
+		comboIsSummerSemester.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				comboresultIsSummerSemester = comboIsSummerSemester.getSelectionIndex();
+
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				comboresultIsSummerSemester = -1;
+			}
+		});
+
+		Label labelLecture = new Label(parent, SWT.NONE);
+		labelLecture.setText("Lecture");
+		lectures = lecture.all();
+		String[] lecturesList = new String[lectures.toArray().length];
+		lecturesListId = new int[lectures.toArray().length];
+
+		for (int i = 0; i < lecturesList.length; i++) {
+			lecturesList[i] = lectures.get(i).getName();
+			lecturesListId[i] = lectures.get(i).getId();
+		}
+
+		final Combo comboLecture = new Combo(parent, SWT.READ_ONLY);
+		comboLecture.setItems(lecturesList);
+		comboLecture.setSize(200, 200);
+		comboLecture.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				comboresultLecture = comboLecture.getSelectionIndex();
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				comboresultLecture = -1;
+			}
+		});
+
+		Label labelLecturerTable = new Label(parent, SWT.NONE);
+		labelLecturerTable.setText("Lecturer:");
+		
+		 viewerLectures = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
+				| SWT.V_SCROLL | SWT.BORDER);
+		CreateLecturerColumns(viewerLectures);
+		viewerLectures.setContentProvider(new LecturerContentProvider());
+		viewerLectures.setLabelProvider(new LecturerLabelProvider());
+		viewerLectures.setInput(getShell());
+
+		GridData gridData = new GridData();
+		gridData.verticalAlignment = GridData.FILL;
+		gridData.horizontalSpan = 2;
+		gridData.grabExcessHorizontalSpace = true;
+		gridData.grabExcessVerticalSpace = true;
+		gridData.horizontalAlignment = GridData.FILL;
+		viewerLectures.getControl().setLayoutData(gridData);
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button buttonOk = new Button(parent, SWT.PUSH);
+		buttonOk.setText("OK");
+		buttonOk.setFont(JFaceResources.getDialogFont());
+		buttonOk.setLayoutData(buttonlayout);
+		buttonOk.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				if (editYear.getText().length() != 0 && comboresultIsSummerSemester >= 0 && comboresultLecture >= 0) {
+					lectureEvent[0] = Integer.parseInt(editYear.getText());
+					lectureEvent[1] = comboresultIsSummerSemester;
+					lectureEvent[2] = lecturesListId[comboresultLecture];
+
+					StructuredSelection sel = ((StructuredSelection) viewerLectures
+							.getSelection());
+					
+					lecturerList = new Lecturer[sel.size()];
+					Object[] fuckdisshit = sel.toArray();
+					for ( int i=0 ; i<fuckdisshit.length ; i++) {
+					lecturerList[i] = (Lecturer) fuckdisshit[i];
+					}
+					
+					shell.setEnabled(true);
+					close();
+
+				} else {
+					setErrorMessage("Please fill out all the data");
+				}
+			}
+		});
+		Button buttonCancel = new Button(parent, SWT.PUSH);
+		buttonCancel.setText("Cancel");
+		buttonCancel.setFont(JFaceResources.getDialogFont());
+		buttonCancel.setLayoutData(buttonlayout);
+		buttonCancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				shell.setEnabled(true);
+				close();
+			}
+		});
+	}
+
+	private void CreateLecturerColumns(TableViewer viewer) {
+		String[] titles = { "Title", "First Name", "Last Name" };
+		int[] bounds = {200, 200, 200 };
+
+		for (int i = 0; i < titles.length; i++) {
+			TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+			column.getColumn().setText(titles[i]);
+			column.getColumn().setWidth(bounds[i]);
+			Table table = viewer.getTable();
+			table.setHeaderVisible(true);
+			table.setLinesVisible(true);
+		}
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventComposite.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventComposite.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventComposite.java	(revision 3)
@@ -0,0 +1,211 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import de.ugoe.cs.swe.exercises.exercisesheet.ExerciseSheet;
+import de.ugoe.cs.swe.exercises.lecture.GUITreeView;
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Group;
+
+public class LectureEventComposite extends Composite {
+	private LectureEvent selected = null;
+	private TableViewer listLecturersViewer;
+	private CCombo lecturersCombo;
+	private ArrayList<Lecturer> lecturers;
+	private Text yearText;
+	private Button btnSs, btnWs;
+
+	public LectureEventComposite(Composite parent, int style) {
+		super(parent, style);
+		setLayout(new GridLayout(2, false));
+
+		Composite composite = new Composite(this, SWT.NONE);
+		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false,
+				1, 1));
+		GridLayout gridLayout = new GridLayout(3, false);
+		gridLayout.marginWidth = 0;
+		gridLayout.marginHeight = 0;
+		composite.setLayout(gridLayout);
+
+		Label lblYear = new Label(composite, SWT.NONE);
+		lblYear.setText("Year:");
+
+		yearText = new Text(composite, SWT.BORDER);
+		yearText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false,
+				1, 1));
+
+		Group group = new Group(composite, SWT.NONE);
+		group
+				.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, false,
+						1, 1));
+		GridLayout gridLayout_1 = new GridLayout(2, false);
+		gridLayout_1.marginWidth = 0;
+		gridLayout_1.marginHeight = 0;
+		group.setLayout(gridLayout_1);
+		btnWs = new Button(group, SWT.RADIO);
+		btnWs.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1,
+				1));
+		btnWs.setText("WS");
+		btnSs = new Button(group, SWT.RADIO);
+		btnSs.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1,
+				1));
+		btnSs.setText("SS");
+		new Label(this, SWT.NONE);
+
+		final Table listLecturersTable = new Table(this, SWT.MULTI | SWT.BORDER);
+		{
+			GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1,
+					1);
+			gridData.minimumHeight = 100;
+			listLecturersTable.setLayoutData(gridData);
+		}
+		listLecturersTable.setHeaderVisible(true);
+		TableColumn col = new TableColumn(listLecturersTable, SWT.LEFT, 0);
+		col.setWidth(200);
+		col.setText("Lecturers");
+
+		listLecturersViewer = new TableViewer(listLecturersTable);
+
+		Button btnRemoveLecturer = new Button(this, SWT.NONE);
+		btnRemoveLecturer.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				StructuredSelection sel = ((StructuredSelection) listLecturersViewer
+						.getSelection());
+
+				Object[] fuckdisshit = sel.toArray();
+
+				for (int i = 0; i < fuckdisshit.length; i++) {
+
+					selected.removeLecturer((Lecturer) fuckdisshit[i]);
+				}
+				listLecturersViewer.refresh();
+			}
+		});
+		btnRemoveLecturer.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM,
+				false, false, 1, 1));
+		btnRemoveLecturer.setText("Remove lecturer");
+
+		lecturersCombo = new CCombo(this, SWT.BORDER);
+		lecturersCombo.setEditable(false);
+		lecturersCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+
+		Button btnAddLecturer = new Button(this, SWT.NONE);
+		btnAddLecturer.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				if (lecturersCombo.getSelectionIndex() < 0)
+					return;
+
+				selected.addLecturer(lecturers.get(lecturersCombo
+						.getSelectionIndex()));
+				listLecturersViewer.refresh();
+			}
+
+		});
+		btnAddLecturer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+		btnAddLecturer.setText("Add lecturer");
+		new Label(this, SWT.NONE);
+
+		Button newExerciseSheet = new Button(this, SWT.NONE);
+		newExerciseSheet.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				ExerciseSheet exerciseSheet = new ExerciseSheet(selected);
+				exerciseSheet.save();
+				TreeItem item = new TreeItem(GUITreeView.getTree()
+						.getSelection()[0], SWT.NONE);
+				item.setData(exerciseSheet);
+				item.setText("New Sheet");
+				GUITreeView.getTree().setSelection(item);
+				GUITreeView.switchComposite();
+			}
+		});
+		newExerciseSheet.setLayoutData(new GridData(SWT.FILL, SWT.CENTER,
+				false, false, 1, 1));
+		newExerciseSheet.setText("New Sheet");
+
+		GridData gridData = new GridData(GridData.FILL_BOTH
+				| GridData.VERTICAL_ALIGN_BEGINNING);
+		gridData.horizontalSpan = 1;
+		gridData.verticalSpan = 2;
+		listLecturersViewer
+				.setContentProvider(new LectureEventLecturerContentProvider());
+		listLecturersViewer
+				.setLabelProvider(new LectureEventLecturerLabelProvider());
+		listLecturersViewer.setInput(new Object());
+		listLecturersViewer.refresh();
+	}
+
+	public void load(LectureEvent lectureEvent) {
+		this.selected = lectureEvent;
+
+		yearText.setText(String.valueOf(selected.getSemester()));
+
+		btnSs.setSelection(this.selected.getIsSummerSemester());
+		btnWs.setSelection(!this.selected.getIsSummerSemester());
+
+		listLecturersViewer
+				.setContentProvider(new LectureEventLecturerContentProvider(
+						selected));
+		listLecturersViewer.refresh();
+		lecturers = Lecturer.all();
+		lecturersCombo.removeAll();
+		for (Lecturer lecturer : lecturers) {
+			lecturersCombo.add(lecturer.toString());
+		}
+	}
+
+	public void save() {
+		if (this.selected == null)
+			return;
+
+		int year = -1;
+		try {
+			year = Integer.parseInt(yearText.getText());
+		} catch (Exception exception) {
+		}
+
+		if (year < 2000 || year > 10000) {
+			MessageBox validationMessageBox = new MessageBox(getShell(), SWT.OK);
+			validationMessageBox.setText("Invalid form data");
+			validationMessageBox
+					.setMessage("Please enter a valid year (a four-digit number like \"2009\").");
+			validationMessageBox.open();
+			return;
+		}
+
+		selected.setSemester(year);
+		selected.setIsSummerSemester(btnSs.getSelection());
+		selected.save();
+		GUITreeView.getTree().getSelection()[0].setText(selected.getLecture()
+				.getName()
+				+ " " + selected.getSemesterString() + selected.getSemester());
+	}
+
+	@Override
+	protected void checkSubclass() {
+		// Disable the check that prevents subclassing of SWT components
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventContentProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventContentProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventContentProvider.java	(revision 3)
@@ -0,0 +1,25 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+public class LectureEventContentProvider implements IStructuredContentProvider {
+
+	LectureEvent lectureEvent = new LectureEvent();
+	//ArrayList<LectureEvent> lectureEvents = LectureEvent.all();
+
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	}
+
+	public void dispose() {
+	}
+
+	@SuppressWarnings("static-access")
+	public Object[] getElements(Object parent) {
+		return lectureEvent.all().toArray();
+	}
+
+	//public ArrayList<LectureEvent> getList() {
+	//	return lectureEvent;
+	//}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventEditDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventEditDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventEditDialog.java	(revision 3)
@@ -0,0 +1,281 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Vector;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+import de.ugoe.cs.swe.exercises.lecturer.LecturerContentProvider;
+import de.ugoe.cs.swe.exercises.lecturer.LecturerLabelProvider;
+
+public class LectureEventEditDialog extends TitleAreaDialog {
+
+	private Text editYear;
+	private int comboresultIsSummerSemester;
+	private int comboresultLecture;
+	private int[] lectureEvent = {-1, -1, -1};
+	int[] lecturesListId;
+	private Lecturer[] lecturerList;
+	private TableViewer viewerLecturers;
+	private ArrayList<Lecturer> selLecturers;
+	
+	private Shell shell;
+
+	private Lecture lecture = new Lecture(null);
+	private ArrayList<Lecture> lectures = new ArrayList<Lecture>();
+
+	public LectureEventEditDialog(Shell parentShell, LectureEvent lectureEvent) {
+		super(parentShell);
+		super.setShellStyle(0);
+		shell = parentShell;
+		shell.setEnabled(false);
+		int SSint;
+		if(lectureEvent.getIsSummerSemester() == true)
+			SSint = 0;
+		else
+			SSint = 1;
+		this.lectureEvent = new int[] {lectureEvent.getSemester(), SSint, getLectureIndex(lectureEvent.getLecture().getId())};
+		this.selLecturers = lectureEvent.getLecturers();
+		this.comboresultIsSummerSemester = SSint;
+		this.comboresultLecture = this.lectureEvent[2];
+	}
+	
+	public Lecturer[] getLecturerList() {
+		return lecturerList;
+	}
+
+	public int[] getLectureEvent() {
+		return lectureEvent;
+	}
+
+	public LectureEventEditDialog(Shell parentShell) {
+		super(parentShell);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		parent.getShell().setSize(650, 500);
+		int x = shell.getLocation().x + (shell.getSize().x - parent.getShell().getSize().x)/2;
+		int y = shell.getLocation().y + (shell.getSize().y - parent.getShell().getSize().y)/2;
+		parent.getShell().setLocation(x, y);
+		
+		Control contents = super.createContents(parent);
+		setTitle("Add a new lecture event");
+		setMessage("Please enter all the data for the new lecture Event",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@SuppressWarnings("static-access")
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label labelYear = new Label(parent, SWT.NONE);
+		labelYear.setText("Year");
+		Text textboxYear = new Text(parent, SWT.BORDER);
+		textboxYear.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textboxYear.setText(String.valueOf(lectureEvent[0]));
+		textboxYear.addListener(SWT.Verify, new Listener() {
+		      public void handleEvent(Event e) {
+		        String string = e.text;
+		        char[] chars = new char[string.length()];
+		        string.getChars(0, chars.length, chars, 0);
+		        for (int i = 0; i < chars.length; i++) {
+		          if (!('0' <= chars[i] && chars[i] <= '9')) {
+		            e.doit = false;
+		            return;
+		          }
+		        }
+		      }
+		    });
+		editYear = textboxYear;
+
+		Label labelIsSummerSemester = new Label(parent, SWT.NONE);
+		labelIsSummerSemester.setText("SS/WS");
+
+		final Combo comboIsSummerSemester = new Combo(parent, SWT.READ_ONLY);
+		comboIsSummerSemester.setItems(new String[] { "Summer semester", "Winter semester" });
+		comboIsSummerSemester.setSize(200, 200);
+		comboIsSummerSemester.select(lectureEvent[1]);
+
+		comboIsSummerSemester.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				comboresultIsSummerSemester = comboIsSummerSemester.getSelectionIndex();
+
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				comboresultIsSummerSemester = -1;
+			}
+		});
+
+		Label labelLecture = new Label(parent, SWT.NONE);
+		labelLecture.setText("Lecture");
+		lectures = lecture.all();
+		String[] lecturesList = new String[lectures.toArray().length];
+		lecturesListId = new int[lectures.toArray().length];
+
+		for (int i = 0; i < lecturesList.length; i++) {
+			lecturesList[i] = lectures.get(i).getName();
+			lecturesListId[i] = lectures.get(i).getId();
+		}
+
+		final Combo comboLecture = new Combo(parent, SWT.READ_ONLY);
+		comboLecture.setItems(lecturesList);
+		comboLecture.setSize(200, 200);
+		comboLecture.select(lectureEvent[2]);
+		comboLecture.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				comboresultLecture = comboLecture.getSelectionIndex();
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				comboresultLecture = -1;
+			}
+		});
+
+		Label labelLecturerTable = new Label(parent, SWT.NONE);
+		labelLecturerTable.setText("Lecturer:");
+		
+		 viewerLecturers = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
+				| SWT.V_SCROLL | SWT.BORDER);
+		CreateLecturerColumns(viewerLecturers);
+		viewerLecturers.setContentProvider(new LecturerContentProvider());
+		viewerLecturers.setLabelProvider(new LecturerLabelProvider());
+		viewerLecturers.setInput(getShell());
+		
+		viewerLecturers.getTable().select(getSelected());
+
+		GridData gridData = new GridData();
+		gridData.verticalAlignment = GridData.FILL;
+		gridData.horizontalSpan = 2;
+		gridData.grabExcessHorizontalSpace = true;
+		gridData.grabExcessVerticalSpace = true;
+		gridData.horizontalAlignment = GridData.FILL;
+		viewerLecturers.getControl().setLayoutData(gridData);
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button buttonOk = new Button(parent, SWT.PUSH);
+		buttonOk.setText("OK");
+		buttonOk.setFont(JFaceResources.getDialogFont());
+		buttonOk.setLayoutData(buttonlayout);
+		buttonOk.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+				if (editYear.getText().length() != 0 && comboresultIsSummerSemester >= 0 && comboresultLecture >= 0) {
+					lectureEvent[0] = Integer.parseInt(editYear.getText());
+					lectureEvent[1] = comboresultIsSummerSemester;
+					lectureEvent[2] = lecturesListId[comboresultLecture];
+
+					StructuredSelection sel = ((StructuredSelection) viewerLecturers
+							.getSelection());
+					
+					lecturerList = new Lecturer[sel.size()];
+					Object[] fuckdisshit = sel.toArray();
+					for ( int i=0 ; i<fuckdisshit.length ; i++) {
+					lecturerList[i] = (Lecturer) fuckdisshit[i];
+					}
+					shell.setEnabled(true);
+					close();
+
+				} else {
+					setErrorMessage("Please fill out all the data");
+				}
+			}
+		});
+		Button buttonCancel = new Button(parent, SWT.PUSH);
+		buttonCancel.setText("Cancel");
+		buttonCancel.setFont(JFaceResources.getDialogFont());
+		buttonCancel.setLayoutData(buttonlayout);
+		buttonCancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				lectureEvent = new int[] {-1,-1,-1};
+				shell.setEnabled(true);
+				close();
+			}
+		});
+	}
+
+	private void CreateLecturerColumns(TableViewer viewer) {
+		String[] titles = { "Title", "First Name", "Last Name" };
+		int[] bounds = {200, 200, 200 };
+
+		for (int i = 0; i < titles.length; i++) {
+			TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+			column.getColumn().setText(titles[i]);
+			column.getColumn().setWidth(bounds[i]);
+			Table table = viewer.getTable();
+			table.setHeaderVisible(true);
+			table.setLinesVisible(true);
+		}
+	}
+	
+	private int getLectureIndex(int lectureId) {
+		ArrayList<Lecture> allLectures = Lecture.all();
+		for(int i=0; i<allLectures.size();i++){
+			if(lectureId == allLectures.get(i).getId()) {
+				return i;
+			}
+		}
+		return 0;
+	}
+	
+	private int[] getSelected() {
+		Vector<Integer> selection = new Vector<Integer>();
+		Iterator<Lecturer> selIterator = selLecturers.iterator();
+		ArrayList<Lecturer> allLecturers = Lecturer.all();
+		while(selIterator.hasNext()) {
+			Lecturer lecturer = selIterator.next();
+			for(int i=0; i<allLecturers.size();i++){
+				if(lecturer.getId() == allLecturers.get(i).getId()) {
+					selection.add(i);
+					break;
+				}
+			}
+		}
+		int[] list = new int[selection.size()];
+		Object[] obj = selection.toArray();
+		for(int i=0; i<list.length; i++) {
+			list[i] = ((Integer)obj[i]).intValue();
+		}
+		return list;
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventFilter.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventFilter.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventFilter.java	(revision 3)
@@ -0,0 +1,28 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+public class LectureEventFilter extends ViewerFilter {
+
+	private String searchString;
+
+	public void setSearchText(String s) {
+		// Search must be a substring of the existing value
+		this.searchString = ".*" + s + ".*";
+	}
+
+	//Filters only for first and last name of the lecturer, not the title or ID.
+	@Override
+	public boolean select(Viewer viewer, Object parentElement, Object element) {
+		if (searchString == null || searchString.length() == 0) {
+			return true;
+		}
+		LectureEvent searchelement = (LectureEvent) element;
+		if (String.valueOf(searchelement.getSemester()).toLowerCase().matches(searchString.toLowerCase()) || searchelement.getLecture().getName().toLowerCase().matches(searchString.toLowerCase())) {
+			return true;
+		}
+		return false;
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLabelProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLabelProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLabelProvider.java	(revision 3)
@@ -0,0 +1,41 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+public class LectureEventLabelProvider extends LabelProvider implements
+		ITableLabelProvider {
+	public String semester;
+	public String getColumnText(Object obj, int index) {
+		
+		LectureEvent lectureEvent = (LectureEvent) obj;
+
+		switch (index) {
+		case 0:
+
+			if (lectureEvent.getIsSummerSemester() == true)
+				semester = "SS";
+			else
+				semester = "WS";
+
+			return (String.valueOf(lectureEvent.getLecture().getName()) + ", "
+					+ semester + " " + String
+					.valueOf(lectureEvent.getSemester()));
+		}
+
+		return null;
+	}
+
+	public Image getColumnImage(Object obj, int index) {
+		return null;
+	}
+
+	@Override
+	public Image getImage(Object obj) {
+		return PlatformUI.getWorkbench().getSharedImages().getImage(
+				ISharedImages.IMG_OBJ_ELEMENT);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerAddDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerAddDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerAddDialog.java	(revision 3)
@@ -0,0 +1,137 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+import de.ugoe.cs.swe.exercises.lecturer.LecturerContentProvider;
+import de.ugoe.cs.swe.exercises.lecturer.LecturerLabelProvider;
+
+public class LectureEventLecturerAddDialog extends TitleAreaDialog {
+
+
+	private int[] lectureEvent = new int[3];
+	int[] lecturesListId;
+	private Lecturer[] lecturerList;
+	private TableViewer viewer;
+
+
+	public Lecturer[] getLecturerList() {
+		return lecturerList;
+	}
+
+	public int[] getLectureEvent() {
+		return lectureEvent;
+	}
+
+	public LectureEventLecturerAddDialog(Shell parentShell) {
+		super(parentShell);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Control contents = super.createContents(parent);
+		setTitle("Add a new lecture Event");
+		setMessage("Please input all the data for the new lecture Event",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+
+		 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
+				| SWT.V_SCROLL);
+		CreateLecturerColumns(viewer);
+		viewer.setContentProvider(new LecturerContentProvider());
+		viewer.setLabelProvider(new LecturerLabelProvider());
+		viewer.setInput(getShell());
+
+		GridData gridData = new GridData();
+		gridData.verticalAlignment = GridData.FILL;
+		gridData.horizontalSpan = 2;
+		gridData.grabExcessHorizontalSpace = true;
+		gridData.grabExcessVerticalSpace = true;
+		gridData.horizontalAlignment = GridData.FILL;
+		viewer.getControl().setLayoutData(gridData);
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button button = new Button(parent, SWT.PUSH);
+		button.setText("OK");
+		button.setFont(JFaceResources.getDialogFont());
+		button.setLayoutData(buttonlayout);
+		button.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+					StructuredSelection sel = ((StructuredSelection) viewer
+							.getSelection());
+
+					lecturerList = new Lecturer[sel.size()];
+					Object[] fuckdisshit = sel.toArray();
+					for ( int i=0 ; i<fuckdisshit.length ; i++) {
+					lecturerList[i] = (Lecturer) fuckdisshit[i];
+					}
+
+					close();
+
+				}
+		});
+		
+		Button cancel = new Button(parent, SWT.PUSH);
+		cancel.setText("Cancel");
+		cancel.setFont(JFaceResources.getDialogFont());
+		cancel.setLayoutData(buttonlayout);
+		cancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				close();
+			}
+		});
+	}
+
+	private void CreateLecturerColumns(TableViewer viewer) {
+		String[] titles = { "Title", "First Name", "Last Name" };
+		int[] bounds = {200, 200, 200 };
+
+		for (int i = 0; i < titles.length; i++) {
+			TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
+			column.getColumn().setText(titles[i]);
+			column.getColumn().setWidth(bounds[i]);
+			Table table = viewer.getTable();
+			table.setHeaderVisible(false);
+			table.setLinesVisible(true);
+		}
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerContentProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerContentProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerContentProvider.java	(revision 3)
@@ -0,0 +1,30 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+public class LectureEventLecturerContentProvider implements
+		IStructuredContentProvider {
+
+	private LectureEvent lectureEvent = null;
+
+	public LectureEventLecturerContentProvider(LectureEvent lectureEvent) {
+		this.lectureEvent = lectureEvent;
+	}
+
+	public LectureEventLecturerContentProvider() {
+	}
+
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	}
+
+	public void dispose() {
+	}
+
+	public Object[] getElements(Object parent) {
+		if (lectureEvent == null)
+			return new Object[] {};
+
+		return this.lectureEvent.getLecturers().toArray();
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerDeleteDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerDeleteDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerDeleteDialog.java	(revision 3)
@@ -0,0 +1,133 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+
+
+public class LectureEventLecturerDeleteDialog extends TitleAreaDialog {
+
+
+	private int[] lectureEvent = new int[3];
+	int[] lecturesListId;
+	private Lecturer[] lecturerList;
+	private TableViewer viewer;
+	private int lectureEventId;
+
+	public void setLectureEventId(int id) {
+		lectureEventId = id;
+	}
+
+	public Lecturer[] getLecturerList() {
+		return lecturerList;
+	}
+
+	public int[] getLectureEvent() {
+		return lectureEvent;
+	}
+
+	public LectureEventLecturerDeleteDialog(Shell parentShell) {
+		super(parentShell);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Control contents = super.createContents(parent);
+		setTitle("Delete a lecturer");
+		setMessage("Please input all the data for the new lecture Event",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+
+		 viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
+				| SWT.V_SCROLL);
+		CreateLecturerColumns(viewer);
+		viewer.setContentProvider(new LectureEventLecturerContentProvider(LectureEvent.get(lectureEventId)));
+		viewer.setLabelProvider(new LectureEventLecturerLabelProvider());
+		viewer.setInput(getShell());
+
+		GridData gridData = new GridData();
+		gridData.verticalAlignment = GridData.FILL;
+		gridData.horizontalSpan = 2;
+		gridData.grabExcessHorizontalSpace = true;
+		gridData.grabExcessVerticalSpace = true;
+		gridData.horizontalAlignment = GridData.FILL;
+		viewer.getControl().setLayoutData(gridData);
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button button = new Button(parent, SWT.PUSH);
+		button.setText("OK");
+		button.setFont(JFaceResources.getDialogFont());
+		button.setLayoutData(buttonlayout);
+		button.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+
+					StructuredSelection sel = ((StructuredSelection) viewer
+							.getSelection());
+
+
+					lecturerList = new Lecturer[sel.size()];
+					Object[] fuckdisshit = sel.toArray();
+					for ( int i=0 ; i<fuckdisshit.length ; i++) {
+					lecturerList[i] = (Lecturer) fuckdisshit[i];
+					}
+
+					close();
+
+				}
+		});
+		
+		Button cancel = new Button(parent, SWT.PUSH);
+		cancel.setText("Cancel");
+		cancel.setFont(JFaceResources.getDialogFont());
+		cancel.setLayoutData(buttonlayout);
+		cancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				close();
+			}
+		});
+	}
+
+	private void CreateLecturerColumns(TableViewer viewer) {
+
+			Table table = viewer.getTable();
+			table.setHeaderVisible(false);
+			table.setLinesVisible(true);
+		}
+	}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerLabelProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerLabelProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lectureevent/LectureEventLecturerLabelProvider.java	(revision 3)
@@ -0,0 +1,29 @@
+package de.ugoe.cs.swe.exercises.lectureevent;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+
+
+public class LectureEventLecturerLabelProvider extends LabelProvider implements ITableLabelProvider {
+	public String getColumnText(Object obj, int index) {
+		
+		Lecturer lecturer = (Lecturer) obj;
+		
+		return (lecturer.getFirstName() + " " + lecturer.getLastName() + ", " + lecturer.getTitle());
+	}
+
+	public Image getColumnImage(Object obj, int index) {
+		return null;
+	}
+
+	@Override
+	public Image getImage(Object obj) {
+		return PlatformUI.getWorkbench().getSharedImages().getImage(
+				ISharedImages.IMG_OBJ_ELEMENT);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/Lecturer.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/Lecturer.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/Lecturer.java	(revision 3)
@@ -0,0 +1,128 @@
+package de.ugoe.cs.swe.exercises.lecturer;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class Lecturer extends Model {
+
+	private String lastName;
+	private String firstName;
+	private String title;
+
+	@Override
+	protected String getTableName() {
+		return "lecturer";
+	}
+
+	public Lecturer() {
+		// DEFAULT CONSTRUCTOR
+		// Needed to create temporary lecturers in different add/edit/delete
+		// methods
+	}
+
+	public Lecturer(String firstName, String lastName, String title) {
+		super();
+		this.setFirstName(firstName);
+		this.setLastName(lastName);
+		this.setTitle(title);
+	}
+
+	public Lecturer(int id, String firstName, String lastName, String title) {
+		super(id);
+		this.setFirstName(firstName);
+		this.setLastName(lastName);
+		this.setTitle(title);
+	}
+
+	@Override
+	protected void update() throws SQLException {
+		PreparedStatement statement = prepareStatement("UPDATE lecturer SET lastname=?, firstname=?, title=? WHERE id=?");
+		statement.setInt(4, this.getId());
+		executeSaveStatement(statement);
+	}
+
+	protected void executeSaveStatement(PreparedStatement statement)
+			throws SQLException {
+		statement.setString(1, this.getLastName());
+		statement.setString(2, this.getFirstName());
+		statement.setString(3, this.getTitle());
+		statement.executeUpdate();
+	}
+
+	@Override
+	protected PreparedStatement insert() throws SQLException {
+
+		PreparedStatement statement = prepareStatement("INSERT INTO lecturer SET lastname=?, firstname=?, title=?");
+		executeSaveStatement(statement);
+		return statement;
+	}
+
+	@Override
+	public String toString() {
+		return getTitle() + " " + getFirstName() + " " + getLastName();
+	}
+	
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setFirstName(String firstName) {
+		this.firstName = firstName;
+	}
+
+	public String getFirstName() {
+		return firstName;
+	}
+
+	public void setLastName(String lastName) {
+		this.lastName = lastName;
+	}
+
+	public String getLastName() {
+		return lastName;
+	}
+
+	public static ArrayList<Lecturer> all() {
+		try {
+			return fromStatement(Model
+					.prepareStatement("SELECT * FROM lecturer"));
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public static ArrayList<Lecturer> fromStatement(PreparedStatement statement)
+			throws SQLException {
+		ResultSet resultset = statement.executeQuery();
+		ArrayList<Lecturer> lecturers = new ArrayList<Lecturer>();
+		while (resultset.next()) {
+			lecturers.add(new Lecturer(resultset.getInt("id"), resultset
+					.getString("firstname"), resultset.getString("lastname"),
+					resultset.getString("title")));
+		}
+		return lecturers;
+	}
+
+	public ArrayList<LectureEvent> getLecturerEvents() {
+		try {
+			PreparedStatement statement = Model
+					.prepareStatement("SELECT DISTINCT lectureevent.* FROM lecturer, lectureevent, lectureevent_lecturer WHERE lecturer.id = ? AND lectureevent.id = lectureevent_lecturer.lectureevent AND lectureevent_lecturer.lecturer = lecturer.id ORDER BY id");
+			statement.setInt(1, this.getId());
+			return LectureEvent.fromStatement(statement);
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerAddDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerAddDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerAddDialog.java	(revision 3)
@@ -0,0 +1,123 @@
+package de.ugoe.cs.swe.exercises.lecturer;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class LecturerAddDialog extends TitleAreaDialog {
+
+	private Text addTitle;
+	private Text addFirstName;
+	private Text addLastName;
+	private String[] lecturer = new String[4];
+	private Shell shell;
+
+	public String[] getLecturer() {
+		return lecturer;
+	}
+
+	public LecturerAddDialog(Shell parentShell) {
+		super(parentShell);
+		super.setShellStyle(0);
+		this.shell = parentShell;
+		shell.setEnabled(false);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Control contents = super.createContents(parent);
+		setTitle("Add a new lecturer");
+		setMessage("Please input all the data for the new lecturer",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		parent.getShell().setSize(500, 240);
+		int x = shell.getLocation().x + (shell.getSize().x - parent.getShell().getSize().x)/2;
+		int y = shell.getLocation().y + (shell.getSize().y - parent.getShell().getSize().y)/2;
+		parent.getShell().setLocation(x, y);
+		
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label labelTitle = new Label(parent, SWT.NONE);
+		labelTitle.setText("Title");
+		Text textboxTitle = new Text(parent, SWT.BORDER);
+		textboxTitle.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		addTitle = textboxTitle;
+		Label labelFirstName = new Label(parent, SWT.NONE);
+		labelFirstName.setText("First name");
+		Text textboxFirstName = new Text(parent, SWT.BORDER);
+		textboxFirstName.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		addFirstName = textboxFirstName;
+		Label labelLastName = new Label(parent, SWT.NONE);
+		labelLastName.setText("Last name");
+		Text textboxLastName = new Text(parent, SWT.BORDER);
+		textboxLastName.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		addLastName = textboxLastName;
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button buttonOk = new Button(parent, SWT.PUSH);
+		buttonOk.setText("OK");
+		buttonOk.setFont(JFaceResources.getDialogFont());
+		buttonOk.setLayoutData(buttonlayout);
+		buttonOk.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (addTitle.getText().length() != 0
+						&& addFirstName.getText().length() != 0
+						&& addLastName.getText().length() != 0) {
+					lecturer[0] = "1";
+					lecturer[1] = addTitle.getText();
+					lecturer[2] = addFirstName.getText();
+					lecturer[3] = addLastName.getText();
+					shell.setEnabled(true);
+					close();
+
+				} else {
+					setErrorMessage("Please fill out all the data");
+				}
+			}
+		});
+		Button buttonCancel = new Button(parent, SWT.PUSH);
+		buttonCancel.setText("Cancel");
+		buttonCancel.setFont(JFaceResources.getDialogFont());
+		buttonCancel.setLayoutData(buttonlayout);
+		buttonCancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				shell.setEnabled(true);
+				close();
+			}
+		});
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerContentProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerContentProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerContentProvider.java	(revision 3)
@@ -0,0 +1,21 @@
+package de.ugoe.cs.swe.exercises.lecturer;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+public class LecturerContentProvider implements IStructuredContentProvider {
+
+	Lecturer lecturer = new Lecturer();
+
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	}
+
+	public void dispose() {
+	}
+
+	@SuppressWarnings("static-access")
+	public Object[] getElements(Object parent) {
+		return lecturer.all().toArray();
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerEditDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerEditDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerEditDialog.java	(revision 3)
@@ -0,0 +1,128 @@
+package de.ugoe.cs.swe.exercises.lecturer;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class LecturerEditDialog extends TitleAreaDialog {
+
+	private Text editTitle;
+	private Text editFirstName;
+	private Text editLastName;
+	private String[] lecturer = new String[4];
+	private Shell shell;
+
+	public String[] getLecturer() {
+		return lecturer;
+	}
+
+	public LecturerEditDialog(Shell parentShell) {
+		super(parentShell);
+		super.setShellStyle(0);
+		this.shell = parentShell;
+		shell.setEnabled(false);
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		parent.getShell().setSize(500, 240);
+		int x = shell.getLocation().x + (shell.getSize().x - parent.getShell().getSize().x)/2;
+		int y = shell.getLocation().y + (shell.getSize().y - parent.getShell().getSize().y)/2;
+		parent.getShell().setLocation(x, y);
+		
+		Control contents = super.createContents(parent);
+		setTitle("Edit a lecturer");
+		setMessage("Edit the lecturers data", IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label labelTitle = new Label(parent, SWT.NONE);
+		labelTitle.setText("Title");
+		Text textboxTitle = new Text(parent, SWT.BORDER);
+		textboxTitle.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+	//	textboxTitle.setText(ViewLecturer.getEditTitle());
+		editTitle = textboxTitle;
+		Label labelFirstName = new Label(parent, SWT.NONE);
+		labelFirstName.setText("First name");
+		Text textboxFirstName = new Text(parent, SWT.BORDER);
+		textboxFirstName.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+	//	textboxFirstName.setText(ViewLecturer.getEditFirstName());
+		editFirstName = textboxFirstName;
+		Label labelLastName = new Label(parent, SWT.NONE);
+		labelLastName.setText("Last name");
+		Text textboxLastName = new Text(parent, SWT.BORDER);
+		textboxLastName.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+	//	textboxLastName.setText(ViewLecturer.getEditLastName());
+		//TODO: 3 kommentare ausklammern
+		editLastName = textboxLastName;
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+
+		Button buttonOk = new Button(parent, SWT.PUSH);
+		buttonOk.setText("OK");
+		buttonOk.setFont(JFaceResources.getDialogFont());
+		buttonOk.setLayoutData(buttonlayout);
+		buttonOk.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (editTitle.getText().length() != 0
+						&& editFirstName.getText().length() != 0
+						&& editLastName.getText().length() != 0) {
+					lecturer[0] = "1";
+					lecturer[1] = editTitle.getText();
+					lecturer[2] = editFirstName.getText();
+					lecturer[3] = editLastName.getText();
+					shell.setEnabled(true);
+					close();
+
+				} else {
+					setErrorMessage("Field can't be empty");
+				}
+			}
+		});
+		Button buttonCancel = new Button(parent, SWT.PUSH);
+		buttonCancel.setText("Cancel");
+		buttonCancel.setFont(JFaceResources.getDialogFont());
+		buttonCancel.setLayoutData(buttonlayout);
+		buttonCancel.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				shell.setEnabled(true);
+				close();
+			}
+		});
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerFilter.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerFilter.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerFilter.java	(revision 3)
@@ -0,0 +1,37 @@
+package de.ugoe.cs.swe.exercises.lecturer;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+
+public class LecturerFilter extends ViewerFilter {
+
+	private String searchString;
+
+	public void setSearchText(String s) {
+		// Search must be a substring of the existing value
+		if (s == null || s.equals("")) {
+			this.searchString = s;
+			return;
+		}
+		
+		this.searchString = ".*" + s + ".*";
+	}
+
+	// Filters only for first and last name of the lecturer, not the title or
+	// ID.
+	@Override
+	public boolean select(Viewer viewer, Object parentElement, Object element) {
+		if (searchString == null || searchString.length() == 0) {
+			return true;
+		}
+		Lecturer filteredLecturers = (Lecturer) element;
+		if (filteredLecturers.getFirstName().toLowerCase().matches(
+				searchString.toLowerCase())) {
+			return true;
+		} else if (filteredLecturers.getLastName().toLowerCase().matches(
+				searchString.toLowerCase())) {
+			return true;
+		}
+		return false;
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerLabelProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerLabelProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/LecturerLabelProvider.java	(revision 3)
@@ -0,0 +1,36 @@
+package de.ugoe.cs.swe.exercises.lecturer;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+public class LecturerLabelProvider extends LabelProvider implements
+		ITableLabelProvider {
+	public String getColumnText(Object obj, int index) {
+
+		Lecturer lecturer = (Lecturer) obj;
+
+		switch (index) {
+		case 0:
+			return lecturer.getTitle();
+		case 1:
+			return lecturer.getFirstName();
+		case 2:
+			return lecturer.getLastName();
+		}
+
+		return getText(obj);
+	}
+
+	public Image getColumnImage(Object obj, int index) {
+		return null;
+	}
+
+	@Override
+	public Image getImage(Object obj) {
+		return PlatformUI.getWorkbench().getSharedImages().getImage(
+				ISharedImages.IMG_OBJ_ELEMENT);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/ViewLecturer.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/ViewLecturer.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/lecturer/ViewLecturer.java	(revision 3)
@@ -0,0 +1,315 @@
+package de.ugoe.cs.swe.exercises.lecturer;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.part.ViewPart;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+
+public class ViewLecturer extends ViewPart {
+	private Table lecturerTable;
+	private Table lectureEventTable;
+	private Text lastnameText;
+	private Text firstnameText;
+	private Text titelText;
+	private Text searchText;
+	
+	private Lecturer selected;
+	
+	private static String editFirstName;
+	private static String editLastName;
+	private static String editTitle;
+	
+	private LecturerFilter filter;
+	TableViewer viewerLecturer;
+
+	public static String getEditFirstName() {
+		return editFirstName;
+	}
+
+	public static String getEditLastName() {
+		return editLastName;
+	}
+
+	public static String getEditTitle() {
+		return editTitle;
+	}
+
+	public ViewLecturer() {
+	}
+
+	public void createPartControl(Composite parent) {
+		
+	
+		
+		parent.setLayout(new GridLayout(3, false));
+
+		Label searchLabel = new Label(parent, SWT.NONE);
+		searchLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
+				false, 1, 1));
+		searchLabel.setText("Search:");
+		
+		searchText = new Text(parent, SWT.BORDER);
+		searchText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+		searchText.addKeyListener(new KeyAdapter() {
+			@Override
+			public void keyReleased(KeyEvent ke) {
+				filter.setSearchText(searchText.getText());
+				viewerLecturer.refresh();
+			}
+		});
+		
+		new Label(parent, SWT.NONE); //fill label
+
+		viewerLecturer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
+				| SWT.V_SCROLL);
+		viewerLecturer.setContentProvider(new LecturerContentProvider());
+		viewerLecturer.setLabelProvider(new LecturerLabelProvider());
+		viewerLecturer.setInput(new Object());
+		lecturerTable = viewerLecturer.getTable();
+		filter = new LecturerFilter();
+		viewerLecturer.addFilter(filter);
+		lecturerTable.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+			selected = (Lecturer)lecturerTable.getSelection()[0].getData();
+			refreshData();
+			}
+		});
+		GridData gridData = new GridData(SWT.FILL, SWT.FILL, false, true, 2, 1);
+		gridData.minimumWidth = 400;
+		gridData.widthHint = 400;
+		lecturerTable.setLayoutData(gridData);
+		lecturerTable.setHeaderVisible(true);
+		lecturerTable.setLinesVisible(true);
+
+		TableColumn titelColumn = new TableColumn(lecturerTable, SWT.NONE);
+		titelColumn.setWidth(100);
+		titelColumn.setText("Titel");
+
+		TableColumn firstnameColumn = new TableColumn(lecturerTable, SWT.NONE);
+		firstnameColumn.setWidth(150);
+		firstnameColumn.setText("First name");
+
+		TableColumn lastnameColumn = new TableColumn(lecturerTable, SWT.NONE);
+		lastnameColumn.setWidth(150);
+		lastnameColumn.setText("Last name");
+
+		refreshLecturerTable();	
+		
+		if (lecturerTable.getItemCount() > 0) {
+			lecturerTable.setSelection(0);
+			selected = (Lecturer)lecturerTable.getItem(0).getData();
+		}
+		
+		Group group = new Group(parent, SWT.NONE);
+		group.setLayout(new GridLayout(3, false));
+		group
+				.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1,
+						1));
+		new Label(group, SWT.NONE);
+
+		Label lastnameLabel = new Label(group, SWT.NONE);
+		lastnameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
+				false, 1, 1));
+		lastnameLabel.setText("last name");
+
+		lastnameText = new Text(group, SWT.BORDER);
+		lastnameText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+			selected.setLastName(lastnameText.getText());
+			}
+		});
+
+		GridData gridData2 = new GridData(SWT.FILL, SWT.CENTER, true, false, 1,
+				1);
+		gridData2.minimumWidth = 100;
+		gridData2.widthHint = 100;
+		lastnameText.setLayoutData(gridData2);
+
+		new Label(group, SWT.NONE);
+
+		Label firstnameLabel = new Label(group, SWT.NONE);
+		firstnameLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
+				false, 1, 1));
+		firstnameLabel.setText("first name");
+
+		firstnameText = new Text(group, SWT.BORDER);
+		firstnameText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1,
+				1));
+		firstnameText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+			selected.setFirstName(firstnameText.getText());
+			}
+		});
+
+		new Label(group, SWT.NONE);
+
+		Label titelLabel = new Label(group, SWT.NONE);
+		titelLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false,
+				false, 1, 1));
+		titelLabel.setText("titel");
+
+		titelText = new Text(group, SWT.BORDER);
+		titelText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
+				1, 1));
+		titelText.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+			selected.setTitle(titelText.getText());
+			}
+		});
+
+		Menu tableMenu = new Menu(parent.getShell(), SWT.POP_UP);
+		lecturerTable.setMenu(tableMenu);
+		MenuItem add = new MenuItem(tableMenu,SWT.PUSH);
+		add.setText("Add lecturer");
+		add.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent event) {
+				Lecturer lecturer = new Lecturer("first name", "last name", "title");
+				lecturer.save();
+				refreshLecturerTable();
+				lecturerTable.setSelection(lecturerTable.getItemCount() - 1);
+				selected = (Lecturer)lecturerTable.getSelection()[0].getData();
+				refreshData();
+				}
+			});
+			
+		MenuItem delete = new MenuItem(tableMenu,SWT.PUSH);
+		delete.setText("Delete lecturer");
+		delete.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent event) {
+				selected.delete();
+				refreshLecturerTable();
+				lecturerTable.setSelection(0);
+				selected = (Lecturer)lecturerTable.getSelection()[0].getData();
+				refreshData();
+				}
+			});
+		
+		new Label(group, SWT.NONE);
+		new Label(group, SWT.NONE);
+		
+		Button saveButton = new Button(group, SWT.NONE);
+		saveButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				selected.save();
+				refreshLecturerTable();
+			}
+		});
+		saveButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+		saveButton.setText("Save changes");
+
+		lectureEventTable = new Table(group, SWT.BORDER | SWT.FULL_SELECTION);
+		lectureEventTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
+				true, 3, 1));
+		lectureEventTable.setHeaderVisible(true);
+		lectureEventTable.setLinesVisible(true);
+		
+		TableColumn tblclmnLecture = new TableColumn(lectureEventTable, SWT.NONE);
+		tblclmnLecture.setWidth(200);
+		tblclmnLecture.setText("Lecture");
+
+		TableColumn lectureEventColumn = new TableColumn(lectureEventTable,
+				SWT.NONE);
+		lectureEventColumn.setWidth(100);
+		lectureEventColumn.setText("Year");
+		
+		TableColumn tblclmnSemester = new TableColumn(lectureEventTable, SWT.NONE);
+		tblclmnSemester.setWidth(100);
+		tblclmnSemester.setText("Semester");
+
+		refreshLectureEventTable();
+		
+		SashForm sashForm = new SashForm(parent, SWT.NONE);
+		sashForm.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false,
+				2, 1));
+
+		Button deleteLecturerButton = new Button(sashForm, SWT.NONE);
+		deleteLecturerButton.setText("Delete Lecturer");		
+		deleteLecturerButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				selected.delete();
+				refreshLecturerTable();
+				lecturerTable.setSelection(0);
+				selected = (Lecturer)lecturerTable.getSelection()[0].getData();
+				refreshData();
+			}
+		});
+
+
+		Button addLecturerButton = new Button(sashForm, SWT.NONE);
+		addLecturerButton.setText("Add Lecturer");
+		addLecturerButton.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				Lecturer lecturer = new Lecturer("first name", "last name", "title");
+				lecturer.save();
+				refreshLecturerTable();
+				lecturerTable.setSelection(lecturerTable.getItemCount() - 1);
+				selected = (Lecturer)lecturerTable.getSelection()[0].getData();
+				refreshData();
+			}
+		});
+		sashForm.setWeights(new int[] { 1, 1 });
+		new Label(parent, SWT.NONE); //empty label
+		refreshData();
+	}
+
+	public void refreshLecturerTable() {
+		viewerLecturer.refresh();
+	}
+	
+	public void refreshLectureEventTable() {
+		lectureEventTable.removeAll();
+		if (selected == null)
+			return;
+		ArrayList<LectureEvent> lectureEventList = selected.getLecturerEvents();
+		for(int i=0; i<lectureEventList.size(); i++) {
+			TableItem item = new TableItem(lectureEventTable, SWT.NONE);
+			item.setText(0, lectureEventList.get(i).getLecture().getName());
+			item.setText(1, lectureEventList.get(i).getSemesterString());
+			item.setText(2, ""+lectureEventList.get(i).getSemester());
+			item.setData(lectureEventList.get(i));
+		}
+		lectureEventTable.redraw();
+	}
+	
+	public void refreshData() {
+		if (selected == null)
+			return;
+		lastnameText.setText(selected.getLastName());
+		firstnameText.setText(selected.getFirstName());
+		titelText.setText(selected.getTitle());
+		refreshLectureEventTable();
+	}
+	
+	@Override
+	public void setFocus() {
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/CKeyword.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/CKeyword.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/CKeyword.java	(revision 3)
@@ -0,0 +1,96 @@
+package de.ugoe.cs.swe.exercises.misc;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+
+public class CKeyword {
+	
+	public final static int LECTURE=0;
+	public final static int EXERCISE=1;
+	public final static int EXERCISESHEET=2;
+	
+	private final static String[] TABLE_NAMES = { "lecture", "exercise", "exercisesheet" };
+	private final static String[] FIELD_NAMES =  { "lecture", "exercise", "exercisesheet" };
+	
+	private int keyId;
+	private String key;
+	private int modelId; // example lectureId
+
+	public CKeyword(String key, int modelId) {
+		this.keyId = Model.UNDEFINED;
+		this.key = key;
+		this.modelId = modelId;
+	}
+
+	public CKeyword(int keyId, String key, int modelId) {
+		this.keyId = keyId;
+		this.key = key;
+		this.modelId = modelId;
+	}
+
+	public String getKey() {
+		return key;
+	}
+
+	public int getKeyId() {
+		return keyId;
+	}
+
+	public int getModelId() {
+		return modelId;
+	}
+	
+	public static ArrayList<CKeyword> fromKeyStatement(
+			PreparedStatement statement, int modelType) throws SQLException {
+		ResultSet resultset = statement.executeQuery();
+		ArrayList<CKeyword> keys = new ArrayList<CKeyword>();
+		while (resultset.next()) {
+			keys.add(new CKeyword(resultset.getInt("id"), resultset
+					.getString("word"), resultset.getInt(FIELD_NAMES[modelType])));
+		}
+		return keys;
+	}
+
+	public static ArrayList<CKeyword> getKeywordsForModel(int modelId, int modelType) {
+		if(modelId < 0) {
+			modelId = 0;
+		}
+		try {
+			PreparedStatement statement = Model
+					.prepareStatement("SELECT * FROM keyword_" + CKeyword.TABLE_NAMES[modelType] + " WHERE " + CKeyword.FIELD_NAMES[modelType] + "=?");
+			statement.setInt(1, modelId);
+			return fromKeyStatement(statement, modelType);
+		} catch (SQLException e) {
+			System.err
+					.println("Got an exception in Lecture.getKeywordsForModel()! ");
+			System.err.println(e.getMessage());
+		} catch (IndexOutOfBoundsException e) {
+		}
+		//throw new Model.DoesNotExistException();
+		return null;
+	}
+
+	public static void insertKey(CKeyword key, int modelType) {
+		try {
+			PreparedStatement statement = Model
+					.prepareStatement("INSERT INTO keyword_" + CKeyword.TABLE_NAMES[modelType] + " (word," + CKeyword.FIELD_NAMES[modelType] + ") VALUES (?,?)");
+			statement.setString(1, key.getKey());
+			statement.setInt(2, key.getModelId());
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			System.out.println(e.getMessage());
+		}
+	}
+
+	public static void deleteKey(int id, int modelType) {
+		try {
+			PreparedStatement statement = Model.prepareStatement("DELETE FROM keyword_" + CKeyword.TABLE_NAMES[modelType] + " WHERE id=?");
+			statement.setInt(1, id);
+			statement.executeUpdate();
+		} catch (SQLException e) {
+			System.out.println(e.getMessage());
+		}
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/FileUtils.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/FileUtils.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/FileUtils.java	(revision 3)
@@ -0,0 +1,42 @@
+package de.ugoe.cs.swe.exercises.misc;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.channels.FileChannel;
+
+import de.ugoe.cs.swe.exercises.exercise.ExerciseSVN;
+
+public class FileUtils {
+
+	public static void copyFile(File in, File out) throws IOException {
+		FileChannel inChannel = new FileInputStream(in).getChannel();
+		FileChannel outChannel = new FileOutputStream(out).getChannel();
+		try {
+			inChannel.transferTo(0, inChannel.size(), outChannel);
+		} catch (IOException e) {
+			throw e;
+		} finally {
+			if (inChannel != null)
+				inChannel.close();
+			if (outChannel != null)
+				outChannel.close();
+		}
+	}
+
+	public static void renameFile(String oldName, String newName) {
+		
+		File oldFile = new File(ExerciseSVN.SVNpath + "exercisesheets/" + oldName);
+		File newFile = new File(ExerciseSVN.SVNpath + "exercisesheets/" + newName);
+		
+		try {
+			copyFile(oldFile, newFile);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			System.err.println(e);
+		}
+		oldFile.delete();
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/KeywordContentProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/KeywordContentProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/KeywordContentProvider.java	(revision 3)
@@ -0,0 +1,30 @@
+package de.ugoe.cs.swe.exercises.misc;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+
+class KeywordContentProvider implements IStructuredContentProvider {
+	private int type, modelId;
+	
+	public KeywordContentProvider(int type, Model model) {
+		this.type = type;
+		this.modelId = model.getId();
+	}
+	
+	public KeywordContentProvider(int type) {
+		this.type = type;
+		this.modelId = -1;
+	}
+	
+	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
+	}
+
+	public void dispose() {
+	}
+
+	public Object[] getElements(Object parent) {
+		return CKeyword.getKeywordsForModel(modelId, this.type).toArray();
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/KeywordLabelProvider.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/KeywordLabelProvider.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/KeywordLabelProvider.java	(revision 3)
@@ -0,0 +1,30 @@
+package de.ugoe.cs.swe.exercises.misc;
+
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+
+public class KeywordLabelProvider extends LabelProvider implements ITableLabelProvider {
+	public String getColumnText(Object obj, int index) {
+
+		CKeyword keys = (CKeyword) obj;
+		switch (index) {
+		case 0:
+			return String.valueOf(keys.getKey());
+		}
+
+		return null;
+	}
+
+	public Image getColumnImage(Object obj, int index) {
+		return null;
+	}
+
+	@Override
+	public Image getImage(Object obj) {
+		return PlatformUI.getWorkbench().getSharedImages().getImage(
+				ISharedImages.IMG_OBJ_ELEMENT);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/KeywordsCompositeExtender.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/KeywordsCompositeExtender.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/KeywordsCompositeExtender.java	(revision 3)
@@ -0,0 +1,139 @@
+package de.ugoe.cs.swe.exercises.misc;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.MessageBox;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.SWT;
+
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+import de.ugoe.cs.swe.exercises.misc.KeywordLabelProvider;
+
+public class KeywordsCompositeExtender {
+	Model selected = null;
+	TableViewer viewerKeywords;
+	Text textKeywords;
+	int type;
+	Composite parent;
+
+	/**
+	 * Create the composite.
+	 * 
+	 * @param parent
+	 * @param style
+	 */
+	public KeywordsCompositeExtender(final Composite parent, final int type) {
+		this.parent = parent;
+		this.type = type;
+		viewerKeywords = new TableViewer(parent, SWT.MULTI | SWT.V_SCROLL
+				| SWT.BORDER);
+		viewerKeywords
+				.setContentProvider(new KeywordContentProvider(this.type));
+		viewerKeywords.setLabelProvider(new KeywordLabelProvider());
+		viewerKeywords.setInput(new Object());
+		final Table tableKeywords = viewerKeywords.getTable();
+		{
+			GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 1,
+					1);
+			gridData.minimumHeight = 100;
+			tableKeywords.setLayoutData(gridData);
+		}
+		tableKeywords.setHeaderVisible(true);
+		TableColumn columnKeywords = new TableColumn(tableKeywords, SWT.LEFT, 0);
+		columnKeywords.setText("Keywords");
+		columnKeywords.setWidth(100);
+		viewerKeywords.refresh();
+
+		Button btnDeleteKeyword = new Button(parent, SWT.NONE);
+		btnDeleteKeyword.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				StructuredSelection sel = ((StructuredSelection) viewerKeywords
+						.getSelection());
+
+				if (!(sel.isEmpty()) && sel instanceof IStructuredSelection) {
+
+					MessageBox deleteMessageBox = new MessageBox(parent
+							.getShell(), SWT.YES | SWT.NO);
+					deleteMessageBox.setText("Delete");
+					deleteMessageBox
+							.setMessage("Do you really want to delete this Keyword(s)?");
+
+					if (deleteMessageBox.open() == SWT.YES) {
+						for (Iterator<?> iterator = sel.iterator(); iterator
+								.hasNext();) {
+							Object entry = iterator.next();
+
+							if (entry instanceof CKeyword) {
+								CKeyword keyword = (CKeyword) entry;
+								int keyId = keyword.getKeyId();
+								CKeyword.deleteKey(keyId, type);
+							}
+						}
+					}
+				}
+				viewerKeywords.refresh();
+			}
+		});
+		btnDeleteKeyword.setLayoutData(new GridData(SWT.FILL, SWT.BOTTOM,
+				false, false, 1, 1));
+		btnDeleteKeyword.setText("Delete keyword");
+
+		textKeywords = new Text(parent, SWT.SINGLE | SWT.BORDER);
+		textKeywords.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true,
+				false, 1, 1));
+		textKeywords
+				.setToolTipText("To add a Key, type it in this Box and press 'Return'");
+
+		//
+		// EVENT Listeners
+		//
+
+		textKeywords.addKeyListener(new KeyAdapter() {
+			@Override
+			public void keyReleased(KeyEvent key) {
+				if (key.keyCode == SWT.LF || key.keyCode == SWT.CR) {
+					addKeyword(textKeywords.getText());
+				}
+			}
+		});
+
+		Button btnAddKeyword = new Button(parent, SWT.NONE);
+		btnAddKeyword.addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				addKeyword(textKeywords.getText());
+			}
+		});
+		btnAddKeyword.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false,
+				false, 1, 1));
+		btnAddKeyword.setText("Add keyword");
+	}
+
+	public void load(Model model) {
+		this.selected = model;
+		viewerKeywords.setContentProvider(new KeywordContentProvider(this.type,
+				model));
+		viewerKeywords.refresh();
+	}
+
+	private void addKeyword(String keyword) {
+		CKeyword.insertKey(new CKeyword(0, keyword, selected.getId()),
+				this.type);
+		textKeywords.setText("");
+		textKeywords.setFocus();
+		viewerKeywords.refresh();
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/Model.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/Model.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/Model.java	(revision 3)
@@ -0,0 +1,172 @@
+package de.ugoe.cs.swe.exercises.misc;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import org.eclipse.swt.widgets.Shell;
+
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.svn.*;
+
+public abstract class Model {
+	private static SettingsDialog mysqlSettings = new SettingsDialog(new Shell());
+	public static int UNDEFINED = -1;
+	private int id = Model.UNDEFINED;
+	private static Connection connection;
+
+	protected abstract String getTableName();
+	
+	public static class DoesNotExistException extends RuntimeException {
+		private static final long serialVersionUID = 1L;
+
+		public DoesNotExistException() {
+			super("The model entry doesn't exist in the database, yet.");
+		}
+
+		public DoesNotExistException(String message) {
+			super(message);
+		}
+	}
+
+	public static Connection initialize(boolean test) {
+		// connect to DB
+		// -Djavax.net.ssl.trustStorePassword=datenbank -Djavax.net.ssl.trustStore=${project_loc}/keystore
+		System.setProperty("javax.net.ssl.trustStorePassword", mysqlSettings.getMySQLPassword());
+        String path = Model.class.getProtectionDomain().getCodeSource().getLocation().getPath();
+        if (path.endsWith("bin/"))
+        	path = path.replaceFirst("bin/$", "");
+        path += "keystore";
+        System.setProperty("javax.net.ssl.trustStore", path);
+
+		if (test == true) {
+			try {
+				System.out.println("Connecting to test db");
+				// Step 1: Load the JDBC driver.
+				Class.forName("com.mysql.jdbc.Driver").newInstance();
+
+				// Step 2: Establish the connection to the database.
+				//System.out.println("jdbc:mysql://" + mysqlSettings.getMySQLHost() + "/" + mysqlSettings.getMySQLDb() + "test?useSSL="+mysqlSettings.isMySQLcheckSSL());
+				String url = "jdbc:mysql://" + mysqlSettings.getMySQLHost() + "/" + mysqlSettings.getMySQLDb() + "test";//?useSSL="+mysqlSettings.isMySQLcheckSSL();
+
+				Connection conn = DriverManager.getConnection(url, mysqlSettings.getMySQLUsername(),
+						mysqlSettings.getMySQLPassword());
+				System.out.println("Connection successful");
+				//url.wait(500);
+				return conn;
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		} else {
+			try {
+				System.out.println("Connecting to production db");
+				// Step 1: Load the JDBC driver.
+				Class.forName("com.mysql.jdbc.Driver").newInstance();
+
+				// Step 2: Establish the connection to the database.
+				String url = "jdbc:mysql://" + mysqlSettings.getMySQLHost() + "/" + mysqlSettings.getMySQLDb() + "?useSSL="+mysqlSettings.isMySQLcheckSSL();
+				Connection conn = DriverManager.getConnection(url, mysqlSettings.getMySQLUsername(),
+						mysqlSettings.getMySQLPassword());
+				return conn;
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+
+		}
+		return null;
+	}
+
+	public Model(int id) {
+		this.id = id;
+	}
+
+	public Model() {
+		this.id = Model.UNDEFINED;
+	}
+
+	public int getId() {
+		return this.id;
+	}
+
+	public static Connection getConnection(boolean test) {
+		if (connection == null)
+			connection = initialize(test);
+		return connection;
+	}
+
+	// run on production server
+	public static Connection getConnection() {
+		return getConnection(false);
+	}
+
+	public void save() {
+		try {
+			if (this.id == Model.UNDEFINED) {
+				ResultSet resultset = this.insert().getGeneratedKeys();
+				resultset.next();
+				this.id = resultset.getInt(1);
+				if (this instanceof Exercise) 
+					((Exercise)(this)).saveToDisk();
+			} else
+				this.update();
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	protected abstract PreparedStatement insert() throws SQLException;
+
+	protected abstract void update() throws SQLException;
+
+	public void delete() {
+		if (this.id == Model.UNDEFINED)
+			throw new DoesNotExistException();
+
+		try {
+			this._delete();
+			this.id = Model.UNDEFINED;
+		} catch (SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	protected void _delete() throws SQLException {
+		PreparedStatement statement = prepareStatement("DELETE FROM "
+				+ this.getTableName() + " WHERE id=?");
+		statement.setInt(1, this.getId());
+		statement.executeUpdate();
+	}
+
+	// Note: Subclasses add "static ArrayList all()" method which returns
+	// list of all model instances of <subclass> type.
+
+	public static PreparedStatement prepareStatement(String sql)
+			throws SQLException {
+		Connection connection = getConnection();
+		PreparedStatement statement = connection.prepareStatement(sql,
+				Statement.RETURN_GENERATED_KEYS);
+		return statement;
+	}
+
+	public static void flushTables() {
+		try {
+			DatabaseMetaData metaData;
+			metaData = Model.getConnection().getMetaData();
+			ResultSet rs = metaData.getTables(mysqlSettings.getMySQLDb()+"test", null, null, null);
+			PreparedStatement statement;
+			while (rs.next()) {
+				statement = Model.getConnection(true).prepareStatement(
+						"DELETE FROM " + rs.getString("TABLE_NAME"));
+				statement.execute();
+			}
+		} catch (SQLException e) {
+			System.err.println("Got an exception! ");
+			System.err.println(e.getMessage());
+		}
+
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/QuickSort.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/QuickSort.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/misc/QuickSort.java	(revision 3)
@@ -0,0 +1,55 @@
+package de.ugoe.cs.swe.exercises.misc;
+
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+
+public class QuickSort {
+
+	Integer[] arr;
+	Exercise[] exercises;
+	
+	public Integer[] getArr() {
+		return arr;
+	}
+	
+	public Exercise[] getExercises() {
+		return exercises;
+	}
+	
+	private int partition(Integer arr[], int left, int right, Exercise[] exercises)	{
+		int i = left, j = right;
+		int tmp;
+		int pivot = arr[(left + right) / 2];
+		Exercise tmpE;
+
+		while (i <= j) {
+			while (arr[i] < pivot)
+				i++;
+			while (arr[j] > pivot)
+				j--;
+			if (i <= j) {
+				tmpE = exercises[i];
+				tmp = arr[i];
+				exercises[i] = exercises[j];
+				arr[i] = arr[j];
+				exercises[j] = tmpE;
+				arr[j] = tmp;
+				i++;
+				j--;
+			}
+		}
+		return i;
+	}
+
+	public void quickSort(Integer[] arr1, int left, int right, Exercise[] exercises1) {
+		if(arr1.length < 1 || exercises1.length < 1) {
+			return;
+		}
+		arr = arr1;
+		exercises = exercises1;
+		int index = partition(arr, left, right, exercises);
+		if (left < index - 1)
+			quickSort(arr, left, index - 1, exercises);
+		if (index < right)
+			quickSort(arr, index, right, exercises);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/svn/Settings.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/svn/Settings.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/svn/Settings.java	(revision 3)
@@ -0,0 +1,20 @@
+package de.ugoe.cs.swe.exercises.svn;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class Settings extends AbstractHandler {
+
+	@Override
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
+		SettingsDialog dialog = new SettingsDialog(window.getShell());
+		dialog.setTitle("Settings");
+		dialog.open();
+		return null;
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/svn/SettingsDialog.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/svn/SettingsDialog.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/src/de/ugoe/cs/swe/exercises/svn/SettingsDialog.java	(revision 3)
@@ -0,0 +1,415 @@
+package de.ugoe.cs.swe.exercises.svn;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.tmatesoft.svn.core.SVNException;
+import org.tmatesoft.svn.core.SVNURL;
+import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
+import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
+import org.tmatesoft.svn.core.io.SVNRepository;
+import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
+import org.tmatesoft.svn.core.wc.SVNWCUtil;
+
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class SettingsDialog extends TitleAreaDialog {
+
+	private Text textSVNLocation;
+	private Text textWorkingDirectory;
+	private Text textSVNUsername;
+	private Text textSVNPassword;
+	private Text textMySQLHost;
+	private Text textMySQLDb;
+	private Text textMySQLUsername;
+	private Text textMySQLPassword;
+	private Text textPdflatex;
+	private Combo cboUseSSL;
+	private String svnLocation = "";
+	private String workingDirectory = "";
+	private String svnUsername = "";
+	private String svnPassword = "";
+	private String mySQLHost = "";
+	private String mySQLDb = "";
+	private String mySQLUsername = "";
+	private String mySQLPassword = "";
+	private String myPDFLatexPath = "";
+	private boolean mySQLcheckSSL = false;
+
+	public boolean hasSettings() {
+		if (svnLocation == "" || workingDirectory == "" || svnUsername == ""
+				|| svnPassword == "" || mySQLHost == "" || mySQLDb == ""
+				|| mySQLUsername == "" || mySQLPassword == ""
+				|| myPDFLatexPath == "") {
+			return false;
+		}
+		return true;
+	}
+
+	public String getmyPDFLatexPath() {
+		return myPDFLatexPath;
+	}
+
+	public void setmyPDFLatexPath(String myPDFLatexPath) {
+		this.myPDFLatexPath = myPDFLatexPath;
+	}
+
+	public String getSVNLocation() {
+		return svnLocation;
+	}
+
+	public String getWorkingDirectory() {
+		return workingDirectory;
+	}
+
+	public String getSVNUsername() {
+		return svnUsername;
+	}
+
+	public String getSVNPassword() {
+		return svnPassword;
+	}
+
+	public String getMySQLHost() {
+		return mySQLHost;
+	}
+
+	public String getMySQLDb() {
+		return mySQLDb;
+	}
+
+	public String getMySQLUsername() {
+		return mySQLUsername;
+	}
+
+	public String getMySQLPassword() {
+		return mySQLPassword;
+	}
+
+	public boolean isMySQLcheckSSL() {
+		return mySQLcheckSSL;
+	}
+
+	public SettingsDialog(Shell parentShell) {
+		super(parentShell);
+		this.getFileContents();
+	}
+
+	@Override
+	protected Control createContents(Composite parent) {
+		Control contents = super.createContents(parent);
+		setTitle("Settings");
+		setMessage("Change the Settings to match your Settings",
+				IMessageProvider.INFORMATION);
+		return contents;
+	}
+
+	@Override
+	protected Control createDialogArea(Composite parent) {
+
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		parent.setLayout(layout);
+		Label label1 = new Label(parent, SWT.NONE);
+		label1.setText("SVN Location:");
+		Text textbox1 = new Text(parent, SWT.BORDER);
+		textbox1.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textSVNLocation = textbox1;
+
+		Label label2 = new Label(parent, SWT.NONE);
+		label2.setText("Working Directory:");
+		Text textbox2 = new Text(parent, SWT.BORDER);
+		textbox2.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textWorkingDirectory = textbox2;
+
+		Label label3 = new Label(parent, SWT.NONE);
+		label3.setText("SVN Username:");
+		Text textbox3 = new Text(parent, SWT.BORDER);
+		textbox3.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textSVNUsername = textbox3;
+
+		Label label4 = new Label(parent, SWT.NONE);
+		label4.setText("SVN Password:");
+		Text textbox4 = new Text(parent, SWT.BORDER | SWT.PASSWORD);
+		textbox4.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textSVNPassword = textbox4;
+
+		Label label5 = new Label(parent, SWT.NONE);
+		label5.setText("MySQL Host:");
+		Text textbox5 = new Text(parent, SWT.BORDER);
+		textbox5.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textMySQLHost = textbox5;
+
+		Label label6 = new Label(parent, SWT.NONE);
+		label6.setText("MySQL Database:");
+		Text textbox6 = new Text(parent, SWT.BORDER);
+		textbox6.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textMySQLDb = textbox6;
+
+		Label label7 = new Label(parent, SWT.NONE);
+		label7.setText("MySQL Username:");
+		Text textbox7 = new Text(parent, SWT.BORDER);
+		textbox7.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textMySQLUsername = textbox7;
+
+		Label label8 = new Label(parent, SWT.NONE);
+		label8.setText("MySQL Password:");
+		Text textbox8 = new Text(parent, SWT.BORDER | SWT.PASSWORD);
+		textbox8.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textMySQLPassword = textbox8;
+
+		Label label9 = new Label(parent, SWT.NONE);
+		label9.setText("Use SSL:");
+		Combo combo1 = new Combo(parent, SWT.LEFT);
+		combo1.add("No SSL");
+		combo1.add("Use SSL");
+		combo1.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		cboUseSSL = combo1;
+
+		Label label10 = new Label(parent, SWT.NONE);
+		label10.setText("PDFLatex Path");
+		Text textbox10 = new Text(parent, SWT.BORDER);
+		textbox10.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
+				| GridData.HORIZONTAL_ALIGN_FILL));
+		textPdflatex = textbox10;
+
+		if (mySQLcheckSSL)
+			cboUseSSL.select(1);
+		else
+			cboUseSSL.select(0);
+
+		textSVNLocation.setText(svnLocation);
+		textWorkingDirectory.setText(workingDirectory);
+		textSVNUsername.setText(svnUsername);
+		textSVNPassword.setText(svnPassword);
+		textMySQLHost.setText(mySQLHost);
+		textMySQLDb.setText(mySQLDb);
+		textMySQLUsername.setText(mySQLUsername);
+		textMySQLPassword.setText(mySQLPassword);
+		textPdflatex.setText(myPDFLatexPath);
+
+		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+
+		return parent;
+
+	}
+
+	@Override
+	protected void createButtonsForButtonBar(Composite parent) {
+		((GridLayout) parent.getLayout()).numColumns = 2;
+
+		GridData buttonlayout = new GridData(SWT.LEFT, SWT.BEGINNING, false,
+				false);
+		buttonlayout.minimumWidth = 200;
+		Button button = new Button(parent, SWT.PUSH);
+		button.setText("OK");
+		button.setFont(JFaceResources.getDialogFont());
+		button.setLayoutData(buttonlayout);
+		button.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (textSVNLocation.getText().length() != 0
+						&& textWorkingDirectory.getText().length() != 0
+						&& textSVNUsername.getText().length() != 0
+						&& textSVNPassword.getText().length() != 0) {
+					svnLocation = textSVNLocation.getText();
+					workingDirectory = textWorkingDirectory.getText();
+					svnUsername = textSVNUsername.getText();
+					svnPassword = textSVNPassword.getText();
+					mySQLHost = textMySQLHost.getText();
+					mySQLDb = textMySQLDb.getText();
+					mySQLUsername = textMySQLUsername.getText();
+					mySQLPassword = textMySQLPassword.getText();
+					myPDFLatexPath = textPdflatex.getText();
+
+					if (cboUseSSL.getSelectionIndex() == 1)
+						mySQLcheckSSL = true;
+					else
+						mySQLcheckSSL = false;
+
+					try {
+						DAVRepositoryFactory.setup();
+						SVNURL url = SVNURL.parseURIDecoded(svnLocation);
+						SVNRepository repository = SVNRepositoryFactory
+								.create(url);
+						ISVNAuthenticationManager authManager = SVNWCUtil
+								.createDefaultAuthenticationManager(
+										svnUsername, svnPassword);
+						((SVNRepository) repository)
+								.setAuthenticationManager(authManager);
+						repository.testConnection();
+
+					} catch (SVNException ex) {
+						setErrorMessage(ex.getMessage());
+						return;
+					}
+
+					System.setProperty("javax.net.ssl.trustStorePassword",
+							mySQLPassword);
+					String path = Model.class.getProtectionDomain()
+							.getCodeSource().getLocation().getPath();
+					if (path.endsWith("bin/"))
+						path = path.replaceFirst("bin/$", "");
+					path += "keystore";
+					System.setProperty("javax.net.ssl.trustStore", path);
+
+					try {
+						// Step 1: Load the JDBC driver.
+						Class.forName("com.mysql.jdbc.Driver").newInstance();
+						// Step 2: Establish the connection to the database.
+						String url = "jdbc:mysql://" + mySQLHost + "/"
+								+ mySQLDb + "?useSSL="
+								+ String.valueOf(mySQLcheckSSL);
+						DriverManager.getConnection(url, mySQLUsername,
+								mySQLPassword);
+					} catch (SQLException ex) {
+						setErrorMessage(ex.getMessage());
+						return;
+					} catch (Exception ex2) {
+						setErrorMessage(ex2.getMessage());
+						return;
+					}
+					setFileContents();
+					close();
+
+				} else {
+					setErrorMessage("Please fill out all fields");
+				}
+			}
+		});
+		Button cancel = new Button(parent, SWT.PUSH);
+		cancel.setText("Cancel");
+		cancel.setFont(JFaceResources.getDialogFont());
+		cancel.setLayoutData(buttonlayout);
+		cancel.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				close();
+			}
+		});
+	}
+
+	private void getFileContents() {
+		Properties settings = new Properties();
+		File file = new File(System.getProperty("user.home")
+				+ "/.exerciseSettings");
+		if (!file.exists()) {
+			svnLocation = "";
+			workingDirectory = "";
+			svnUsername = "";
+			svnPassword = "";
+			mySQLHost = "";
+			mySQLDb = "";
+			mySQLUsername = "";
+			mySQLPassword = "";
+			mySQLcheckSSL = false;
+			myPDFLatexPath = "";
+		} else {
+			try {
+				settings.load(new FileInputStream(file));
+			} catch (FileNotFoundException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+			try {
+				if (settings.getProperty("svnLocation") != null)
+					svnLocation = settings.getProperty("svnLocation");
+				if (settings.getProperty("workingDirectory") != null)
+					workingDirectory = settings.getProperty("workingDirectory");
+				if (settings.getProperty("svnUsername") != null)
+					svnUsername = settings.getProperty("svnUsername");
+				if (settings.getProperty("svnPassword") != null)
+					svnPassword = settings.getProperty("svnPassword");
+				if (settings.getProperty("mySQLHost") != null)
+					mySQLHost = settings.getProperty("mySQLHost");
+				if (settings.getProperty("mySQLDb") != null)
+					mySQLDb = settings.getProperty("mySQLDb");
+				if (settings.getProperty("mySQLUsername") != null)
+					mySQLUsername = settings.getProperty("mySQLUsername");
+				if (settings.getProperty("mySQLPassword") != null)
+					mySQLPassword = settings.getProperty("mySQLPassword");
+				if (settings.getProperty("mySQLcheckSSL") != null)
+					mySQLcheckSSL = Boolean.parseBoolean(settings
+							.getProperty("mySQLcheckSSL"));
+				if (settings.getProperty("mySQLcheckSSL") != null)
+					myPDFLatexPath = settings.getProperty("myPDFLatexPath");
+			} catch (Exception ex) {
+				svnLocation = "";
+				workingDirectory = "";
+				svnUsername = "";
+				svnPassword = "";
+				mySQLHost = "";
+				mySQLDb = "";
+				mySQLUsername = "";
+				mySQLPassword = "";
+				mySQLcheckSSL = false;
+				myPDFLatexPath = "";
+			}
+		}
+	}
+
+	private void setFileContents() {
+		Properties settings = new Properties();
+		File file = new File(System.getProperty("user.home")
+				+ "/.exerciseSettings");
+		if (!file.exists()) {
+			try {
+				file.createNewFile();
+			} catch (IOException e) {
+				e.printStackTrace();
+				return;
+			}
+		}
+
+		settings.setProperty("svnLocation", svnLocation);
+		settings.setProperty("workingDirectory", workingDirectory);
+		settings.setProperty("svnUsername", svnUsername);
+		settings.setProperty("svnPassword", svnPassword);
+		settings.setProperty("mySQLHost", mySQLHost);
+		settings.setProperty("mySQLDb", mySQLDb);
+		settings.setProperty("mySQLUsername", mySQLUsername);
+		settings.setProperty("mySQLPassword", mySQLPassword);
+		settings.setProperty("mySQLcheckSSL", String.valueOf(mySQLcheckSSL));
+		settings.setProperty("myPDFLatexPath", myPDFLatexPath);
+
+		try {
+			settings.store(new FileOutputStream(file),
+					"SVN and other Settings included");
+		} catch (FileNotFoundException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/template-klausur.tex
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/template-klausur.tex	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/template-klausur.tex	(revision 3)
@@ -0,0 +1,32 @@
+\documentclass[11pt,a4paper]{article}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}    % need for subequations
+\usepackage{graphicx}   % need for figures
+\usepackage{verbatim}   % useful for program listings
+\usepackage{color}      % use if color is used in text
+\usepackage{hyperref}   % use for hypertext links, including those to external documents and URLs
+\usepackage[left=2cm,top=1cm,right=2cm,bottom=2cm,nohead,nofoot]{geometry}
+
+\pagestyle{plain}
+
+\begin{document}
+\title{\begin{flushleft}Georg-August-UniversitÃ€t
+GÃ¶ttingen\\LECTURE\\LECTURERS\\Klausur SHEETNUMBER\end{flushleft}}
+\author{}
+\date{}
+\maketitle
+
+\vspace{-2cm}
+\begin{flushleft}
+Name:\\Matrikelnummer:
+\end{flushleft}
+
+\hrule
+
+\vspace{0.5cm}
+
+EXERCISES
+
+\end{document}
+
+
Index: /trunk/de.ugoe.cs.swe.exercises/template-uebung.tex
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/template-uebung.tex	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/template-uebung.tex	(revision 3)
@@ -0,0 +1,29 @@
+\documentclass[11pt,a4paper]{article}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}    % need for subequations
+\usepackage{graphicx}   % need for figures
+\usepackage{verbatim}   % useful for program listings
+\usepackage{color}      % use if color is used in text
+\usepackage{hyperref}   % use for hypertext links, including those to external documents and URLs
+\usepackage[left=2cm,top=1cm,right=2cm,bottom=2cm,nohead,nofoot]{geometry}
+
+\pagestyle{plain}
+
+\begin{document}
+\title{\begin{flushleft}Georg-August-UniversitÃ€t
+GÃ¶ttingen\\LECTURE\\LECTURERS\\Ãbung SHEETNUMBER\end{flushleft}}
+\author{}
+\date{}
+\maketitle
+
+\vspace{-1.9cm}
+
+\hrule
+
+\vspace{0.5cm}
+
+EXERCISES
+
+\end{document}
+
+
Index: /trunk/de.ugoe.cs.swe.exercises/template.tex
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/template.tex	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/template.tex	(revision 3)
@@ -0,0 +1,32 @@
+\documentclass[11pt,a4paper]{article}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}    % need for subequations
+\usepackage{graphicx}   % need for figures
+\usepackage{verbatim}   % useful for program listings
+\usepackage{color}      % use if color is used in text
+\usepackage{hyperref}   % use for hypertext links, including those to external documents and URLs
+\usepackage[left=2cm,top=1cm,right=2cm,bottom=2cm,nohead,nofoot]{geometry}
+
+\pagestyle{plain}
+
+\begin{document}
+\title{\begin{flushleft}Georg-August-UniversitÃ€t
+GÃ¶ttingen\\LECTURE\\LECTURERS\\EXAMORUNIT SHEETNUMBER\end{flushleft}}
+\author{}
+\date{}
+\maketitle
+
+\vspace{-2cm}
+\begin{flushleft}
+Name:\\Matrikelnummer:
+\end{flushleft}
+
+\hrule
+
+\vspace{0.5cm}
+
+EXERCISES
+
+\end{document}
+
+
Index: /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/BaseTest.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/BaseTest.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/BaseTest.java	(revision 3)
@@ -0,0 +1,24 @@
+package de.ugoe.cs.swe.exercises.tests;
+
+import org.junit.After;
+import org.junit.Before;
+import de.ugoe.cs.swe.exercises.exercise.ExerciseSVN;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class BaseTest {
+	private java.sql.Connection con;
+	
+	@Before
+	public void setUpTestDb() throws Exception {
+		while(con == null)
+			con = Model.getConnection(true);
+		ExerciseSVN.SVNCheckout();
+		//Model.flushTables();
+	}
+
+	@After
+	public void tearDownTestDb() throws Exception {
+		Model.flushTables();
+		//con.close();
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/ExerciseSVNTest.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/ExerciseSVNTest.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/ExerciseSVNTest.java	(revision 3)
@@ -0,0 +1,39 @@
+package de.ugoe.cs.swe.exercises.tests;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import de.ugoe.cs.swe.exercises.exercise.ExerciseSVN;
+import de.ugoe.cs.swe.exercises.exercisesheet.ExerciseSheet;
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class ExerciseSVNTest extends BaseTest{
+
+	@Before
+	public void setUp() throws Exception {
+		Model.getConnection(true);
+		ExerciseSVN.SVNCheckout();
+		Model.flushTables();
+	}
+
+	@Test
+	public void testSVNCheckout() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+
+		
+		ExerciseSheet sheet = new ExerciseSheet(1, 1, 5, false, infoEvent,5);
+		sheet.save();
+		
+		ExerciseSVN.SVNCheckout(sheet.returnMaxRevision());
+	}
+
+
+
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/ExerciseSheetTest.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/ExerciseSheetTest.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/ExerciseSheetTest.java	(revision 3)
@@ -0,0 +1,105 @@
+package de.ugoe.cs.swe.exercises.tests;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.exercisesheet.ExerciseSheet;
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+
+public class ExerciseSheetTest extends BaseTest {
+	@Test
+	public void testAll() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		
+		ExerciseSheet sheet = new ExerciseSheet(1, 1, 5, false, infoEvent, 5);
+		sheet.save();
+		assertEquals(ExerciseSheet.all().size(), 1);
+		assertEquals(ExerciseSheet.all().get(0).getId(), sheet.getId());
+		assertEquals(ExerciseSheet.all().get(0).getNumber(), sheet
+				.getNumber());
+		assertEquals(ExerciseSheet.all().get(0).isExamination(), sheet
+				.isExamination());
+
+		assertEquals(ExerciseSheet.all().get(0).getComplexityValue(), sheet
+				.getComplexityValue());
+		assertEquals(ExerciseSheet.all().get(0).getLectureEvent().getId(), sheet
+				.getLectureEvent().getId());
+	}
+
+	@Test
+	public void testGetExercises() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		Exercise exercise = new Exercise("Penner Aufgabe", "Penner", "Sack", 6);
+		exercise.save();
+		ExerciseSheet sheet = new ExerciseSheet(1, 1, 5, false, infoEvent,5);
+		sheet.save();
+		sheet.addExercise(exercise);
+		assertEquals(sheet.getExercises().size(), 1);
+		assertEquals(sheet.getExercises().get(0).getId(), exercise.getId());
+		sheet.removeExercise(exercise);
+		assertEquals(sheet.getExercises().size(), 0);
+	}
+	
+	@Test
+	public void testUpdate() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		ExerciseSheet sheet = new ExerciseSheet(1, 1, 5, false, infoEvent,5);
+		sheet.save();
+		assertEquals(ExerciseSheet.all().size(), 1);
+		sheet.setExamination(true);
+		sheet.save();
+		assertEquals(ExerciseSheet.all().size(), 1);
+		assertEquals(ExerciseSheet.all().get(0).getId(), sheet.getId());
+		assertEquals(ExerciseSheet.all().get(0).getNumber(), sheet
+				.getNumber());
+		assertEquals(ExerciseSheet.all().get(0).isExamination(), sheet
+				.isExamination());
+		assertEquals(ExerciseSheet.all().get(0).getComplexityValue(), sheet
+				.getComplexityValue());
+		assertEquals(ExerciseSheet.all().get(0).getLectureEvent().getId(), sheet
+				.getLectureEvent().getId());
+	}
+
+	@Test
+	public void testDelete() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		ExerciseSheet sheet = new ExerciseSheet(1, 1, 5, false, infoEvent,5);
+		sheet.save();
+		assertEquals(ExerciseSheet.all().size(), 1);
+		sheet.delete();
+		assertEquals(ExerciseSheet.all().size(), 0);
+	}
+
+	@Test
+	public void testCacadedDelete() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		ExerciseSheet sheet = new ExerciseSheet(1, 1, 5, false, infoEvent,5);
+		sheet.save();
+		assertEquals(ExerciseSheet.all().size(), 1);
+		informatik.delete();
+		assertEquals(ExerciseSheet.all().size(), 0);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/ExerciseTest.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/ExerciseTest.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/ExerciseTest.java	(revision 3)
@@ -0,0 +1,131 @@
+package de.ugoe.cs.swe.exercises.tests;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class ExerciseTest extends BaseTest {
+
+	Exercise test = new Exercise("Horst's exercise 1", "1 + 1 = 6?", "false", 8,1);
+	Exercise test2 = new Exercise("Horst's exercise 2", "1 + 1 = 6?", "false", 8,1);
+
+	@Test
+	public void testExerciseInt() {
+		Exercise testInt = new Exercise();
+		assertTrue(testInt instanceof Exercise);
+	}
+
+	@Test
+	public void testExerciseIntStringStringString() {
+		Exercise testInt2 = new Exercise("Hans theorem", "Hans", "Wurst", 6, 6);
+		assertTrue(testInt2 instanceof Exercise);
+	}
+
+	@Test
+	public void testSetSolution() {
+		test.setSolution("Horst");
+		test.save();
+		assertEquals(test.getSolution(),"Horst\n");
+	}
+
+	@Test
+	public void testGetSolution() {
+		test2.save();
+		assertEquals(test2.getSolution(),"false\n");
+	}
+
+	@Test
+	public void testSetRevisionnumber() {
+		test.setRevisionnumber(2);
+		assertTrue(test.getRevisionnumber() == 2);
+	}
+
+	@Test
+	public void testGetRevisionnumber() {
+		assertTrue(test2.getRevisionnumber() == 8);
+	}
+
+	@Test
+	public void testSetComplexity() {
+		test.setComplexity(4);
+		assertTrue(test.getComplexity() == 4);
+	}
+
+	@Test
+	public void testGetComplexity() {
+		assertTrue(test2.getComplexity() == 1);
+	}
+
+	@Test
+	public void testInsertAndUpdate() {
+		Exercise test1 = new Exercise("Penner's lemma", "Penner", "Sack", 6,1);
+		Exercise test3 = new Exercise("sfasf solve", "sgfgfg", "gfdfg", 7,2);
+		assertEquals(test1.getId(), Model.UNDEFINED);
+		assertEquals(test3.getId(), Model.UNDEFINED);
+		assertEquals(Exercise.all().size(), 0);
+		test1.save();
+		// assertEquals(Exercise.all().size(), 1);
+		test3.save();
+		assertEquals(Exercise.all().size(), 2);
+		assertEquals(Exercise.all().get(0).getId(), test1.getId());
+		assertEquals(Exercise.all().get(1).getId(), test3.getId());
+		assertEquals(Exercise.all().get(0).getSolution(), test1.getSolution());
+	
+		test1.setSolution("bla");
+		test1.save();
+		assertEquals(Exercise.all().size(), 2);
+		assertEquals(Exercise.all().get(0).getId(), test1.getId());
+		assertEquals(Exercise.all().get(1).getId(), test3.getId());
+		assertEquals(Exercise.all().get(0).getSolution(), test1.getSolution());
+	
+		test1.setSolution("OvO");
+		test1.save();
+		assertEquals(Exercise.all().size(), 2);
+	}
+
+	@Test
+	public void testDelete() {
+		Exercise test1 = new Exercise("Penner's lemma", "Penner", "Sack", 3);
+		test1.save();
+		assertEquals(Exercise.all().size(), 1);
+		test1.delete();
+		assertEquals(Exercise.all().size(), 0);
+		assertEquals(Model.UNDEFINED, test1.getId());
+	}
+
+	@Test
+	public void testAll() {
+		Exercise test1 = new Exercise("Penner's lemma", "Penner", "Sack", 7);
+		Exercise test3 = new Exercise("bumbum", "sgfgfg", "gfdfg", 10);
+		test1.save();
+		test3.save();
+		// ArrayList<Exercise> lecturers = new ArrayList<Exercise>();
+		// lecturers.add(test1);
+		// lecturers.add(test3);
+		assertEquals(Exercise.all().get(0).getId(), test1.getId());
+		assertEquals(Exercise.all().get(1).getId(), test3.getId());
+		assertEquals(Exercise.all().get(0).getSolution(), test1.getSolution());
+		assertEquals(Exercise.all().get(1).getSolution(), test3.getSolution());
+		assertEquals(Exercise.all().get(0).getComplexity(), test1
+				.getComplexity());
+		assertEquals(Exercise.all().get(1).getComplexity(), test3
+				.getComplexity());
+	}
+
+	@Test
+	public void testSaveToDisk() {
+//		Exercise test5 = new Exercise("Lemma lemma", "solution", "egal", 5);
+//		test5.save();
+//		test5.saveToDisk();
+
+	}
+
+	// @Test
+	// public void testGetTextFromSVN(String svnRef)
+	// {
+	// ExerciseSVN.getTextFromSVN("hallo");
+	//		
+	// }
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/LectureEventTest.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/LectureEventTest.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/LectureEventTest.java	(revision 3)
@@ -0,0 +1,117 @@
+package de.ugoe.cs.swe.exercises.tests;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class LectureEventTest extends BaseTest {
+
+	@Test(expected = Model.DoesNotExistException.class)
+	public void testUnsavedLecture() {
+		Lecture informatik = new Lecture("Informatik I");
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+	}
+
+	@Test
+	public void testAll() {
+		Lecture informatik = new Lecture("Informatik I");
+		Lecture english = new Lecture("Business English");
+		informatik.save();
+		english.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		LectureEvent englishEvent = new LectureEvent(2008, LectureEvent.WS,
+				english);
+		infoEvent.save();
+		englishEvent.save();
+		assertEquals(LectureEvent.all().get(0).getId(), infoEvent.getId());
+		assertEquals(LectureEvent.all().get(1).getId(), englishEvent.getId());
+		assertEquals(LectureEvent.all().get(0).getSemester(), infoEvent
+				.getSemester());
+		assertEquals(LectureEvent.all().get(1).getSemester(), englishEvent
+				.getSemester());
+		assertEquals(LectureEvent.all().get(0).getIsSummerSemester(), infoEvent.getIsSummerSemester());
+		assertEquals(LectureEvent.all().get(1).getIsSummerSemester(), englishEvent
+				.getIsSummerSemester());
+		assertEquals(LectureEvent.all().get(0).getLecture().getId(), infoEvent
+				.getLecture().getId());
+		assertEquals(LectureEvent.all().get(1).getLecture().getId(),
+				englishEvent.getLecture().getId());
+	}
+
+	@Test
+	public void testGetLecturers() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		Lecturer waack = new Lecturer("Stefan", "Waack", "Prof. Dr.");
+		Lecturer damm = new Lecturer("Carsten", "Damm", "Prof. Dr.");
+		waack.save();
+		damm.save();
+		infoEvent.addLecturer(waack);
+		infoEvent.addLecturer(damm);
+		assertEquals(infoEvent.getLecturers().size(), 2);
+		assertEquals(infoEvent.getLecturers().get(0).getId(), waack.getId());
+		assertEquals(infoEvent.getLecturers().get(1).getId(), damm.getId());
+		infoEvent.removeLecturer(waack);
+		infoEvent.removeLecturer(damm);
+		assertEquals(infoEvent.getLecturers().size(), 0);
+	}
+
+	@Test
+	public void testUpdate() {
+		Lecture informatik = new Lecture("Informatik I");
+		Lecture informatik2 = new Lecture("Informatik II");
+		informatik.save();
+		informatik2.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		assertEquals(LectureEvent.all().get(0).getLecture().getId(), infoEvent
+				.getLecture().getId());
+		infoEvent.setLecture(informatik2);
+		infoEvent.save();
+		assertEquals(LectureEvent.all().size(), 1);
+		assertEquals(LectureEvent.all().get(0).getId(), infoEvent.getId());
+		assertEquals(LectureEvent.all().get(0).getSemester(), infoEvent
+				.getSemester());
+		assertEquals(LectureEvent.all().get(0).getIsSummerSemester(), infoEvent.getIsSummerSemester());
+		assertEquals(LectureEvent.all().get(0).getLecture().getName(),
+				infoEvent.getLecture().getName());
+		assertEquals(LectureEvent.all().get(0).getLecture().getId(), infoEvent
+				.getLecture().getId());
+	}
+
+	@Test
+	public void testDelete() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		assertEquals(LectureEvent.all().size(), 1);
+		infoEvent.delete();
+		assertEquals(LectureEvent.all().size(), 0);
+	}
+
+	@Test
+	public void testCascadedDelete() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		assertEquals(LectureEvent.all().size(), 1);
+		informatik.delete();
+		assertEquals(LectureEvent.all().size(), 0);
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/LectureTest.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/LectureTest.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/LectureTest.java	(revision 3)
@@ -0,0 +1,106 @@
+package de.ugoe.cs.swe.exercises.tests;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class LectureTest extends BaseTest {
+
+	@Test
+	public void testInsertAndUpdate() {
+		Lecture informatik = new Lecture("Informatik I");
+		Lecture english = new Lecture("Business English");
+		assertEquals(informatik.getId(), Model.UNDEFINED);
+		assertEquals(english.getId(), Model.UNDEFINED);
+		assertEquals(Lecture.all().size(), 0);
+		informatik.save();
+		assertEquals(Lecture.all().size(), 1);
+		english.save();
+		assertEquals(Lecture.all().size(), 2);
+		assertEquals(Lecture.all().get(0).getId(), informatik.getId());
+		assertEquals(Lecture.all().get(1).getId(), english.getId());
+		assertEquals(Lecture.all().get(0).getName(), informatik.getName());
+		assertEquals(Lecture.all().get(1).getName(), english.getName());
+		informatik.setName("Informatik II");
+		informatik.save();
+		assertEquals(Lecture.all().size(), 2);
+		assertEquals(Lecture.all().get(0).getId(), informatik.getId());
+		assertEquals(Lecture.all().get(1).getId(), english.getId());
+		assertEquals(Lecture.all().get(0).getName(), informatik.getName());
+		assertEquals(Lecture.all().get(1).getName(), english.getName());
+		informatik.setName("Informatik I");
+		informatik.save();
+		assertEquals(Lecture.all().size(), 2);
+	}
+
+	@Test
+	public void testAll() {
+		Lecture informatik = new Lecture("Informatik I");
+		Lecture english = new Lecture("Business English");
+		informatik.save();
+		english.save();
+		assertEquals(Lecture.all().get(0).getId(), informatik.getId());
+		assertEquals(Lecture.all().get(1).getId(), english.getId());
+		assertEquals(Lecture.all().get(0).getName(), informatik.getName());
+		assertEquals(Lecture.all().get(1).getName(), english.getName());
+	}
+
+	@Test
+	public void testDelete() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		assertEquals(Lecture.all().size(), 1);
+		informatik.delete();
+		assertEquals(Lecture.all().size(), 0);
+		assertEquals(Model.UNDEFINED, informatik.getId());
+
+	}
+
+	@Test(expected = Model.DoesNotExistException.class)
+	public void testDeleteException() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.delete();
+	}
+
+	@Test
+	public void testInsertKeyword() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+
+		CKeyword key1 = new CKeyword(0, "SchlÃŒssel 1", informatik.getId());
+		CKeyword key2 = new CKeyword(0, "SchlÃŒssel** 2", informatik.getId());
+
+		CKeyword.insertKey(key1, CKeyword.LECTURE);
+		CKeyword.insertKey(key2, CKeyword.LECTURE);
+
+		assertEquals(key1.getKey(), CKeyword.getKeywordsForModel(
+				informatik.getId(), CKeyword.LECTURE).get(0).getKey());
+		assertEquals(key1.getModelId(), CKeyword.getKeywordsForModel(
+				informatik.getId(), CKeyword.LECTURE).get(0).getModelId());
+	}
+
+	@Test
+	public void testDeleteKeyword() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+
+		CKeyword key1 = new CKeyword(0, "SchlÃŒssel 1", informatik.getId());
+		CKeyword key2 = new CKeyword(0, "SchlÃŒssel** 2", informatik.getId());
+
+		CKeyword.insertKey(key1, CKeyword.LECTURE);
+		CKeyword.insertKey(key2, CKeyword.LECTURE);
+
+		CKeyword.deleteKey(CKeyword.getKeywordsForModel(informatik.getId(), CKeyword.LECTURE)
+				.get(0).getKeyId(), CKeyword.LECTURE);
+		assertEquals(1, CKeyword.getKeywordsForModel(informatik.getId(), CKeyword.LECTURE)
+				.size());
+		CKeyword.deleteKey(CKeyword.getKeywordsForModel(informatik.getId(), CKeyword.LECTURE)
+				.get(0).getKeyId(), CKeyword.LECTURE);
+		assertEquals(0, CKeyword.getKeywordsForModel(informatik.getId(), CKeyword.LECTURE)
+				.size());
+	}
+}
Index: /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/LecturerTest.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/LecturerTest.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/LecturerTest.java	(revision 3)
@@ -0,0 +1,113 @@
+package de.ugoe.cs.swe.exercises.tests;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import de.ugoe.cs.swe.exercises.lecturer.Lecturer;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class LecturerTest extends BaseTest {
+
+	Lecturer test = new Lecturer();
+	Lecturer test2 = new Lecturer("Hans", "Wurst", "Master of Disaster");
+
+	@Test
+	public void testLecturerInt() {
+		Lecturer testInt = new Lecturer();
+		assertTrue(testInt instanceof Lecturer);
+	}
+
+	@Test
+	public void testLecturerIntStringStringString() {
+		Lecturer testInt2 = new Lecturer("Hans", "Wurst", "Master of Disaster");
+		assertTrue(testInt2 instanceof Lecturer);
+	}
+
+	@Test
+	public void testSetTitle() {
+		test.setTitle("Dr");
+		assertTrue(test.getTitle() == "Dr");
+	}
+
+	@Test
+	public void testGetTitle() {
+		assertTrue(test2.getTitle() == "Master of Disaster");
+	}
+
+	@Test
+	public void testSetFirstName() {
+		test.setFirstName("Peter");
+		assertTrue(test.getFirstName() == "Peter");
+	}
+
+	@Test
+	public void testGetFirstName() {
+		assertTrue(test2.getFirstName() == "Hans");
+	}
+
+	@Test
+	public void testSetLastName() {
+		test.setLastName("Zwegat");
+		assertTrue(test.getLastName() == "Zwegat");
+	}
+
+	@Test
+	public void testGetLastName() {
+		assertTrue(test2.getLastName() == "Wurst");
+	}
+
+	@Test
+	public void testInsertAndUpdate() {
+		Lecturer test1 = new Lecturer("Penner", "Sack", "Master of Puppets");
+		Lecturer test3 = new Lecturer("sgfgfg", "gfdfg", "Dr. NO");
+		
+		assertEquals(test1.getId(), Model.UNDEFINED);
+		assertEquals(test3.getId(), Model.UNDEFINED);
+		assertEquals(Lecturer.all().size(), 0);
+		test1.save();
+		assertEquals(Lecturer.all().size(), 1);
+		test3.save();
+		assertEquals(Lecturer.all().size(), 2);
+		
+		assertEquals(Lecturer.all().get(0).getId(), test1.getId());
+		assertEquals(Lecturer.all().get(1).getId(), test3.getId());
+		
+		assertEquals(Lecturer.all().get(0).getFirstName(), test1.getFirstName());
+		assertEquals(Lecturer.all().get(1).getLastName(), test3.getLastName());
+		test1.setFirstName("bla");
+		test1.save();
+		assertEquals(Lecturer.all().size(), 2);
+		assertEquals(Lecturer.all().get(0).getId(), test1.getId());
+		assertEquals(Lecturer.all().get(1).getId(), test3.getId());
+		assertEquals(Lecturer.all().get(0).getLastName(), test1.getLastName());
+		assertEquals(Lecturer.all().get(1).getFirstName(), test3.getFirstName());
+		test1.setFirstName("OvO");
+		test1.save();
+		assertEquals(Lecturer.all().size(), 2);
+	}
+
+	@Test
+	public void testDelete() {
+		Lecturer test1 = new Lecturer("Penner", "Sack", "Master of Puppets");
+		test1.save();
+		assertEquals(Lecturer.all().size(), 1);
+		test1.delete();
+		assertEquals(Lecturer.all().size(), 0);
+		assertEquals(Model.UNDEFINED, test1.getId());
+	}
+
+	@Test
+	public void testAll() {
+		Lecturer test1 = new Lecturer("Penner", "Sack", "Master of Puppets");
+		Lecturer test3 = new Lecturer("sgfgfg", "gfdfg", "Dr. NO");
+		test1.save();
+		test3.save();
+		// ArrayList<Lecturer> lecturers = new ArrayList<Lecturer>();
+		// lecturers.add(test1);
+		// lecturers.add(test3);
+		assertEquals(Lecturer.all().get(0).getId(), test1.getId());
+		assertEquals(Lecturer.all().get(1).getId(), test3.getId());
+		assertEquals(Lecturer.all().get(0).getFirstName(), test1.getFirstName());
+		assertEquals(Lecturer.all().get(1).getLastName(), test3.getLastName());
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/PdfGeneratorTest.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/PdfGeneratorTest.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/PdfGeneratorTest.java	(revision 3)
@@ -0,0 +1,35 @@
+package de.ugoe.cs.swe.exercises.tests;
+
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.exercisesheet.ExerciseSheet;
+import de.ugoe.cs.swe.exercises.exercisesheet.PdfGenerator;
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+
+public class PdfGeneratorTest extends BaseTest{
+
+//	@Test
+	public void testGeneratePdf() {
+		Lecture informatik = new Lecture("Informatik I");
+		informatik.save();
+		LectureEvent infoEvent = new LectureEvent(2009, LectureEvent.SS,
+				informatik);
+		infoEvent.save();
+		ExerciseSheet sheet = new ExerciseSheet(1, 1, 5, false, infoEvent,5);
+		sheet.save();
+
+		Exercise testInt2 = new Exercise("Hans theorem", "Hans", "Wurst", 6);
+		Exercise test1 = new Exercise("Penner's lemma", "Penner", "Sack", 6,1);
+		Exercise test3 = new Exercise("sfasf solve", "sgfgfg", "gfdfg", 7,2);
+		testInt2.save();
+		test1.save();
+		test3.save();
+		
+		sheet.addExercise(testInt2);
+		sheet.addExercise(test1);
+		sheet.addExercise(test3);
+		
+		PdfGenerator.generatePdf(sheet, "output.pdf", false, true);
+	}
+
+}
Index: /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/SheetGeneratorTest.java
===================================================================
--- /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/SheetGeneratorTest.java	(revision 3)
+++ /trunk/de.ugoe.cs.swe.exercises/tests/de/ugoe/cs/swe/exercises/tests/SheetGeneratorTest.java	(revision 3)
@@ -0,0 +1,76 @@
+package de.ugoe.cs.swe.exercises.tests;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import de.ugoe.cs.swe.exercises.exercise.Exercise;
+import de.ugoe.cs.swe.exercises.exercise.ExerciseSVN;
+import de.ugoe.cs.swe.exercises.exercisesheet.SheetGenerator;
+import de.ugoe.cs.swe.exercises.lecture.Lecture;
+import de.ugoe.cs.swe.exercises.lectureevent.LectureEvent;
+import de.ugoe.cs.swe.exercises.misc.CKeyword;
+import de.ugoe.cs.swe.exercises.misc.Model;
+
+public class SheetGeneratorTest extends BaseTest {
+
+	private SheetGenerator testSheet;
+	private ArrayList<CKeyword> testKeywords;
+	private Exercise test1;
+	private Exercise test2;
+
+	@Before
+	public void setUp() throws Exception {
+		Model.getConnection(true);
+		ExerciseSVN.SVNCheckout();
+		Model.flushTables();
+		
+		testKeywords = new ArrayList<CKeyword>();
+		
+		Lecture lecture = new Lecture("Vorlesung");
+		lecture.save();
+		
+		LectureEvent le = new LectureEvent(2009,true,lecture.getId());
+		le.save();
+		
+		test1 = new Exercise("Horst's exercise 1", "1 + 1 = 6?", "false", 8,1);
+		test2 = new Exercise("Horst's exercise 2", "1 + 1 = 6?", "false", 8,1);
+		test1.save();
+		test2.save();
+		
+		testKeywords.add(new CKeyword( "Keyword1", test1.getId()));
+		testKeywords.add(new CKeyword( "Keyword2", test1.getId()));
+		testKeywords.add(new CKeyword( "Keyword2", test2.getId()));
+		
+		CKeyword.insertKey(testKeywords.get(0), CKeyword.EXERCISE);
+		CKeyword.insertKey(testKeywords.get(1), CKeyword.EXERCISE);
+		CKeyword.insertKey(testKeywords.get(2), CKeyword.EXERCISE);
+		
+		testSheet = new SheetGenerator(10, le, testKeywords, 5);
+		
+	}
+
+	@Test
+	public void testGetMaxComplexity() {
+		assertEquals(10, testSheet.getMaxComplexity());
+	}
+
+	@Test
+	public void testGetLectureEvent() {
+		//assertEquals(1, testSheet.getLectureEvent().getId());
+	}
+
+	// Test impractical and unrealiable due to used random function
+	
+	/*
+	@Test
+	public void testGenerateExercises() {
+		
+		assertEquals(null , testSheet.generateExercises());
+	}
+	*/
+
+}
