tagged initial contribution Object Teams Examples

diff --git a/otdt-examples/OTSample-ATM-src/.classpath b/otdt-examples/OTSample-ATM-src/.classpath
new file mode 100644
index 0000000..bcc3bc2
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="OTRE"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/otdt-examples/OTSample-ATM-src/.project b/otdt-examples/OTSample-ATM-src/.project
new file mode 100644
index 0000000..0bd56e5
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/.project
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>OTSample-ATM-src</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.objectteams.otdt.builder.OTJBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.objectteams.otdt.OTJavaNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/otdt-examples/OTSample-ATM-src/.settings/org.eclipse.jdt.core.prefs b/otdt-examples/OTSample-ATM-src/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3ea6481
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,64 @@
+#Sat Jul 18 22:09:19 CEST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
diff --git a/otdt-examples/OTSample-ATM-src/atm-zip.jardesc b/otdt-examples/OTSample-ATM-src/atm-zip.jardesc
new file mode 100644
index 0000000..100efff
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/atm-zip.jardesc
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jardesc>
+    <jar path="org.eclipse.objectteams.otdt.samples/samples/atm.zip"/>
+    <options buildIfNeeded="true" compress="true" descriptionLocation="/OTSample-ATM-src/atm-zip.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="false" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="true"/>
+    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+    <selectedProjects/>
+    <selectedElements exportClassFiles="false" exportJavaFiles="true" exportOutputFolder="false">
+        <file path="/OTSample-ATM-src/.classpath"/>
+        <file path="/OTSample-ATM-src/.project"/>
+        <javaElement handleIdentifier="=OTSample-ATM-src/src"/>
+    </selectedElements>
+</jardesc>
diff --git a/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/ATM.java b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/ATM.java
new file mode 100644
index 0000000..e873b3a
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/ATM.java
@@ -0,0 +1,116 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.atm;
+import org.objectteams.ImplicitTeamActivation;
+
+/**
+ * This team realizes the ATM.
+ * An ATM belongs to a certain bank and only for withdrawal from a foreign account 
+ * an additional fee is debited. Furthermore it is not possible to query the balance 
+ * of a foreign account. 
+ */
+@ImplicitTeamActivation
+public team class ATM {
+	private Bank myBank;
+	private Account feeAccount;
+	
+	public ATM(Bank bank) {
+		myBank = bank;
+		feeAccount = new Account(bank);
+	}
+	
+	/**
+	 * Returns the balance of the fee account.
+	 */
+	int getFeeAccountBalance() {
+		return feeAccount.getBalance();
+	}
+	
+	/**
+	 * Pays the given amount of cash from the given account, if it contains enough money. 
+	 */
+	public int payCash(Account account, int amount) {
+		boolean ok = account.debit(amount);
+		if (ok) 
+			return amount;
+		else 
+			return 0;
+	}
+	
+	/**
+	 * Returns the balance of the given Account object. If an exception is thrown while accessing the
+	 * balance of the account this method throws an AccessDeniedException.
+	 */
+	public int getBalance(Account account) throws AccessDeniedException {
+		try {
+			return account.getBalance();
+		} catch (Exception e) {
+			throw new AccessDeniedException();
+		}
+	}
+	
+	/**
+	 * This role is responsible for the different handling of accounts belonging to a different bank
+	 * than the ATM does (foreign accounts).
+	 * 
+	 * The guard predicate attached to the ForeignAccount role ensures that this role and therefore 
+	 * all its callin bindings are only effective for foreign accounts. It checks, if the bank of the base 
+	 * object to be lifted is different from the bank of the ATM. 
+	 */
+	public class ForeignAccount playedBy Account
+	base when (!(ATM.this.myBank.equals(base.getBank())))
+	{
+		/**
+		 * This callin method calls its base method with the given amount plus an additional fee.
+		 */
+		callin boolean debitWithFee(int amount) {
+			int fee = calculateFee(amount);
+			if (base.debitWithFee(fee+amount)) {
+				System.out.println("Debiting from a foreign account: Additional fee of "+fee+" Euro will be debited!");
+				feeAccount.credit(fee);
+				return true;
+			}
+			return false;
+		}
+		/**
+		 * Binds the role method debitWithFee to the base method debit of the base class Account.
+		 */
+		debitWithFee <- replace debit;
+		
+		/**
+		 * Restricting the query of balance, is realized as another callin method denying the call to
+		 * getBalance for foreign accounts. Because of the role predicate, this callin method is not called for own accounts.
+		 */
+		callin int checkedGetBalance() { 
+			throw new RuntimeException("Access to balance of foreign account not allowed!");
+		}
+		
+		/**
+		 * Binds the role method checkedGetBalance to the base method getBalance of the base class Account.
+		 */
+		checkedGetBalance <- replace getBalance;
+		
+		/**
+		 * Returns the fee for debiting the given amount from a foreign account. 
+		 * Here this is a fixed fee of 5%.
+		 */
+		public int calculateFee(int amount) {
+			int feePercent = 5;
+			return (amount/100)*feePercent;
+		}
+	}
+}
diff --git a/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/AccessDeniedException.java b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/AccessDeniedException.java
new file mode 100644
index 0000000..d39df0c
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/AccessDeniedException.java
@@ -0,0 +1,24 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.atm;
+/**
+ * This exception is thrown if an unauthorized access to an account is tried.
+ *
+ */
+public class AccessDeniedException extends Throwable {
+
+}
diff --git a/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/Account.java b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/Account.java
new file mode 100644
index 0000000..54f1e14
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/Account.java
@@ -0,0 +1,68 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.atm;
+/**
+ * This class represents an account. 
+ * In this application it is the base class of the ATM.ForeignAccount role 
+ * and the SpecialConditions.BonusAccount role. 
+ */
+public class Account {
+	
+    private int balance;
+    private Bank bank;
+
+    /**
+     * Constructor of an account object. Gets the owning bank as parameter.
+     */
+    public Account(Bank _bank) {
+        bank = _bank;
+    }
+
+    /**
+     * Get the balance of the account.
+     */
+    public int getBalance() {
+        return balance;
+    }
+
+    /**
+     * Get the bank of the account.
+     */
+    public Bank getBank() {
+        return bank;
+    }
+
+    /**
+     * Debit an amount from the account.
+     */
+    public boolean debit(int amount) {
+
+        if (!(amount>balance)) {
+            balance -= amount;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Credit an amount to the account.
+     */
+    public void credit(int amount) {
+        balance += amount;
+    }
+
+}
diff --git a/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/Bank.java b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/Bank.java
new file mode 100644
index 0000000..00a8fbb
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/Bank.java
@@ -0,0 +1,33 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.atm;
+/**
+ * This class represents a very simple bank, only characterized by its name.
+ *
+ */
+public class Bank {
+    private String name;
+
+    public Bank(String _name) {
+        name = _name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+}
diff --git a/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/Main.java b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/Main.java
new file mode 100644
index 0000000..ac20466
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/Main.java
@@ -0,0 +1,98 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.atm;
+
+/**
+ * Object Teams features demonstrated by this example:
+ * ---------------------------------------------------
+ * 
+ * Guard Predicates:
+ * Guard predicates are used to restrict the activation of callins.
+ * 
+ * Reflection:
+ * Reflection is used to check whether a base object already has a role in 
+ * the context of a certain team.
+ *  
+ * 
+ * Domain description: 
+ * -------------------
+ *
+ * This is a simple example of an automatic teller machine (ATM).
+ * Using a certain account it is possible to pay cash and to check the balance.
+ * Accounts of foreign banks are handled differently from home bank accounts. Additionally, 
+ * it is possible to participate in special conditions to gain bonus for certain withdrawals.
+
+ * Launching the application:
+ * --------------------------
+ * 
+ *   - Just run this class as you would run any regular Java program.
+ *     (to check enablement of OT/J you may visit the JRE tab of the corres-
+ *     ponding launch configuration and ensure that "Enable OTRE" is checked).
+ * 
+ */
+public class Main {
+	
+	public static void main(String[] args) {
+		Bank bb = new Bank("Bust-Bank");
+		
+		Account acc1 = new Account(bb);
+
+		
+		Bank cb = new Bank("Crash-Bank");
+		Account acc2 = new Account(cb);
+	
+		ATM cbATM = new ATM(cb);
+		System.out.println("Both accounts get 1000 Euro seed capital.");
+		acc1.credit(1000);
+		acc2.credit(1000);
+		
+		System.out.println("Withdrawing 200 Euro from both accounts:");
+		cbATM.payCash(acc1, 200);
+		System.out.println("Balance of foreign account: "+ acc1.getBalance()+ " Euro");
+		cbATM.payCash(acc2, 200);
+		System.out.println("Balance of home account: "+ acc2.getBalance()+ " Euro");
+		System.out.println("ATMs fee account balance: " + cbATM.getFeeAccountBalance()+ " Euro");
+		
+		System.out.println("---------------------------------------------------");
+		try {
+			System.out.println("Get balance of foreign account via atm: ");
+			System.out.println(cbATM.getBalance(acc1)+ " Euro");
+		} catch (AccessDeniedException ade) {
+			System.out.println("Sorry: Can not read the balance of a foreign account!");
+		}
+		try {
+			System.out.println("Get balance of home account via atm: ");
+			System.out.println(cbATM.getBalance(acc2)+ " Euro");
+		} catch (AccessDeniedException ade) {
+			System.out.println("Sorry: Can not read the balance of a foreign account!");
+		}
+		System.out.println("---------------------------------------------------");
+		SpecialConditions sc = new SpecialConditions();
+		sc.activate();
+		sc.participate(acc2);
+		
+		System.out.println("Crediting 2000 Euro to both accounts:");
+		int acc1_before = acc1.getBalance();
+		int acc2_before = acc2.getBalance();
+		acc1.credit(2000); // -> balance += 2020 
+		
+		System.out.println("Not participating account gets: " + (acc1.getBalance() - acc1_before)+" Euro.");
+		acc2.credit(2000); // -> balance += 2000
+		System.out.println("Special condition participating account gets: " + (acc2.getBalance() - acc2_before)+" Euro.");
+		
+	}
+}
diff --git a/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/SpecialConditions.java b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/SpecialConditions.java
new file mode 100644
index 0000000..68b0334
--- /dev/null
+++ b/otdt-examples/OTSample-ATM-src/src/org/eclipse/objectteams/example/atm/SpecialConditions.java
@@ -0,0 +1,64 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.atm;
+
+/**
+ * This team realizes special conditions for selected accounts.
+ * If an account is registered to collect a special bonus, every time 
+ * an amount of more than 1000 is deposited, additionaly, 1% of the amount 
+ * is credited. 
+ */
+public team class SpecialConditions {
+	
+	/**
+	 * This team provides a registration method participate which
+	 * is used to register an Account for the special conditions. 
+	 * Here, the explicit role creation mechanism is used.
+	 */
+	public void participate(Account as BonusAccount ba) {}
+
+	
+	/**
+	 * The base guard predicate at the BonusAccount role checks, if the base
+	 * object already has a role in this team. If this is not the case it prevents 
+	 * lifting (and thus role creation). In combination with the registration method 
+	 * this means that BonusAccountroles are never created automatically via lifting but 
+	 * have to be explicitly registered first.
+	 */
+	public class BonusAccount playedBy Account
+		base when(SpecialConditions.this.hasRole(base, BonusAccount.class))
+	{ 	  
+		/**
+		 * This callin method implements the collection of the bonus. 
+		 * It replaces the original Account.credit method and performs a base call with the 
+		 * increased amount of money. 
+		 */
+		callin void creditBonus(int amount)
+		{
+			int bonus = amount/100;
+			base.creditBonus(amount+bonus);
+			System.out.println("You will gain a bonus of "+ bonus + " Euro!");
+		}
+
+		/**
+		 * In the method binding we use an additional predicate to ensure that 
+		 * bonus is only credited for amounts greater than 1000.
+		 */
+		void creditBonus(int amount) <- replace void credit(int i)
+			base when (i > 1000); 
+	}    
+}
diff --git a/otdt-examples/OTSample-Flightbonus-src/.classpath b/otdt-examples/OTSample-Flightbonus-src/.classpath
new file mode 100644
index 0000000..dae5e9f
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/src"/>
+	<classpathentry kind="src" path="src/booking"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="OTRE"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/otdt-examples/OTSample-Flightbonus-src/.project b/otdt-examples/OTSample-Flightbonus-src/.project
new file mode 100644
index 0000000..8d99dca
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/.project
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>OTSample-Flightbonus-src</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.objectteams.otdt.builder.OTJBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.objectteams.otdt.OTJavaNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/otdt-examples/OTSample-Flightbonus-src/.settings/org.eclipse.jdt.core.prefs b/otdt-examples/OTSample-Flightbonus-src/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..004aee8
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,70 @@
+#Fri Mar 13 22:53:55 CET 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/otdt-examples/OTSample-Flightbonus-src/booking.jardesc b/otdt-examples/OTSample-Flightbonus-src/booking.jardesc
new file mode 100644
index 0000000..f9e66bc
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/booking.jardesc
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jardesc>
+    <jar path="OTSample-Flightbonus-src/src/lib/booking.jar"/>
+    <options buildIfNeeded="true" compress="true" descriptionLocation="/OTSample-Flightbonus-src/booking.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
+    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+    <selectedProjects/>
+    <manifest generateManifest="true" mainClassHandleIdentifier="=OTSample-Flightbonus-src/src\/booking&lt;org.eclipse.objectteams.example.flightbooking{Main.java[Main" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+        <sealing sealJar="false">
+            <packagesToSeal/>
+            <packagesToUnSeal/>
+        </sealing>
+    </manifest>
+    <selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false">
+        <javaElement handleIdentifier="=OTSample-Flightbonus-src/src\/booking"/>
+    </selectedElements>
+    <fatjar builder="org.eclipse.jdt.ui.plain_jar_builder" launchConfig=""/>
+</jardesc>
diff --git a/otdt-examples/OTSample-Flightbonus-src/build.xml b/otdt-examples/OTSample-Flightbonus-src/build.xml
new file mode 100644
index 0000000..1764bfd
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/build.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="flightbonus" default="zip">
+	<property name="zipfile" value="org.eclipse.objectteams.otdt.samples/samples/flightbonus.zip"/>
+	<target name="zip">
+		<delete file="${zipfile}"/>
+		<zip 
+			destfile="${zipfile}"
+			basedir="OTSample-Flightbonus-src/src"
+			includes="Intro0.html,FlightbookingWithBonus.launch,.classpath,.project,sample.properties,src/**,lib/**,.settings/**"/>
+	</target>
+</project>
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/.classpath b/otdt-examples/OTSample-Flightbonus-src/src/.classpath
new file mode 100644
index 0000000..accdde3
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="OTRE"/>
+	<classpathentry kind="lib" path="lib/booking.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/.project b/otdt-examples/OTSample-Flightbonus-src/src/.project
new file mode 100644
index 0000000..f51313f
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/.project
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>OTSample-Flightbonus</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.objectteams.example.otdt.builder.OTJBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.objectteams.example.otdt.OTJavaNature</nature>
+	</natures>
+</projectDescription>
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/.settings/org.eclipse.jdt.core.prefs b/otdt-examples/OTSample-Flightbonus-src/src/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..7d74eb0
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Thu Mar 01 00:59:03 CET 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/FlightbookingWithBonus.launch b/otdt-examples/OTSample-Flightbonus-src/src/FlightbookingWithBonus.launch
new file mode 100644
index 0000000..0612398
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/FlightbookingWithBonus.launch
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/OTSample-Flightbonus/lib/booking.jar"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.objectteams.example.flightbooking.Main"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="OTSample-Flightbonus"/>
+<booleanAttribute key="org.eclipse.objectteams.launch" value="true"/>
+<booleanAttribute key="org.eclipse.objectteams.otdt.debug.TEAMCONFIG_ACTIVE_ATTR" value="true"/>
+<listAttribute key="org.eclipse.objectteams.otdt.debug.TEAMCONFIG_ATTR">
+<listEntry value="=OTSample-Flightbonus/src&lt;org.eclipse.objectteams.example.fbapplication{GUIConnector.java[GUIConnector"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.objectteams.otdt.debug.USE_JPLIS" value="true"/>
+</launchConfiguration>
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/Intro0.html b/otdt-examples/OTSample-Flightbonus-src/src/Intro0.html
new file mode 100644
index 0000000..5b5f0c9
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/Intro0.html
@@ -0,0 +1,127 @@
+<title>OTSample-FlightBonus Intro</title>
+<style type="text/css">
+code { background-color:lightgray; }
+img { border:0px; }
+</style>
+<body>
+<h1>Overview of the Flight Bonus example</h1>
+This is a simple flight booking program, which exists in different versions.
+
+<h2>Flight booking - bare application</h2>
+Package <img src="images/package.gif" /><code>flightbooking</code> 
+is available only as jar file (<img src="images/jar_src_obj.gif"/><code>Referenced Libraries/booking.jar</code>).<br />
+<img src="images/run_exc.gif" /><strong>Running:</strong> 
+This regular Java application can be invoked like a regular Java program
+(e.g., by click the link <u><font color="blue">run the sample</font></u> on the welcome sheet at the right).
+The main method is in <img src="images/class_public.gif" /><code>flightbooking.Main</code>.
+It has a simple GUI which will direct you through the relevant transactions.
+Note that this variant does not include collecting bonus points.
+
+<h2>Bonus and FlightBonus</h2>
+The first scenario of adaptation concerns the definition of a bonus
+programme for frequent flyers. Two team classes are involved.
+
+The purpose of each team class is:
+
+<dl>
+<dt><img src="images/team_obj.gif" /><code>bonussystem/Bonus</code>:</dt>
+<dd>Define an abstract, re-usable concept of 
+    <img src="images/role_obj.gif"/>Subscriber</code>s that may collect credits,
+    and <img src="images/role_obj.gif"/>BonusItems</code> that are acquired by a Subscriber 
+    and give a specific amount of credits.</dd>
+<dt><img src="images/team_obj.gif" /><code>fbappication/FlightBonus</code>:</dt>
+<dd>Bind the abstract team Bonus to the flightbooking package. Other
+    than class and method bindings, this team only adds one method
+    implementation for calculating the credit for booking a flight segment.</dd>
+</dl>
+
+<h2>Integrating the application</h2>
+In order to integrate the new functionality into the GUI, even another
+team class exists: <img src="images/team_obj.gif" /><code>GUIConnector</code>. 
+It adapts the original GUI in <code>booking.jar</code>.<br />
+
+<img src="images/run_exc.gif" /><strong>Running:</strong> 
+To invoke the variant with bonus apply the supplied launch configuration <img src="images/file_obj.gif" /><code>FlightbookingWithBonus.launch</code>.
+Looking at this launch configuration you will find these relevant settings:
+<ul>
+	<li>On tab "JRE" two options are checked: <code>Enable OTRE</code> and <code>Java 5 JPLIS Launching</code></li>
+	<li>On the tab "<img src="images/team_obj.gif"> Team Activation" the team <code>GUIConnector</code> is selected for instantiation and activation.<br>
+	<strong>Optional:</strong><br>
+	   <ol type="a">
+	      <li>You may additionally select the team <code>WindowPlacer</code> which ensures that
+	      new windows are always centered with respect to the desktop/their parent.<br>
+	      <i>Note,</i> that this team requires the "Java 5 JPLIS Launching" option (see above),
+	      because it adapts class <code>java.awt.Window</code>
+	      which is not adaptable using the old launch mode.
+	   </ol></li>
+</ul>
+
+The most important step is to add a method binding to <code>flightbooking.PassengerList.add()</code>.<br />
+The following line in 
+<code><img src="images/role_obj.gif"/>&nbsp;fbapplication.GUIConnector.Controller</code> 
+is responsible for this (it's a callin binding):<br />
+<img src="images/callinbinding_obj.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<code> queryRegisterForBonus &lt;- <strong>after</strong>  add;</code><br />
+
+<p>
+Whenever a passenger is added to that list (an internal "repository"),
+the user is asked, whether the passenger wants to participate in the bonus programme. 
+If so, a new <img src="images/team_obj.gif" /><code>FlightBonus</code> instance is created 
+and the passenger is implicitly registered
+(cf. the implementation of <code>fbapplication.BonusGUI.Controller.queryRegisterForBonus</code>).
+After that all bookings for this passenger will also give bonus credits
+to the passenger.
+</p>
+<p>
+Collecting credits will be reported by a new dialog box &mdash; the nested team 
+<code><img src="images/team_role_obj.gif" />&nbsp;fbapplication.GUIConnector.FlightBonusDialog</code>.
+This team defines another layer over the team FlightBonus, observing the behaviour of its roles.
+</p>
+
+<h2>OT/J concepts used</h2>
+The following concepts are demonstrated and documented in the source code (<a href="guide/otjld/def/index.html"><img src="images/ot_paragraph.gif" /> numbers refer to paragraphs in the language definition</a>):
+<dl>
+<dt><strong>team inheritance and implicit inheritance of roles</strong> (<a href="guide/otjld/def/team.html"><img src="images/ot_paragraph.gif" /> 1</a>)</dt>
+<dd>There are two team inheritance relations: <code>FlightBonus extends Bonus</code>
+  and <code>GUIConnector extends BonusGUI</code>.
+  In both cases the contained roles are further specialized in the sub-team.<br />
+  Implicit inheritance works accross levels (<a href="guide/otjld/def/team.html#s1.5"><img src="images/ot_paragraph.gif" /> 1.5</a>): 
+  the nested team <code>FlightBonusDialog</code>
+  implicitly inherits all roles from its implicit super team of the same name.
+  The inner most roles recursively inherit from their implicit super roles.<br />
+  You may want to try the special hierarchy view (F4) for exploring this implicit inheritance.
+  </dd>
+<dt><strong>callin method bindinds</strong> (<a href="guide/otjld/def/callin.html"><img src="images/ot_paragraph.gif" /> 4</a>)</dt>
+<dd>The <code>FlightBonus</code> and the <code>GUIConnector</code> teams are both triggered
+  via callin bindings, by which they hook into the underlying system.
+  In the case of the <code>FlightBonusDialog</code> the base classes are roles, too.
+  This means roles are used to intercept events at some other roles.</dd>
+<dt><strong>callout method bindinds</strong> (<a href="guide/otjld/def/callout.html"><img src="images/ot_paragraph.gif" /> 3</a>)</dt>
+<dd>Most roles access features of their base class using callout bindings.</dd>
+<dt><strong>role files</strong> (<a href="guide/otjld/def/team.html#s1.2.5"><img src="images/ot_paragraph.gif" /> 1.2.5</a>)</dt>
+<dd><code>fbapplication.BonusGUI.FlightBonusDialog</code> and 
+    <code>fbapplication.GUIConnector.FlightBonusDialog</code>.
+    Each role file resides in a <strong><code>team package</code></strong>
+    that has the same name as the enclosing team (i.e., a team is a class and a package).</dd>
+<dt><strong>team activation</strong> (<a href="guide/otjld/def/activation.html"><img src="images/ot_paragraph.gif" /> 5</a>)</dt>
+<dd>The 'bootstrap' team <code>GUIConnector</code> is activated via the <strong>launch configuration</strong>
+  (<a href="guide/otjld/def/activation.html#s5.5"><img src="images/ot_paragraph.gif" /> 5.5</a>).
+  By this technique it is possible to adapt the flight booking application without changing
+  a single line of source code.
+  In the sequel the <code>GUIConnector</code> creates instances of <code>FlightBonus</code>
+  and <code>FlightBonusDialog</code>, both of which invoke <strong><code>activate()</code></strong>
+  (<a href="guide/otjld/def/activation.html#s5.2.b"><img src="images/ot_paragraph.gif" /> 5.2(b)</a>) from their constructor in order to enable all callins of contained roles.<br />
+  Roles <code>FlightBonus.Subscriber</code> and <code>BonusGUI.Collector</code> restrict
+  activation to specific instances using a <strong>guard predicate</strong> (<a href="guide/otjld/def/activation.html#s5.4"><img src="images/ot_paragraph.gif" /> 5.4</a>).
+<dt><strong>lifting</strong> (<a href="guide/otjld/def/rolebinding.html#s2.3"><img src="images/ot_paragraph.gif" /> 2.3</a>)</dt>
+<dd>The constructor <code>FlightBonus(Passenger as Subscriber s)</code> uses declared lifting
+  (<a href="guide/otjld/def/rolebinding.html#s2.3.2"><img src="images/ot_paragraph.gif" /> 2.3.2</a>)
+  to force creation of a subscriber role for each passenger to be registered.<br />
+  The constructor <code>FlightBonusDialog(FlightBonus fb)</code> is a lifting constructor,
+  which means it will implicitly be used by the lifting operation, but it can also be
+  invoked explicitly, to create a new role for a given base instance 
+  (cf. method <code>queryRegisterForBonus</code>).
+  </dd>  
+</dl>
+
+</body>
+</html>
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/FlightBookingSystem.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/FlightBookingSystem.java
new file mode 100644
index 0000000..503fa03
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/FlightBookingSystem.java
@@ -0,0 +1,188 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: FlightBookingSystem.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking;
+
+import org.eclipse.objectteams.example.flightbooking.model.BookingException;
+import org.eclipse.objectteams.example.flightbooking.model.Flight;
+import org.eclipse.objectteams.example.flightbooking.model.Passenger;
+import org.eclipse.objectteams.example.flightbooking.model.PassengerDB;
+import org.eclipse.objectteams.example.flightbooking.util.FlightIterator;
+import org.eclipse.objectteams.example.flightbooking.util.FlightList;
+
+/**
+ * This class represents a flight booking system.
+ */
+public class FlightBookingSystem {
+	/**
+	 * The list of bookable <code>Flight</code>s.
+	 */
+	private FlightList _flights = new FlightList();
+
+	/**
+	 * The list of registered <code>Passenger</code>s.
+	 */
+	private PassengerDB _passengers = new PassengerDB();
+
+	/**
+	 * This is the <code>Passenger</code> who is currently active.
+	 */
+	private Passenger _currentPassenger;
+
+	public FlightBookingSystem() {
+		super();
+	}
+
+	/**
+	 * This method registers a new <code>Passenger</code>.
+	 * 
+	 * @param name
+	 *            The <code>Passenger</code>'s name.
+	 * @param budget
+	 *            The <code>Passenger</code>'s budget.
+	 * @return <code>true</code> if the <code>Passenger</code> is already
+	 *         known to the booking system, <code>false</code> otherwise.
+	 */
+	public boolean registerPassenger(String name, int budget) {
+		if (_passengers.contains(name)) {
+			return false;
+		}
+		_passengers.add(new Passenger(name, budget));
+
+		return true;
+	}
+
+	/**
+	 * This method adds a <code>Flight</code> to the booking system.
+	 * 
+	 * @param flight
+	 *            The <code>Flight</code> to add.
+	 */
+	public void addFlight(Flight flight) {
+		_flights.add(flight);
+	}
+
+	/**
+	 * This method removes a <code>Flight</code> from the booking system.
+	 * 
+	 * @param flight
+	 *            The <code>Flight</code> to remove.
+	 */
+	public void removeFlight(Flight flight) {
+		_flights.remove(flight);
+	}
+
+	/**
+	 * This method returns a <code>FlightIterator</code> of all offered
+	 * <code>Flight</code>s.
+	 * 
+	 * @return The flights.
+	 */
+	public FlightIterator getOfferedFlights() {
+		return _flights.getIterator();
+	}
+
+	/**
+	 * This method books a certain <code>Flight</code> for the active
+	 * <code>Passenger</code>.
+	 * 
+	 * @param idx
+	 *            The number of the flight to book.
+	 */
+	public void bookFlight(int idx) throws BookingException {
+		if (_currentPassenger == null) {
+			throw new BookingException("No current passenger");
+		}
+		_currentPassenger.book(_flights.get(idx));
+	}
+
+	/**
+	 * This method activates a <code>Passenger</code>.
+	 * 
+	 * @param name
+	 *            The name of the <code>Passenger</code> to activate.
+	 * @return <code>true</code> if the <code>Passenger</code> was found in
+	 *         the booking system and there is currently no other active
+	 *         <code>Passenger</code>,<code>false</code> otherwise.
+	 */
+	public boolean setCurrentPassenger(String name) {
+		if (_passengers.contains(name) && (_currentPassenger == null)) {
+			_currentPassenger = _passengers.get(name);
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * This method deactivates a <code>Passenger</code>.
+	 * 
+	 * @param name
+	 *            The name of the <code>Passenger</code> to deactivate.
+	 * @return <code>true</code> if the <code>Passenger</code> was found in
+	 *         the booking system and he really is the active
+	 *         <code>Passenger</code>,<code>false</code> otherwise.
+	 */
+	public boolean disableCurrentPassenger(String name) {
+		if (_passengers.contains(name)
+				&& (_currentPassenger.getName().equals(name))) {
+			_currentPassenger = null;
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * This method returns the current <code>Passenger</code>.
+	 * 
+	 * @return The current <code>Passenger</code>.
+	 */
+	public Passenger getCurrentPassenger() {
+		return _currentPassenger;
+	}
+
+	/**
+	 * This method searches for a <code>Passenger</code> in the booking
+	 * system.
+	 * 
+	 * @return <code>true</code> if the <code>Passenger</code> was found,
+	 *         <code>false</code> otherwise.
+	 */
+	public boolean containsPassenger(String name) {
+		return _passengers.contains(name);
+	}
+
+	/**
+	 * Get the passengers list for iteration.
+	 * 
+	 * @return
+	 */
+	public PassengerDB getRegisteredPassengers() {
+		_passengers.reset();
+		return _passengers;
+	}
+	
+	/**
+	 * This method ends the program.
+	 */
+	public void exit() {
+		System.exit(1);
+	}
+
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/Main.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/Main.java
new file mode 100644
index 0000000..4ffb2b5
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/Main.java
@@ -0,0 +1,108 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Main.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking;
+
+import org.eclipse.objectteams.example.flightbooking.gui.FlightBookingGUI;
+import org.eclipse.objectteams.example.flightbooking.model.Flight;
+import org.eclipse.objectteams.example.flightbooking.model.Segment;
+
+// ## Attention: the current version has a few publics which should
+// not be needed, but callout still requires regular visibility.
+/**
+ * This class contains the main method.
+ */
+public class Main {
+	final private FlightBookingSystem _system;
+
+	// ## added to give access to _system
+	/**
+	 * This method returns the associated <code>FlightBookingSystem</code>.
+	 * 
+	 * @return The code>FlightBookingSystem</code>.
+	 */
+	public FlightBookingSystem getSystem() {
+		return _system;
+	}
+
+	/**
+	 * Contructs a new <code>Main</code> object.
+	 */
+	public Main() {
+		_system = new FlightBookingSystem();
+	}
+	
+	public void start() {
+		initFlights();
+		providePassengers();
+						
+
+		java.awt.EventQueue.invokeLater(new Runnable() {
+	           	public void run() {
+	           		FlightBookingGUI fbgui = new FlightBookingGUI(_system);
+	           		fbgui.setVisible(true);
+	           }
+	    	});
+	}
+
+	/**
+	 * This is the main method that is used to start the flight booking example.
+	 * 
+	 * @param args
+	 *            No args.
+	 */
+	public static void main(String[] args) {
+		final Main main = new Main();
+		main.start();
+	}
+
+	private void initFlights() {
+		Flight berlinNY = new Flight();
+		berlinNY.addSegment(new Segment("Berlin", "Frankfurt", 903, 150, 400));
+		berlinNY.addSegment(new Segment("Frankfurt", "New York", 903, 350, 1400));
+
+		Flight berlinHH = new Flight();
+		berlinHH.addSegment(new Segment("Berlin", "Hamburg", 1105, 100, 99));
+		
+		Flight berlinLDN = new Flight();
+		berlinLDN.addSegment(new Segment("Berlin", "London", 937, 120, 125));
+		berlinLDN.addSegment(new Segment("London", "Berlin", 938, 120, 135));
+		
+		Flight chicago1 = new Flight();
+		chicago1.addSegment(new Segment("Berlin", "Amsterdam", 342, 60, 213));
+		chicago1.addSegment(new Segment("Amsterdam", "Chicago", 342, 260, 313));
+
+		Flight chicago2 = new Flight();
+		chicago2.addSegment(new Segment("Berlin", "Frankfurt", 342, 60, 113));
+		chicago2.addSegment(new Segment("Frankfurt", "Chicago", 342, 260, 316));
+
+		_system.addFlight(berlinNY);
+		_system.addFlight(berlinHH);
+		_system.addFlight(berlinLDN);
+		_system.addFlight(chicago1);
+		_system.addFlight(chicago2);
+	}
+
+	private void providePassengers() {
+		_system.registerPassenger("Carsten", 16000);
+		_system.registerPassenger("Jan", 100);
+		_system.registerPassenger("Stephan", 16000);
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/data/DistanceManager.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/data/DistanceManager.java
new file mode 100644
index 0000000..5453315
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/data/DistanceManager.java
@@ -0,0 +1,79 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: DistanceManager.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.data;
+
+
+/**
+ * The distance manager is used to manage the distances between
+ * different cities. It implements the Singleton pattern.
+ */
+public class DistanceManager 
+{
+    private DistanceTable _distanceTable = new DistanceTable();
+
+	/**
+	 * Some exemplary distances are stored in the distance table.
+	 */
+	private DistanceManager() 
+	{
+		_distanceTable.addPlace("Berlin");
+		_distanceTable.getPlaceDistances("Berlin").addDistance("Frankfurt", 424);
+		_distanceTable.getPlaceDistances("Berlin").addDistance("Hamburg", 252);
+        _distanceTable.getPlaceDistances("Berlin").addDistance("Brussels", 653);
+        _distanceTable.getPlaceDistances("Berlin").addDistance("London", 934);
+        _distanceTable.getPlaceDistances("Berlin").addDistance("Amsterdam", 576);
+
+		_distanceTable.addPlace("Frankfurt");
+		_distanceTable.getPlaceDistances("Frankfurt").addDistance("New York", 6194);
+		_distanceTable.getPlaceDistances("Frankfurt").addDistance("Atlanta", 7396);
+		_distanceTable.getPlaceDistances("Frankfurt").addDistance("Chicago", 6960);
+        
+        _distanceTable.addPlace("Brussels");
+        _distanceTable.getPlaceDistances("Brussels").addDistance("Chicago", 6657);
+        _distanceTable.addPlace("London");
+        _distanceTable.getPlaceDistances("London").addDistance("Chicago", 6347);
+        _distanceTable.getPlaceDistances("London").addDistance("Berlin", 934);
+        _distanceTable.addPlace("Amsterdam");
+        _distanceTable.getPlaceDistances("Amsterdam").addDistance("Chicago", 6605);
+	}
+
+//	 TODO(mkr): add javadoc
+	public int getDistance(String place1, String place2) 
+	{
+		if (_distanceTable.containsPlace(place1)) 
+		{
+			return _distanceTable.getPlaceDistances(place1).getDistance(place2);
+		}
+		if (_distanceTable.containsPlace(place2)) 
+		{
+			return _distanceTable.getPlaceDistances(place2).getDistance(place1);
+		}
+		return DistanceTable.NO_DISTANCE;
+	}
+
+	/**
+	 * This method returns the singleton object.
+	 * @return The <code>DistanceManager</code>.
+	 */
+	public static DistanceManager getSingleton() {
+		return new DistanceManager();
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/data/DistanceTable.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/data/DistanceTable.java
new file mode 100644
index 0000000..e609fe9
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/data/DistanceTable.java
@@ -0,0 +1,66 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: DistanceTable.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.data;
+
+import java.util.Hashtable;
+
+/**
+ * This class represents a table of distances between different cities.
+ * It is used by the <code>DistanceManager</code>
+ * to store and retrieve those distances.
+ */
+public class DistanceTable {
+	public final static int NO_DISTANCE = 0;
+
+	private Hashtable<String, DistanceList> _data = new Hashtable<String, DistanceList>();
+
+	/**
+	 * A list of distances.
+	 */
+	public class DistanceList {
+		private Hashtable<String, Integer> _distances = new Hashtable<String, Integer>();
+
+		public void addDistance(String placeName, int distance) {
+			_distances.put(placeName, new Integer(distance));
+		}
+
+		public int getDistance(String placeName) {
+			return _distances.containsKey(placeName) ? _distances
+					.get(placeName).intValue() : NO_DISTANCE;
+		}
+	}
+
+	public DistanceTable() {
+		super();
+	}
+
+	public void addPlace(String name) {
+		_data.put(name, new DistanceList());
+	}
+
+	public DistanceList getPlaceDistances(String name) {
+		return _data.get(name);
+	}
+
+	public boolean containsPlace(String name) {
+		return _data.containsKey(name);
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/gui/EnterPassengerDialog.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/gui/EnterPassengerDialog.java
new file mode 100644
index 0000000..d68e2ad
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/gui/EnterPassengerDialog.java
@@ -0,0 +1,227 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: EnterPassengerDialog.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.gui;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.WindowConstants;
+
+import org.eclipse.objectteams.example.flightbooking.FlightBookingSystem;
+import org.eclipse.objectteams.example.flightbooking.model.Passenger;
+
+
+@SuppressWarnings("serial")
+public class EnterPassengerDialog extends JDialog {
+    
+	private FlightBookingSystem 	_system;
+	private FlightBookingGUI 		_parentFrame;
+	private String 					_customerName = "";
+	private int 					_customerBudget = 0;
+	
+	private JTextField _nameTextField;
+	private JTextField _budgetTextField;
+	
+    public EnterPassengerDialog(
+    			FlightBookingGUI parent, 
+			boolean modal,
+			FlightBookingSystem system) {
+		super(parent, modal);
+		_system = system;
+		_parentFrame = parent;
+		initComponents();
+		setResizable(false);
+		setVisible(true);
+	}
+    
+    public void clearButtonClicked() {
+		_nameTextField.setText("");
+		_budgetTextField.setText("");		
+	}
+    
+    public void okButtonClicked() {    	
+	    	_customerName = _nameTextField.getText();
+	    	
+	    	if (_customerName.equals("")) {
+			showErrDialog("Please enter the passenger's name");
+			return;
+		}	
+    	
+		try {
+			_customerBudget = Integer.parseInt(_budgetTextField.getText());	
+		} 
+		catch (NumberFormatException ex) {
+			showErrDialog("The characters in the budget string must be decimal digits");
+			
+			return;
+		}
+		
+		Passenger prev = _system.getCurrentPassenger();
+		if (prev != null) {
+			_system.disableCurrentPassenger(prev.getName());
+		}
+		
+		if (!_system.containsPassenger(_customerName)) {
+			_system.registerPassenger(_customerName, _customerBudget);
+			_system.setCurrentPassenger(_customerName);
+			_parentFrame.getCustomerModel().addElement(_system.getCurrentPassenger());
+		} else {			
+			_system.setCurrentPassenger(_customerName);
+			showInfoDialog("Passenger exists already");	
+		}
+		
+		_parentFrame.setEnabled(true);
+		setVisible(false);		
+	}
+    
+    
+    private void showErrDialog(final String message) {    	
+    		JOptionPane.showMessageDialog(
+    						this, 
+						message, 
+						"Error",
+						JOptionPane.ERROR_MESSAGE);
+    }
+    
+    private void showInfoDialog (final String message) {
+    		JOptionPane.showMessageDialog(
+    				this, 
+				message, 
+				"Message",
+				JOptionPane.INFORMATION_MESSAGE);
+    }
+    
+    /** 
+     * This method is called from within the constructor to
+     * initialize the form.
+     */
+    private void initComponents(	) {
+        GridBagConstraints gridBagConstraints = null;
+
+        this.setTitle("New Passenger Dialog");
+        JPanel jPanel1 = new JPanel();
+        JLabel nameLabel = new JLabel();
+        _nameTextField = new JTextField();
+		JLabel budgetLabel = new JLabel();
+        _budgetTextField = new JTextField();
+		JPanel jPanel2 = new JPanel();
+        JButton okButton = new JButton();
+        JButton clearButton = new JButton();
+        JButton cancelButton = new JButton();
+
+        getContentPane().setLayout(new GridBagLayout());
+
+        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+        jPanel1.setLayout(new GridBagLayout());
+
+        nameLabel.setText("Passenger's Name: ");
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 0;
+        gridBagConstraints.gridy = 0;
+        gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
+        gridBagConstraints.anchor = GridBagConstraints.WEST;
+        gridBagConstraints.insets = new Insets(5, 0, 6, 0);
+        jPanel1.add(nameLabel, gridBagConstraints);
+
+        _nameTextField.setColumns(12);
+        _nameTextField.setText("");
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 1;
+        gridBagConstraints.gridy = 0;
+        gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
+        gridBagConstraints.ipadx = 2;
+        gridBagConstraints.insets = new Insets(0, 6, 4, 0);
+        jPanel1.add(_nameTextField, gridBagConstraints);
+
+        budgetLabel.setText("Passenger's Budget: ");
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 0;
+        gridBagConstraints.gridy = 1;
+        gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
+        gridBagConstraints.anchor = GridBagConstraints.WEST;
+        jPanel1.add(budgetLabel, gridBagConstraints);
+
+        _budgetTextField.setText("");
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 1;
+        gridBagConstraints.gridy = 1;
+        gridBagConstraints.fill = GridBagConstraints.HORIZONTAL;
+        gridBagConstraints.insets = new Insets(0, 6, 0, 0);
+        jPanel1.add(_budgetTextField, gridBagConstraints);
+
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.insets = new Insets(10, 10, 10, 10);
+        getContentPane().add(jPanel1, gridBagConstraints);
+
+        jPanel2.setLayout(new java.awt.GridBagLayout());
+
+	    clearButton.setText("Clear");
+	    clearButton.addActionListener(new java.awt.event.ActionListener() {
+	    	public void actionPerformed(java.awt.event.ActionEvent evt) {
+	    		clearButtonClicked();
+	      	}
+	    });
+	    gridBagConstraints = new GridBagConstraints();
+	    gridBagConstraints.gridx = 0;
+        gridBagConstraints.gridy = 0;
+	    jPanel2.add(clearButton, gridBagConstraints);
+
+        okButton.setText("OK");
+        okButton.addActionListener(new java.awt.event.ActionListener() {
+	    	public void actionPerformed(java.awt.event.ActionEvent evt) {
+	    			okButtonClicked();
+	      	}
+	    });
+        gridBagConstraints = new GridBagConstraints();
+	    gridBagConstraints.insets = new Insets(0, 30, 0, 0);
+        gridBagConstraints.gridx = 2;
+        gridBagConstraints.gridy = 0;
+        jPanel2.add(okButton, gridBagConstraints);
+        
+        cancelButton.setText("Cancel");
+        cancelButton.addActionListener(new java.awt.event.ActionListener() {
+    		public void actionPerformed(java.awt.event.ActionEvent evt) {
+    			_parentFrame.setEnabled(true);
+    			setVisible(false);
+	      	}
+	    });
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 3;
+        gridBagConstraints.gridy = 0;
+        jPanel2.add(cancelButton, gridBagConstraints);
+
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 0;
+        gridBagConstraints.gridy = 1;
+        gridBagConstraints.anchor = GridBagConstraints.EAST;
+        gridBagConstraints.insets = new Insets(10, 10, 10, 10);
+        getContentPane().add(jPanel2, gridBagConstraints);
+
+        pack();
+    }    
+}
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/gui/FlightBookingGUI.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/gui/FlightBookingGUI.java
new file mode 100644
index 0000000..f3c9cff
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/gui/FlightBookingGUI.java
@@ -0,0 +1,316 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: FlightBookingGUI.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.gui;
+
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.SwingConstants;
+import javax.swing.WindowConstants;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import org.eclipse.objectteams.example.flightbooking.FlightBookingSystem;
+import org.eclipse.objectteams.example.flightbooking.model.BookingException;
+import org.eclipse.objectteams.example.flightbooking.model.Flight;
+import org.eclipse.objectteams.example.flightbooking.model.Passenger;
+import org.eclipse.objectteams.example.flightbooking.model.PassengerDB;
+import org.eclipse.objectteams.example.flightbooking.util.FlightIterator;
+
+
+
+/**
+* This class implements a simple graphical user interface for the flight booking system.
+*/
+@SuppressWarnings("serial")
+public class FlightBookingGUI extends JFrame {
+   
+	private JList 	_flightList;
+	private JList 	_passengerList;
+	
+	private FlightBookingSystem _system;
+	private FlightBookingGUI 	_frame = this;
+	private DefaultListModel 	_flightModel;
+	private DefaultListModel 	_customerModel;
+	private Flight 			_selectedFlight;
+	private Passenger 		_selectedCustomer;
+	
+	/**
+	 * Creates new <code>FlightBookingGUI</code> object 
+	 */
+	public FlightBookingGUI(FlightBookingSystem system) {
+		_system = system;
+		_customerModel = new DefaultListModel();
+		_flightModel = new DefaultListModel();
+		initFlightModel();
+		initCustomerModel();
+		initComponents();
+		this.setResizable(false);
+	}
+   
+	/**
+	 * Initializes the <code>FlightModel</code> with data contained 
+	 * in the flight booking system,
+	 */
+	private void initFlightModel() {
+		for (FlightIterator iter = _system.getOfferedFlights(); iter.hasNext();) {
+			_flightModel.addElement(iter.getNext());
+		}		
+	}
+	
+	/**
+	 * Initializes the <code>PassengerModel</code> with data contained 
+	 * in the flight booking system,
+	 */
+	private void initCustomerModel() {
+		for (PassengerDB passengers = _system.getRegisteredPassengers(); passengers.hasNext();) {
+			_customerModel.addElement(passengers.getNext());
+		}		
+	}
+	/**
+	 * Returns the customer
+	 */
+	public DefaultListModel getCustomerModel() {
+		return _customerModel;
+	}
+	
+	/**
+	 * Returns the flight model 
+	 */
+	public DefaultListModel getFlightModel() {
+		return _flightModel;
+	}
+	
+	/**
+	 * Invoked when the bookButton is pressed
+	 */
+	public void bookButtonClicked() {
+						
+		if(_selectedFlight == null) {
+			showErrDialog("Please select a flight!");
+			return;
+		}
+		
+		if(_selectedCustomer == null) {
+			showErrDialog("Please select a passenger!");
+			return;
+		}
+		
+		Passenger prev = _system.getCurrentPassenger();
+		if (prev != null) {
+			_system.disableCurrentPassenger(prev.getName());
+		}
+		
+		_system.setCurrentPassenger(_selectedCustomer.getName());
+		
+		try {
+			_system.bookFlight(_flightList.getSelectedIndex());
+		} catch (BookingException ex) {
+			showErrDialog("Booking transaction failed: " + ex.getMessage());
+			return;
+		}
+						
+		showInfoDialog("Passenger " + _selectedCustomer.getName() + ":  " 
+				+ _selectedFlight + "\n"
+				+ _selectedCustomer.getName() + "'s balance :  " 
+				+ _selectedCustomer.getBudget());	
+	}
+	
+    
+	/** 
+	 * This method is called from within the constructor to
+	 * initialize the form.
+	 */
+	private void initComponents() {
+        GridBagConstraints gridBagConstraints = null;
+        
+        JButton bookButton = new JButton();
+        JButton customerButton = new JButton();
+        JButton exitButton = new JButton();
+        JScrollPane flightPane = new JScrollPane();
+        JScrollPane passPane = new JScrollPane();
+        _flightList = new JList(_flightModel);
+        _passengerList = new JList(_customerModel);
+
+        getContentPane().setLayout(new GridBagLayout());
+
+        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+        setTitle("Flight Booking System");
+
+        JLabel flightsLabel = new JLabel();
+        flightsLabel.setText("Offered Flights: ");
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 1;
+        gridBagConstraints.gridy = 0;
+        gridBagConstraints.anchor = GridBagConstraints.WEST;
+        gridBagConstraints.insets = new Insets(5, 19, 5, 17);
+        getContentPane().add(flightsLabel, gridBagConstraints);
+
+        JLabel passLabel = new JLabel();
+        passLabel.setText("Passengers: ");
+        passLabel.setHorizontalAlignment(SwingConstants.RIGHT);
+        gridBagConstraints = new java.awt.GridBagConstraints();
+        gridBagConstraints.gridx = 0;
+        gridBagConstraints.gridy = 0;
+        gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+        gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 43);
+        getContentPane().add(passLabel, gridBagConstraints);
+                
+        _flightList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
+        flightPane.setPreferredSize(new Dimension(250, 250));
+        flightPane.setViewportView(_flightList);
+
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 1;
+        gridBagConstraints.gridy = 1;
+        gridBagConstraints.gridheight = 5;
+        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+        gridBagConstraints.insets = new java.awt.Insets(0, 20, 0, 10);
+        getContentPane().add(flightPane, gridBagConstraints);
+
+        _passengerList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
+        passPane.setPreferredSize(new Dimension(100, 250));
+        passPane.setViewportView(_passengerList);
+        
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 0;
+        gridBagConstraints.gridy = 1;
+        gridBagConstraints.gridheight = 5;
+        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+        gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0);
+        getContentPane().add(passPane, gridBagConstraints);
+
+        
+        customerButton.setText("New Passenger");
+        customerButton.addActionListener(new ActionListener() {
+        	public void actionPerformed(ActionEvent evt) {
+        		showEnterCustomerDialog();
+        	}
+        });
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 2;
+        gridBagConstraints.gridy = 1;
+//        gridBagConstraints.insets = new Insets(0, 20, 0, 0);
+        getContentPane().add(customerButton, gridBagConstraints);
+
+        bookButton.setText("Book");
+        bookButton.setPreferredSize(customerButton.getPreferredSize());
+        bookButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                bookButtonClicked();
+            }
+        });
+        
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 2;
+        gridBagConstraints.gridy = 2;
+        getContentPane().add(bookButton, gridBagConstraints);
+
+        
+        JPanel btnPanel = new JPanel();
+        btnPanel.setLayout(new GridBagLayout());
+
+        exitButton.setText("Exit");
+        exitButton.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                System.exit(0);
+            }
+        });
+
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 5;
+        gridBagConstraints.gridy = 0;
+        btnPanel.add(exitButton, gridBagConstraints);
+
+        gridBagConstraints = new GridBagConstraints();
+        gridBagConstraints.gridx = 0;
+        gridBagConstraints.gridy = 6;
+        gridBagConstraints.gridwidth = 3;
+        gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
+        gridBagConstraints.insets = new java.awt.Insets(20, 10, 10, 10);
+        getContentPane().add(btnPanel, gridBagConstraints);
+        
+        
+        _flightList.addListSelectionListener(new ListSelectionListener() {
+            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
+                flightListValueChanged(evt);
+            }
+        });
+        
+        _passengerList.addListSelectionListener(new ListSelectionListener() {
+            public void valueChanged(ListSelectionEvent evt) {
+                customerListValueChanged(evt);
+            }
+        });
+              
+        pack();
+    }
+    	
+	/**
+	 * Updates the selected flight reference when the flight list value is changed
+	 */
+	public void flightListValueChanged(ListSelectionEvent evt) {
+		_selectedFlight = (Flight)_flightList.getSelectedValue();		
+	}
+	
+	/**
+	 * Updates the selected customer reference when the passenger list value is changed
+	 */
+	public void customerListValueChanged(ListSelectionEvent evt) {
+		if(!_passengerList.isSelectionEmpty()) {
+			_selectedCustomer = (Passenger)_passengerList.getSelectedValue();
+		}
+	}
+	
+	/**
+	 * Shows the given message in a message dialog box 
+	 */
+    private void showInfoDialog(final String message){    	
+    		JOptionPane.showMessageDialog(_frame, message, "Message", JOptionPane.INFORMATION_MESSAGE);
+    }
+    
+    /**
+     * Shows the given message in a error dialog box
+     */
+    private void showErrDialog(final String message){    	
+    		JOptionPane.showMessageDialog(_frame, message, "Error", JOptionPane.ERROR_MESSAGE);
+    }
+    
+    /**
+     * Shows the <code>EnterPassengerDialog</code> for entering of new passenger data  
+     */
+    private void showEnterCustomerDialog() {
+	    	this.setEnabled(false);
+	    	new EnterPassengerDialog(_frame,false,_system);    
+    }
+}
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/BookingException.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/BookingException.java
new file mode 100644
index 0000000..f4ff681
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/BookingException.java
@@ -0,0 +1,36 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: BookingException.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.model;
+
+//	 TODO(mkr): add javadoc
+@SuppressWarnings("serial")
+public class BookingException extends Exception 
+{
+	public BookingException() 
+	{
+		super();
+	}
+
+    public BookingException(String msg) 
+    {
+		super(msg);
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/Flight.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/Flight.java
new file mode 100644
index 0000000..707959c
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/Flight.java
@@ -0,0 +1,95 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Flight.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.model;
+
+import org.eclipse.objectteams.example.flightbooking.util.SegmentIterator;
+import org.eclipse.objectteams.example.flightbooking.util.SegmentList;
+
+/**
+ * A flight which consists of a number of segments.
+ */
+public class Flight {
+	/**
+	 * The list of <code>Segment</code>s, this Flight consists of.
+	 */
+	private SegmentList _segments;
+
+	/**
+	 * Constructs a new <code>Flight</code>.
+	 */
+	public Flight() {
+		_segments = new SegmentList();
+	}
+
+	/**
+	 * This method adds a <code>Segment</code> to this <code>Flight</code>.
+	 * 
+	 * @param seg
+	 *            The <code>Segment</code> to add.
+	 */
+	public void addSegment(Segment seg) {
+		_segments.add(seg);
+	}
+
+	/**
+	 * This method returns the price of this <code>Flight</code>, which
+	 * equals the sum of all its <code>Segment</code>s' prices.
+	 * 
+	 * @return The price.
+	 */
+	public int getPrice() {
+		int price = 0;
+		for (SegmentIterator iter = _segments.getIterator(); iter.hasNext();) {
+			price += iter.getNext().getPrice();
+		}
+
+		return price;
+	}
+
+	/**
+	 * This method books a <code>Flight</code>.
+	 * 
+	 * @param pass
+	 *            The <code>Passenger</code> who is booking.
+	 */
+	public void book(Passenger pass) throws BookingException {
+		for (SegmentIterator iter = _segments.getIterator(); iter.hasNext();) {
+			iter.getNext().book(pass);
+		}
+	}
+
+	/**
+	 * This method returns a String representation of this <code>Flight</code>.
+	 * 
+	 * @return The String. 
+	 */
+	public String toString() {
+		StringBuffer result = new StringBuffer();
+		result.append(_segments.get(0).getStart());
+
+		for (SegmentIterator iter = _segments.getIterator(); iter.hasNext();) {
+			result.append(" --> ");
+			result.append(iter.getNext().getDestination());
+		}
+
+		return result.toString();
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/Passenger.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/Passenger.java
new file mode 100644
index 0000000..ef6c76c
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/Passenger.java
@@ -0,0 +1,124 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Passenger.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.model;
+
+/**
+ * This class represents a passenger who has a name, a budget and who is able to
+ * book flights.
+ */
+public class Passenger {
+	private String _name;
+
+	private int _budget;
+
+	/**
+	 * Constructs a new <code>Passenger</code>.
+	 * 
+	 * @param name
+	 *            The <code>Passenger</code>'s name.
+	 */
+	public Passenger(String name) {
+		_name = name;
+		_budget = 0;
+	}
+
+	/**
+	 * Constructs a new <code>Passenger</code>.
+	 * 
+	 * @param name
+	 *            The <code>Passenger</code>'s name.
+	 * @param budget
+	 *            The <code>Passenger</code>'s budget.
+	 */
+	public Passenger(String name, int budget) {
+		_name = name;
+		_budget = budget;
+	}
+
+	/**
+	 * This method implements the booking of a <code>Flight</code>.
+	 * 
+	 * @param flight
+	 *            The <code>Flight</code> to book.
+	 * @throws BookingException
+	 *             Thrown if the <code>Passenger</code> has not enough money
+	 *             to book the given <code>Flight</code>.
+	 */
+	public void book(Flight flight) throws BookingException {
+		int price = flight.getPrice();
+
+		if (_budget < price) {
+			throw new BookingException("Passenger " + getName()
+					+ " hasn't enough money!");
+		}
+
+		_budget -= price;
+
+		flight.book(this);
+	}
+
+	/**
+	 * This method returns the <code>Passenger</code>'s budget.
+	 * 
+	 * @return The budget.
+	 */
+	public int getBudget() {
+		return _budget;
+	}
+
+	/**
+	 * This method increases the <code>Passenger</code>'s budget by a given
+	 * amount.
+	 * 
+	 * @param amount
+	 *            The amount to increase the budget by.
+	 */
+	public void earn(int amount) {
+		_budget += amount;
+	}
+
+	/**
+	 * This is a setter for the <code>Passenger</code>'s budget.
+	 * 
+	 * @param bud
+	 *            The budget.
+	 */
+	public void setBudget(int bud) {
+		_budget = bud;
+	}
+
+	/**
+	 * This method returns a String representation of this
+	 * <code>Passenger</code>.
+	 */
+	public String toString() {
+		return _name;
+	}
+
+	/**
+	 * This method returns the <code>Passenger</code>'s name.
+	 * 
+	 * @return The name.
+	 */
+	public String getName() {
+		return _name;
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/PassengerDB.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/PassengerDB.java
new file mode 100644
index 0000000..fb47fb5
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/PassengerDB.java
@@ -0,0 +1,71 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: PassengerDB.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.model;
+
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import org.eclipse.objectteams.example.flightbooking.model.Passenger;
+
+
+/**
+ * This class implements a list of <code>Passenger</code>s.
+ */
+public class PassengerDB {
+    
+	private Hashtable<String, Passenger> _data;
+	private Enumeration<Passenger> _valueEnumeration;
+	
+	public PassengerDB() {
+		_data = new Hashtable<String, Passenger>();
+	}
+
+	public void add(Passenger pass) {
+		if (!_data.containsKey(pass.getName())) {
+			_data.put(pass.getName(), pass);
+		}
+	}
+
+	public void remove(Passenger pass) {
+		_data.remove(pass.getName());
+	}
+
+	public Passenger get(String name) {
+		return _data.get(name);
+	}
+
+	public boolean contains(String name) {
+		return _data.containsKey(name);
+	}
+	
+	
+	public void reset() {
+		_valueEnumeration = _data.elements();
+	}
+	
+	public boolean hasNext() {
+		return _valueEnumeration != null && _valueEnumeration.hasMoreElements();
+	}
+	
+	public Passenger getNext() {
+		return _valueEnumeration.nextElement();
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/Segment.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/Segment.java
new file mode 100644
index 0000000..99261ac
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/model/Segment.java
@@ -0,0 +1,123 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Segment.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.model;
+
+import org.eclipse.objectteams.example.flightbooking.data.DistanceManager;
+
+/**
+ * A <code>Segment</code> is part of a <code>Flight</code>. Different
+ * <code>Flight</code>s may share common <code>Segment</code>s.
+ */
+public class Segment {
+	/**
+	 * This <code>Segment</code>'s start.
+	 */
+	private String _start;
+
+	/**
+	 * This <code>Segment</code>'s destination.
+	 */
+	private String _destination;
+
+	/**
+	 * This <code>Segment</code>'s date.
+	 */
+	private int _date;
+
+	/**
+	 * The number of available seats for this <code>Segment</code>.
+	 */
+	private int _seatsAvail;
+
+	/**
+	 * This <code>Segment</code>'s price.
+	 */
+	private int _price;
+
+	/**
+	 * Constructs a new <code>Segment</code>.
+	 */
+	public Segment(String start, String dest, int date, int seats, int price) {
+		_start = start;
+		_destination = dest;
+		_date = date;
+		_seatsAvail = seats;
+		_price = price;
+	}
+
+	/**
+	 * This method returns this <code>Segment</code>'s start.
+	 */
+	public String getStart() {
+		return _start;
+	}
+
+	/**
+	 * This method returns this <code>Segment</code>'s destination.
+	 */
+	public String getDestination() {
+		return _destination;
+	}
+
+	/**
+	 * This method returns this <code>Segment</code>'s date.
+	 */
+	public int getDate() {
+		return _date;
+	}
+
+	/**
+	 * This method returns the number of this <code>Segment</code>'s
+	 * available seats.
+	 */
+	public int getAvailableSeats() {
+		return _seatsAvail;
+	}
+
+	/**
+	 * This method returns this <code>Segment</code>'s price.
+	 */
+	public int getPrice() {
+		return _price;
+	}
+
+	public void book(Passenger pass) throws BookingException {
+		if (_seatsAvail <= 0) {
+			throw new BookingException("Segment overbooked!");
+		}
+		reserveSeat(pass);
+	}
+
+	private void reserveSeat(Passenger pass) {
+		// reserve a seat for the passenger
+		_seatsAvail--;
+	}
+
+	/**
+	 * This method returns the distance between this <code>Segment</code>'s
+	 * start and its destination.
+	 * 
+	 * @return The distance.
+	 */
+	public int getDistance() {
+		return DistanceManager.getSingleton().getDistance(_start, _destination);
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/FlightIterator.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/FlightIterator.java
new file mode 100644
index 0000000..b25e38b
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/FlightIterator.java
@@ -0,0 +1,37 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: FlightIterator.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.util;
+
+import org.eclipse.objectteams.example.flightbooking.model.Flight;
+
+/**
+ * This interface is used to make the <code>FlightIterator</code>,
+ * implemented as an inner class in <code>FlightList</code>, usable outside
+ * of that class.
+ */
+public interface FlightIterator
+{
+	public boolean hasNext();
+
+	public Flight getNext();
+	
+	public int getLength();
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/FlightList.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/FlightList.java
new file mode 100644
index 0000000..f5a24af
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/FlightList.java
@@ -0,0 +1,72 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: FlightList.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.util;
+
+import java.util.Vector;
+import java.util.Enumeration;
+
+import org.eclipse.objectteams.example.flightbooking.model.Flight;
+import org.eclipse.objectteams.example.flightbooking.util.FlightIterator;
+
+
+/**
+ * This class implements a list of <code>Flight</code>s.
+ */
+public class FlightList {
+	private Vector<Flight> _data;
+
+	public FlightList() {
+		_data = new Vector<Flight>();
+	}
+
+	public void add(Flight flight) {
+		if (!_data.contains(flight)) {
+			_data.add(flight);
+		}
+	}
+
+	public void remove(Flight flight) {
+		_data.remove(flight);
+	}
+
+	public Flight get(int idx) {
+		return _data.get(idx);
+	}
+
+	public FlightIterator getIterator() {
+		final Enumeration<Flight> rawIter = _data.elements();
+
+		return new FlightIterator() {
+
+			public boolean hasNext() {
+				return rawIter.hasMoreElements();
+			}
+
+			public Flight getNext() {
+				return rawIter.nextElement();
+			}
+
+			public int getLength() {
+				return _data.size();
+			}
+		};
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/SegmentIterator.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/SegmentIterator.java
new file mode 100644
index 0000000..6c5b690
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/SegmentIterator.java
@@ -0,0 +1,35 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: SegmentIterator.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.util;
+
+import org.eclipse.objectteams.example.flightbooking.model.Segment;
+
+/**
+ * This interface is used to make the <code>SegmentIterator</code>,
+ * implemented as an inner class in <code>SegmentList</code>, usable outside
+ * of that class.
+ */
+public interface SegmentIterator
+{
+	public boolean hasNext();
+
+	public Segment getNext();
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/SegmentList.java b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/SegmentList.java
new file mode 100644
index 0000000..3b2271b
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/booking/org/eclipse/objectteams/example/flightbooking/util/SegmentList.java
@@ -0,0 +1,82 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: SegmentList.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.flightbooking.util;
+
+import java.util.Vector;
+import java.util.Iterator;
+
+import org.eclipse.objectteams.example.flightbooking.model.Segment;
+
+
+/**
+ * This class implements a list of <code>Segment</code>s.
+ */
+public class SegmentList
+{
+	private Vector<Segment> _data;
+
+	public SegmentList()
+	{
+		 _data = new Vector<Segment>();
+	}
+	
+	public void add(Segment seg)
+	{
+		if (!_data.contains(seg))
+		{
+			_data.add(seg);
+		}
+	}
+
+	public void remove(Segment seg)
+	{
+		_data.remove(seg);
+	}
+
+	public Segment get(int idx)
+	{
+		return _data.elementAt(idx);
+	}
+
+	/** How many segments does this list contain? */
+	public int getSegmentCount() {
+	    return _data.size();
+	}
+
+	public SegmentIterator getIterator()
+	{
+		final Iterator<Segment> rawIter = _data.iterator();
+
+		return new SegmentIterator()
+		{
+
+			public boolean hasNext()
+			{
+				return rawIter.hasNext();
+			}
+
+			public Segment getNext()
+			{
+				return rawIter.next();
+			}
+		};
+	}
+}
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/sample.properties b/otdt-examples/OTSample-Flightbonus-src/src/sample.properties
new file mode 100644
index 0000000..cb47beb
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/sample.properties
@@ -0,0 +1,8 @@
+#
+#Wed Mar 11 12:22:47 CET 2009
+projectName=OTSample-Flightbonus
+name=Object Teams Sample - Flightbonus
+launchTarget=org.eclipse.objectteams.example.flightbooking.Main
+description=This example demonstrates, how a reusable collaboration for collecting bonus points can be integrated into an existing application for flight booking.
+launcher=org.eclipse.jdt.debug.ui.launchConfigurations.JavaApplicationLaunchShortcut
+id=org.eclipse.objectteams.otdt.samples.flightbooking
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/bonussystem/Bonus.java b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/bonussystem/Bonus.java
new file mode 100644
index 0000000..cc2d8f4
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/bonussystem/Bonus.java
@@ -0,0 +1,92 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Bonus.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.bonussystem;
+
+/**
+ * Abstract team defining the collaboration between a subscriber and some bonus
+ * items by which the subscriber earns some credits.
+ */
+public abstract team class Bonus {
+
+	/**
+	 * By this attribute a bonus item can access the currently active subscriber
+	 * (relative to the team instance).
+	 */
+	protected Subscriber subscriber = null;
+	
+	/**
+	 * While a subscriber is buying something, all acquired
+	 * bonus items will contribute to his/her credits.
+	 */ 
+	public abstract class Subscriber {
+	    
+	    int collectedCredits = 0;
+	    
+	    protected int getCollectedCredits() {
+	    	return collectedCredits;
+	    }
+	    
+	    /** Add new credit points to our balance. */
+	    protected void collectCredit (int credit) {
+			collectedCredits += credit;
+	    }
+	    
+		/**
+		 * When buying something, tell the enclosing team
+		 * who we are, so that we will get the credits.
+		 */
+	    callin void buy ()
+	    {
+			Bonus.this.subscriber = this;
+			base.buy();
+			Bonus.this.subscriber = null;
+
+			log("Subscriber has collected a total of "+getCollectedCredits()+" credit points.");
+	    }
+	}	
+
+	/**
+	 * An item that is associated with some bonus points (credits).
+	 */
+	public abstract class Item {
+	    
+	    /** Expected method: calculate the number of points to be earned. */
+	    protected abstract int calculateCredit ();
+	    
+	    /** 
+		 *  The item is about to be acquired: give the associated
+		 *  credit points to the subscriber.
+		 */
+	    protected void earnCredit () {
+			Subscriber subscriber = Bonus.this.subscriber;
+			if (subscriber == null) 
+				return;
+			
+			int tmpCredits = calculateCredit();
+			log("buying an item that yields "+tmpCredits+" credit points.");
+			subscriber.collectCredit(tmpCredits);
+	    }
+	}
+	
+	protected void log (String msg) {
+		System.out.println(">>Bonus>> "+msg);
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/BonusGUI.java b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/BonusGUI.java
new file mode 100644
index 0000000..ee823ae
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/BonusGUI.java
@@ -0,0 +1,84 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: BonusGUI.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.fbapplication;
+
+import java.awt.Component;
+
+import javax.swing.JOptionPane;
+
+import org.eclipse.objectteams.example.flightbooking.model.Passenger;
+
+/**
+ * This team gives an unspecific, partially abstract implementation of a GUI
+ * for a bonus programme. 
+ * Please also see its nested team FlightBonusDialog
+ * (since FlightBonusDialog is a role file, you may try pressing ctrl-o twice for navigation).
+ * FlightBonusDialog already connects to FlightBonus.
+ * However, no bindings to the flight booking system are given at this level.
+ */
+public team class BonusGUI {
+
+	/** This is a reference to the active GUI. */
+	View view = null;
+
+	/**
+	 * Make the GUI accessible and extend it by a registration question.
+	 */    
+    abstract protected class View  {
+
+    	void registerView() {
+    		BonusGUI.this.view = this;
+    	}
+
+    	protected boolean queryRegisterDialog() {
+    		int choice = JOptionPane.showConfirmDialog(
+			    				getComponent(), 
+								"Register for Flight Bonus?", 
+			    				"OT Bonus System", 
+								JOptionPane.YES_NO_OPTION);
+    		
+    		return choice == JOptionPane.YES_OPTION;
+    	}   
+
+    	/**
+    	 * Expected method: get an AWT component as parent for new windows.
+    	 */
+    	protected abstract Component getComponent();
+    }
+	
+			
+	/**
+	 * This role is used as a hook into PassengerList.
+	 */
+    protected class Controller 
+		when (BonusGUI.this.view != null) // don't receive callin triggers before proper initialization
+	{
+    	/**
+		 * Given a passenger, ask if he/she should participate in the
+		 * bonus programme.
+		 */
+		void queryRegisterForBonus (Passenger p) {
+			if (BonusGUI.this.view.queryRegisterDialog()) 
+				new FlightBonusDialog(new FlightBonus(p));
+		};
+    }    
+}
+
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/BonusGUI/FlightBonusDialog.java b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/BonusGUI/FlightBonusDialog.java
new file mode 100644
index 0000000..4379914
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/BonusGUI/FlightBonusDialog.java
@@ -0,0 +1,91 @@
+team package org.eclipse.objectteams.example.fbapplication.BonusGUI;
+
+/**
+ * A dialog for presenting information about collected bonus credits.
+ *
+ * This class is a nested team, i.e., it is a role of its enclosing team BonusGUI
+ * and at the same time it is the team for the contained roles Collector and Message.
+ * As a role it uses the option of role files, i.e., roles stored in their own file.
+ * You may use the package declaration to navigate (F3) to the enclosing team BonusGUI.
+ */
+protected team class FlightBonusDialog playedBy FlightBonus {
+
+        /**
+        * Message string to be placed in the dialog box
+        */
+        String message;	
+        
+        /**
+        * Team/role constructor: Creates a new <code>FlightBonusDialog</code> object for the given 
+        * <code>FlightBonus</code> object 
+        */
+        public FlightBonusDialog(FlightBonus fb) {
+                this.initializeMessage(0);
+                this.activate();
+                System.out.println("FBDialog ");
+        }
+        
+        /**
+            * Store old number of credits for the next message.
+            * @param credits
+            */
+        void initializeMessage(int credits) {
+                this.message = new String("Collected credits in the past: "+credits+"\n");
+        }
+        
+        /**
+        *  When a subscriber is earning credits, the message string has to be updated.
+        */
+        protected abstract class Collector {
+                
+                /**
+                    * Expected method: Returns the start string
+                    */
+                public abstract String getStart();
+                
+                /**
+                    * Expected method: Returns the destination string
+                    */
+                public abstract String getDestination();
+                
+                /**
+                    * Updates the message string when credits are calculated
+                    */
+                callin int recordCredits() {
+                        int credits = base.recordCredits();
+                        FlightBonusDialog.this.message += "FlightSegment: \n";
+                        FlightBonusDialog.this.message += "    "+this.getStart()+"-->"+this.getDestination()+"\n";
+                        FlightBonusDialog.this.message += "    earning credit: "+credits+"\n";
+                        return credits;
+                }
+                
+        }
+        
+        /**
+        *  When a subscriber is buying something, the earned credits are shown in a dialog box.
+        */
+        protected abstract class Message {
+                
+                abstract int getTotalCollectedCredits();
+                abstract String getName();
+                
+                /**
+                    * Shows a dialog box with the bonus message
+                    */
+                public void showBonusDialog() {
+                        int currentCredits = this.getTotalCollectedCredits();
+                        
+                        String title = "Bonus message for Passenger "+this.getName(); 
+                        FlightBonusDialog.this.message += new String ("Collected credits now: "+currentCredits);
+                        
+                        JOptionPane.showMessageDialog(
+                                                        BonusGUI.this.view.getComponent(), 
+                                                        FlightBonusDialog.this.message, 
+                                                        title, 
+                                                        JOptionPane.INFORMATION_MESSAGE);
+
+                        // reinitialize for the next message:
+                        FlightBonusDialog.this.initializeMessage(currentCredits);
+                }
+        }
+}
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/FlightBonus.java b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/FlightBonus.java
new file mode 100644
index 0000000..e128b29
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/FlightBonus.java
@@ -0,0 +1,84 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: FlightBonus.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.fbapplication;
+
+import org.eclipse.objectteams.example.bonussystem.Bonus;
+
+import base org.eclipse.objectteams.example.flightbooking.model.Passenger;
+import base org.eclipse.objectteams.example.flightbooking.model.Segment;
+
+/**
+ * This team is a specialization of the generic Bonus programme. 
+ * It inherits all roles from its super-team, which are adapted
+ * to the flightbooking domain in this team. 
+ */
+public team class FlightBonus extends Bonus {
+
+	/**
+	 * Register a passenger as subscriber of this bonus programme. This creates
+	 * a Subscriber role for the given Passenger object and makes the declared
+	 * callin method binding effective for it.
+	 */
+    public FlightBonus(Passenger as Subscriber s) {
+        activate();
+    }
+
+	/**
+	 * In flight booking our subscribers are passengers.
+	 */ 
+	public class Subscriber playedBy Passenger 
+		// adapt only registered passengers (guard predicate):
+		base when (FlightBonus.this.hasRole(base)) 
+	{
+		// Callin method binding:
+		buy     <- replace book;
+
+		// Callout method binding
+		String getName() -> String getName();
+	};
+
+	/**
+	 * Credits are associated with each segment of a flight.
+	 */
+	public class Item playedBy Segment {
+		
+		/**
+		 * Implement the air line's strategy: For each started 1000 miles give
+		 * 1000 points.
+		 */
+		public int calculateCredit () {
+			int miles = getDistance();
+			int credit = ((miles+999)/1000) * 1000; // round up
+			return credit;
+		};
+
+		
+		// Callin method binding:
+		earnCredit     <- after book;
+
+		// Callout method binding: forwarding to base method
+		String getDestination() -> String getDestination();
+
+		int getDistance() -> int getDistance();
+
+		String getStart() -> String getStart();
+	}
+}
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/GUIConnector.java b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/GUIConnector.java
new file mode 100644
index 0000000..5a03294
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/GUIConnector.java
@@ -0,0 +1,48 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: GUIConnector.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.fbapplication;
+
+import java.awt.Component;
+
+import base org.eclipse.objectteams.example.flightbooking.gui.FlightBookingGUI;
+import base org.eclipse.objectteams.example.flightbooking.model.PassengerDB;
+
+/**
+ * This team class (connector) connects the 
+ */
+public team class GUIConnector extends BonusGUI {
+	
+	
+    protected class View playedBy FlightBookingGUI {
+    	protected Component getComponent () {
+    		return this; // implicit lowering, the base object conforms to Component.
+    	}    
+    	
+    	registerView                 <- after  initComponents;
+    }
+    
+    protected class Controller playedBy PassengerDB {
+		//------------------------------------------------------
+		// Bootstrap callin method binding:
+		queryRegisterForBonus        <- after  add;
+		//-------------------------------------------------------
+    }
+}
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/GUIConnector/FlightBonusDialog.java b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/GUIConnector/FlightBonusDialog.java
new file mode 100644
index 0000000..c006e57
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/fbapplication/GUIConnector/FlightBonusDialog.java
@@ -0,0 +1,40 @@
+/*
+ * Created on Mar 6, 2005
+ */
+team package org.eclipse.objectteams.example.fbapplication.GUIConnector;
+
+
+/**
+ * This team is nested within GUIConnector (see the package statement above).
+ * It is responsible for recording acquired credits and displaying this
+ * information after a passenger has booked his or her flight.
+ *
+ * Note, that this class implicitly inherits from GUIConnector.FlightBonusDialog
+ * and so do its roles recursively.
+ */
+protected team class FlightBonusDialog playedBy FlightBonus {
+
+	protected class Collector playedBy Item<@FlightBonusDialog.base> {
+   		
+		//-------------------------------------------------------
+		//Callin bindings
+		recordCredits            <- replace calculateCredit;
+		//-------------------------------------------------------
+		//Callout bindings
+		getDestination           ->         getDestination;
+		getStart                 ->         getStart;
+		//-------------------------------------------------------
+   	}
+
+	protected class Message playedBy Subscriber<@FlightBonusDialog.base> {
+		
+		//-------------------------------------------------------
+		// Callout bindings 
+		getTotalCollectedCredits ->        getCollectedCredits;
+		getName                  ->        getName;
+		//-------------------------------------------------------
+		// Callin binding
+		showBonusDialog          <- after  buy;
+		//-------------------------------------------------------
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/ui/WindowPlacer.java b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/ui/WindowPlacer.java
new file mode 100644
index 0000000..8f7bb44
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/src/src/org/eclipse/objectteams/example/ui/WindowPlacer.java
@@ -0,0 +1,49 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: WindowPlacer.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.ui;
+
+import java.awt.Component;
+import java.awt.Container;
+
+import base java.awt.Window;
+
+
+/**
+ * This aspect ensures that each window will appear in the middle
+ * of the screen.
+ */
+public team class WindowPlacer  {
+
+    @SuppressWarnings("bindingtosystemclass")
+	protected class WindowAdaptor playedBy Window {
+    	// callouts:
+    	Container getParent()   		   -> Container getParent();
+    	void setCentered(Container parent) -> void setLocationRelativeTo(Component parent);
+
+    	// callin:
+    	void centerRelativeToParent() <- after void pack(); 
+    	
+    	// the action:
+    	protected void centerRelativeToParent() {
+    		setCentered(getParent());
+    	}    	
+    }
+}
diff --git a/otdt-examples/OTSample-Flightbonus-src/zipFlightbonus.launch b/otdt-examples/OTSample-Flightbonus-src/zipFlightbonus.launch
new file mode 100644
index 0000000..b571065
--- /dev/null
+++ b/otdt-examples/OTSample-Flightbonus-src/zipFlightbonus.launch
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ant.AntLaunchConfigurationType">
+<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="true"/>
+<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;launchConfigurationWorkingSet factoryID=&quot;org.eclipse.ui.internal.WorkingSetFactory&quot; label=&quot;working set&quot; name=&quot;working set&quot;&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/org.eclipse.objectteams.otdt.samples/samples&quot; type=&quot;2&quot;/&gt;&#10;&lt;/launchConfigurationWorkingSet&gt;}"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/OTSample-Flightbonus-src/build.xml"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.ant.internal.ui.antsupport.InternalAntRunner"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="OTSample-Flightbonus-src"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_INSTALL_NAME" value="jdk1.5.0_17"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_INSTALL_TYPE_ID" value="org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType"/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
+<mapAttribute key="org.eclipse.jdt.launchingVM_INSTALL_TYPE_SPECIFIC_ATTRS_MAP">
+<mapEntry key="org.eclipse.jdt.launching.JAVA_COMMAND" value="java"/>
+</mapAttribute>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="${workspace_loc:/OTSample-Flightbonus-src/build.xml}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc}"/>
+<booleanAttribute key="org.eclipse.objectteams.launch" value="false"/>
+<booleanAttribute key="org.eclipse.objectteams.otdt.debug.USE_JPLIS" value="false"/>
+<stringAttribute key="process_factory_id" value="org.eclipse.ant.ui.remoteAntProcessFactory"/>
+</launchConfiguration>
diff --git a/otdt-examples/OTSample-Observer-src/.classpath b/otdt-examples/OTSample-Observer-src/.classpath
new file mode 100644
index 0000000..bcc3bc2
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="OTRE"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/otdt-examples/OTSample-Observer-src/.project b/otdt-examples/OTSample-Observer-src/.project
new file mode 100644
index 0000000..37d4665
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/.project
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>OTSample-Observer-src</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.objectteams.otdt.builder.OTJBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.objectteams.otdt.OTJavaNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/otdt-examples/OTSample-Observer-src/observer-zip.jardesc b/otdt-examples/OTSample-Observer-src/observer-zip.jardesc
new file mode 100644
index 0000000..2fc91c6
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/observer-zip.jardesc
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jardesc>
+    <jar path="org.eclipse.objectteams.otdt.samples/samples/observer.zip"/>
+    <options buildIfNeeded="true" compress="true" descriptionLocation="/OTSample-Observer-src/observer-zip.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="false" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="true"/>
+    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+    <selectedProjects/>
+    <selectedElements exportClassFiles="false" exportJavaFiles="true" exportOutputFolder="false">
+        <javaElement handleIdentifier="=OTSample-Observer-src"/>
+    </selectedElements>
+</jardesc>
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/application/Main.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/application/Main.java
new file mode 100644
index 0000000..7777351
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/application/Main.java
@@ -0,0 +1,97 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.application;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.objectteams.example.observer.library.*;
+import org.eclipse.objectteams.example.observer.point_n_line.*;
+
+
+/**
+ * Simple main program: create some objects, invoke modifications and watch the result.
+ */
+public class Main {
+
+	public static void main (String[] args) {
+		// --- Testing ObserveLibrary: ---
+		ObserveLibrary ol = new ObserveLibrary();
+		ol.activate();
+
+		Person jack = new Person("Jack");
+		Book gof = new Book("Design Patterns", "GoF", "1234");
+		Book etl = new Book("Eiffel The Language", "BM", "345");
+		BookCopy gof1 = new BookCopy(gof);
+		BookCopy gof2 = new BookCopy(gof);
+		BookCopy etl1 = new BookCopy(etl);
+		BookCopy etl2 = new BookCopy(etl);
+
+		printBorrow(gof1, jack);
+		printBorrow(etl2, jack);
+
+		BookManager manager = new BookManager();
+		manager.printView();
+		
+		manager.buy(gof1);
+		manager.buy(gof2);
+		manager.buy(etl1);
+		manager.buy(etl2);
+
+		manager.printView();
+
+		System.out.println("===> return gof1, borrow etl1");
+		gof1.returnIt();
+		printBorrow(etl1, jack);
+		manager.printView();
+
+		System.out.println("===> test unregistering:");
+		manager.drop(etl2);
+		etl2.returnIt();
+		manager.printView();
+		manager.buy(etl2);
+		manager.printView();
+
+		// --- Testing ObserveLine: ---
+		testPointNLine();
+	}
+
+	static void printBorrow(BookCopy bc, Person p) {
+		System.out.println(bc+" is borrowed by "+bc.borrow(p));
+	}
+
+        /**
+         * Perform some tests: create an Area and a Polyline.
+         * After drawing the line, perform some changes
+         *
+         */
+        static void testPointNLine() {
+            ObserveLine observing = new ObserveLine();
+            observing.activate(); // needed to make callin bindings effective.
+            Area area = new Area();
+            Polyline line = new Polyline();
+            area.draw(line);
+            // single point:
+            line.addPoint(new Point(0,0));
+            // list of points:
+            List<Point> points = Arrays.asList( new Point[] {
+                    new Point(1,0), new Point(1,1), new Point(2,2)
+            });
+            // bulk-operation:
+            line.addPoints(points); // causes re-entrance (but not of observer! ;)
+        }
+}
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/application/ObserveLibrary.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/application/ObserveLibrary.java
new file mode 100644
index 0000000..390c9d6
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/application/ObserveLibrary.java
@@ -0,0 +1,49 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.application;
+
+import org.eclipse.objectteams.example.observer.pattern.ObserverPattern;
+
+import base org.eclipse.objectteams.example.observer.library.BookManager;
+import base org.eclipse.objectteams.example.observer.library.BookCopy;
+
+/**
+ * This is a team class which is used as a connector, meaning, it contains
+ * just bindings, no implementation.
+ * The abstract modifier of superclass is dropped, 
+ * because abstract methods are defined by deployment (using callout-bindings).
+ */
+public team class ObserveLibrary extends ObserverPattern {
+
+    public class Observer playedBy BookManager {
+    	
+    	// Callout method binding: bind an action to the update event.
+        update   -> updateView; 
+        
+        /* -------------------------------------------------------------- */
+        
+        // Callin method bindings: bind events to trigger the start/stop operations.
+        start    <- after  buy;
+        stop     <- before drop;  
+    }
+
+    public class Subject playedBy BookCopy {
+
+    	// Callin method binding: bind events to trigger the notification mechanism. 
+        changeOp <- after returnIt, borrow; 
+    }
+}
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/application/ObserveLine.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/application/ObserveLine.java
new file mode 100644
index 0000000..234653b
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/application/ObserveLine.java
@@ -0,0 +1,57 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.application;
+
+import org.eclipse.objectteams.example.observer.pattern.ObserverPattern;
+
+import base org.eclipse.objectteams.example.observer.point_n_line.Polyline;
+import base org.eclipse.objectteams.example.observer.point_n_line.Area;
+
+/**
+ * This class applies the observer pattern to a set of drawing elements.
+ * One could easily think of a canvas that should react to changes of
+ * its figures.
+ */
+public team class ObserveLine extends ObserverPattern {
+	
+	/**
+	 * Elements to be observed are simple poly-lines.
+	 */
+	protected class Subject playedBy Polyline {
+		// bindings only:
+		changeOp     <- after   addPoint;
+		changeOpMany <- replace addPoints;
+		toString     => toString; // callout overrides existing method
+	}
+	protected class Observer playedBy Area {
+		/**
+		 * Only print out that a change happend and some action should be taken.
+		 * (this method implements the inherited abstract method, instead of 
+		 * binding it to a base method).
+		 *  
+		 * @param s the element that has changed.
+		 */
+		protected void update(Subject s) {
+			System.out.println("Observing: "+s);
+		}
+		/**
+		 * Bind the trigger to start the protocol:
+		 * only elements that are drawn need to participate in the observer pattern.
+		 */
+		start <- after draw; 
+	}
+}
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/Book.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/Book.java
new file mode 100644
index 0000000..d65c069
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/Book.java
@@ -0,0 +1,50 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.library;
+
+import java.util.LinkedList;
+
+/**
+ * A title listed in the catalogue.
+ */
+public class Book {
+
+	private String name;
+	private String author;
+	private String isbn;
+	private LinkedList<BookCopy> copies = new LinkedList<BookCopy>();
+
+	public Book (String name, String author, String isbn) {
+		this.name = name;
+		this.author = name;
+		this.isbn = isbn;
+	}
+
+	public String getName () { return name ; }
+	public String getAuthor () { return  author; }
+	public String getISBN () { return  isbn; }
+
+	/**
+	 * When a new copy of this book is acquired, use this method to register.
+	 * @param bc
+	 * @return number of registered copies after the operation. 
+	 */
+	public int registerCopy (BookCopy bc) {
+		copies.add(bc);
+		return copies.size();
+	}
+}
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/BookCopy.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/BookCopy.java
new file mode 100644
index 0000000..59d4965
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/BookCopy.java
@@ -0,0 +1,68 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.library;
+
+/**
+ * Instances represent physical books in the shelf.
+ */
+public class BookCopy {
+
+	private Book theBook; // the title of which this is a copy
+	private Person borrower = null;
+	private int nr; 
+
+	public BookCopy (Book ofBook) {
+		theBook = ofBook;
+		nr = ofBook.registerCopy(this);
+	}
+
+	/**
+	 * When a person borrows a book, record who is the borrower.
+	 * @param who
+	 * @return the borrower 
+	 */
+	public Person borrow (Person who) {
+		borrower = who;
+		return borrower;
+	}
+
+	/**
+	 * (Unfortunately cannot name a method "return" ;-)
+	 * A book copy that was out is returned.
+	 */
+	public void returnIt () {
+		borrower = null;
+	}
+
+	/**
+	 * Is it available for borrowing?
+	 */
+	public boolean isAvail () {
+		return borrower == null;
+	}
+
+	/**
+	 * The ID of a book copy gives the title and a serial number.
+	 */
+	public String getID () {
+		return "'"+theBook.getName() + "'#" + nr;
+	}
+
+	public String toString () {
+		return getID();
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/BookManager.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/BookManager.java
new file mode 100644
index 0000000..7113910
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/BookManager.java
@@ -0,0 +1,69 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.library;
+
+import java.util.Arrays;
+import java.util.HashMap;
+
+/**
+ * Central class of a simplistic library-system.
+ * The book manager keeps a set of books.
+ */
+public class BookManager {
+
+	private HashMap<String, String> view = new HashMap<String, String>(); // ID -> status
+
+	/**
+	 * A new copy of a book is bought and stored in the book manager.
+	 * @param bc the new book copy.
+	 */
+	public void buy (BookCopy bc) {
+		updateView (bc);
+	}
+
+	/**
+	 * Remove a book copy, e.g., after it was lost.
+	 * @param bc 
+	 */
+	public void drop (BookCopy bc) {
+		view.remove(bc.getID());
+	}
+
+	/**
+	 * Print some information on each book managed by us.
+	 */
+	public void printView () {
+		System.out.println("Copy\t\t\tStatus");
+		System.out.println("--------------------------------");
+		String[] keys = view.keySet().toArray(new String[view.size()]);
+		Arrays.sort(keys); // sorting is for testability.
+		for (int i=0; i<keys.length; i++) {
+			String key = keys[i];
+			String status = view.get(key);
+			System.out.println(key + "\t" + status);
+		}
+	}
+
+	/**
+	 * Update the status (available/out) of a given book copy.
+	 * @param bc
+	 */
+	public void updateView(BookCopy bc) {
+		String status = bc.isAvail() ? "available" : "out";
+		view.put(bc.getID(), status);
+	}
+}
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/Person.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/Person.java
new file mode 100644
index 0000000..8c7ea80
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/library/Person.java
@@ -0,0 +1,34 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.library;
+
+/**
+ * While Persons are actually quite complex, this class models only
+ * what is needed to identify a Person when borrowing a book copy.
+ */
+public class Person {
+
+	private String name;
+
+	public Person (String n) {
+		name = n;
+	}
+
+	public String getName () { return name; }
+
+    public String toString() { return name; }
+}
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/pattern/ObserverPattern.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/pattern/ObserverPattern.java
new file mode 100644
index 0000000..e52d260
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/pattern/ObserverPattern.java
@@ -0,0 +1,106 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.pattern;
+
+import java.util.LinkedList;
+
+/**
+ * This team gives a reusable implementation of the Observer Pattern.
+ * Only application-specific parts are left abstract.
+ * 
+ * Two applications of this pattern and a simple Main can be found in package org.eclipse.objectteams.example.observer.application.
+ * 
+ * To run the application, select org.eclipse.objectteams.example.observer.application/Main.java in the package explorer
+ * and select "Run as" -> "Java Application".
+ * (to check enablement of OT/J you may visit the JRE tab of the corres-
+ * ponding launch configuration and ensure that "Enable OTRE" is checked).
+ */
+public abstract team class ObserverPattern {
+
+	/**
+	 * The Subject role of the observer pattern.
+	 * Abstractness is not strictly needed, but it signals that applications
+	 * of the pattern should refine this role.
+	 */
+	protected abstract class Subject {
+		
+		// ========== Registry of known Observers: ==========
+		private LinkedList<Observer> observers = new LinkedList<Observer>();
+	    
+		protected void addObserver (Observer o) {
+			observers.add(o);
+		}
+
+		protected void removeObserver (Observer o) {
+			observers.remove(o);
+		}
+
+		/**
+		 * All edit operations of the concrete Subject should call into this method. 
+		 */
+		public void changeOp() {
+			for (Observer observer : observers)
+				observer.update(this);
+		}
+
+		/**
+		 *  Variant for multiple changes in one method call.
+		 *  Because we suspect reentrance at the base side, we temporarily deactivate this Team.
+		 *    (This solves the problem known as "jumping aspects" 
+		 *     where more notifications would be sent than needed).
+		 *  By declaring the method as "callin" it is designed to be bound using "replace".
+		 */
+		callin void changeOpMany () {
+			boolean wasActive = isActive();
+			deactivate();        // no notification during the base call.
+			base.changeOpMany(); // call original version (requires "callin" modifier).
+			if (wasActive)
+				activate(); // restore state
+
+			changeOp();
+		}
+	}
+
+	/**
+	 * Observer role of the design pattern.
+	 */
+	protected abstract class Observer {
+
+		/** 
+		 *  This method needs to be realized to do something usefull 
+		 *  on the actual observer instance.
+		 */
+		protected abstract void update(Subject s);
+
+		/**
+		 * To be called, when a concrete observer starts to participate in the pattern.
+		 * @param s the subject to connect to.
+		 */
+		public void start (Subject s) {
+			s.addObserver(this);
+		}
+
+		/**
+		 * To be called, when a concrete observer stops to participate in the pattern.
+		 * @param s the subject to disconnect from.
+		 */
+		public void stop (Subject s) {
+			s.removeObserver(this);
+		}
+	}
+}
+
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/point_n_line/Area.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/point_n_line/Area.java
new file mode 100644
index 0000000..66fd534
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/point_n_line/Area.java
@@ -0,0 +1,24 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.point_n_line;
+
+public class Area {
+
+	public void draw (Polyline l) {
+		System.out.println("Area drawing line "+l);
+	}
+}
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/point_n_line/Point.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/point_n_line/Point.java
new file mode 100644
index 0000000..9aae5da
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/point_n_line/Point.java
@@ -0,0 +1,28 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.point_n_line;
+
+public class Point {
+	private int x,y;
+	public Point (int x, int y) {
+		this.x = x;
+		this.y = y;
+	}
+	public String toString () {
+		return "("+x+", "+y+")";
+	}
+}
diff --git a/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/point_n_line/Polyline.java b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/point_n_line/Polyline.java
new file mode 100644
index 0000000..55cb648
--- /dev/null
+++ b/otdt-examples/OTSample-Observer-src/src/org/eclipse/objectteams/example/observer/point_n_line/Polyline.java
@@ -0,0 +1,44 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.observer.point_n_line;
+
+import java.util.*;
+
+public class Polyline {
+	private LinkedList<Point> points = new LinkedList<Point>();
+
+	public void addPoint (Point p) {
+		points.add(p);
+	}
+	
+	public void addPoints (List<Point> pList) {
+		for (Point p : pList) 
+			addPoint(p);
+	}
+	
+	public String toString () {
+		StringBuffer buf = new StringBuffer("Line [");
+		String sep = "";
+		for (Point p : points) {
+			buf.append(sep+p.toString());
+			sep = ", ";
+		}
+		buf.append("]");
+		return buf.toString();
+	}
+	
+}
diff --git a/otdt-examples/OTSample-Stopwatch-src/.classpath b/otdt-examples/OTSample-Stopwatch-src/.classpath
new file mode 100644
index 0000000..bcc3bc2
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="OTRE"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/otdt-examples/OTSample-Stopwatch-src/.project b/otdt-examples/OTSample-Stopwatch-src/.project
new file mode 100644
index 0000000..7ce2846
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/.project
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>OTSample-Stopwatch-src</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.objectteams.otdt.builder.OTJBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.objectteams.otdt.OTJavaNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/otdt-examples/OTSample-Stopwatch-src/.settings/org.eclipse.jdt.core.prefs b/otdt-examples/OTSample-Stopwatch-src/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..87e37e0
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,64 @@
+#Sat Jul 18 21:53:34 CEST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
diff --git a/otdt-examples/OTSample-Stopwatch-src/img/watch.jpg b/otdt-examples/OTSample-Stopwatch-src/img/watch.jpg
new file mode 100644
index 0000000..2e293fe
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/img/watch.jpg
Binary files differ
diff --git a/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/AnalogClock.java b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/AnalogClock.java
new file mode 100644
index 0000000..579ffc8
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/AnalogClock.java
@@ -0,0 +1,123 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: AnalogClock.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.stopwatch;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+import javax.swing.JPanel;
+
+public class AnalogClock extends JPanel {
+    private int seconds = 0;
+
+    private static final int   spacing = 10;
+    private static final float threePi = (float)(3.0 * Math.PI);
+    // Angles for the trigonometric functions are measured in radians.
+    // The following in the number of radians per sec or min.
+    private static final float radPerSecMin = (float)(Math.PI / 30.0);
+
+    private int size;       // height and width of clock face
+    private int centerX;    // x coord of middle of clock
+    private int centerY;    // y coord of middle of clock
+    private BufferedImage clockImage;
+
+    //==================================================== Clock constructor
+    public AnalogClock() {
+        this.setBackground(Color.white);
+        this.setForeground(Color.black);
+    }//end constructor
+
+    //=============================================================== update
+        // Replace the default update so that the plain background
+        // doesn't get drawn.
+    public void update(int value) {
+    	seconds = value;
+        this.repaint();
+    }//end update
+
+    //======================================================= paintComponent
+
+    public void paintComponent(Graphics g) {
+        super.paintComponent(g);  // paint background, borders
+        Graphics2D g2 = (Graphics2D)g;
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                            RenderingHints.VALUE_ANTIALIAS_ON);
+
+        int w = getWidth();
+        int h = getHeight();
+        size = ((w < h) ? w : h) - 2 * spacing;
+        centerX = size / 2 + spacing;
+		centerY = size / 2 + spacing + 35;
+
+        // Create the clock face background image if this is the first time
+        if (clockImage == null
+                || clockImage.getWidth() != w
+                || clockImage.getHeight() != h) {
+
+        	try {
+				clockImage = ImageIO.read(new File("img/watch.jpg"));
+			} catch (IOException e) {
+				// File not found :-/
+			}
+            // now get a graphics context from this image
+            Graphics2D gc = clockImage.createGraphics();
+            gc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                                RenderingHints.VALUE_ANTIALIAS_ON);
+        }
+        
+        // Draw the clock face from the precomputed image
+        g2.drawImage(clockImage, null, 0, 0);
+
+        // Draw the clock hands
+        drawClockHand(g);
+    }//end paintComponent
+
+    //======================================================= drawClockHand
+    private void drawClockHand(Graphics g) {
+        int secondRadius = size / 2 - 55;
+
+        // second hand
+        float fseconds = seconds;
+        float secondAngle = threePi - (radPerSecMin * fseconds);
+        drawRadius(g, centerX, centerY, secondAngle, 0, secondRadius);
+
+    }//end drawClockHands
+
+    // =========================================================== drawRadius
+    private void drawRadius(Graphics g, int x, int y, double angle,
+                    int minRadius, int maxRadius) {
+        float sine   = (float)Math.sin(angle);
+        float cosine = (float)Math.cos(angle);
+
+        int dxmin = (int)(minRadius * sine);
+        int dymin = (int)(minRadius * cosine);
+
+        int dxmax = (int)(maxRadius * sine);
+        int dymax = (int)(maxRadius * cosine);
+        Graphics2D g2d = (Graphics2D)g;
+        g2d.setStroke(new BasicStroke(4));
+        g2d.drawLine(x + dxmin, y + dymin, x + dxmax, y + dymax);
+    }//end drawRadius
+
+}
diff --git a/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/Main.java b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/Main.java
new file mode 100644
index 0000000..9b65979
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/Main.java
@@ -0,0 +1,59 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Main.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.stopwatch;
+
+/**
+ * Object Teams features demonstrated by this example:
+ * ---------------------------------------------------
+ * 
+ * Callin and callout method binding: Callin bindings are used to inform the GUI
+ * about changes in the base class. The callout method bindings allow us to
+ * propagate commands from the GUI to the base class.
+ * 
+ * Role class binding: The role WatchDisplay is bound to the base class StopWatch.
+ *  
+ * 
+ * Domain description: 
+ * -------------------
+ *
+ * This is a simple example for an implementation of the Model-View-Controller
+ * pattern. A StopWatch with the basic functions start, stop, and clear is
+ * created and passed to two WatchDisplays. Any changes in the model (StopWatch)
+ * are made visible in both views (WatchDisplay).
+ * 
+ * Launching the application:
+ * --------------------------
+ * Just run this main class as a Java Application, e.g., like this:
+ *  - Choose "Run", "Run..." in the Eclipse menu bar
+ *  - Select "Java Application"
+ *  - Create a new run configuration by clicking "New"
+ *  - Click "Run"
+ * (to check enablement of OT/J you may visit the JRE tab of the corres-
+ * ponding launch configuration and ensure that "Enable OTRE" is checked).
+ */
+public class Main {
+
+	public static void main(String[] args) {
+		StopWatch w = new StopWatch();
+		new WatchUIAnalog(w);
+		new WatchUI(w);
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/StopWatch.java b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/StopWatch.java
new file mode 100644
index 0000000..e3b0ff0
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/StopWatch.java
@@ -0,0 +1,127 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: StopWatch.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.stopwatch;
+
+/**
+ * This class acts as base class for this example. It is bound to the
+ * WatchDisplay role of the WatchUI team. StopWatch implemets a simple watch as
+ * a thread. The watch can be controlled via three methods: start(), stop() and
+ * clear(). getValue() returns the current time value. Note, that the StopWatch
+ * is not aware of the GUI.
+ */
+public class StopWatch implements Runnable {
+
+	/**
+	 * Current time value
+	 */
+	private int time = 0;
+
+	/**
+	 * Flag that indicates if the watch is running
+	 */
+	private boolean running;
+
+	/**
+	 * Flag that indicates if there is a stop request
+	 */
+	private boolean stopRequest;
+
+	/**
+	 * Increases the time value.
+	 */
+	private synchronized void advance() {
+		time++;
+	}
+
+	/**
+	 * Starts the watch thread.
+	 */
+	public synchronized void start() {
+		if (!running) {
+			setRunning(true);
+			setStopped(false);
+			(new Thread(this)).start();
+		}
+	}
+
+	/**
+	 * Stops the watch thread.
+	 *  
+	 */
+	public synchronized void stop() {
+		setStopped(true);
+	}
+
+	/**
+	 * Resets the time value.
+	 */
+	public synchronized void reset() {
+		time = 0;
+	}
+
+	/**
+	 * Returns the current time value.
+	 */
+	public synchronized int getValue() {
+		return time;
+	}
+
+	/**
+	 * Sets the running flag value.
+	 */
+	private synchronized void setRunning(boolean value) {
+		running = value;
+	}
+
+	/**
+	 * Returns the stop flag value
+	 */
+	private synchronized boolean isStopped() {
+		return stopRequest;
+	}
+
+	/**
+	 * Sets the stop flag value
+	 */
+	private synchronized void setStopped(boolean value) {
+		stopRequest = value;
+	}
+
+	/**
+	 * This method contains the main loop that is executed while the watch is
+	 * running.
+	 */
+	public void run() {
+		while (true) {
+			try {
+				Thread.sleep(1000);
+			} catch (InterruptedException e) {
+				setRunning(false);
+				return;
+			}
+			if (isStopped()) {
+				setRunning(false);
+				return;
+			}
+			advance();
+		}
+	}
+}
\ No newline at end of file
diff --git a/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/WatchUI.java b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/WatchUI.java
new file mode 100644
index 0000000..b788f21
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/WatchUI.java
@@ -0,0 +1,135 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: WatchUI.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.stopwatch;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JTextField;
+
+/**
+ * This team implements the UI for a StopWatch and contains the role class
+ * WatchDisplay.
+ */
+public team class WatchUI {
+	static int ypos = 150;
+
+	/**
+	 * Role class WatchDisplay is played by the base class StopWatch. The role
+	 * class WatchDisplay is bound to the base class StopWatch with the keyowrd
+	 * 'playedBy'.
+	 */
+	protected class WatchDisplay extends JFrame playedBy StopWatch 
+	{
+		private JTextField display;
+		private JButton startButton;
+		private JButton stopButton;
+		private JButton clearButton;
+
+		/**
+		 * This constructor is used for automatic role creation. E.g. via
+		 * declared lifting. Role class constructor takes an object of the type
+		 * of the declared base class. Setup the window, create a textfield for
+		 * time display and three buttons "start", "stop", and "clear".
+		 */
+		public WatchDisplay(StopWatch w) {
+			setTitle("Digital Stop Watch");
+			setSize(new Dimension(300, 100));
+			setLocation(410, ypos+=110);
+			Container pane = getContentPane();
+			pane.setLayout(new GridLayout(2,3));
+
+			pane.add(new JLabel(""));
+			display = new JTextField("0", 8);
+			display.setHorizontalAlignment(JTextField.RIGHT);
+			pane.add(display);
+			pane.add(new JLabel(""));
+
+			startButton = new JButton("start");
+			startButton.addActionListener(new ActionListener() {
+					public void actionPerformed(ActionEvent e) {
+						start();
+					}});
+			pane.add(startButton);
+
+			stopButton = new JButton("stop");
+			stopButton.addActionListener(new ActionListener() {
+					public void actionPerformed(ActionEvent e) {
+						stop();
+					}});
+			pane.add(stopButton);
+
+			clearButton = new JButton("clear");
+			clearButton.addActionListener(new ActionListener() {
+					public void actionPerformed(ActionEvent e) {
+						clear();
+					}});
+			pane.add(clearButton);
+			setVisible(true);
+		}		
+
+		/**
+		 * Shows the new time value on the watch display.
+		 */
+		void update() {
+			String val = getStringValue();
+			display.setText(val);
+		}
+
+		// Abstract methods for mapping to the concrete base methods:
+		abstract void   start();
+		abstract void   stop();
+		abstract void   clear();
+		abstract String getStringValue();
+			
+			   // callout method bindings: any call of the abstract WatchDisplay
+			   // method will be forwarded to the concrete StopWatch method
+			   start            ->       start;
+			   stop             ->       stop;
+			   clear            ->       reset;
+		String getStringValue()	-> int   getValue() 
+			   with {
+					// result is a predefined name.
+			   		result      <-   Integer.toString(result)
+		       }
+
+		  	   /* -------------------------------------------------------------- */
+		
+			   // Callin method bindings: WatchDisplay (role object) is updated
+			   // after the StopWatch (base object) advanced or was reset.
+			   void update()	<- after void advance();
+			   void update()    <- after void reset();
+	}
+
+	/**
+	 * The team constructor uses declared lifting. A WatchDisplay role is
+	 * created for the given StopWatch object.
+	 */
+	public WatchUI (StopWatch as WatchDisplay w) {
+		activate(ALL_THREADS); // Without this, the callin bindings have no effect.
+	}
+}
diff --git a/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/WatchUIAnalog.java b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/WatchUIAnalog.java
new file mode 100644
index 0000000..814e1c8
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/src/org/eclipse/objectteams/example/stopwatch/WatchUIAnalog.java
@@ -0,0 +1,117 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: WatchUIAnalog.java 23501 2010-02-08 18:27:55Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.example.stopwatch;
+
+import java.awt.BorderLayout;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+/**
+ * This team implements the UI for a StopWatch and contains the role class
+ * WatchDisplay.
+ */
+public team class WatchUIAnalog {
+	public class WatchDisplay extends JFrame playedBy StopWatch {
+
+	    AnalogClock clockFace;
+		private JButton startButton;
+		private JButton stopButton;
+		private JButton clearButton;
+		
+	    //========================================================== constructor
+	    public WatchDisplay(StopWatch sw) {
+	        Container content = this.getContentPane();
+			content.setLayout(new BorderLayout());
+	        clockFace = new AnalogClock();
+	        this.setLocation(90, 110);
+	        this.setResizable(false);
+
+	        content.add(clockFace, BorderLayout.CENTER);
+			JPanel buttons = new JPanel();
+			buttons.setLayout(new FlowLayout());
+			
+			startButton = new JButton("start");
+			startButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent e) {
+					start();
+				}});
+			buttons.add(startButton);
+			
+			stopButton = new JButton("stop");
+			stopButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent e) {
+					stop();
+				}});
+			buttons.add(stopButton);
+			
+			clearButton = new JButton("clear");
+			clearButton.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent e) {
+					clear();
+				}});
+			buttons.add(clearButton);
+
+	        content.add(buttons, BorderLayout.SOUTH);
+
+			this.setTitle("Analog Stop Watch");
+			this.setSize(new Dimension(298, 440));
+
+	        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
+	        setVisible(true);
+	    }//end constructor
+	    
+	    void update() {
+	    	clockFace.update(getValue());
+		}
+//	  Abstract methods for mapping to the concrete base methods:
+		abstract void    stop();
+		abstract void   clear();
+		abstract int getValue();
+			
+			   // callout method bindings: any call of the abstract WatchDisplay
+			   // method will be forwarded to the concrete StopWatch method
+		void   start()          ->       void start();
+			   stop             ->       stop;
+			   clear            ->       reset;
+			   getValue			->       getValue; 
+			   
+//			 Callin method bindings: WatchDisplay (role object) is updated
+			   // after the StopWatch (base object) advanced or was reset.
+			   void update()	<- after void advance();
+			   void update()    <- after void reset();
+	}//end class ClockAnalogBuf
+	
+
+	/**
+	 * The team constructor uses declared lifting. A WatchDisplay role is
+	 * created for the given StopWatch object.
+	 */
+	public WatchUIAnalog (StopWatch as WatchDisplay w) {
+		activate(ALL_THREADS); // Without this, the callin bindings have no effect.
+	}
+}
diff --git a/otdt-examples/OTSample-Stopwatch-src/stopwatch-zip.jardesc b/otdt-examples/OTSample-Stopwatch-src/stopwatch-zip.jardesc
new file mode 100644
index 0000000..1e6e125
--- /dev/null
+++ b/otdt-examples/OTSample-Stopwatch-src/stopwatch-zip.jardesc
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jardesc>
+    <jar path="org.eclipse.objectteams.otdt.samples/samples/stopwatch.zip"/>
+    <options buildIfNeeded="true" compress="true" descriptionLocation="/OTSample-Stopwatch-src/stopwatch-zip.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="false" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="true"/>
+    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+    <selectedProjects/>
+    <selectedElements exportClassFiles="false" exportJavaFiles="true" exportOutputFolder="false">
+        <javaElement handleIdentifier="=OTSample-Stopwatch-src"/>
+    </selectedElements>
+</jardesc>
diff --git a/otdt-examples/OTSample-ordersystem-src/.classpath b/otdt-examples/OTSample-ordersystem-src/.classpath
new file mode 100644
index 0000000..bcc3bc2
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="OTRE"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/otdt-examples/OTSample-ordersystem-src/.project b/otdt-examples/OTSample-ordersystem-src/.project
new file mode 100644
index 0000000..76279e9
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/.project
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>OTSample-ordersystem-src</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.objectteams.otdt.builder.OTJBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.objectteams.otdt.OTJavaNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/otdt-examples/OTSample-ordersystem-src/Intro0.html b/otdt-examples/OTSample-ordersystem-src/Intro0.html
new file mode 100644
index 0000000..f37851b
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/Intro0.html
@@ -0,0 +1,75 @@
+<title>Intro to the Order System Sample</title>
+<style type="text/css">
+code { background-color:lightgray; }
+img { border:0px; }
+</style>
+<body>	
+<h1>A Simple Order System</h1>
+
+<h2>Package Overview</h2>
+See the individual class comments for details.
+
+<dl>
+<dt><img src="images/package.gif"> <b><code>package org.objectteams.sample.ordersystem</code></b>
+<dd>A simple main class triggering some actions in batch mode.
+
+<dt><img src="images/package.gif"> <b><code>package org.objectteams.sample.ordersystem.data</code></b>
+<dd>Plain data classes <code>Customer</code> and <code>Address</code>
+
+<dt><img src="images/package.gif"> <b><code>package org.objectteams.sample.ordersystem.store</code></b>
+<dd>This package models a <code>Storage</code> and its <code>StockItems</code>.<br />
+	These are normal data objects with the usual access methods.<br />
+	Throughout the class <code>StockItem</code> you will find "callin markers" 
+	(<img src="images/callinbinding_obj.gif">) in the gutter, 
+	indicating that the corresponding methods are adapted by one or more aspects in the system.
+
+<dt><img src="images/package.gif"> <b><code>package org.objectteams.sample.ordersystem.reservation</code></b>
+<dl>
+<dt><img src="images/team_obj.gif"> <code>team class Reservations</code>
+<dd>A simple reservation component; abstract at this level because it is
+    completely undefined what kinds of <img src="images/role_obj.gif">&nbsp;<code>Reservable</code> items are 
+    being managed.
+<dt><img src="images/team_obj.gif"> <code>team class StockReservations</code>
+<dd>Binding the reservation component in order to manage <code>StockItems</code>.
+</dl>
+
+<dt><img src="images/package.gif"> <b><code>package org.objectteams.sample.ordersystem.order</code></b>
+<dl>
+<dt><img src="images/team_obj.gif"> <code>team class Order</code>
+<dd>A simple ordering component; abstract at this level because it is
+    completely undefined what kinds of <img src="images/role_obj.gif">&nbsp;<code>Items</code> items are 
+    being managed. <br />
+    However, each order is associated to a <img src="images/role_obj.gif">&nbsp;<code>Customer</code>
+    and his or her <img src="images/role_obj.gif">&nbsp;<code>Address</code>. Please note, that these
+    role classes are not related to those classes defined in <code>org.objectteams.samples.data</code>.
+<dt><img src="images/team_obj.gif"> <code>team class StockOrder</code>
+<dd>Binding the order component in order to manage <code>StockItems</code>.
+</dl>
+<dt><img src="images/package.gif"> <b><code>package org.objectteams.sample.ordersystem.gui</code></b>
+<dl><img src="images/class_public.gif"> <code>class OrderSystemMainFrame</code>
+<dd>Definition of the GUI of this system. Most of this class might have been generated by 
+ 	a Form Designer.
+<dt><img src="images/team_obj.gif"> <code>team class ModelAdapterTeam</code>
+<dd>This aspect binds classes from the packages <code>data</code> and <code>store</code> to
+    the GUI.
+<dt><img src="images/team_obj.gif"> <code>team class ControllerAdapterTeam</code>
+<dd>This aspect contains all listeners and attaches them to the GUI.
+<dt><img src="images/team_obj.gif"> <code>team class GUIAdapterTeam</code>
+<dd>This aspect ensures that each window will appear in the middle of the screen.
+<dt>
+<dd>
+</dl>
+</dl>
+
+<h2>Running the application</h2>
+In order to see the full functionality enter the following information to the launch configuration:
+<table padding=3 border=1>
+<tr><td colspan=2><b>Tab <img src="images/class_public.gif"> Main</b>
+<tr><td>Main class<td><code>org.objectteams.samples.ordersystem.gui.GUITest</code>
+<tr><td colspan=2><b>Tab <img src="images/team_obj.gif"> Team Activation</b>
+<tr><td>Add:	<td><code>ModelAdapterTeam</code><br />
+				    <code>ControllerAdapterTeam</code><br />
+				    <code>GUIAdapterTeam</code>
+</table>
+</body>
+</html>
\ No newline at end of file
diff --git a/otdt-examples/OTSample-ordersystem-src/ordersystem-zip.jardesc b/otdt-examples/OTSample-ordersystem-src/ordersystem-zip.jardesc
new file mode 100644
index 0000000..3ecf58a
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/ordersystem-zip.jardesc
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jardesc>
+    <jar path="org.objectteams.otdt.samples/samples/ordersystem.zip"/>
+    <options buildIfNeeded="true" compress="true" descriptionLocation="/OTSample-ordersystem-src/ordersystem-zip.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="false" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="true"/>
+    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+    <selectedProjects/>
+    <selectedElements exportClassFiles="false" exportJavaFiles="true" exportOutputFolder="false">
+        <javaElement handleIdentifier="=OTSample-ordersystem-src/src"/>
+        <file path="/OTSample-ordersystem-src/Intro0.html"/>
+        <file path="/OTSample-ordersystem-src/.project"/>
+        <file path="/OTSample-ordersystem-src/.classpath"/>
+    </selectedElements>
+</jardesc>
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/Main.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/Main.java
new file mode 100644
index 0000000..9db247f
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/Main.java
@@ -0,0 +1,189 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Main.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem;
+
+import org.objectteams.samples.ordersystem.data.*;
+import org.objectteams.samples.ordersystem.order.StockOrder;
+import org.objectteams.samples.ordersystem.reservation.StockReservations;
+import org.objectteams.samples.ordersystem.store.*;
+
+/**
+ * Object Teams features demonstrated by this example:
+ * ---------------------------------------------------
+ * Team class as design pattern Facade: The team class reservations.Reservations 
+ * provides a simple interface which hides the system complexity and minimizes 
+ * the communication between reservation system and main class.
+ * 
+ * Role classes as Decorator: The role class Reservable decorates its base class 
+ * StockItem by adding of reservation feature, thereby allowing to control the 
+ * availability of items in the storage. The role class Item encloses its base class 
+ * StockItem, forwards requests to its provided methods (callouts) and performs 
+ * additional actions for its base class (callins), thereby allowing to regard 
+ * the storage items as a part of an order list. So we can manage the items in 
+ * the storage, discount them and give the alarm, if the item has been invalidated.
+ * 
+ * Team and role inheritance: The team class reservation.StockReservations inherits 
+ * the role class Reservable from its super-team reservation.Reservations, the team 
+ * class order.StockOrder inherits the role class Item from its super-team order.Order 
+ * 
+ * Declared lifting: The base object StockItem is explicitly lifted to its role object
+ * in the team class methods (teams order.StockOrder and reservation.StockReservations).
+ * 
+ * Translation polymorphism: The base class StockItem plays two different roles 
+ * in two different teams: Item in order.StockOrder and Reservable in 
+ * reservation.StockReservations. The both role classes are not conform to each
+ * other. By transfer of an object of type Item between two methods of the different 
+ * team classes (order.StockOrder and reservation.StockReservations) the Item object
+ * is implicitly lowered to its base object StockOrder following by declared lifting 
+ * to the object of type Reservable. (see the data flow between Item.doReserve(int) and 
+ * StockReservations.reserve(StockItem as Reservable,int))
+ * 
+ * Separation of team implementaion and role binding: The role classes Item and Reservable
+ * are implemented in their enclosing teams order.Order and reservation.Reservations 
+ * and bound to their base classes in the sub-teams order.StockOrder and
+ * reservation.StockReservations. 
+ *  
+ * Callin and callout method binding: The essential adaptations are integrated using 
+ * callin bindings. Note, that the roles also employ the style of callout bindings 
+ * in order to access features of their base class.
+ * 
+ * 
+ * Domain description:
+ * -------------------
+ * 
+ * A generic storage functionality is implemented in the classes Storage and StockItem.
+ * The order system is introduced in the team class order.Order, where the role Item is 
+ * unbound. The team class reservation.Reservatoins realizes the storage management in
+ * connection with the reservation of contained items. The base class storage.StockItem
+ * plays a role of an order entry in the team order.StockOrder (Item) and the role of 
+ * a reservable item in the team reservation.StockReservations (Reservable).  
+ */
+public class Main {
+	static StockItem[] items = new StockItem[] {
+		new StockItem("screw driver", 1500),
+		new StockItem("tool box pro", 5000),
+		new StockItem("stepladder", 7999),
+		new StockItem("philips screw", 155),
+		new StockItem("wall paint", 1680),
+		new StockItem("paint brush", 800)
+	};
+	
+	static Address[] addresses = new Address[] {
+		new Address("22, october avenue", "2345", "Chicago", "Il,USA"),
+		new Address("Blaumeisenweg 5", "12345", "Berlin", "Germany"),
+		new Address("10, Lundy Avenue", "513648", "Paris", "France"),
+		new Address("Venus/Mars", "135754", "Io", "Jupiter"),
+	};
+	
+	static Customer[] customers = new Customer[] {
+		new Customer("Joe", "Jojo", addresses[0]),		
+		new Customer("Jim", "Beann", addresses[1]),
+		new Customer("Jan", "Tatam", addresses[2])
+	};
+	
+	static StockReservations res = (StockReservations)StockReservations.theInstance();
+
+	public static void main (String[] args) {
+		
+		
+		print("================StoreTest================\n");
+
+//		print("----------------Init Tests---------------\n");
+//		InitTests.initTests();
+		
+		print("----------------Fill storage-------------");
+		fillStorage();
+		Storage storage = Storage.theInstance();
+		storage.print(System.out);
+
+		print("----------------Remove item--------------");
+		storage.delete(items[2]);
+		storage.print(System.out);
+
+
+		print("----------------Change item counts-------");
+		storage.changeCount(items[4], 40);
+		storage.changeCount(items[0], 25);
+		storage.changeCount(items[5], 99);
+		storage.print(System.out);
+		
+		reserve(items[0], 24);
+		reserve(items[3], 100);
+		Storage.theInstance().print(System.out);
+		printStore();
+		print("--- Deliver 20 of "+items[0]);
+		res.deliver(items[0], 20); 
+		printStore();
+		
+		print("--- Record that we lost 5 screw driver by theft.");
+		items[0].take(5); // they were stolen!!
+		printStore();
+
+		//create a new stock order and try to order some items and deliver these
+		StockOrder o1 = new StockOrder(customers[0]);
+		o1.order(items[4], 100);
+		o1.order(items[5], 2);
+		o1.print();
+		o1.deliver();
+		o1.print();
+
+		//create a new stock order and try to order an item
+		StockOrder o2 = new StockOrder(customers[1]);
+		o2.order(items[4], 200);
+		o2.print();
+
+		items[4].put(400);
+		
+		//discounting
+		StockOrder o3 = new StockOrder(customers[2], addresses[3]);
+		o3.setDiscount(items[4], 0.10);
+		o3.order(items[4], 200);
+		o3.order(items[5], 2);
+		o3.print();
+		items[4].take(200);		
+	}
+
+	public static void fillStorage() {
+		Storage storage = Storage.theInstance();
+		storage .add(items[0]);
+		storage .add(items[1]);
+		items[1].put(20);
+		storage .add(items[2]);
+		storage .add(items[3]);
+		items[3].put(1);
+		storage .add(items[4]);
+		items[4].put(200);
+		storage .add(items[5]);
+	}
+
+	public static void print(String str) {
+		System.out.println(str);
+	}
+	
+	static void reserve(StockItem item, int count) {
+		int actual = res.reserve(item, count);
+		print("--- Reserved "+actual+"("+count+") of "+item);
+	}
+	
+	/**
+	 * Printing of inventory list
+	 */
+	static void printStore() {
+		for (int i=0;i<items.length; i++)
+			print("available: "+res.numAvail(items[i])+"\t of "+items[i]);	
+	}
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/data/Address.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/data/Address.java
new file mode 100644
index 0000000..5ee6471
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/data/Address.java
@@ -0,0 +1,94 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Address.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.data;
+
+/**
+ * @author Dehla
+ *
+ */
+public class Address {
+
+	@SuppressWarnings("unused") private int id;
+
+	private String street;
+	private String postalcode;
+	private String city;
+	private String country;
+	
+	public Address(String street, String postalcode, String city, String country) {
+		this.street = street;
+		this.postalcode = postalcode;
+		this.city = city;
+		this.country = country;
+	}
+
+	Address() {}
+	
+	
+	/**
+	 * @return Returns the city.
+	 */
+	public String getCity() {
+		return city;
+	}
+	/**
+	 * @param city The city to set.
+	 */
+	public void setCity(String city) {
+		this.city = city;
+	}
+	/**
+	 * @return Returns the country.
+	 */
+	public String getCountry() {
+		return country;
+	}
+	/**
+	 * @param country The country to set.
+	 */
+	public void setCountry(String country) {
+		this.country = country;
+	}
+	/**
+	 * @return Returns the postalcode.
+	 */
+	public String getPostalcode() {
+		return postalcode;
+	}
+	/**
+	 * @param postalcode The postalcode to set.
+	 */
+	public void setPostalcode(String postalcode) {
+		this.postalcode = postalcode;
+	}
+	/**
+	 * @return Returns the street.
+	 */
+	public String getStreet() {
+		return street;
+	}
+	/**
+	 * @param street The street to set.
+	 */
+	public void setStreet(String street) {
+		this.street = street;
+	}
+	
+	public String toString() {
+		return street + ", " + postalcode + " " + city + ", " + country; 
+	}
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/data/Customer.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/data/Customer.java
new file mode 100644
index 0000000..2f3c0a7
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/data/Customer.java
@@ -0,0 +1,85 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Customer.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.data;
+
+/**
+ * @author Dehla
+ *
+ */
+public class Customer {
+	
+	@SuppressWarnings("unused") private int id;
+
+	private String lastname;
+	private String firstname;
+	private Address address;
+	
+	public Customer(String lastname, String firstname, Address address) {
+		this.lastname = lastname;
+		this.firstname = firstname;
+		this.address = address;
+	}
+	
+	Customer() { }
+
+
+	/**
+	 * @return Returns the address.
+	 */
+	public Address getAddress() {
+		return address;
+	}
+	
+	/**
+	 * @param address The address to set.
+	 */
+	public void setAddress(Address address) {
+		this.address = address;
+	}
+	
+	/**
+	 * @return Returns the firstname.
+	 */
+	public String getFirstname() {
+		return firstname;
+	}
+	
+	/**
+	 * @param firstname The firstname to set.
+	 */
+	public void setFirstname(String firstname) {
+		this.firstname = firstname;
+	}
+	
+	/**
+	 * @return Returns the lastname.
+	 */
+	public String getLastname() {
+		return lastname;
+	}
+	
+	/**
+	 * @param lastname The lastname to set.
+	 */
+	public void setLastname(String lastname) {
+		this.lastname = lastname;
+	}
+	
+	public String toString() {
+		return firstname + " " + lastname + "\n" + "private address: " + address.toString();
+	}
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/AbstractTableModelTemplate.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/AbstractTableModelTemplate.java
new file mode 100644
index 0000000..36e0279
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/AbstractTableModelTemplate.java
@@ -0,0 +1,68 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: AbstractTableModelTemplate.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.gui;
+
+import java.util.Vector;
+
+import javax.swing.table.AbstractTableModel;
+
+
+@SuppressWarnings("serial")
+public abstract class AbstractTableModelTemplate<T> extends AbstractTableModel {
+    
+    protected abstract String[] getColumnNames();
+
+    public abstract Vector<T> getElements();
+    
+    public abstract Object getValueAt(int aRowIndex, int aColumnIndex);
+    
+    /**
+     * @param aRowIndex an index
+     * @return the element (row) at given index
+     */
+    public Object getElementAt(int aRowIndex) {
+        if (aRowIndex >= 0) {
+            return getElements().elementAt(aRowIndex);
+        }
+        else {
+            return null;
+        }
+    }
+    
+    /**
+     * @see javax.swing.table.TableModel#getRowCount()
+     */
+    public int getRowCount() {
+        return getElements().size();
+    }
+
+    /**
+     * @see javax.swing.table.TableModel#getColumnCount()
+     */
+    public int getColumnCount() {
+        return getColumnNames().length;
+    }
+
+    /**
+     * @see javax.swing.table.AbstractTableModel#getColumnName(int)
+     */
+    public String getColumnName(int aColumn) {
+        return getColumnNames()[aColumn];
+    }
+
+
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/ButtonListLayout.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/ButtonListLayout.java
new file mode 100644
index 0000000..3fc5492
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/ButtonListLayout.java
@@ -0,0 +1,390 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: ButtonListLayout.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.gui;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.Insets;
+import java.awt.LayoutManager;
+import java.awt.LayoutManager2;
+import java.util.ArrayList;
+
+/**
+ * 
+ * @author Dehla Sokenou
+ *
+ * Class for laying out are typical constellation: a button panel and a list (or a similar
+ * e.g. table) panel.
+ * <p>
+ * 
+ * Buttons can be placed on top or below (vertical orientation) or on the left or right side
+ * (horizontal orientation) of the list.
+ * Standard orientation is horizontal.
+ * Standard placement of buttons is -depending on orientation- below or on the right side
+ * of the list panel (buttons after list).
+ * 
+ */
+public class ButtonListLayout implements LayoutManager2 {
+        
+    /**
+     * Enum for the orientation. 
+     * Possibly values are
+     * <ul>
+     * <li> HORIZONTAL: button panel ist displayed at the left or the right side of list panel.
+     * <li> VERTICAL: button panel is dispayed on top or below list panel.
+     * </ul>
+     * 
+     * Orientation and placement cannot be changed during lifecycle of this class' objects.
+     */
+    public enum Orientation {
+        VERTICAL, HORIZONTAL;
+    }
+    
+    public enum Placement {
+        BUTTONS_AFTER_LIST, BUTTONS_BEFORE_LIST;
+    }
+    
+    public enum ComponentType {
+        BUTTON_PANEL, LIST_OR_TABLE_PANEL;
+    }
+    
+    /**
+     * Orientation of the actual layout manager. Default is horizontal.
+     */
+    protected final Orientation orientation;
+    
+    /**
+     * Placement of the actual layout manager. Default is the placement of buttons after list.
+     */
+    protected final Placement placement;
+    
+    /**
+     * Reference to button panel that is managed by this layout manager.
+     */
+    protected ArrayList<Component> buttons = new ArrayList<Component>();
+    
+    /**
+     * Reference to list panel that is managed by this layout manager.
+     */
+    protected Component listOrTablePanel = null;
+    
+    /**
+     * The spacing between buttons. Default is 5.
+     */
+    protected int buttonSpacing = 5;
+    
+    /**
+     * The spacing between panels and panel to frame. Default is .
+     */
+    protected int panelSpacing = 0;
+    
+    /**
+     * Size of button panel depending from button panel's orientation. 
+     * If orientation is horizontal, size means width. 
+     * If orientation is vertical, size means height.
+     * Default is preferred size of included buttons (null).
+     */
+    protected Dimension fixedButtonSize = null;
+
+    
+    public ButtonListLayout() {
+        this(null, null);
+    }
+    
+    public ButtonListLayout(Orientation anOrientation) {
+        this(anOrientation, null);       
+    }
+    
+    public ButtonListLayout(Placement aPlacement) {
+        this(null, aPlacement);
+    }
+
+    public ButtonListLayout(Orientation anOrientation, Placement aPlacement) {
+        orientation = anOrientation != null ? anOrientation : Orientation.HORIZONTAL;
+        placement = aPlacement != null ? aPlacement : Placement.BUTTONS_AFTER_LIST;
+    }
+    
+    /**
+     * @param aPanelSpacing the panelSpacing to set
+     */
+    public void setPanelSpacing(int aPanelSpacing) {
+        panelSpacing = aPanelSpacing;
+    }
+
+    /**
+     * @param aButtonSpacing the buttonSpacing to set
+     */
+    public void setButtonSpacing(int aButtonSpacing) {
+        if (aButtonSpacing >= 0) {
+            buttonSpacing = aButtonSpacing;
+        }
+    }
+    
+    /**
+     * @param aFixedButtonPanelSize the fixedButtonPanelSize to set
+     */
+    public void setFixedButtonSize(Dimension aFixedButtonPanelSize) {
+        fixedButtonSize = aFixedButtonPanelSize;
+    }
+    
+    /**
+     * @see LayoutManager2#addLayoutComponent(Component, Object)
+     */
+    public void addLayoutComponent(Component aComponent, Object aConstraints) {
+        if (aConstraints instanceof ComponentType) {
+            switch ((ComponentType) aConstraints) {
+                case BUTTON_PANEL: 
+                    buttons.add(aComponent); break;
+                case LIST_OR_TABLE_PANEL:
+                    listOrTablePanel = aComponent; break;
+                default:
+                    throw new IllegalArgumentException("Unsupported layout constraint: " + aConstraints.toString());
+            }
+        }
+        else {
+            throw new IllegalArgumentException("Unsupported layout constraint: " + aConstraints.toString());
+        }
+    }
+
+    /**
+     * @see LayoutManager2#maximumLayoutSize(Container)
+     */
+    public Dimension maximumLayoutSize(Container aTarget) {
+        return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
+    }
+
+    /**
+     * @see LayoutManager2#getLayoutAlignmentX(Container)
+     */
+    public float getLayoutAlignmentX(Container aTarget) {
+        // do nothing
+        return 0;
+    }
+
+    /**
+     * @see LayoutManager2#getLayoutAlignmentY(Container)
+     */
+    public float getLayoutAlignmentY(Container aTarget) {
+        // do nothing
+        return 0;
+    }
+
+    /**
+     * @see LayoutManager2#invalidateLayout(Container)
+     */
+    public void invalidateLayout(Container aTarget) {
+        // do nothing
+    }
+
+    /**
+     * @see LayoutManager#addLayoutComponent(String, Component)
+     */
+    public void addLayoutComponent(String aName, Component aComponent) {
+        throw new UnsupportedOperationException("Sdding layout components based on String constraints is not supported." +
+                                                "Use add(Component, Object) instead.");
+    }
+
+    /**
+     * @see LayoutManager#removeLayoutComponent(Component)
+     */
+    public void removeLayoutComponent(Component aComponent) {
+        if (listOrTablePanel == aComponent) {
+            listOrTablePanel = null;
+        }
+        else if (buttons.contains(aComponent)) {
+            buttons.remove(aComponent);
+        }
+        // else do nothing
+    }
+
+    /**
+     * @see LayoutManager#preferredLayoutSize(Container)
+     */
+    public Dimension preferredLayoutSize(Container aParent) {
+        return getLayoutSize(aParent, false);
+    }
+
+    /**
+     * @see LayoutManager#minimumLayoutSize(Container)
+     */
+    public Dimension minimumLayoutSize(Container aParent) {
+        return getLayoutSize(aParent, true);
+    }
+
+    /**
+     * @see LayoutManager#layoutContainer(Container)
+     */
+    public void layoutContainer(Container aParent) {
+        // beachten: insets, orientation, fixedbuttonsize, placement
+        // Note: we don't care about to small panel... if it doesn't fit, only a part is visible    
+        
+        // firstly, calculate button panel size
+        Insets tempInsets = aParent.getInsets();
+        int tempMaxWidth = aParent.getWidth() - (tempInsets.left + tempInsets.right)
+                                              - 2 * panelSpacing;
+        int tempMaxHeight = aParent.getHeight() - (tempInsets.top + tempInsets.bottom)
+                                              - 2 * panelSpacing;
+        
+        Dimension tempPreferredButtonPanelSize = getButtonPanelLayoutSize(false);
+        double tempPreferredButtonPanelWidth = tempPreferredButtonPanelSize.getWidth();
+        double tempPreferredButtonPanelHeight = tempPreferredButtonPanelSize.getHeight();
+
+        // secondly, give remaining space to list
+        int tempListPanelX = tempInsets.left + panelSpacing;
+        if (orientation == Orientation.VERTICAL && placement == Placement.BUTTONS_BEFORE_LIST) {
+            tempListPanelX += panelSpacing + tempPreferredButtonPanelWidth;
+        }
+        int tempListPanelY = tempInsets.top + panelSpacing;
+        if (orientation == Orientation.HORIZONTAL && placement == Placement.BUTTONS_BEFORE_LIST) {
+            tempListPanelY += panelSpacing + tempPreferredButtonPanelHeight;
+        }
+        int tempListPanelWidth = tempMaxWidth;
+        if (orientation == Orientation.VERTICAL) {
+            tempListPanelWidth -= (int) tempPreferredButtonPanelWidth + panelSpacing;
+        }
+        int tempListPanelHeight = tempMaxHeight;
+        if (orientation == Orientation.HORIZONTAL) {
+            tempListPanelHeight -= (int) tempPreferredButtonPanelHeight + panelSpacing;
+        }
+        // check, if panel is unvisible
+        if (tempListPanelWidth < 0) {
+            tempListPanelWidth = 0;
+        }
+        if (tempListPanelHeight < 0) {
+            tempListPanelHeight = 0;
+        }
+        listOrTablePanel.setBounds(tempListPanelX, tempListPanelY, tempListPanelWidth, tempListPanelHeight);
+
+        // thirdly, layout buttons in button panel based on preferred size
+        int tempButtonX = tempInsets.left + panelSpacing;
+        if (orientation == Orientation.VERTICAL && placement == Placement.BUTTONS_AFTER_LIST) {
+            tempButtonX += panelSpacing + tempListPanelWidth;
+        }
+        int tempButtonY = tempInsets.top + panelSpacing; 
+        if (orientation == Orientation.HORIZONTAL && placement == Placement.BUTTONS_AFTER_LIST) {
+            tempButtonY += panelSpacing + tempListPanelHeight;
+        }
+        for (Component tempButton : buttons) {
+            Dimension tempButtonSize = fixedButtonSize != null ? fixedButtonSize : tempButton.getPreferredSize();
+            int tempButtonWidth = tempButtonSize.width; 
+            int tempButtonHeight = tempButtonSize.height;   
+            tempButton.setBounds(tempButtonX, tempButtonY, tempButtonWidth, tempButtonHeight);
+            // calculate next button position
+            switch (orientation) {
+                case VERTICAL: 
+                    tempButtonY += tempButtonHeight + buttonSpacing;
+                    break;
+                case HORIZONTAL: 
+                    tempButtonX += tempButtonWidth + buttonSpacing;
+                    break;
+            }
+        }
+        
+    }
+    
+    /**
+     * 
+     * @param aParent the container to manage
+     * @param minimum indicates whether minimum (true) or preferred (false) layout 
+     *        will be returned
+     * @return the preferred or (if minimum) minimum layout size
+     */
+    protected Dimension getLayoutSize(Container aParent, boolean minimum) {
+        Dimension tempButtonPanelDimension = getButtonPanelLayoutSize(minimum);
+        
+        Insets tempInsets = aParent.getInsets();
+        double tempLayoutWidth = 2 * panelSpacing + tempInsets.left + tempInsets.right;
+        double tempLayoutHeight = 2 * panelSpacing + tempInsets.top + tempInsets.bottom;
+        Dimension tempListDimension = minimum ? listOrTablePanel.getMinimumSize()
+                                              : listOrTablePanel.getPreferredSize();
+        switch (orientation) {
+            case HORIZONTAL:
+                tempLayoutWidth += tempListDimension.getWidth() + panelSpacing 
+                                                                + tempButtonPanelDimension.getWidth();
+                tempLayoutHeight += Math.max(tempListDimension.getHeight(), 
+                                             tempButtonPanelDimension.getHeight());
+                break;
+            case VERTICAL:
+                tempLayoutHeight += tempListDimension.getHeight() + panelSpacing 
+                                                                  + tempButtonPanelDimension.getHeight();
+                tempLayoutWidth += Math.max(tempListDimension.getWidth(), 
+                                            tempButtonPanelDimension.getWidth());
+                break;
+        }            
+                
+        Dimension tempLayoutDimension = new Dimension();
+        tempLayoutDimension.setSize(tempLayoutWidth, tempLayoutHeight);
+        return tempLayoutDimension;
+    }
+
+    /**
+     * Returns the layout size of button panel.
+     * 
+     * @param minimum indicates whether minimum (true) or preferred (false) layout 
+     *        will be returned
+     * @return the preferred or (if minimum) minimum layout size
+     */
+    protected Dimension getButtonPanelLayoutSize(boolean minimum) {
+        // calculate sum of space between buttons dependent from orientation
+        double tempButtonsLayoutWidth = ((orientation == Orientation.HORIZONTAL) ?
+                                          (buttons.size() - 1) * buttonSpacing :  
+                                           0);
+        double tempButtonsLayoutHeight = ((orientation == Orientation.VERTICAL) ?
+                                          (buttons.size() - 1) * buttonSpacing : 
+                                           0);
+        if (fixedButtonSize != null) {
+            // if fixed button size, use fixed size instead of preferred or minimum size
+            switch (orientation) {
+                case VERTICAL: 
+                    tempButtonsLayoutWidth += fixedButtonSize.getWidth();
+                    tempButtonsLayoutHeight += buttons.size() * fixedButtonSize.getHeight();
+                    break;
+                case HORIZONTAL:     
+                    tempButtonsLayoutWidth += buttons.size() * fixedButtonSize.getWidth();
+                    tempButtonsLayoutHeight += fixedButtonSize.getHeight();
+                    break;
+            }
+        }
+        else {
+            // if not fixed size, use each buttons preferred resp. minimum size
+            for (Component tempComponent : buttons) {
+                Dimension tempButtonDimension = minimum ? tempComponent.getMinimumSize() 
+                                                        : tempComponent.getPreferredSize();
+                switch (orientation) {
+                    case VERTICAL:
+                        if (tempButtonsLayoutWidth < tempButtonDimension.getWidth()) {
+                            tempButtonsLayoutWidth = tempButtonDimension.getWidth();
+                        }
+                        tempButtonsLayoutHeight += tempButtonDimension.getHeight();
+                        break;
+                    case HORIZONTAL:
+                        tempButtonsLayoutWidth += tempButtonDimension.getWidth();
+                        if (tempButtonsLayoutHeight < tempButtonDimension.getHeight()) {
+                            tempButtonsLayoutHeight = tempButtonDimension.getHeight();
+                        }
+                        break;
+                }
+            }
+        }
+        
+        Dimension tempButtonPanelDimension = new Dimension();
+        tempButtonPanelDimension.setSize(tempButtonsLayoutWidth, tempButtonsLayoutHeight);
+        return tempButtonPanelDimension;
+    }
+
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/ControllerAdapterTeam.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/ControllerAdapterTeam.java
new file mode 100644
index 0000000..c3b9084
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/ControllerAdapterTeam.java
@@ -0,0 +1,259 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: ControllerAdapterTeam.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.gui;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Vector;
+
+import javax.swing.JButton;
+import javax.swing.JTable;
+
+import org.objectteams.Team;
+import org.objectteams.samples.ordersystem.data.Customer;
+import org.objectteams.samples.ordersystem.order.StockOrder;
+import org.objectteams.samples.ordersystem.store.StockItem;
+import org.objectteams.samples.ordersystem.store.Storage;
+
+/**
+ * @author Dehla Sokenou
+ *
+ * Team implementing controller of order system.
+ * 
+ */
+public team class ControllerAdapterTeam {
+    
+        
+    public ControllerAdapterTeam() {
+        this.activate(Team.ALL_THREADS);
+    }
+    
+    /**
+     * Role that implements a controller logic for each button.
+     */
+    public class ButtonController implements ILowerable playedBy OrderSystemMainFrame {
+                
+    	// by this hook all elementary controllers are registered at startup:
+        void setButtonControllers() <- after void setVisible(boolean aVisibility);
+        
+        // store buttons (callout to field):
+        @SuppressWarnings("decapsulation")
+		JButton getAddItemButton()        -> get JButton addItemButton; 
+        JButton getRemoveItemButton()     -> get JButton removeItemButton;
+        JButton getIncreaseStockButton()  -> get JButton increaseStockButton;
+        JButton getDecreaseStockButton()  -> get JButton decreaseStockButton;
+        
+        // customer management buttons
+        JButton getAddCustomerButton()    -> get JButton addCustomerButton;
+        JButton getRemoveCustomerButton() -> get JButton removeCustomerButton;
+        
+        // reservation management buttons
+        // none
+        
+        // order management buttons
+        JButton getNewOrderButton()       -> get JButton newOrderButton;
+        JButton getRemoveOrderButton()    -> get JButton removeOrderButton;
+        JButton getChangeOrderButton()    -> get JButton changeOrderButton;
+                
+        // tables
+        JTable getStoreTable()            -> get JTable storeTable;
+        JTable getCustomerTable()         -> get JTable customerTable;
+        JTable getReservationTable()      -> get JTable reservationTable;
+        JTable getOrderTable()            -> get JTable orderTable;
+
+        /**
+         * Assign controllers for all buttons
+         */
+        protected void setButtonControllers() {
+            final OrderSystemMainFrame tempOrderFrame = (OrderSystemMainFrame) this.lower();
+            
+            // store buttons
+            getAddItemButton().addActionListener(new ActionListener() {
+                public void actionPerformed(ActionEvent anEvent) {
+                    StockItem tempItem = InputDialog.showAddItemDialog(tempOrderFrame);
+                    if (tempItem != null) {
+                        Storage.theInstance().add(tempItem);
+                    }
+                    updateModel(Tab.STORE);
+                    updateModel(Tab.RESERVATION);
+                }                
+            });
+            
+            getRemoveItemButton().addActionListener(new ActionListener() {
+                public void actionPerformed(ActionEvent anEvent) {
+                    try {
+                       StockItem tempItem = (StockItem) getSelectedIndex(Tab.STORE);
+                       if (tempItem != null) {
+                           Storage.theInstance().delete(tempItem);
+                           updateModel(Tab.STORE);
+                           updateModel(Tab.RESERVATION);
+                           updateModel(Tab.ORDER);
+                       }
+                    }
+                    catch (Exception e) {
+                        // debug output
+                        e.printStackTrace();
+                    }
+                }                
+            });
+            
+            getIncreaseStockButton().addActionListener(
+                            getChangeItemCountActionListener(tempOrderFrame, true));
+            
+            getDecreaseStockButton().addActionListener(
+                            getChangeItemCountActionListener(tempOrderFrame, false));
+
+            // reservation management buttons
+            // none
+            
+            // customer management buttons
+            getAddCustomerButton().addActionListener(new ActionListener() {
+                public void actionPerformed(ActionEvent anEvent) {
+                    try {
+                        Customer tempCustomer = InputDialog.showAddCustomerDialog(tempOrderFrame);
+                        if (tempCustomer != null) {
+                            //  TODO: better use callin from constructor in ModelAdapterTeam as soon as it is available
+                            ModelAdapterTeam.getModelAdapterTeam().getCustomerAdapter().addElement(tempCustomer);
+                            updateModel(Tab.CUSTOMER);
+                        }
+                    }
+                    catch (Exception e) {
+                        // debug output
+                        e.printStackTrace();
+                    }
+                }
+            });
+            
+            getRemoveCustomerButton().addActionListener(new ActionListener() {
+                public void actionPerformed(ActionEvent anEvent) {
+                    try {
+                        Customer tempCustomer = (Customer) getSelectedIndex(Tab.CUSTOMER);
+                        ModelAdapterTeam.getModelAdapterTeam().getCustomerAdapter().removeElement(tempCustomer);
+                        updateModel(Tab.CUSTOMER);
+                    }
+                     catch (Exception e) {
+                         // debug output
+                         e.printStackTrace();
+                     }
+                }
+            });
+            
+            // order management buttons
+            getNewOrderButton().addActionListener(new ActionListener() {
+                public void actionPerformed(ActionEvent anEvent) {
+                    Vector<Customer> tempCustomerElements = 
+                            ModelAdapterTeam.getModelAdapterTeam().getCustomerAdapter().getElements();
+                    Customer[] tempCustomers = new Customer[tempCustomerElements.size()];
+                    for (int i = 0; i < tempCustomers.length; i++) {
+                        tempCustomers[i] = tempCustomerElements.elementAt(i);
+                    }
+                    Vector<StockItem> tempItemElements = 
+                            ModelAdapterTeam.getModelAdapterTeam().getStorageAdapter().getElements();
+                    StockItem[] tempItems = new StockItem[tempItemElements.size()];
+                    for (int i = 0; i < tempItems.length; i++) {
+                        tempItems[i] = (StockItem) tempItemElements.elementAt(i);                        
+                    }
+                    StockOrder tempOrder = InputDialog.showAddOrderDialog(
+                                                tempOrderFrame, tempCustomers, tempItems);
+                    if (tempOrder != null) {
+                        //  TODO: better use callin from constructor in ModelAdapterTeam as soon as it is available
+                        ModelAdapterTeam.getModelAdapterTeam().getOrderAdapter().addElement(tempOrder);
+                        updateModel(Tab.ORDER);
+                    }
+                }
+            });
+            
+            getRemoveOrderButton().addActionListener(new ActionListener() {
+                public void actionPerformed(ActionEvent anEvent) {
+                    // TODO:
+                }
+            });
+            
+            getChangeOrderButton().addActionListener(new ActionListener() {
+                public void actionPerformed(ActionEvent anEvent) {
+                    // TODO:
+                }
+            });
+                        
+        }
+
+        /**
+         * Updates model after changes.
+         */
+        protected void updateModel(Tab aTab) {
+            ModelAdapterTeam.getModelAdapterTeam().update(aTab);
+        }
+        
+        /**
+         * 
+         */
+        protected Object getSelectedIndex(Tab aTab) {
+            JTable tempTable;
+            switch (aTab) {
+                case STORE      : tempTable = getStoreTable(); break;
+                case CUSTOMER   : tempTable = getCustomerTable(); break;
+                case RESERVATION: tempTable = getReservationTable(); break;
+                case ORDER      : tempTable = getOrderTable(); break; 
+                default: 
+                    throw new IllegalArgumentException("Method not defined for argument " + aTab);
+            }
+            int tempSelectedIndex = tempTable.getSelectedRow();
+            if (tempSelectedIndex >= 0) {
+                //FIXME: remove if-statement later, workaround
+                if (aTab == Tab.STORE) {
+                    final ModelAdapterTeam tempModelAdapterTeam = ModelAdapterTeam.getModelAdapterTeam();
+                    return ((StorageAdapter<@tempModelAdapterTeam>) tempTable.getModel()).getElementAt(tempSelectedIndex);
+                }
+                AbstractTableModelTemplate<?> tempModel = (AbstractTableModelTemplate<?>) tempTable.getModel();
+                return tempModel.getElementAt(tempSelectedIndex);
+            }
+            else {
+                return null;
+            }
+        }
+
+        /**
+         * @param tempOrderFrame the main frame
+         * @param anInc indicates whether the count is increased (decreased otherwise)
+         * @return
+         */
+        private ActionListener getChangeItemCountActionListener(
+                    final OrderSystemMainFrame tempOrderFrame, final boolean anInc) {
+            return new ActionListener() {
+                public void actionPerformed(ActionEvent anEvent) {
+                    try {
+                        StockItem tempItem = (StockItem) getSelectedIndex(Tab.STORE);
+                        Integer tempCount = InputDialog.showChangeStockDialog(tempOrderFrame, anInc);
+                        if (tempItem != null && tempCount != null && tempCount.intValue() > 0) {
+                            if (! anInc) {
+                                tempCount = -tempCount;
+                            }
+                            Storage.theInstance().changeCount(tempItem, tempCount);
+                            updateModel(Tab.STORE);
+                            updateModel(Tab.RESERVATION);
+                            updateModel(Tab.ORDER);
+                        }
+                    }
+                    catch (Exception e) {
+                        // debug output
+                        e.printStackTrace();
+                    }
+                }                
+            };
+        }
+    }
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/GUIAdapterTeam.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/GUIAdapterTeam.java
new file mode 100644
index 0000000..50098d7
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/GUIAdapterTeam.java
@@ -0,0 +1,77 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: GUIAdapterTeam.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.gui;
+
+import java.awt.Container;
+import java.awt.Dimension;
+
+import org.objectteams.Team;
+
+
+/**
+ * This aspect ensures that each window will appear in the middle
+ * of the screen.
+ * 
+ * @author Dehla Sokenou
+ */
+public team class GUIAdapterTeam  {
+    
+    public GUIAdapterTeam() { 
+        activate(Team.ALL_THREADS);
+    }
+
+    // note: we need to individually adapt two GUI-classes 
+    // as long as class java.awt.Window cannot be adapted 
+    // (restriction to be removed in the future).
+    
+    public class MainFrameAdapter playedBy OrderSystemMainFrame {
+
+        // callouts
+        public abstract Container getParent();
+        getParent -> getParent;
+        
+        public abstract void setCentered(Container parent);
+        setCentered -> setLocationRelativeTo;
+        
+        // callins
+        protected void centerRelativeToParent() {
+            setCentered(getParent());
+        }
+        centercallin:
+        void centerRelativeToParent() <- after void setSize(Dimension aDimension), 
+                                               void setSize(int aWidth, int aHeight);
+        
+    }
+    
+    public class DialogAdapter playedBy InputDialog {
+        
+        // callouts
+        public abstract Container getParent();
+        getParent -> getParent;
+        
+        public abstract void setCentered(Container parent);
+        setCentered -> setLocationRelativeTo;
+        
+        // callins
+        protected void centerRelativeToParent() {
+            setCentered(getParent());
+        }
+        centercallin:
+        void centerRelativeToParent() <- after void setSize(Dimension aDimension), 
+                                               void setSize(int aWidth, int aHeight);
+    }
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/GUITest.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/GUITest.java
new file mode 100644
index 0000000..fade166
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/GUITest.java
@@ -0,0 +1,33 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: GUITest.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.gui;
+
+
+public class GUITest {
+
+    public static void main(String[] args) {
+        GUITest tempGUITest = new GUITest();
+        tempGUITest.init();
+    }
+    
+    private void init() {
+        // hook for security application
+        // TODO: remove this when OT can adapt constructors
+        new OrderSystemMainFrame();
+    }
+    
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/InputDialog.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/InputDialog.java
new file mode 100644
index 0000000..0287391
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/InputDialog.java
@@ -0,0 +1,566 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: InputDialog.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.Box;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.DefaultListModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+
+import org.objectteams.samples.ordersystem.data.Address;
+import org.objectteams.samples.ordersystem.data.Customer;
+import org.objectteams.samples.ordersystem.order.StockOrder;
+import org.objectteams.samples.ordersystem.store.StockItem;
+
+
+
+@SuppressWarnings("serial")
+public class InputDialog extends JDialog {
+    
+    /**
+     * Options that can be selected by user: <br>
+     * OK - proceed <br>
+     * CANCEL - cancel actual dialog
+     */
+    protected static enum InputOption {
+        OK, CANCEL
+    }
+    
+    /**
+     * The textfields for user input.
+     */
+    protected JTextField[] inputFields;
+    
+    /**
+     * Option that the user selected (InputOption.OK or InputOption.CANCEL).
+     */
+    protected InputOption selectedOption = InputOption.CANCEL;
+    
+    
+    /**
+     * Creates a new input dialog. Constructor is protected because only static methods of this
+     * class should be used to create an input dialog.
+     * 
+     * @param aParent the dialog's parent
+     * @param aTitle the dialog's title
+     * @param aInputNames the names of input fields
+     */
+    protected InputDialog(JFrame aParent, String aTitle, String[] aInputNames) {
+        this(aParent, aTitle);
+        
+        int tempInputCount = aInputNames.length;        
+        JPanel tempInputPanel = new JPanel();
+        tempInputPanel.setLayout(new GridLayout(tempInputCount, 2));
+        inputFields = new JTextField[tempInputCount];        
+        for (int i = 0; i < aInputNames.length; i++) {
+            String tempInput = aInputNames[i];
+            tempInputPanel.add(new JLabel(tempInput + ": "));
+            inputFields[i] = new JTextField(100);
+            tempInputPanel.add(inputFields[i]);
+        }
+        add("Center", tempInputPanel);
+        
+        setSize();
+        setVisible(true);
+    }
+
+    /**
+     * Creates a new input dialog based on the given components.
+     * Components are simply layout using a vertical Box.
+     * 
+     * @param aParent the dialog's parent
+     * @param aTitle the dialog's title
+     * @param aDisplayedComponents
+     */
+    protected InputDialog(JFrame aParent, String aTitle, Component[] aDisplayedComponents) {
+        this(aParent, aTitle);
+        
+        Box tempInputPanel = Box.createVerticalBox();
+        for (Component tempComponent : aDisplayedComponents) {
+            tempInputPanel.add(tempComponent);
+        }
+        add("Center", tempInputPanel);
+        
+        setSize();
+        setVisible(true);
+    }
+    
+    /**
+     * Creates an empty unvisible input dialog (only buttons visible).
+     * 
+     * @param aParent the dialog's parent
+     * @param aTitle the dialog's title
+     */
+    protected InputDialog(JFrame aParent, String aTitle) {
+        super(aParent, aTitle, true);
+        setLayout(new BorderLayout());
+        
+        Box tempButtonPanel = Box.createHorizontalBox();
+        JButton tempOkayButton = new JButton("Okay");
+        tempOkayButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent anEvent) {
+                selectedOption = InputOption.OK;
+                setVisible(false);
+            }
+        });
+        tempButtonPanel.add(tempOkayButton);
+        tempButtonPanel.add(Box.createHorizontalGlue());
+        JButton tempCancelButton = new JButton("Cancel");
+        tempCancelButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent anEvent) {
+                selectedOption = InputOption.CANCEL;
+                setVisible(false);
+            }
+        });
+        tempButtonPanel.add(tempCancelButton);
+        add("South", tempButtonPanel);
+    }
+    
+    protected InputDialog(final JFrame aParent, 
+                final JComboBox aCustomerComboBox, final JComboBox anAddressComboBox,
+                final JList aSelectItemList, final JList anOrderItemList) {
+        this(aParent, "New Order");
+        addWindowListener(new WindowAdapter() {
+            public void windowOpened(WindowEvent aE) {
+                super.windowOpened(aE);
+                setSize();
+                repaint();
+            }
+        });
+        
+        // create customer combobox
+        JPanel tempCustomerPanel = new JPanel();
+        tempCustomerPanel.setLayout(new GridLayout(3,2));
+        tempCustomerPanel.add(new JLabel("Select Customer: "));
+        aCustomerComboBox.setRenderer(new CustomerRenderer());
+        tempCustomerPanel.add(aCustomerComboBox);
+        // TODO: order address
+        tempCustomerPanel.add(new JLabel("Order Address: "));
+        anAddressComboBox.addItem("NONE");
+        anAddressComboBox.addItem("New Order Address");
+        anAddressComboBox.setRenderer(new AddressRenderer());
+        anAddressComboBox.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent aE) {
+                if (anAddressComboBox.getSelectedItem().equals("New Order Address")) {
+                    Address tempAddress = showAddAddressDialog(aParent);
+                    if (tempAddress != null) {
+                        anAddressComboBox.removeAllItems();
+                        anAddressComboBox.addItem(tempAddress);
+                        anAddressComboBox.addItem("NONE");
+                        anAddressComboBox.addItem("New Order Address");
+                    }
+                    anAddressComboBox.setSelectedIndex(0);
+                }
+            }
+        });
+        tempCustomerPanel.add(anAddressComboBox);
+        // fill with empty components
+        tempCustomerPanel.add(new JPanel());
+        tempCustomerPanel.add(new JPanel());
+        add("North", tempCustomerPanel);
+
+        // create item lists
+        anOrderItemList.setCellRenderer(new OrderItemCellRenderer());
+        anOrderItemList.setModel(new DefaultListModel());
+        
+        aSelectItemList.setCellRenderer(new ItemCellRenderer());
+        
+        JButton tempButton = new JButton("->");
+        tempButton.setBackground(new Color(238, 238, 238));
+        tempButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent anEvent) {
+                try {
+                    StockItem tempSelectedItem = (StockItem) aSelectItemList.getSelectedValue();
+                    Integer tempAmount = InputDialog.showChangeAmountDialog(aParent, "Item Amount in Order");
+                    if (tempSelectedItem != null && tempAmount != null) {
+                        DefaultListModel tempModel = (DefaultListModel) anOrderItemList.getModel();
+                        OrderItem tempOrderItem = new OrderItem(tempSelectedItem, tempAmount);                        
+                        if (! tempModel.contains(tempOrderItem)) {
+                            tempModel.addElement(tempOrderItem);
+                        }
+                    }
+                }
+                catch (Exception ex) {
+                    // error message output
+                    ex.printStackTrace();
+                }
+            }
+        });
+
+        JPanel tempListPanel = new JPanel();
+        tempListPanel.setLayout(new GridLayout(1,3));
+        JScrollPane tempSelectItemScrollPane = new JScrollPane(aSelectItemList);
+        JScrollPane tempOrderItemScrollPane = new JScrollPane(anOrderItemList);
+        tempListPanel.add(tempSelectItemScrollPane);
+        tempListPanel.add(tempButton);
+        tempListPanel.add(tempOrderItemScrollPane);
+        
+        add("Center", tempListPanel);
+        
+        setSize();
+        setVisible(true);
+    }
+    
+    
+    /**
+     * Shows dialog that requests stock item data.
+     * 
+     * @param aParent the dialogs parents or null, if no parent should be set.
+     * @return the stock item that is created from user data or null if any error occured or the 
+     * user has canceled dialog
+     */
+    public static StockItem showAddItemDialog(JFrame aParent) {
+        String[] data = createInputDialog(aParent, "New StockItem", new String[] {"Name", "Price (in Cent)"});
+        try{
+            if (data != null) {
+                return new StockItem(data[0], Integer.valueOf(data[1]));
+            }
+            else {
+                return null;
+            }
+        }
+        catch (NumberFormatException e) { 
+            // can't convert to integer, don't create item (not a user-friendly way ;-)
+            return null;
+        }
+    }
+    
+    /**
+     * Shows dialog that requests stock item data.
+     * 
+     * @param aParent the dialog's parents or null, if no parent should be set.
+     * @return the stock item that is created from user data or null if any error occured or the 
+     * user has canceled dialog
+     */
+    public static Customer showAddCustomerDialog(JFrame aParent) {
+        String[] data = createInputDialog(aParent, "New Customer", 
+                new String[] {"First Name", "Last Name", "Street", "Postal Code", "City", "Country"});
+        if (data != null) {
+            Address tempAddress = new Address(data[2], data[3], data[4], data[5]);
+            return new Customer(data[0], data[1], tempAddress);
+        }
+        else {
+            return null;
+        }
+    }
+    
+    /**
+     * Shows dialog that requests stock item data.
+     * 
+     * @param aParent the dialog's parents or null, if no parent should be set.
+     * @return the stock item that is created from user data or null if any error occured or the 
+     * user has canceled dialog
+     */
+    public static Address showAddAddressDialog(JFrame aParent) {
+        String[] data = createInputDialog(aParent, "New Address", 
+                new String[] {"Street", "Postal Code", "City", "Country"});
+        if (data != null) {
+            return new Address(data[0], data[1], data[2], data[3]);
+        }
+        else {
+            return null;
+        }
+    }
+    
+    /**
+     * Shows dialog that requests item change count.
+     * 
+     * @param aParent the dialog's parents or null, if no parent should be set.
+     * @param increase indicates if stock item count will be increased, if false decreasing is selected 
+     * @return the amount to increase resp. decrease stock, null if none
+     */
+    public static Integer showChangeStockDialog(JFrame aParent, boolean increase) {
+        String tempTitle = increase ? "Increase Item Count" : "Decrease Item Count";
+        return showChangeAmountDialog(aParent, tempTitle);
+    }
+
+    /**
+     * Shows dialog that requests an amount.
+     * 
+     * @param aParent the dialog's parent (null, if none)
+     * @param aTitle the dialog's title
+     * @return the user's input amount, null if none
+     */
+    public static Integer showChangeAmountDialog(JFrame aParent, String aTitle) {
+        String[] data = createInputDialog(aParent, aTitle, new String[] {"Enter Amount"});
+        if (data != null && ! data[0].equals("")) {
+            return Integer.valueOf(data[0]);
+        }
+        else {
+            return null;
+        }
+    }
+    
+    /**
+     * Creates an input dialog that requests user data based on the given input names.
+     * For each name, a field is provided that delivers a string. 
+     * These strings are collected by a data array.
+     * 
+     * @param aParent the dialog's parent (null, if none)
+     * @param aTitle the dialog's title
+     * @param aInputNames the names of input
+     * @return the data array referencing the user input as string; note, values can be null or empty strings
+     */
+    public static String[] createInputDialog(JFrame aParent, String aTitle, String[] aInputNames) {
+        InputDialog tempDialog = new InputDialog(aParent, aTitle, aInputNames);
+        if (tempDialog.selectedOption == InputOption.OK) {
+            String[] tempInput = new String[aInputNames.length];
+            for (int i = 0; i < tempInput.length; i++) {
+                tempInput[i] = tempDialog.inputFields[i].getText();
+            }
+            for (String tempString : tempInput) {
+                if (tempString.equals("")) {
+                    return null;
+                }
+            }
+            return tempInput;
+        }
+        else {
+            return null;            
+        }
+    }
+    
+    /**
+     * Shows dialog that requests input for creating a new order.
+     * 
+     * @return an order
+     */
+    public static StockOrder showAddOrderDialog(final JFrame aParent, Customer[] aCustomers, StockItem[] aItems) {
+        
+        JComboBox tempCustomerComboBox = new JComboBox(aCustomers);
+        JComboBox tempAddressComboBox = new JComboBox();
+        JList tempSelectItemList = new JList(aItems);
+        JList tempOrderItemList = new JList();
+        
+        InputDialog tempDialog = new InputDialog(aParent, tempCustomerComboBox, tempAddressComboBox, 
+                                                 tempSelectItemList, tempOrderItemList);
+        
+        // collect input and return new Order
+        if (tempDialog.selectedOption == InputOption.OK) {
+            // get Customer and order address and create new order
+            Customer tempChoosenCustomer = (Customer) tempCustomerComboBox.getSelectedObjects()[0];
+            if (tempChoosenCustomer != null) { 
+                // TODO: distinguish between orders with and without order address 
+                StockOrder tempOrder;
+                Object tempAddressElement = tempAddressComboBox.getItemAt(0);
+                if (tempAddressElement instanceof Address) {
+                    if (tempAddressComboBox.getSelectedIndex() > 0) {
+                        tempOrder = new StockOrder(tempChoosenCustomer, (Address) tempAddressElement, true);
+//                        tempOrder = new StockOrder(tempChoosenCustomer, (Address) tempAddressElement);
+                    }
+                    else {
+                        tempOrder = new StockOrder(tempChoosenCustomer, (Address) tempAddressElement);
+                    }
+                }
+                else {
+                    tempOrder = new StockOrder(tempChoosenCustomer);
+                }
+                // get order items and add them to order
+                DefaultListModel tempModel = (DefaultListModel) tempOrderItemList.getModel();
+                for (int i = 0; i < tempModel.size(); i++) {
+                    OrderItem tempItem = (OrderItem) tempModel.getElementAt(i);
+                    tempOrder.order(tempItem.getItem(), tempItem.getAmount());
+                }
+                return tempOrder;
+            }
+            else {
+                return null;
+            }
+        }
+        else {
+            return null;
+        }
+    }
+    
+    
+    /**
+     * Sets size of dialog to (nearly) preferred size.
+     */
+    private void setSize() {
+        setSize(400, getPreferredSize().height+50);
+    }
+    
+    
+    /**
+     * 
+     * Class implementing a cell renderer for customers
+     */
+    private static class CustomerRenderer extends DefaultListCellRenderer {
+
+        /**
+         * @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
+         */
+        public Component getListCellRendererComponent(JList aList, Object aValue, int anIndex, boolean aIsSelected, boolean aCellHasFocus) {
+            JLabel tempLabel = (JLabel) super.getListCellRendererComponent(aList, aValue, anIndex, aIsSelected, aCellHasFocus);
+            if (aValue instanceof Customer) {
+                Customer aCustomer = (Customer) aValue;
+                tempLabel.setText(aCustomer.getFirstname() + " " + aCustomer.getLastname());
+            }
+            else {
+                tempLabel.setText("");
+            }
+            return tempLabel;
+        }
+        
+    }
+    
+    
+    /**
+     * 
+     * Class implementing a cell renderer for addresses
+     */
+    private static class AddressRenderer extends DefaultListCellRenderer {
+        
+        /**
+         * @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
+         */
+        public Component getListCellRendererComponent(JList aList, Object aValue, int anIndex, boolean aIsSelected, boolean aCellHasFocus) {
+            JLabel tempLabel = (JLabel) super.getListCellRendererComponent(aList, aValue, anIndex, aIsSelected, aCellHasFocus);
+            if (aValue instanceof Address || aValue instanceof String) {
+                tempLabel.setText(aValue.toString());
+            }
+            else {
+                tempLabel.setText("");
+            }
+            return tempLabel;
+        }
+        
+    }
+       
+    
+    /**
+     * 
+     * Class implementing a cell renderer for items
+     */
+    private static class ItemCellRenderer extends DefaultListCellRenderer {
+
+        /**
+         * @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
+         */
+        public Component getListCellRendererComponent(JList aList, Object aValue, int anIndex, boolean aIsSelected, boolean aCellHasFocus) {
+            JLabel tempLabel = (JLabel) super.getListCellRendererComponent(aList, aValue, anIndex, aIsSelected, aCellHasFocus);
+            if (aValue instanceof StockItem) {
+                StockItem anItem = (StockItem) aValue;
+                tempLabel.setText(anItem.getId() + " - " + anItem.getName());
+            }
+            else {
+                tempLabel.setText("");
+            }
+            return tempLabel;
+        }
+        
+    }
+    
+    /**
+     * 
+     * Class implementing a cell renderer for order items
+     */
+    private static class OrderItemCellRenderer extends DefaultListCellRenderer {
+
+        /**
+         * @see javax.swing.ListCellRenderer#getListCellRendererComponent(javax.swing.JList, java.lang.Object, int, boolean, boolean)
+         */
+        public Component getListCellRendererComponent(JList aList, Object aValue, int anIndex, boolean aIsSelected, boolean aCellHasFocus) {
+            JLabel tempLabel = (JLabel) super.getListCellRendererComponent(aList, aValue, anIndex, aIsSelected, aCellHasFocus);
+            if (aValue instanceof OrderItem) {
+                OrderItem anItem = (OrderItem) aValue;
+                tempLabel.setText(anItem.getId() + " - " + anItem.getName() + " (# " + anItem.getAmount() + ")");
+            }
+            else {
+                tempLabel.setText("");
+            }
+            return tempLabel;
+        }
+        
+    }
+    
+    /**
+     * 
+     * Class representing order items.
+     */
+    private static class OrderItem {
+        
+        private StockItem item;
+        private int amount;
+        
+        OrderItem(StockItem anItem, int anAmount) {
+            item = anItem;
+            amount = anAmount;            
+        }
+        
+        /**
+         * @return the amount
+         */
+        int getAmount() {
+            return amount;
+        }
+        
+        /**
+         * @return the item's id
+         */
+        Integer getId() {
+            return item.getId();
+        }
+        
+        /**
+         * @return the item's name
+         */
+        String getName() {
+            return item.getName();
+        }
+        
+        /**
+         * @return the item
+         */
+        StockItem getItem() {
+            return item;
+        }
+
+        /**
+         * @see java.lang.Object#equals(java.lang.Object)
+         */
+        public boolean equals(Object anotherObject) {
+            if (anotherObject instanceof OrderItem) {
+                OrderItem anotherItem = (OrderItem) anotherObject;
+                return item.equals(anotherItem.item);
+            }
+            else {
+                return false;
+            }
+        }
+
+    }
+    
+
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/ModelAdapterTeam.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/ModelAdapterTeam.java
new file mode 100644
index 0000000..6a251d2
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/ModelAdapterTeam.java
@@ -0,0 +1,620 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: ModelAdapterTeam.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.gui;
+
+import java.awt.Component;
+import java.util.HashMap;
+import java.util.Vector;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableColumn;
+
+import org.objectteams.Team;
+import org.objectteams.samples.ordersystem.data.Address;
+import org.objectteams.samples.ordersystem.order.StockOrder;
+import org.objectteams.samples.ordersystem.reservation.Reservations;
+import org.objectteams.samples.ordersystem.store.StockItem;
+
+import org.objectteams.samples.ordersystem.data.Customer;
+import base org.objectteams.samples.ordersystem.reservation.StockReservations;
+import base org.objectteams.samples.ordersystem.store.Storage;
+
+
+
+/**
+ * Team providing the model of the order system. 
+ * It does so by binding to base classes from the packages data and store.
+ * 
+ * Three different kinds of roles exist:
+ * - CustomerRole provides a specific view to its underlying base object.
+ * - Different adapters present a collection of base objects as a table:
+ *   CustomerAdapter, OrderAdapter, ReservationAdapter, StorageAdaptor
+ * - ModelInitializer intercepts switching between tabs in order to switch models accordingly.
+ * 
+ * @author Dehla Sokenou
+ */
+public team class ModelAdapterTeam {
+    
+    
+    protected static ModelAdapterTeam theModelAdapterTeam;
+
+    public static ModelAdapterTeam getModelAdapterTeam() {
+        if (theModelAdapterTeam == null) {
+            theModelAdapterTeam = new ModelAdapterTeam();
+        }
+        return theModelAdapterTeam;
+    }
+    
+    protected ModelAdapterTeam() {
+        this.activate(Team.ALL_THREADS);
+        theModelAdapterTeam = this;
+        initialize();
+    }
+    
+    // some things to fill storage, customer and addresses
+    protected StockItem[] initItems = new StockItem[] {
+            new StockItem("screw driver", 1500),
+            new StockItem("tool box pro", 5000),
+            new StockItem("stepladder", 7999),
+            new StockItem("philips screw", 155),
+            new StockItem("wall paint", 1680),
+            new StockItem("paint brush", 800)
+        };
+    
+    protected Address[] initAddresses = new Address[] {
+            new Address("22, october avenue", "2345", "Chicago", "Il,USA"),
+            new Address("Blaumeisenweg 5", "12345", "Berlin", "Germany"),
+            new Address("10, Lundy Avenue", "513648", "Paris", "France"),
+            new Address("Venus/Mars", "135754", "Io", "Jupiter"),
+            new Address("Dan Tokpa", "14440", "Cotonou", "Benin")
+        };
+
+    protected Customer[] initCustomers = new Customer[] {
+            new Customer("Joe", "Jojo", initAddresses[0]),
+            new Customer("Jim", "Beann", initAddresses[1]),
+            new Customer("Jan", "Tatam", initAddresses[2]),
+            new Customer("Paulchen", "Panther", initAddresses[3])
+        };
+
+    
+    protected void initialize() {
+        fillStorage();
+        createCustomers();
+        createOrders();
+    }
+    
+    protected void fillStorage() {
+        StorageAdapter storage = StorageAdapter.theInstance();
+        storage.add(initItems[0]);
+        storage.add(initItems[1]);
+        initItems[1].put(20);
+        storage.add(initItems[2]);
+        storage.add(initItems[3]);
+        initItems[3].put(1);
+        storage.add(initItems[4]);
+        initItems[4].put(200);
+        storage.add(initItems[5]);
+        initItems[5].put(3);
+    }
+
+    protected void createCustomers() {
+        CustomerAdapter tempCustomerAdapter = getCustomerAdapter();
+        //  TODO: better use callin from constructor as soon as it is available
+        tempCustomerAdapter.addElement(initCustomers[0]);     
+        tempCustomerAdapter.addElement(initCustomers[1]);
+        tempCustomerAdapter.addElement(initCustomers[2]);
+        tempCustomerAdapter.addElement(initCustomers[3]);
+    }
+    
+    protected void createOrders() {
+        //  TODO: better use callin from constructor as soon as it is available
+        OrderAdapter tempOrderAdapter = getOrderAdapter();
+        StockOrder tempOrder1 = new StockOrder(initCustomers[0]);
+        tempOrder1.order(initItems[4], 100);
+        tempOrder1.order(initItems[5], 2);
+        tempOrder1.deliver();
+        tempOrderAdapter.addElement(tempOrder1);
+
+        StockOrder tempOrder2 = new StockOrder(initCustomers[1]);
+        tempOrder2.order(initItems[4], 200);
+        tempOrderAdapter.addElement(tempOrder2);
+
+        StockOrder tempOrder3 = new StockOrder(initCustomers[2], initAddresses[4]);
+        tempOrder3.setDiscount(initItems[4], 0.10);
+        tempOrder3.order(initItems[4], 200);
+        tempOrder3.order(initItems[5], 2);
+        tempOrderAdapter.addElement(tempOrder3);
+    }
+    
+    
+    // the adapters implementing AbstractModelTemplate
+    protected StorageAdapter theStorageAdapter;
+    protected CustomerAdapter theCustomerAdapter;
+    protected ReservationAdapter theReservationAdapter;
+    protected OrderAdapter theOrderAdapter;
+    
+    
+    /**
+     * @return the store item list model
+     */
+    public StorageAdapter getStorageAdapter() {
+        if (theStorageAdapter == null) {
+            theStorageAdapter = StorageAdapter.theInstance();
+        }
+        return theStorageAdapter;
+    }
+    
+    /**
+     * @return the customer list model
+     */
+    public CustomerAdapter getCustomerAdapter() {
+        if (theCustomerAdapter == null) {
+            theCustomerAdapter = new CustomerAdapter();
+        }
+        return theCustomerAdapter;
+    }
+    
+    /**
+     * @return the reservation list model
+     */
+    public ReservationAdapter getReservationAdapter() {
+        if (theReservationAdapter == null) {
+            theReservationAdapter = ReservationAdapter.theInstance();
+        }
+        return theReservationAdapter;
+    }
+    
+    /**
+     * @return the customer list model
+     */
+    public OrderAdapter getOrderAdapter() {
+        if (theOrderAdapter == null) {
+            theOrderAdapter = new OrderAdapter();
+        }
+        return theOrderAdapter;
+    }
+    
+    /**
+     * Updates table model in the given tab. 
+     * @param aTab the model tab to update
+     */
+    public void update(Tab aTab) {
+        switch (aTab) {
+            case STORE : 
+                getStorageAdapter().fireTableDataChanged(); 
+                break;
+            case CUSTOMER : 
+                getCustomerAdapter().fireTableDataChanged();
+                break;
+            case RESERVATION : 
+                getReservationAdapter().fireTableDataChanged();
+                break;
+            case ORDER : 
+                getOrderAdapter().fireTableDataChanged();
+                break; 
+            default: 
+                throw new IllegalArgumentException("Method not defined for argument " + aTab);
+        }
+    }
+    
+    /**
+     * Lifts a customer to its role in this team.
+     * @param aCustomer the customer to lift
+     */
+    protected void liftCustomerToRole(Customer as CustomerRole aCustomer) {
+        // nop, lifting is all we want
+    }
+    
+    
+    /**
+     * Initializes model.
+     */
+    protected class ModelInitializer playedBy OrderSystemMainFrame {
+        
+        // callouts to tables
+        JTable getStoreTable()       -> get JTable storeTable;
+        JTable getCustomerTable()    -> get JTable customerTable;
+        JTable getReservationTable() -> get JTable reservationTable;
+        JTable getOrderTable()       -> get JTable orderTable;
+        
+        // callins to set models
+        void setModels(Tab aTab) <- after JPanel getStoreTab()       with { aTab <- Tab.STORE }
+        void setModels(Tab aTab) <- after JPanel getCustomerTab()    with { aTab <- Tab.CUSTOMER }
+        void setModels(Tab aTab) <- after JPanel getReservationTab() with { aTab <- Tab.RESERVATION }
+    setOrderModel: 
+        void setModels(Tab aTab)       <- after JPanel getOrderTab() with { aTab <- Tab.ORDER }
+    setOrderRenderer: 
+        void setCellRenderer(Tab aTab) <- after JPanel getOrderTab() with { aTab <- Tab.ORDER }
+      
+        // two callins to the same base method exist, must declare precedence:
+        precedence setOrderModel, setOrderRenderer;
+        
+        
+        protected void setModels(Tab aTab) {
+            JTable tempTable;
+            AbstractTableModel tempTableModel;
+            switch (aTab) {
+                case STORE: 
+                    tempTable      = getStoreTable();
+                    tempTableModel = getStorageAdapter();
+                    break;
+                case CUSTOMER: 
+                    tempTable      = getCustomerTable();
+                    tempTableModel = getCustomerAdapter();
+                    break;
+                case RESERVATION: 
+                    tempTable      = getReservationTable();
+                    tempTableModel = getReservationAdapter();
+                    break;
+                case ORDER: 
+                    tempTable      = getOrderTable();
+                    tempTableModel = getOrderAdapter(); 
+                    break;
+                default: 
+                    throw new IllegalArgumentException("Method not defined for argument " + aTab);
+            }
+            if (tempTableModel != null) {
+                tempTable.setModel(tempTableModel);
+            }
+            tempTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+        }
+        
+        @SuppressWarnings("serial") // regarding nested anonymous class
+		protected void setCellRenderer(Tab aTab) {
+            final JTable tempTable;
+            switch (aTab) {
+                case ORDER: 
+                    tempTable = getOrderTable();
+                    TableColumn tempColumn = tempTable.getColumnModel().getColumn(0);
+                    tempColumn.setCellRenderer(new DefaultTableCellRenderer() {
+                        public Component getTableCellRendererComponent(JTable aTable, Object aValue, boolean aIsSelected, boolean aHasFocus, int aRow, int aColumn) {
+                            JLabel tempLabel = (JLabel) super.getTableCellRendererComponent(aTable, aValue, aIsSelected, aHasFocus, aRow, aColumn);
+                            String tempText = "<html>" + aValue.toString().replace("\n", "<br>").replace("Total", "<b>Total") +  "</b></html>";
+                            tempLabel.setText(tempText);
+                            tempTable.setRowHeight(aRow, tempLabel.getPreferredSize().height);
+                            return tempLabel;
+                        }
+                    });
+                    break;
+                default: 
+                    // do nothing, allows overriding by subroles
+                    break;
+            }            
+        }
+    }
+    
+    
+    /**
+     * Manages store item via store class.
+     */
+    @SuppressWarnings("serial")
+    public class StorageAdapter extends AbstractTableModelTemplate<StockItem> playedBy Storage {
+        
+        protected StorageAdapter(Storage myBase) {
+            ModelAdapterTeam.this.theStorageAdapter = this;
+        }
+        
+        protected String[] columnNames = new String[] {
+                                        "Id", "Name", "Price", "Count on Stock"
+                                   };
+        
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getColumnNames()
+         */
+        protected String[] getColumnNames() {
+            return columnNames;
+        }
+
+        /**
+         * @see javax.swing.table.TableModel#getValueAt(int, int)
+         */
+        public Object getValueAt(int aRowIndex, int aColumnIndex) {
+            Vector<StockItem> tempElements = getElements();
+            StockItem tempItem = tempElements.elementAt(aRowIndex);
+            switch (aColumnIndex) {
+                case 0 : 
+                    return tempItem.getId();
+                case 1 : 
+                    return tempItem.getName();
+                case 2 : 
+                    return tempItem.getPriceString();
+                case 3 : 
+                    return tempItem.getCount();
+                default : 
+                    return null;
+            }
+        }
+        
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getElements()
+         */
+        // Note: abstract method is implemented using callout binding:
+        @SuppressWarnings("decapsulation")
+		public Vector<StockItem> getElements() -> get HashMap<Integer,StockItem> items 
+        	with {
+                    result <- new Vector<StockItem>(items.values())
+            }
+
+        StorageAdapter theInstance() -> Storage theInstance();
+        
+		void add(StockItem item) -> void add(StockItem item);
+		
+		void delete(StockItem item) -> void delete(StockItem item);
+
+    }
+    
+    
+    /**
+     * CustomerAdapter is not a real role class (unbound). Manages the customers (see CustomerRoles).
+     */
+    @SuppressWarnings("serial")
+    public class CustomerAdapter extends AbstractTableModelTemplate<Customer> {
+
+        protected String[] columnNames = new String[] {
+                                    "First Name", "Last Name", "Street", "Postal Code", "City", "Country"};
+        
+        protected Vector<Customer> elements = new Vector<Customer>();
+        
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getColumnNames()
+         */
+        protected String[] getColumnNames() {
+            return columnNames;
+        }
+
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getValueAt(int, int)
+         */
+        public Object getValueAt(int aRowIndex, int aColumnIndex) {
+            Vector<Customer> tempElements = getElements();
+            Customer tempCustomer = tempElements.elementAt(aRowIndex);
+            CustomerRole tempCustomerRole = ModelAdapterTeam.this.getRole(tempCustomer, CustomerRole.class);
+            switch (aColumnIndex) {
+                case 0 : 
+                    return tempCustomerRole.getFirstName();
+                case 1 : 
+                    return tempCustomerRole.getLastName();
+                case 2 : 
+                    return tempCustomerRole.getStreet(); 
+                case 3 : 
+                    return tempCustomerRole.getPostalcode();
+                case 4 : 
+                    return tempCustomerRole.getCity();
+                case 5 : 
+                    return tempCustomerRole.getCountry();
+                default : 
+                    return null;
+            }
+        }
+        
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getElements()
+         */
+        public Vector<Customer> getElements() {
+            return elements;
+        }
+        
+        /**
+         * Adds an element (customer) to the list of customers.
+         * @param aCustomer the customer to add
+         */
+        public void addElement(Customer aCustomer) {
+            if (! ModelAdapterTeam.this.hasRole(aCustomer, CustomerRole.class)) {
+                ModelAdapterTeam.this.liftCustomerToRole(aCustomer);
+            }
+            elements.add(aCustomer);
+        }
+        
+        /**
+         * Removes an element (customer) from the list of customers.
+         * @param aCustomer the customer to remove
+         */
+        public void removeElement(Customer aCustomer) {
+            elements.remove(aCustomer);
+        }
+
+    }
+    
+    
+    /**
+     * Role played by customers in this team.
+     * 
+     * This role applies the "Virtual Restructuring" pattern:
+     *   Although at the base level, Customer and Address are distinct entities,
+     *   this role provides a combined view as if both classes had been 
+     *   restructured into one.
+     */
+    @SuppressWarnings("bindingconventions") // can't use base import for Customer, because it is also used directly within this team.
+    public class CustomerRole implements ILowerable playedBy Customer {
+        
+        // callouts to different fields in customer and address.
+        // fields of customer are only included to have a uniform interface to customers.
+        String getFirstName()  -> String getFirstname();
+        String getLastName()   -> String getLastname();
+        String getStreet()     -> Address getAddress()  with {result <- result.getStreet()};
+        String getPostalcode() -> Address getAddress()  with {result <- result.getPostalcode()};
+        String getCity()       -> Address getAddress()  with {result <- result.getCity()};
+        String getCountry()    -> Address getAddress()  with {result <- result.getCountry()};        
+    }
+    
+    
+    /**
+     * Manages the reservations via team StockReservations.
+     */
+    @SuppressWarnings("serial")
+	public class ReservationAdapter extends AbstractTableModelTemplate<StockItem> playedBy StockReservations {
+
+        protected String[] columnNames = new String[] {
+                "Id", "Name", "Count on Stock", "# Reserved", "# Available"
+           };
+        
+        // callouts
+        int getNumAvail(StockItem anItem) -> int numAvail(StockItem anItem);
+
+		ReservationAdapter theInstance() -> StockReservations theInstance();		
+        
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getColumnNames()
+         */
+        protected String[] getColumnNames() {
+            return columnNames;
+        }
+
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getElements()
+         */
+        public Vector<StockItem> getElements() {
+			return getStorageAdapter().getElements();
+        }
+
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getValueAt(int, int)
+         */
+        public Object getValueAt(int aRowIndex, int aColumnIndex) {
+            Vector<StockItem> tempElements = getElements();
+            StockItem tempItem = tempElements.elementAt(aRowIndex);
+            boolean hasRole = Reservations.theInstance().hasRole(tempItem);
+            switch (aColumnIndex) {
+                case 0 : 
+                    return tempItem.getId();
+                case 1 : 
+                    return tempItem.getName();
+                case 2 : 
+                    return tempItem.getCount();
+                case 3 : 
+                    if (hasRole) {
+                        return tempItem.getCount() - getNumAvail(tempItem);
+                    }
+                    else {
+                        return 0;
+                    }
+                case 4 : 
+                    if (hasRole) {
+                        return getNumAvail(tempItem);
+                    }
+                    else {
+                        return tempItem.getCount();
+                    }
+                default : 
+                    return null;
+            }
+        }
+        
+    }
+    
+    
+    /**
+     * Manages the reservations via team StockReservations.
+     */
+    @SuppressWarnings("serial")
+	public class OrderAdapter extends AbstractTableModelTemplate<StockOrder> {
+        
+        protected Vector<StockOrder> elements = new Vector<StockOrder>();
+        
+        protected String[] columnNames = new String[] {
+                "Order Information"
+           };
+        
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getColumnNames()
+         */
+        protected String[] getColumnNames() {
+            return columnNames;
+        }
+        
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getElements()
+         */
+        public Vector<StockOrder> getElements() {
+            return elements;
+        }
+
+        /**
+         * @see org.objectteams.samples.ordersystem.gui.AbstractTableModelTemplate#getValueAt(int, int)
+         */
+        public Object getValueAt(int aRowIndex, int aColumnIndex) {
+            return getElements().elementAt(aRowIndex).toString();
+        }
+
+        /**
+         * Adds an element (customer) to the list of customers.
+         * @param aCustomer the customer to add
+         */
+        public void addElement(StockOrder anOrder) {
+            elements.add(anOrder);
+        }
+        
+        /**
+         * Removes an element (customer) from the list of customers.
+         * @param aCustomer the customer to remove
+         */
+        public void removeElement(StockOrder anOrder) {
+            elements.remove(anOrder);
+        }
+
+    }
+     
+    
+    // don't need these roles anymore, but was not deleted because they show another kind of MVC behaviour 
+//    /**
+//     * Role listening to changes that occur directly in observed model of reservations.
+//     */
+//    protected team class ReservationListener playedBy StockReservations {
+//        
+//        protected class ReservationItemListener playedBy base.Reservable {
+//
+//            // callins
+//            update <- after reserve, release, check, invalidate, remove;
+//            
+//            protected void  update() {
+//                ModelAdapterTeam.this.update(Tab.RESERVATION);
+//            }
+//            
+//        }
+//        
+//    }
+//    
+//
+//    /**
+//     * Role listening to changes that occur directly in observed model of orders.
+//     */
+//    protected team class OrderListener playedBy StockOrder {
+//        
+//        protected class OrderItemListener playedBy base.Item {
+//            
+//        // callins
+//        update <- after check, alarm, doReserve, doDeliver;
+//        
+//            protected void update() {
+//                ModelAdapterTeam.this.update(Tab.RESERVATION);
+//                ModelAdapterTeam.this.update(Tab.ORDER);
+//            }
+//        
+//        }
+//        
+//        
+//    }
+
+    
+    
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/OrderSystemMainFrame.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/OrderSystemMainFrame.java
new file mode 100644
index 0000000..9e4a436
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/OrderSystemMainFrame.java
@@ -0,0 +1,171 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: OrderSystemMainFrame.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import javax.swing.JButton;
+import javax.swing.JTabbedPane;
+import javax.swing.JTable;
+
+
+
+/**
+ * 
+ * @author Dehla Sokenou
+ *
+ * Class implementing view of order system.
+ *
+ */
+@SuppressWarnings("serial")
+public class OrderSystemMainFrame extends JFrame {
+    
+    // store buttons
+    private JButton addItemButton = new JButton("Add Item");
+    protected JButton removeItemButton = new JButton("Remove Item");
+    protected JButton increaseStockButton = new JButton("Increase Stock");
+    protected JButton decreaseStockButton = new JButton("Decrease Stock");
+    
+    // customer management buttons
+    protected JButton addCustomerButton = new JButton("Add Customer");
+    protected JButton removeCustomerButton = new JButton("Remove Customer");
+    
+    // reservation management buttons
+    // none
+    
+    // order management buttons
+    protected JButton newOrderButton = new JButton("New Order");
+    protected JButton removeOrderButton = new JButton("Remove Order");
+    protected JButton changeOrderButton = new JButton("Change Order");
+    
+    // close application button
+    protected JButton closeButton = new JButton("Exit");
+    
+    // table
+    protected JTable storeTable = new JTable();
+    protected JTable customerTable = new JTable();
+    protected JTable reservationTable = new JTable();
+    protected JTable orderTable = new JTable();
+    
+    // preferred size of buttons: get greatest button size
+    protected Dimension preferredButtonSize = round(removeCustomerButton.getPreferredSize());
+    
+    
+    public OrderSystemMainFrame() {
+        super();
+        setTitle("TOPPrax Ordersystem");
+        setSize(800, 600);
+        setLayout(new BorderLayout());
+                
+        initializeContents();
+                
+        setVisible(true);
+    }
+
+    /**
+     * Initializes components in main frame. Necessary to provide hook for adaption.
+     */
+    private void initializeContents() {
+        JTabbedPane tempTabbedPane = new JTabbedPane();
+        getContentPane().add("Center", tempTabbedPane);
+        tempTabbedPane.addTab("Store", getStoreTab());
+        tempTabbedPane.addTab("Customers", getCustomerTab());
+        tempTabbedPane.addTab("Reservations", getReservationTab());
+        tempTabbedPane.addTab("Orders", getOrderTab());
+        
+        closeButton.addActionListener(new ActionListener() {
+            public void actionPerformed(ActionEvent aE) {
+                closeApp();
+            }
+        });
+        closeButton.setAlignmentX(Component.CENTER_ALIGNMENT);
+        getContentPane().add("South", closeButton);
+        
+        addWindowListener(new WindowAdapter() {
+            public void windowClosing(WindowEvent aE) {
+                closeApp();
+            }
+        });
+    }
+    
+    protected JPanel getStoreTab() {
+        return createPanel(storeTable, new JButton[] {addItemButton,
+                                                     removeItemButton,
+                                                     increaseStockButton,
+                                                     decreaseStockButton,
+                           });
+    }
+
+    protected JPanel getCustomerTab() {
+        return createPanel(customerTable, new JButton[] {addCustomerButton,
+                                                     removeCustomerButton,
+                           });
+    }
+    
+    protected JPanel getReservationTab() {
+        return createPanel(reservationTable, new JButton[0]);
+    }
+
+    protected JPanel getOrderTab() {
+        return createPanel(orderTable, new JButton[] {newOrderButton,
+//                                                     removeOrderButton,
+//                                                     changeOrderButton,
+                           });
+    }
+
+    protected JPanel createPanel(JTable aTable, JButton[] aButtonArray) {
+        JPanel tempPanel = new JPanel();
+
+        ButtonListLayout tempButtonListLayout = new ButtonListLayout(ButtonListLayout.Orientation.VERTICAL);
+        tempButtonListLayout.setFixedButtonSize(preferredButtonSize);
+        tempButtonListLayout.setButtonSpacing(10);
+        tempButtonListLayout.setPanelSpacing(10);
+        tempPanel.setLayout(tempButtonListLayout);
+        
+        tempPanel.add(new JScrollPane(aTable), ButtonListLayout.ComponentType.LIST_OR_TABLE_PANEL);
+        
+        for (JButton tempButton : aButtonArray) {
+            tempPanel.add(tempButton, ButtonListLayout.ComponentType.BUTTON_PANEL);
+        }
+        return tempPanel;
+    }
+    
+    protected Dimension round(Dimension aDimension) {
+        // round Dimension to the next whole 5 or 10
+        int tempAddWidth = 5 - (aDimension.width % 5);
+        int tempAddHeight = 5 - (aDimension.height % 5);
+        aDimension.width += tempAddWidth; 
+        aDimension.height += tempAddHeight;
+        return aDimension;
+    }
+    
+    protected void closeApp() {
+        System.exit(0); 
+    }
+    
+       
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/Tab.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/Tab.java
new file mode 100644
index 0000000..ee585a8
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/gui/Tab.java
@@ -0,0 +1,26 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Tab.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.gui;
+
+/**
+ * Enum representing actual foreground tab.
+ */
+public enum Tab {
+
+    STORE, CUSTOMER, RESERVATION, ORDER;
+    
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/order/Order.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/order/Order.java
new file mode 100644
index 0000000..ed02175
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/order/Order.java
@@ -0,0 +1,403 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Order.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.order;
+
+import java.util.LinkedList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+* This is a generic team definition of an order. An <code>Order</code> consists of a list of
+* <code>Item</code>s, implemented as an abstract role, and several team features.
+*/
+public team class Order {
+
+	/**
+	 * The abstract role of an address. This address is used by Customer
+	 */
+	public abstract class Address {
+		@SuppressWarnings("unused") private int id;
+	}
+		
+	/**
+	 * The abstract role of a customer.
+	 */
+	public abstract class Customer {
+		
+		@SuppressWarnings("unused") private int id;
+
+		private boolean usePrivateAddress = true;
+		private Address orderAddress;
+		
+		/**
+		 * @return Returns the usePrivateAddress.
+		 */
+		public boolean isUsePrivateAddress() {
+			return usePrivateAddress;
+		}
+		
+		/**
+		 * @param usePrivateAddress The usePrivateAddress to set.
+		 */
+		public void setUsePrivateAddress(boolean usePrivateAddress) {
+			this.usePrivateAddress = usePrivateAddress;
+//			this.orderAddress = null;
+		}
+		
+		/**
+		 * @return Returns the orderAddress.
+		 */
+		public Address getOrderAddress() {
+			return orderAddress;
+		}
+		
+		/**
+		 * @param orderAddress The orderAddress to set.
+		 */
+		public void setOrderAddress(Address orderAddress) {
+			this.orderAddress = orderAddress;
+			this.usePrivateAddress = false;
+		}
+		
+		abstract public String getRepres();
+		
+	}
+	
+	/**
+	 * The abstract role of an order entry. An <code>Item</code> is a part of an order list.
+	 */
+    protected abstract class Item {
+		
+		/**
+		 * Returns the number of available items. This abstract method is implemented in a sub-role. 
+		 */
+		abstract int getStockCount();
+		
+		/**
+		 * Returns the current price of a single piece. This abstract method is implemented in a sub-role.
+		 */
+		abstract int getSinglePrice ();
+		
+		/**
+		 * Returns the description of the item. This abstract method is implemented in a sub-role. 
+		 */
+		abstract String getDescription();
+
+		@SuppressWarnings("unused") private int id;
+
+		/**
+		 * Number of ordered pieces.
+		 */
+		private int count = 0;
+		
+		/**
+		 * Number of missing pieces.
+		 */
+		private int numMissing = 0;
+		
+		/**
+		 * Discounting rate for the current item.
+		 */
+		private double discount = 0.0;
+
+		/**
+		 * Returns the number of ordered pieces.
+		 */
+		protected int  getCount() {
+			return count ;  	    }
+
+		/**
+		 * Sets the number of ordered pieces.
+		 * @param count
+		 */
+		protected void setCount(int count) {
+			this.count = count;	}
+
+		/**
+		 * Returns the number of missing pieces.
+		 */
+		protected int  getMissing  () {
+			return numMissing;    }
+
+		/**
+		 * Sets the number of missing pieces. 
+		 * @param count number of missing pieces
+		 */
+		protected void setMissing  (int count) {
+			numMissing = count;  }
+
+		/**
+		 * Sets the discounting rate for the item.
+		 * @param discount Discounting rate to be set
+		 */
+		protected void setDiscount (double discount) {
+			this.discount = discount; }
+
+		/**
+		 * Returns the total price of the item considering the discounting rate.
+		 */
+		protected int getTotalPrice() {
+			return (int) ((getSinglePrice() * getCount()) * (1.0 - discount));
+		}
+
+		/**
+		 * Reserves the missing pices again and returns the number of actually reserved pieces.
+		 * Checks whether the complete order list can be delivered, if all missing pieces have been reserved.
+		 */
+		void check () {
+			int stockCount = getStockCount();
+			if ((numMissing > 0) && (stockCount > 0)) {
+				int reserved = doReserve(numMissing);
+				numMissing -= reserved;
+				if (numMissing == 0)
+					Order.this.check(); // delegate up to the enclosing team instance
+			}
+		}
+
+		/**
+		 * Give the alarm, if the reservation became invalid.
+		 * Completely replaces the original behavior, thus the warning about
+		 * a missing base call.
+		 */
+		@SuppressWarnings("basecall")
+		callin void alarm () {
+			System.err.println("\nOrder of "+Order.this.customer.getRepres()+":");
+			System.err.println("ATTENTION, Reservation became invalid!");
+			System.err.println("Order item: "+getDescription());
+			// TODO: [begin] set missing pieces to zero, try to newly reserve items 
+			setMissing(getCount());
+			check();
+		    // TODO: [end]
+		}
+
+		/**
+		 * Returns a report about the ordered item.
+		 */
+		public String toString() {
+			String comment = "";
+			if (numMissing > 0)
+				comment = "\n !! "+numMissing+" pieces not on stock!!";
+			return getDescription()+": \t"
+				+ getCount()+"*\t= "+getEuroString(getTotalPrice())
+				+ comment;
+		}
+
+		/**
+		 * Reserves the missing items. Returns the number of actually reserved pieces.
+		 * @param numMissing Number of missing pieces
+		 * @return Number of actually reserved pieces
+		 */
+		abstract public int doReserve(int numMissing);
+		
+		/**
+		 * Deliver the given number of pieces.
+		 * @param count
+		 */
+		abstract public void doDeliver(int count);
+
+	}
+
+	@SuppressWarnings("unused") private int id;
+
+	/**
+	 * An Order is always associated with a customer.
+	 */
+	Customer customer;
+	
+	/**
+	 * List of ordered items.
+	 */
+	List<Item> itemList;
+	
+	/**
+	 * This <code>Order</code>'s status.
+	 */
+	int status;
+	
+	/**
+	 * Status value of the order list. All ordered items are available and can be delivered.
+	 */
+	public static final int NORMAL = 0;
+	
+	/**
+	 * Status value of the order list. There is at least one of the ordered items which is 
+	 * not available so that the complete order list cannot be delivered and has to wait for stock.
+	 */
+	public static final int WAIT   = 1;
+	
+	/**
+	 * Status value of the order list. All ordered items have been delivered.
+	 */
+	public static final int DELIVERED = 2;
+	
+	/**
+	 * Status values of the order list.
+	 */
+	public static final String[] STATES = {
+		"in progress",
+		"wait for stock",
+		"delivered"
+	};
+	
+	/**
+	 * Creates a new team instance.
+	 */
+	public Order (Customer customer) {
+		this.customer = customer;
+		itemList = new LinkedList<Item>();
+		status = NORMAL;
+		activate(ALL_THREADS);
+	}
+
+	/**
+	 * Creates a new team instance with a different order address.
+	 */
+	public Order (Customer customer, Address orderAddress) {
+		// this(customer);
+		this.customer = customer;
+		this.customer.setOrderAddress(orderAddress);
+		itemList = new LinkedList<Item>();
+		status = NORMAL;
+		activate(ALL_THREADS);
+	}
+
+    /**
+     * Creates a new team instance with a different order address.
+     */
+    public Order (Customer customer, Address orderAddress, boolean isUsingPrivateAddress) {
+        // this(customer);
+        this.customer = customer;
+        this.customer.setOrderAddress(orderAddress);
+        this.customer.setUsePrivateAddress(true);
+        itemList = new LinkedList<Item>();
+        status = NORMAL;
+        activate(ALL_THREADS);
+    }
+
+	Order() { }
+
+	/**
+	 * Checks the order list and notes the missing items which cannot be delevered.  The state of 
+	 * the missing items is set on <code>WAIT</code>. If all items in the order list are available, 
+	 * they will be delivered. 
+	 */
+	void check () {
+		status = NORMAL;
+		Iterator<Item> it = itemList.iterator();
+		while (it.hasNext()) {
+			Item p = it.next();
+			if (p.getMissing() > 0) {
+				status = WAIT;
+				return;
+			}
+		}
+		System.out.println("Now deliverable!");
+		print();
+		deliver();
+		print();
+	}
+
+	/**
+	 * Orders a given number (count) of pieces. The local variable <code>reserved</code> holds the 
+	 * number of actually reserved pieces. 
+	 */
+	public void order (Item item, int count) {
+		int reserved = item.doReserve(count);
+		item.setCount(count);
+		if (reserved < count) {
+			item.setMissing(count - reserved);
+			status = WAIT;
+		}
+		itemList.add(item);
+	}
+
+	/**
+	 * Checks the order status and returns true, if the order can be delivered.
+	 */
+	public boolean isDeliverable () {
+		return status == NORMAL;
+	}
+
+	/**
+	 * Delivers all items in the order list. After delivering the team instance should be deaktivated.
+	 */
+	public void deliver () {
+		Iterator<Item> it = itemList.iterator();
+		while (it.hasNext()) {
+			Item p = it.next();
+			p.doDeliver(p.getCount());
+		}
+		status = DELIVERED;
+		deactivate();
+	}
+
+	/**
+	 * Sets the discounting rate for the given item.
+	 * @param item item which should be discounted
+	 * @param discount discounting rate
+	 */
+	public void setDiscount (Item item, double discount) {
+		item.setDiscount(discount);
+	}
+
+	/**
+	 * This team method prints a string representation of this order.
+	 */
+	public void print() {
+        System.out.println("----------------------------------------");
+		System.out.println(toString());
+        System.out.println("----------------------------------------");
+	}
+
+    /**
+     * 
+     */
+    public String toString() {
+        String tempString = "";
+        tempString += "Order for "+customer.getRepres()+"\n";
+        if (customer.getOrderAddress() != null) {
+            tempString += "order address  : " + customer.getOrderAddress() + "\n";
+            tempString += "-> using " + 
+                          ((customer.isUsePrivateAddress()) ? "private address" : "order address") 
+                          + "\n";
+        }
+        tempString += "("+STATES[status]+")\n";
+        tempString += "========================================\n";
+		Iterator<Item> it = itemList.iterator();
+		int i = 1;
+		int total = 0;
+		while (it.hasNext()) {
+			Item p = it.next();
+            tempString += ((i++)+".\t"+p) + "\n";
+			total += p.getTotalPrice();
+		}
+        tempString += "Total: "+getEuroString(total) +"\n";
+        return tempString;
+    }
+
+	/**
+	 * Returns an euro string for the given price. 
+	 * @param price
+	 * @return euro string 
+	 */
+	public String getEuroString(int price) {
+		int euro = price / 100;
+		int cent = price % 100;
+		return euro + "," + cent + " Euro";
+	}
+
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/order/StockOrder.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/order/StockOrder.java
new file mode 100644
index 0000000..96cb3c9
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/order/StockOrder.java
@@ -0,0 +1,146 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: StockOrder.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.order;
+
+import org.objectteams.samples.ordersystem.reservation.StockReservations;
+
+import base org.objectteams.samples.ordersystem.data.Customer;
+import base org.objectteams.samples.ordersystem.data.Address;
+import base org.objectteams.samples.ordersystem.store.StockItem;
+
+/**
+ * The team <code>StockOrder</code> is a specialization of the <code>Order</code>. 
+ * It inherits the <code>Item</code> role from its super-team.
+ */
+public team class StockOrder extends Order {
+
+	/**
+	 * The role class <code>Address</code> is implemented in the super-team 
+	 * <code>Order</code>. 
+	 * Here the role class is just bound to its base class.
+	 */
+	public class Address playedBy Address {
+
+		abstract public String toString();
+		toString -> toString;
+		
+	}
+	
+	/**
+	 * The role class <code>Customer</code> is implemented in the super-team 
+	 * <code>Order</code>. 
+	 * Here the role class is just bound to its base class.
+	 */
+	public class Customer playedBy Customer {
+		
+		abstract public String toString();
+		toString -> toString;
+		
+		public String getRepres() {
+			boolean PRINT_ADDRESS = false;
+			return toString() + (PRINT_ADDRESS ? "\n" + orderAddress.toString() : "");
+		}
+		
+	}
+	
+	/**
+	 * The role class <code>Item</code> is implemented in the super-team 
+	 * <code>Order</code> and realizes the ordered stock item. 
+	 * Here the role class is just bound to its base class.
+	 */
+    protected class Item playedBy StockItem {
+
+
+		// callout method bindings: forwarding to the base methods
+		getStockCount  -> getCount;
+		getSinglePrice -> getPrice;
+		getDescription -> getName;
+
+		// callin method bindings:
+		check <- after put;
+		alarm <- replace invalidate;
+
+		/**
+		 * Reserves the missing pieces of the current stock item.
+		 */
+		public int doReserve(int numMissing) {
+			return res.reserve(this, numMissing);
+		}
+
+		/**
+		 * Delivers the given number of pieces.
+		 */
+		public void doDeliver(int count) {
+			res.deliver(this, count);
+		}
+	}
+
+	/** Reference to another team used for the reservation functionality. */
+	StockReservations res; 
+	
+	// ================ Facade interface: ================
+	// (see the corresponding comment in StockReservations)
+	
+	/**
+	 * Orders a given number of pieces of an item.
+	 */
+	public void order (StockItem as Item item, int count) {
+		super.order(item, count);
+	}
+
+	/**
+	 * Sets the given discounting rate for an item.
+	 */
+	public void setDiscount (StockItem as Item item, double discount) {
+		super.setDiscount(item, discount);
+	}
+
+	/**
+	 * Team constructor, uses the constructor of the super-team. 
+	 */
+	public StockOrder (Customer as Customer customer) {
+		super(customer);
+		init();
+	}
+
+	/**
+	 * Team constructor, uses the constructor of the super-team. 
+	 */ 
+	public StockOrder (Customer as Customer customer, 
+	        		   Address  as Address address) 
+	{
+		super(customer, address);
+		init();
+	}
+
+    /**
+     * Team constructor, uses the constructor of the super-team. 
+     */ 
+    public StockOrder (Customer as Customer customer, 
+                       Address as Address address,
+                       boolean isUsingPrivateAddress) 
+    {
+        super(customer, address, isUsingPrivateAddress);
+        init();
+    }
+
+	StockOrder() {}
+
+	public void init() {
+		res = (StockReservations)StockReservations.theInstance();
+	}
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/reservation/Reservations.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/reservation/Reservations.java
new file mode 100644
index 0000000..aaeb721
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/reservation/Reservations.java
@@ -0,0 +1,155 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Reservations.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.reservation;
+
+/**
+ * This is a team implementation for a simple reservation system.
+ * <code>Reservations</code> contains an abstract role <code>Reservable</code>
+ * which is bound in the sub-team <code>StockReservations</code>.
+ */
+public abstract team class Reservations {
+
+	/**
+	 * The role class <code>Reservable</code> represents a reservable item.
+	 */
+    protected abstract class Reservable {
+
+		
+		abstract protected void remove(int count);
+		
+		/**
+		 * Returns the number of pieces, which are located in the storage.
+		 * Should be bound to the base class methods via callout in the subteam.
+		 */
+		abstract int getCount();
+		
+		/**
+		 * Makes the item invalid.
+		 */
+		abstract void invalidate();
+
+		@SuppressWarnings("unused") private int id;
+
+		/**
+		 * Contains the quantity of reserved pieces.
+		 */
+		private int numReserved = 0;
+
+		/**
+		 * Reserves the given number of pieces for the item and returns the number
+		 * of pieces which were actually reserved.
+		 * @param count Number of pieces that should be reserved
+		 * @return Number of actually reserved pieces
+		 */
+		protected int reserve (int count) {
+			//check, how much pieces are available:
+			int avail = numAvail();
+			//if not enough pieces are available, reserve the remaining pieces:
+			if (count > avail) 
+				count = avail;
+			//add the newly reserved items to the reserved ones:
+			numReserved += count;
+			return count;
+		}
+
+		/**
+		 * Releases the given number of pieces by moving them to the available ones and
+		 * returns the number of actually released pieces.
+		 * @param count Number of pieces that should be released
+		 * @return Number of actually released items
+		 */
+		protected int release(int count) {
+			//check, whether the given number of pieces can be released:
+			if (count > numReserved)
+				count = numReserved;
+			//put the released pieces to the available ones:
+			numReserved -= count;
+			return count;
+		}
+		
+		/**
+		 * Returns the number of available pieces. This is the difference between the pieces
+		 * which are located in the storage and the reserved ones.
+		 * @return Number of available pieces
+		 */
+		protected int numAvail() {
+			return getCount() - numReserved;
+		}
+
+		/**
+		 * Checks the availability of the item.
+		 */
+		void check() {
+			System.out.println(">>> Checking: "+this+"("+numAvail()+")");
+			//invalidate the item if some pieces are missing
+			if (numAvail() < 0) {
+			    // TODO: [begin] before invalidation, remove all reservations
+			    numReserved = 0;
+			    // TODO: [end]
+				invalidate();
+			}
+		}
+		
+		callin String toStr() {
+					String result = "";
+					result = base.toStr();
+					return result+"\t reserved="+numReserved;
+				}		
+
+	}
+
+	/**
+	 * Singleton: reference to the team instance.
+	 */
+	static Reservations instance;
+	
+	@SuppressWarnings("unused") private int id;
+
+	/**
+	 * Returns the singleton instance 
+	 */
+	public static Reservations theInstance() { return instance; }
+
+	/**
+	 * Reserves the given number of pieces. Returns the number actually reserved pieces.
+	 */	
+	public int reserve(Reservable item, int count) {
+		return item.reserve(count);
+	}
+	
+	/**
+	 * Releases the given number of pieces. Returns the number actually released pieces.
+	 */
+	public int release(Reservable item, int count) {
+		return item.release(count);
+	}
+	
+	/**
+	 * Delivers the given number of pieces and returns the number of actualy delivered pieces.
+	 */
+	public void deliver(Reservable item, int count) {
+		item.remove(item.release(count));
+	}
+	
+	/**
+	 * Checks whether the given item is available.
+	 */
+	public int numAvail(Reservable item) {
+		return item.numAvail();
+	}
+}
+
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/reservation/StockReservations.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/reservation/StockReservations.java
new file mode 100644
index 0000000..2f885ab
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/reservation/StockReservations.java
@@ -0,0 +1,103 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: StockReservations.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.reservation;
+
+import base org.objectteams.samples.ordersystem.store.StockItem;
+
+/**
+ * Team class <code>StockReservations</code> extends the abstract team class <code>Reservations</code>
+ * and realizes the role bindings. This example shows, that the role bindings may appear in a subteam.
+ */
+public team class StockReservations extends Reservations {
+	
+	/**
+	 * The role class <code>Reservable</code> is implemented in the unbound super-class and realizes the
+	 * reservable item. Here the role class is simply bound to its base class store.StockItem.
+	 */
+	protected class Reservable playedBy StockItem {
+		
+		// callout method bindings:
+		remove     -> take;
+		getCount   -> getCount;
+		invalidate -> invalidate;
+		toString   => toString;             //overriding of inherited method
+	
+		/* --------------------------------------------------------------- */
+		
+		// callin method binding:
+		toStr <- replace toString;
+		check <- after take;
+	}
+	
+	/**
+	 * Team constructor is private because Stockreservations is a Singleton.
+	 */
+	private StockReservations() {
+		// callins are effective only after activation
+		activate(ALL_THREADS);
+	}
+	
+	/**
+	 * Singleton: Create the instance and store reference to it.
+	 */
+	static{
+		instance = new StockReservations(); 
+	}
+	
+	/**
+	 * Returns the singleton instance
+	 */
+	public static StockReservations theInstance() { return (StockReservations) instance; }
+
+	
+	// ================ Facade interface: ================
+	// The following methods export the main functions of this team.
+	// The inherited methods require a role type argument, but for better
+	// encapsulation, clients should not refer to role types. 
+	// To this end, the "as" signatures allow to invoke these methods 
+	// with an argument of type StockItem.
+	// Before entering the method body, the argument is lifted to its Reservable role,
+	// which is then passed to the super-method.
+	
+	/**
+	 * Reserves the given number of pieces.
+	 */
+	public int reserve(StockItem as Reservable item, int count) {
+		return super.reserve(item, count);
+	}
+	
+	/**
+	 * Releases the given number of pieces.
+	 */
+	public int release(StockItem as Reservable item, int count) {
+		return super.release(item, count);
+	}
+	
+	/**
+	 * Delivers the given number of pieces.
+	 */
+	public void deliver(StockItem as Reservable item, int count) {
+		super.deliver(item, count);
+	}
+	
+	/**
+	 * Returns the number of available pieces in the storage.
+	 */
+	public int numAvail(StockItem as Reservable item) {
+		return super.numAvail(item);
+	}
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/store/StockItem.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/store/StockItem.java
new file mode 100644
index 0000000..59c8edb
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/store/StockItem.java
@@ -0,0 +1,127 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: StockItem.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.store;
+
+/**
+ * This is a simple implementation of a stock item. It contains the name of the item,
+ * its id, price and quantity.
+ */
+public class StockItem {
+	
+	/**
+	 * Id that was assigned at last. 
+	 */
+	private static int lastId = 0;
+	
+	/**
+	 * The id of the stock item.
+	 */
+	private Integer id;
+	
+	/**
+	 * The name of the stock item.
+	 */
+	private String name;
+	
+	/**
+	 * The currently quantity of pieces.
+	 */
+	private int count;
+	
+	/**
+	 * The curently price for a piece (in cents). 
+	 */
+	private int price;
+	
+	/**
+	 * Creates a new stock item initialized with the specified name and price. 
+	 */ 
+	public StockItem (String name, int price) {
+		this.name = name;
+		this.price = price;
+		this.id = new Integer(++ lastId);
+		this.count = 0;
+	}
+	
+	StockItem() {}
+
+	/**
+	 * Returns the id of the item.
+	 */
+	public Integer getId() {return id; }
+	
+	/**
+	 * Returns the name of the item.
+	 */
+	public String getName() { return name; }
+	
+	/**
+	 * Returns the quantity of the item. 
+	 */
+	public int getCount() { return count; }
+	
+	/**
+	 * Returns the price of the item.
+	 */
+	public int getPrice() { return price; }
+
+	/**
+	 * Generates the price string
+	 */
+	public String getPriceString() {
+		int euro = price / 100;
+		int cent = price % 100;
+		return euro + "," + cent + " Euro";
+	}
+	
+	/**
+	 * Generates an entry string which describes the item.
+	 */
+	public String toString() {
+		return "StockItem "+id+" '"+name+"'\t #="+count+",\t a "+getPriceString();
+	}
+
+	/**
+	 * Increases the number of pieces located in the storage.
+	 */
+	public void put (int count) {
+		this.count += count;
+	}
+
+	/**
+	 * Decreases the number of pieces located in the storage.
+	 */
+	public void take (int count) {
+		if (this.count > count)
+			this.count -= count;
+		else
+			this.count = 0;
+	}
+	
+	/**
+	 * Invalidates the current item, meaning that something is wrong with
+	 * this item's records.
+	 * 
+	 * This method only prints to System.err since the Storage has no 
+	 * means for handling invalid items.
+	 */
+	public void invalidate () {
+		System.err.println("*****");
+		System.err.println("*** Item "+this+"\n*** has been invalidated.");
+		System.err.println("*****");
+	}
+}
diff --git a/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/store/Storage.java b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/store/Storage.java
new file mode 100644
index 0000000..e606671
--- /dev/null
+++ b/otdt-examples/OTSample-ordersystem-src/src/org/objectteams/samples/ordersystem/store/Storage.java
@@ -0,0 +1,90 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010  Technical University Berlin, Germany, and others.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: Storage.java 23502 2010-02-08 18:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.objectteams.samples.ordersystem.store;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.io.PrintStream;
+
+/**
+ * This class is a simple model of a storage. A Storage comprises a number of
+ * <code>StockItem</code>s and has methods to add, delete and print these items.
+ */
+public class Storage {
+	
+	/**
+	 * List of available items
+	 */
+	private HashMap<Integer, StockItem> items;
+
+	/**
+	 * Reference to the storage instance
+	 */
+	private static Storage instance = new Storage();
+	
+	/**
+	 * Storage constrctor
+	 */
+	private Storage () {
+		items = new HashMap<Integer, StockItem>();
+	}
+	
+	/**
+	 * Returns the storage instance. This method is used for the object creation (Singleton). 
+	 */
+	public static Storage theInstance() { return instance; }
+
+	/**
+	 * Adds a new item to the storage.
+	 */ 
+	public void add(StockItem item) { 
+		if (items.containsKey(item.getId()))
+			throw new RuntimeException("Already contained item "+item);
+		items.put(item.getId(), item);
+	}
+	
+	/**
+	 * Deletes the given item from the storage.
+	 */
+	public void delete(StockItem item) {
+		if (!items.containsKey(item.getId()))
+			throw new RuntimeException("Not contained item "+item);
+		items.remove(item.getId());
+	}
+	
+	/** 
+	 * Changes the number of pieces for the given item.
+	 */
+	public void changeCount(StockItem item, int difference) {
+		if (difference >= 0)
+			item.put(difference);
+		else
+			item.take(-difference);
+	}
+	
+	/**
+	 * Prints a list of available items.
+	 */
+	public void print(PrintStream out) {
+		Iterator<StockItem> it=items.values().iterator(); 
+		while (it.hasNext()) {
+			out.println(it.next().toString());
+		}
+		out.println();
+	}	
+}
+