cloudstore-developers

Initial commit

4/17/2015 11:35:07 AM

Changes

pom.xml 403(+403 -0)

README.md 67(+67 -0)

Details

pom.xml 403(+403 -0)

diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..fa44151
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,403 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>eu.cloudscale</groupId>
+	<artifactId>showcase</artifactId>
+	<name>showcase</name>
+	<packaging>war</packaging>
+	<version>1.0.0-BUILD-SNAPSHOT</version>
+	<repositories>
+		<repository>
+			<id>spring-milestone</id>
+			<name>Spring Maven MILESTONE Repository</name>
+			<url>http://repo.springsource.org/libs-milestone</url>
+		</repository>
+	</repositories>
+	<properties>
+		<org.springframework.version>3.2.1.RELEASE</org.springframework.version>
+		<log4j.version>1.2.17</log4j.version>
+	</properties>
+	<dependencies>
+		<!-- Spring -->
+
+		<!-- Logging -->
+
+		<!-- <dependency> -->
+		<!-- <groupId>javax.inject</groupId> -->
+		<!-- <artifactId>javax.inject</artifactId> -->
+		<!-- <version>1</version> -->
+		<!-- </dependency> -->
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-api</artifactId>
+			<version>2.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-core</artifactId>
+			<version>2.0.1</version>
+		</dependency>
+		<!-- Servlet -->
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>servlet-api</artifactId>
+			<version>2.5</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet.jsp</groupId>
+			<artifactId>jsp-api</artifactId>
+			<version>2.1</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>javax.servlet</groupId>
+			<artifactId>jstl</artifactId>
+			<version>1.2</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework.data</groupId>
+			<artifactId>spring-data-mongodb</artifactId>
+			<version>1.2.0.RELEASE</version>
+		</dependency>
+		<dependency>
+			<groupId>org.thymeleaf</groupId>
+			<artifactId>thymeleaf-spring3</artifactId>
+			<version>2.0.16</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-orm</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-beans</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-webmvc</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-web</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-core</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-entitymanager</artifactId>
+			<version>4.1.9.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-dbcp</groupId>
+			<artifactId>commons-dbcp</artifactId>
+			<version>1.2.2</version>
+		</dependency>
+		<dependency>
+			<groupId>com.mchange</groupId>
+			<artifactId>c3p0</artifactId>
+			<version>0.9.5-pre1</version>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.24</version>
+		</dependency>
+		<dependency>
+			<groupId>cglib</groupId>
+			<artifactId>cglib</artifactId>
+			<version>3.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-c3p0</artifactId>
+			<version>4.1.9.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-ehcache</artifactId>
+			<version>4.1.9.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>net.sf.ehcache</groupId>
+			<artifactId>ehcache</artifactId>
+			<version>2.7.2</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context-support</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate</artifactId>
+			<version>3.6.0.Beta2</version>
+			<type>pom</type>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-jdbc</artifactId>
+			<version>${org.springframework.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>nz.net.ultraq.thymeleaf</groupId>
+			<artifactId>thymeleaf-layout-dialect</artifactId>
+			<version>1.1.3</version>
+		</dependency>
+		<dependency>
+			<groupId>com.amazonaws</groupId>
+			<artifactId>aws-java-sdk</artifactId>
+			<version>1.4.7</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>1.3.2</version>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-resources-plugin</artifactId>
+				<version>2.6</version>
+				<configuration>
+					<encoding>UTF-8</encoding>
+				</configuration>
+			</plugin>
+			<!-- <plugin> -->
+			<!-- <groupId>org.codehaus.cargo</groupId> -->
+			<!-- <artifactId>cargo-maven2-plugin</artifactId> -->
+			<!-- <version>1.3.3</version> -->
+			<!-- <configuration> -->
+			<!-- <container> -->
+			<!-- <containerId>tomcat7x</containerId> -->
+			<!-- <type>remote</type> -->
+
+			<!-- </container> -->
+			<!-- <configuration> -->
+			<!-- <timeout>60000</timeout> -->
+			<!-- <type>runtime</type> -->
+			<!-- <properties> -->
+			<!-- <cargo.hostname>10.10.40.23</cargo.hostname> -->
+			<!-- <cargo.servlet.port>8081</cargo.servlet.port> -->
+			<!-- <cargo.remote.uri>http://10.10.40.23:8081/manager/text</cargo.remote.uri> -->
+			<!-- <cargo.remote.username>remote-deploy</cargo.remote.username> -->
+			<!-- <cargo.remote.password>prfct42x</cargo.remote.password> -->
+			<!-- </properties> -->
+			<!-- </configuration> -->
+			<!-- <deployer> -->
+			<!-- <type>remote</type> -->
+			<!-- </deployer> -->
+			<!-- <deployables> -->
+			<!-- <deployable> -->
+			<!-- <groupId>${project.groupId}</groupId> -->
+			<!-- <artifactId>${project.artifactId}</artifactId> -->
+			<!-- <type>war</type> -->
+			<!-- <properties> -->
+			<!-- <context>${project.artifactId}</context> -->
+			<!-- </properties> -->
+			<!-- <pingURL>http://10.10.40.23:8081/showcase-1</pingURL> -->
+			<!-- </deployable> -->
+			<!-- </deployables> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-war-plugin</artifactId>
+				<version>2.4</version>
+				<!-- Enable filtering in web.xml -->
+				<configuration>
+					<archive>
+						<manifest>
+							<addClasspath>true</addClasspath>
+						</manifest>
+					</archive>
+					<webResources>
+						<resource>
+							<filtering>true</filtering>
+							<directory>src/main/webapp</directory>
+							<includes>
+								<include>**/web.xml</include>
+							</includes>
+						</resource>
+					</webResources>
+					<warSourceDirectory>src/main/webapp</warSourceDirectory>
+					<webXml>src/main/webapp/WEB-INF/web.xml</webXml>
+				</configuration>
+			</plugin>
+			<!-- <plugin> -->
+			<!-- <artifactId>maven-eclipse-plugin</artifactId> -->
+			<!-- <version>2.9</version> -->
+			<!-- <configuration> -->
+			<!-- <additionalProjectnatures> -->
+			<!-- <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature> -->
+			<!-- </additionalProjectnatures> -->
+			<!-- <additionalBuildcommands> -->
+			<!-- <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand> -->
+			<!-- </additionalBuildcommands> -->
+			<!-- <downloadSources>true</downloadSources> -->
+			<!-- <downloadJavadocs>true</downloadJavadocs> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>2.5.1</version>
+				<configuration>
+					<source>1.6</source>
+					<target>1.6</target>
+					<!-- <compilerArgument>-Xlint:all</compilerArgument> -->
+					<!-- <showWarnings>true</showWarnings> -->
+					<!-- <showDeprecation>true</showDeprecation> -->
+				</configuration>
+			</plugin>
+			<!-- <plugin> -->
+			<!-- <groupId>org.codehaus.mojo</groupId> -->
+			<!-- <artifactId>exec-maven-plugin</artifactId> -->
+			<!-- <configuration> -->
+			<!-- <mainClass>org.test.int1.Main</mainClass> -->
+			<!-- </configuration> -->
+			<!-- </plugin> -->
+			<!-- <plugin> -->
+			<!-- <artifactId>maven-assembly-plugin</artifactId> -->
+			<!-- <configuration> -->
+			<!-- <archive> -->
+			<!-- <manifest> -->
+			<!-- <mainClass>eu.cloudscaleproject.showcase.db.generate.Generate</mainClass> -->
+			<!-- </manifest> -->
+			<!-- </archive> -->
+			<!-- <descriptorRefs> -->
+			<!-- <descriptorRef>jar-with-dependencies</descriptorRef> -->
+			<!-- </descriptorRefs> -->
+			<!-- </configuration> -->
+			<!-- <executions> -->
+			<!-- <execution> -->
+			<!-- <id>make-assembly</id> -->
+			<!-- <phase>package</phase> -->
+			<!-- <goals> -->
+			<!-- <goal>single</goal> -->
+			<!-- </goals> -->
+			<!-- </execution> -->
+			<!-- </executions> -->
+			<!-- </plugin> -->
+
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>exec-maven-plugin</artifactId>
+				<version>1.2.1</version>
+				<configuration>
+					<executable>java</executable>
+					<arguments>
+						<argument>-Djava.library.path=${project.build.directory}/lib</argument>
+						<argument>-classpath ${compile.classpath}</argument>
+						<argument>eu.cloudscale.showcase.generate.Generate</argument>
+						<argument>${dbtype}</argument>
+					</arguments>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<version>2.8</version>
+				<executions>
+					<execution>
+						<id>copy-dependencies</id>
+						<phase>package</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+						<configuration>
+							<overWriteReleases>false</overWriteReleases>
+							<overWriteSnapshots>false</overWriteSnapshots>
+							<overWriteIfNewer>true</overWriteIfNewer>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+				<filtering>true</filtering>
+				<excludes>
+					<exclude>jmeter</exclude>
+					<exclude>matlab</exclude>
+					<exclude>rbe</exclude>
+					<exclude>results</exclude>
+					<exclude>aws</exclude>
+				</excludes>
+			</resource>
+		</resources>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings 
+					only. It has no influence on the Maven build itself. -->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>
+											org.apache.maven.plugins
+										</groupId>
+										<artifactId>
+											maven-dependency-plugin
+										</artifactId>
+										<versionRange>
+											[2.8,)
+										</versionRange>
+										<goals>
+											<goal>
+												copy-dependencies
+											</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<ignore></ignore>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+	<profiles>
+		<profile>
+			<id>amazon-hibernate</id>
+			<properties>
+				<eu.cloudscale.environment>aws</eu.cloudscale.environment>
+				<eu.cloudscale.datasource>hibernate</eu.cloudscale.datasource>
+				<eu.cloudscale.showcase.generate.properties>classpath:database/database.aws.hibernate.properties</eu.cloudscale.showcase.generate.properties>
+			</properties>
+		</profile>
+		<profile>
+			<id>amazon-mongodb</id>
+			<properties>
+				<eu.cloudscale.environment>aws</eu.cloudscale.environment>
+				<eu.cloudscale.datasource>mongodb</eu.cloudscale.datasource>
+			</properties>
+		</profile>
+	</profiles>
+</project>

README.md 67(+67 -0)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..80dd278
--- /dev/null
+++ b/README.md
@@ -0,0 +1,67 @@
+## Introduction
+
+Here is the source code of CloudStore the showcase for CloudScale Project. It is web application written in Java SpringFramework according to TPC-W specification.
+
+You can read more about CloudScale project on: http://www.cloudscale-project.eu
+
+## Running from Eclipse
+
+Import project into Eclipse. Before running showcase, you will need to setup Apache Tomcat server in Eclipse. Don't forget to add Maven Dependencies to the Deployment Assembly setting for this project.
+
+To run showcase on Tomcat server, right click on project and choose Run As -> Run on server. 
+
+## Building
+
+Before building a war package choose which database you want to use. Showcase support two databases, MySQL and MongoDB. Configuration files for each one of them are in `src/main/resources/database/`.
+
+To build showcase for MySQL or MongoDB use Maven profiles:
+
+```bash
+$ mvn -Phibernate -Dconnection_pool_size=<number> install 
+```
+
+or
+
+```bash
+$ mvn -Pmongodb -Dconnection_pool_size=<number> install
+```
+
+Notice the `-Dconnection_pool_size=<number>` compile parameter. Here you set the maximum size of connection pool for database.
+
+After building you get `.war` file in `target/` directory. You can upload this file on Tomcat or any other Java web container that is able to run `.war` files.
+
+### Generating images
+
+You can generate images by configuring and executing the file `generate_images.sh` with Perl:
+
+```bash
+$ perl generate_images.sh
+```
+
+**NOTICE** You need to add the execute permission to `ImgGen/ImgFiles/tpcwIMG`!
+
+This script will generate images in `main/webapp/resources/img/` directory. 
+
+Important configuration properties in `generate_images.sh` are:
+
+ 1. `$NUM_ITEMS` - refers to the number of rows in `items` database table
+ 2. `$DEST_DIR` - directory where to save images
+ 3. `$GEN_DIR` - the location of generator script 
+ 
+### Generating database
+
+To generate database you need to edit `src/main/resources/app-context.xml` file and replace row:
+
+```
+<import resource="${eu.cloudscale.environment}" />
+```
+
+with
+
+```
+<import resource="hibernate.xml" /> or <import resource="mongodb.xml" />
+```
+
+You'll also need to edit a configuration for choosen database `hibernate.xml` or `mongodb.xml` and set the actual number instead of variable placeholder `${connection_pool_size}`.
+
+Then you can run `src/main/java/eu/cloudscale/showcase/generate/Generate.java` from Eclipse
diff --git a/src/main/java/eu/cloudscale/showcase/db/BuyConfirmResult.java b/src/main/java/eu/cloudscale/showcase/db/BuyConfirmResult.java
new file mode 100644
index 0000000..7d4be6a
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/BuyConfirmResult.java
@@ -0,0 +1,42 @@
+package eu.cloudscale.showcase.db;
+
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+
+
+public class BuyConfirmResult
+{
+	public IOrders order;
+	public IShoppingCart cart;
+	
+	public BuyConfirmResult(IOrders order2, IShoppingCart sc)
+    {
+        order = order2;
+        cart = sc;
+    }
+
+	
+    public IOrders getOrder()
+    {
+    	return order;
+    }
+
+	
+    public void setOrder(IOrders order)
+    {
+    	this.order = order;
+    }
+
+	
+    public IShoppingCart getCart()
+    {
+    	return cart;
+    }
+
+	
+    public void setCart(IShoppingCart cart)
+    {
+    	this.cart = cart;
+    }
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/common/ContextHelper.java b/src/main/java/eu/cloudscale/showcase/db/common/ContextHelper.java
new file mode 100644
index 0000000..461e456
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/common/ContextHelper.java
@@ -0,0 +1,22 @@
+package eu.cloudscale.showcase.db.common;
+
+import org.springframework.context.support.GenericXmlApplicationContext;
+
+
+public class ContextHelper 
+{
+	private static GenericXmlApplicationContext ctx = null;
+	
+	public static GenericXmlApplicationContext getApplicationContext()
+	{
+		if( ctx == null)
+		{
+			ctx = new GenericXmlApplicationContext();
+			ctx.load("classpath:app-context.xml");
+			ctx.refresh();
+		}
+		
+		return ctx;
+	}
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/common/DatabaseHelper.java b/src/main/java/eu/cloudscale/showcase/db/common/DatabaseHelper.java
new file mode 100644
index 0000000..9984d66
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/common/DatabaseHelper.java
@@ -0,0 +1,21 @@
+package eu.cloudscale.showcase.db.common;
+
+import eu.cloudscale.showcase.db.services.IService;
+
+
+public class DatabaseHelper
+{
+	
+    public static IService getDatabase()
+	{
+
+    	IService db = (IService) ContextHelper.getApplicationContext().getBean( "service" );
+    	if (db == null)
+    	{
+    		System.out.println("Service is null");
+    	}
+		return db;
+
+	}
+	
+}
\ No newline at end of file
diff --git a/src/main/java/eu/cloudscale/showcase/db/common/Soundex.java b/src/main/java/eu/cloudscale/showcase/db/common/Soundex.java
new file mode 100644
index 0000000..da72e86
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/common/Soundex.java
@@ -0,0 +1,92 @@
+package eu.cloudscale.showcase.db.common;
+
+public class Soundex
+{
+
+	public static String soundex(String s)
+	{
+		char[] x = s.toUpperCase().toCharArray();
+		char firstLetter = x[0];
+
+		// convert letters to numeric code
+		for ( int i = 0; i < x.length; i++ )
+		{
+			switch ( x[i] )
+			{
+				case 'B':
+				case 'F':
+				case 'P':
+				case 'V':
+				{
+					x[i] = '1';
+					break;
+				}
+
+				case 'C':
+				case 'G':
+				case 'J':
+				case 'K':
+				case 'Q':
+				case 'S':
+				case 'X':
+				case 'Z':
+				{
+					x[i] = '2';
+					break;
+				}
+
+				case 'D':
+				case 'T':
+				{
+					x[i] = '3';
+					break;
+				}
+
+				case 'L':
+				{
+					x[i] = '4';
+					break;
+				}
+
+				case 'M':
+				case 'N':
+				{
+					x[i] = '5';
+					break;
+				}
+
+				case 'R':
+				{
+					x[i] = '6';
+					break;
+				}
+
+				default:
+				{
+					x[i] = '0';
+					break;
+				}
+			}
+		}
+
+		// remove duplicates
+		String output = "" + firstLetter;
+		for ( int i = 1; i < x.length; i++ )
+			if ( x[i] != x[i - 1] && x[i] != '0' )
+				output += x[i];
+
+		// pad with 0's or truncate
+		output = output + "0000";
+		return output.substring( 0, 4 );
+	}
+
+	public static void main(String[] args)
+	{
+		String name1 = args[0];
+		String name2 = args[1];
+		String code1 = soundex( name1 );
+		String code2 = soundex( name2 );
+		System.out.println( code1 + ": " + name1 );
+		System.out.println( code2 + ": " + name2 );
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AddressDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AddressDaoImpl.java
new file mode 100644
index 0000000..ab059c6
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AddressDaoImpl.java
@@ -0,0 +1,46 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.hibernate.Address;
+
+@Repository
+//@Transactional(readOnly=true)
+public class AddressDaoImpl extends DaoImpl<IAddress> implements IAddressDao
+{
+	public AddressDaoImpl()
+	{
+		System.out.println("AddressDaoImpl constructor called!");
+	}
+
+	@Autowired
+	public AddressDaoImpl(SessionFactory sessionFactory)
+	{
+		super(sessionFactory);
+	}
+
+	@Override
+    public List<IAddress> findAll()
+    {
+		return null;
+    }
+
+    @Override
+    public IAddress findById(int id)
+    {
+		return (IAddress) getCurrentSession().get( Address.class, id );
+    }
+    
+    @Override
+    public IAddress getObject()
+    {
+    	return new Address();
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AuthorDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AuthorDaoImpl.java
new file mode 100644
index 0000000..36d8288
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/AuthorDaoImpl.java
@@ -0,0 +1,64 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.hibernate.Author;
+
+@Repository
+//@Transactional(readOnly=true)
+public class AuthorDaoImpl extends DaoImpl<IAuthor> implements IAuthorDao
+{
+	public AuthorDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+
+	@Autowired
+	public AuthorDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<IAuthor> findAll()
+    {
+		String hql = "FROM Author";
+		Query q = getCurrentSession().createQuery( hql );
+		return q.list();
+    }
+
+    @Override
+    public IAuthor findById(int id)
+    {
+		return (IAuthor) getCurrentSession().get( Author.class, id );
+    }
+
+    @Override
+	public IAuthor getObject()
+	{
+		return new Author();
+	}
+
+	@Override
+    public List<IAuthor> findBySoundexLname(String keyword)
+    {
+	    String hql = "SELECT A FROM Author as A, Item as I WHERE substring(soundex(A.ALname),0,4)=substring(soundex(:keyword),0,4) AND I.author.AId=A.AId ORDER BY I.ITitle";
+	    
+	    Query query = getCurrentSession().createQuery( hql );
+	    query.setParameter( "keyword", keyword );
+	    query.setMaxResults( 50 );
+	    
+	    List res = (List<Author>) query.list();
+	    
+	    return res;
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CcXactsDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CcXactsDaoImpl.java
new file mode 100644
index 0000000..55a0f21
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CcXactsDaoImpl.java
@@ -0,0 +1,67 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.hibernate.CcXacts;
+
+@Repository
+//@Transactional(readOnly=true)
+public class CcXactsDaoImpl extends DaoImpl<ICcXacts> implements ICcXactsDao
+{
+	
+	public CcXactsDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public CcXactsDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+	
+    @Override
+	public ICcXacts getObject()
+	{
+		return new CcXacts();
+	}
+
+	@SuppressWarnings( "rawtypes" )
+    @Override
+    public int getLastCcXactsId()
+    {
+		String hql = "SELECT CX_ID FROM cc_xacts ORDER BY CX_ID DESC";
+		
+		Query query = getCurrentSession().createQuery( hql );
+		query.setMaxResults( 1 );
+		List res = query.list();
+		
+		return ((ICcXacts) res.get( 0 )).getId();
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public ICcXacts findById(Integer id)
+    {
+		String hql = "SELECT * FROM cc_xacts WHERE CX_ID = :id";
+		Query query = getCurrentSession().createQuery( hql );
+		query.setParameter( "id", id );		
+		
+		List<CcXacts> res = query.list();
+		
+		if( res.isEmpty() )
+			return null;
+		
+		return res.get( 0 );
+    }
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CountryDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CountryDaoImpl.java
new file mode 100644
index 0000000..6dd815d
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CountryDaoImpl.java
@@ -0,0 +1,72 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.hibernate.Country;
+
+@Repository
+//@Transactional(readOnly=true)
+public class CountryDaoImpl extends DaoImpl<ICountry> implements ICountryDao
+{
+	private String tableName = "country";
+
+	public CountryDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public CountryDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+    @Override
+    public ICountry findById(int id)
+    {
+//		String hql = "FROM Country C WHERE C.coId = :coId";
+//		Query q = this.session.createQuery(hql);
+//		q.setParameter("coId", id);
+//		List<Country> res = (List<Country>) q.list();
+//		return res.get(0);
+		return (ICountry) getCurrentSession().get( Country.class, id );
+    }
+
+    @SuppressWarnings( "unchecked" )
+    @Override
+    public ICountry getByName(String country)
+    {
+	    String hql = "SELECT C FROM Country as C WHERE C.coName = :countryName";
+	    Query query = getCurrentSession().createQuery( hql );
+	    query.setParameter( "countryName", country );
+	    
+	    List<Query> res = query.list();
+	    if( res.isEmpty() )
+	    {
+	    	return null;
+	    }
+	    
+	    return (ICountry) res.get( 0 );
+    }
+
+    @Override
+	public ICountry getObject()
+	{
+		return new Country();
+	}
+    
+    @Override
+    public void createTable()
+    {
+    	String query = "CREATE TABLE IF NOT EXISTS " + this.tableName;
+    	getCurrentSession().createSQLQuery( query );
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CustomerDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CustomerDaoImpl.java
new file mode 100644
index 0000000..9207073
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/CustomerDaoImpl.java
@@ -0,0 +1,75 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.hibernate.Customer;
+
+@Repository
+//@Transactional(readOnly=true)
+public class CustomerDaoImpl extends DaoImpl<ICustomer> implements ICustomerDao
+{
+
+	public CustomerDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+//		System.out.println("Normal constructor called!");
+	}
+	
+	@Autowired
+	public CustomerDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+    @SuppressWarnings( "rawtypes" )
+    @Override
+    public ICustomer getUserBy(String username, String password)
+    {
+	    String query = "SELECT C FROM Customer as C WHERE C.CUname = :username AND C.CPasswd = :passwd";
+	    
+	    Query q = getCurrentSession().createQuery( query );
+	    q.setMaxResults( 1 );
+	    q.setParameter( "username", username );
+	    q.setParameter( "passwd", password );
+	    List res = q.list();
+	    
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    return (ICustomer) res.get( 0 );
+    }
+
+
+    @Override
+    public ICustomer getObject()
+    {
+	    return new Customer();
+    }
+
+    @Override
+    public ICustomer findById(Integer id)
+    {
+		return (ICustomer) getCurrentSession().get( Customer.class, id );
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<ICustomer> findByAddress(IAddress address)
+    {
+		String query = "SELECT C FROM Customer as C WHERE C.address = :address";
+		
+		Query q = getCurrentSession().createQuery( query );
+		q.setParameter( "address", address );
+		
+		return q.list();
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/DaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/DaoImpl.java
new file mode 100644
index 0000000..3f8516f
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/DaoImpl.java
@@ -0,0 +1,76 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import javax.naming.NamingException;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+
+//@Transactional(readOnly=true)
+public class DaoImpl<T> implements IDao<T>
+{
+	protected int count = 1;
+	
+	protected SessionFactory sessionFactory;
+	
+	public DaoImpl()
+    {
+    }
+	
+
+	public DaoImpl(SessionFactory sFactory)
+	{
+		sessionFactory = sFactory;
+	}
+	
+	protected final Session getCurrentSession() 
+	{
+		Session session = sessionFactory.getCurrentSession();
+		//System.out.println("SESSION = " + session.getClass().hashCode());
+        return sessionFactory.getCurrentSession();
+    }
+	
+	@Override
+	public T shrani(T object) 
+	{	
+		//Session session = sessionFactory.getCurrentSession();
+	    //session.saveOrUpdate(object);
+		sessionFactory.getCurrentSession().saveOrUpdate( object );
+    	return object;
+	}
+	
+	@Override
+	public T shrani(T object, boolean flag) 
+	{	
+		//Session session = sessionFactory.getCurrentSession();
+	    //session.saveOrUpdate(object);
+		//System.out.println("[DaoImpl.shrani(object, flag)] " + ((IShoppingCart) object).getScId());
+		sessionFactory.getCurrentSession().saveOrUpdate( object );
+    	return object;
+	}
+
+	@Override
+    public void finish()
+    {
+    }
+
+    @Override
+    public T getObject()
+    {
+		try
+        {
+	        throw new UnsupportedOperationException( "Implement in DAO implementation!" );
+        }
+        catch ( UnsupportedOperationException e )
+        {
+	        e.printStackTrace();
+        }
+       
+		return null;
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ItemDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ItemDaoImpl.java
new file mode 100644
index 0000000..7d7280f
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ItemDaoImpl.java
@@ -0,0 +1,280 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.hibernate.Item;
+
+@Repository
+//@Transactional(readOnly=true)
+public class ItemDaoImpl extends DaoImpl<IItem> implements IItemDao
+{
+
+	public ItemDaoImpl()
+	{
+		// super( (SessionFactory)
+		// ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+
+	@Autowired
+	public ItemDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAll()
+	{
+		String hql = "FROM Item";
+		Query q = getCurrentSession().createQuery( hql );
+		q.setMaxResults( 20 );
+		return (List<IItem>) q.list();
+	}
+
+	@SuppressWarnings( "unused" )
+	@Override
+	public IItem findById(int id)
+	{
+		String hql = "SELECT I, A FROM Item I, Author A WHERE I.IId = :itemId AND A.AId = I.author.AId";
+		Query q = getCurrentSession().createQuery( hql );
+		q.setParameter( "itemId", id );
+		List res = q.list();
+		if ( res != null && res.get( 0 ) == null )
+			return null;
+
+		IItem item = (Item) ( (Object[]) res.get( 0 ) )[0];
+		// Hibernate.initialize( item.getShoppingCartLines() );
+		// Hibernate.initialize( item.getOrderLines());
+		return item;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> getPromotional()
+	{
+		Random rand = new Random();
+		String hql = "SELECT " +
+						"I2.I_THUMBNAIL as I2_THUMBNAIL," +
+						"I2.I_ID as I2_ID," +
+						"I3.I_THUMBNAIL as I3_THUMBNAIL," +
+						"I3.I_ID as I3_ID," +
+						"I4.I_THUMBNAIL as I4_THUMBNAIL," +
+						"I4.I_ID as I4_ID," +
+						"I5.I_THUMBNAIL as I5_THUMBNAIL," +
+						"I5.I_ID as I5_ID, " +
+						"I6.I_THUMBNAIL as I6_THUMBNAIL," +
+						"I6.I_ID as I6_ID " +
+					"FROM " +
+						"item as I " +
+					"LEFT JOIN " +
+						"item as I2 ON I.I_RELATED1 = I2.I_ID " +
+					"LEFT JOIN " +
+						"item as I3 ON I.I_RELATED2 = I3.I_ID " +
+					"LEFT JOIN " +
+						"item as I4 ON I.I_RELATED3 = I4.I_ID " +
+					"LEFT JOIN " +
+						"item as I5 ON I.I_RELATED4 = I5.I_ID " +
+					"LEFT JOIN " +
+						"item as I6 ON I.I_RELATED5 = I6.I_ID " +
+					"WHERE I.I_ID = " + (rand.nextInt((1000) + 1) + 1);
+		
+		long startTime = System.currentTimeMillis();
+		Query q = getCurrentSession().createSQLQuery( hql );
+		q.setMaxResults( 1 );
+
+		List<Object> res = (List<Object>) q.list();
+		List<IItem> results = new ArrayList<IItem>();
+
+		try
+		{
+			Object[] relateds = (Object[]) res.get(0);
+			
+			for(int i=0; i < relateds.length; i+=2)
+			{
+				String related = (String) relateds[i];
+				Integer id = (Integer) relateds[i+1];
+				
+				Item item = new Item();
+				item.setIThumbnail(related);
+				item.setIId(id);
+				results.add(item);
+			}
+		}
+		catch(IndexOutOfBoundsException e)
+		{
+			System.out.println("SIMON, ERROR OCCURED!!!");
+			System.out.println("TIME = " + (System.currentTimeMillis() - startTime));
+			System.out.println(hql);
+			e.printStackTrace();
+		}
+		
+		return results;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+//	@Transactional( readOnly = true )
+	public List<IItem> getNewProducts(String category)
+	{
+		Session session = getCurrentSession();
+		Query query = session
+		        .createQuery( "SELECT I, A FROM Item as I, Author as A WHERE I.author.AId = A.AId AND I.ISubject = :category "
+		                + "ORDER BY I.IPubDate DESC, I.ITitle" );
+		query.setString( "category", category );
+		query.setMaxResults( 50 );
+		ArrayList<IItem> newProducts = new ArrayList<IItem>();
+
+		List<Object[]> res = query.list();
+		for ( int i = 0; i < res.size(); i++ )
+		{
+			newProducts.add( (Item) ( res.get( i )[0] ) );
+		}
+		return newProducts;
+	}
+
+	@SuppressWarnings( "unchecked" )
+//	@Transactional( readOnly = true )
+	public List<Object[]> getBestSellers(String category)
+	{
+		Session session = getCurrentSession();
+
+		 Query query =
+		 session.createQuery("SELECT I.IId, A.AFname, A.ALname, I.ITitle, SUM(OL.olQty) AS val " +
+		 		"FROM OrderLine as OL, Item as I, Author as A " +
+		 		"WHERE " +
+		 		"I.author.AId = A.AId AND " +
+		 		"I.IId = OL.item.IId AND " +
+		 		"I.ISubject = :category " +
+		 		"GROUP BY OL.item.IId " +
+		 		"ORDER BY val DESC");
+
+//		Query query = session
+//		        .createSQLQuery(
+//		                "SELECT i_id as a, i_title as b, a_fname as c, a_lname as d, SUM(ol_qty) AS val "
+//		                        + "FROM "
+//		                        + "orders, order_line, item, author "
+//		                        + "WHERE "
+//		                        + "order_line.ol_o_id = orders.o_id AND item.i_id = order_line.ol_i_id "
+//		                        + "AND item.i_subject = :category AND item.i_a_id = author.a_id GROUP BY i_id "
+//		                        + "ORDER BY orders.o_date, val DESC" )
+//		        .addScalar( "a" ).addScalar( "b" ).addScalar( "c" )
+//		        .addScalar( "d" ).addScalar( "val" );
+
+		query.setParameter( "category", category );
+		query.setMaxResults( 50 );
+
+		long start = System.nanoTime();
+		List<Object[]> res = query.list();
+		System.out.println( "[best-sellers] Category = " + category + ", cas izvajanja = "
+		        + ( System.nanoTime() - start ) / 1E9 );
+
+		return res;
+
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public IItem getRandomItem()
+	{
+		String hql = "SELECT I FROM Item as I ORDER BY RAND()";
+		Query query = getCurrentSession().createQuery( hql );
+		query.setMaxResults( 1 );
+
+		List<Object> res = query.list();
+		if ( res.isEmpty() )
+		{
+			return null;
+		}
+
+		return (IItem) res.get( 0 );
+	}
+
+	@Override
+	public IItem getObject()
+	{
+		return new Item();
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAllByAuthor(IAuthor author)
+	{
+		String hql = "SELECT I FROM Item as I WHERE I.author = :author ORDER BY I.ITitle";
+		Query query = getCurrentSession().createQuery( hql );
+
+		query.setParameter( "author", author );
+		query.setMaxResults( 50 );
+		// query.setCacheable( true );
+
+		List<IItem> res = query.list();
+
+		ArrayList<IItem> items = new ArrayList<IItem>();
+		for ( IItem item : res )
+		{
+			Hibernate.initialize( item.getAuthor() );
+			items.add( item );
+		}
+
+		return items;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAllByTitle(String keyword)
+	{
+		String hql = "SELECT I FROM Item as I, Author as A WHERE I.author.AId = A.AId AND substring(soundex(I.ITitle), 0, 4) = substring(soundex(:title), 0, 4) ORDER BY I.ITitle";
+
+		Query query = getCurrentSession().createQuery( hql );
+
+		query.setParameter( "title", keyword );
+		query.setMaxResults( 50 );
+		// query.setCacheable( true );
+
+		List<IItem> res = query.list();
+
+		for ( IItem item : res )
+		{
+			Hibernate.initialize( item.getAuthor() );
+		}
+
+		return res;
+	}
+
+	@SuppressWarnings( "unchecked" )
+	@Override
+	public List<IItem> findAllBySubject(String keyword)
+	{
+		String hql = "SELECT I FROM Item as I WHERE I.ISubject = :subject ORDER BY I.ITitle";
+
+		Query query = getCurrentSession().createQuery( hql );
+
+		query.setParameter( "subject", keyword );
+		query.setMaxResults( 50 );
+		// query.setCacheable( true );
+
+		List<IItem> res = query.list();
+		for ( IItem item : res )
+		{
+			Hibernate.initialize( item.getAuthor() );
+		}
+
+		return res;
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrderLineDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrderLineDaoImpl.java
new file mode 100644
index 0000000..bb7ffc7
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrderLineDaoImpl.java
@@ -0,0 +1,60 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.hibernate.OrderLine;
+
+@Repository
+//@Transactional(readOnly=true)
+public class OrderLineDaoImpl extends DaoImpl<IOrderLine> implements IOrderLineDao
+{
+
+	public OrderLineDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public OrderLineDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+	
+    @Override
+	public IOrderLine getObject()
+	{
+		return new OrderLine();
+	}
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<IOrderLine> findAllByOrder(IOrders orders)
+    {
+	    String hql = "SELECT OL FROM OrderLine as OL WHERE OL.orders = :order";
+	    
+	    Query query = getCurrentSession().createQuery( hql );
+	    query.setParameter( "order", orders );
+	    
+	    return query.list();
+    }
+
+	@Override
+    public IOrderLine findById(Integer id)
+    {
+		String hql = "SELECT OL FROM OrderLine as OL WHERE OL.id = :id";
+		Query query = getCurrentSession().createQuery( hql );
+		query.setParameter("id", id);
+		
+		return (IOrderLine) query.uniqueResult();
+    }
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrdersDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrdersDaoImpl.java
new file mode 100644
index 0000000..79b41f4
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/OrdersDaoImpl.java
@@ -0,0 +1,173 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.hibernate.Orders;
+
+@Repository
+//@Transactional(readOnly=true)
+public class OrdersDaoImpl extends DaoImpl<IOrders> implements IOrdersDao
+{
+	public OrdersDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public OrdersDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+	
+    @Override
+	public IOrders getObject()
+	{
+		return new Orders();
+	}
+
+	@SuppressWarnings( { "rawtypes" } )
+    @Override
+    public IOrders getMostRecentOrder(ICustomer customer)
+    {
+
+		String hql16 = "SELECT O FROM Orders as O, Customer as C WHERE O.customer.CId = C.CId AND C.CUname = :cid ORDER BY O.ODate, O.OId DESC";
+		Query query16 = getCurrentSession().createQuery( hql16 );
+		query16.setMaxResults( 1 );
+		query16.setParameter( "cid", String.valueOf(customer.getCId() ));
+		List res16 = query16.list();
+		
+		if( res16 == null || res16.isEmpty() )
+		{
+			return null;
+		}
+		
+		IOrders order = (IOrders) res16.get( 0 );
+//		Hibernate.initialize( order.getOrderLines() );
+		
+		return order;
+////		SELECT O FROM Customer as C, Orders as O WHERE C.CId = O.OCId AND C.CUname = 'SE' ORDER BY O.ODate, O.OId DESC
+//		String hql1 = "SELECT O FROM Customer as C, Orders as O"
+//					+ " WHERE C.CId = O.customer.CId"
+//					+ " AND C.CUname = :username"
+//					+ " ORDER BY O.ODate, O.OId DESC";
+//		Query query = getCurrentSession().createQuery( hql1 );
+//		query.setParameter( "username", customerUsername );
+//		query.setMaxResults( 1 );
+//		if( query.list().isEmpty() )
+//			return null;
+//		
+//		IOrders order = (IOrders) query.list().get( 0 );
+//		
+//		String hql2 = "SELECT O, C, CX, SHIP, SHIP_CO, BILL, BILL_CO FROM"
+//					+ " Orders as O, " 
+//				    + " Customer as C," 
+//				    + " CcXacts as CX, "
+//				    + " Address as SHIP, "
+//				    + " Address as BILL, "
+//				    + " Country as SHIP_CO, "
+//				    + " Country as BILL_CO "
+//				    + " WHERE O.OId = :orderId"
+//				    + " AND CX.id.cxOId = O.OId"
+//					+ " AND C.CId = O.customer.CId"
+//					+ " AND O.addressByOBillAddrId.addrId = BILL.addrId"
+//					+ " AND BILL.country.coId = BILL_CO.coId"
+//					+ " AND O.addressByOShipAddrId.addrId = SHIP.addrId"
+//					+ " AND SHIP.country.coId = SHIP_CO.coId"
+//					+ " ORDER BY O.ODate, O.OId DESC";
+//		query = getCurrentSession().createQuery( hql2 );
+//		query.setMaxResults(1);
+//		query.setParameter("orderId", order.getOId());
+//		
+//		
+//		List res = query.list();
+//		if( res.isEmpty() )
+//			return null;
+//		
+//		order = new Orders((Object[]) query.list().get( 0 ));
+//		
+//	    return order;
+    }
+
+	@Override
+    public IOrders findById(Integer cxOId)
+    {
+		return (IOrders) getCurrentSession().get( Orders.class, cxOId );
+    }
+	
+//	  @Override
+//      public Orders getMostRecentOrder(String customerUsername, List<OrderLine> orderLines)
+//      {
+//    		String hql1 = "SELECT o_id "
+//					+ "FROM customer, orders "
+//					+ "WHERE customer.c_id = orders.o_c_id "
+//					+ "AND c_uname = ? "
+//					+ "ORDER BY o_date, orders.o_id DESC "
+//					+ "LIMIT 0,1";
+//    		Query query = getCurrentSession().createQuery( hql1 );
+//    		query.setParameter( "username", customerUsername );
+//    		query.setMaxResults( 1 );
+//    		if( query.list().isEmpty() )
+//    			return null;
+//    		
+//    		Orders order = (Orders) query.list().get( 0 );
+//    		
+//    		String hql2 = "SELECT orders.*, customer.*, "
+//					+ "  cc_xacts.cx_type, "
+//					+ "  ship.addr_street1 AS ship_addr_street1, "
+//					+ "  ship.addr_street2 AS ship_addr_street2, "
+//					+ "  ship.addr_state AS ship_addr_state, "
+//					+ "  ship.addr_zip AS ship_addr_zip, "
+//					+ "  ship_co.co_name AS ship_co_name, "
+//					+ "  bill.addr_street1 AS bill_addr_street1, "
+//					+ "  bill.addr_street2 AS bill_addr_street2, "
+//					+ "  bill.addr_state AS bill_addr_state, "
+//					+ "  bill.addr_zip AS bill_addr_zip, "
+//					+ "  bill_co.co_name AS bill_co_name "
+//					+ "FROM customer, orders, cc_xacts,"
+//					+ "  address AS ship, "
+//					+ "  country AS ship_co, "
+//					+ "  address AS bill,  "
+//					+ "  country AS bill_co "
+//					+ "WHERE orders.o_id = :orderId "
+//					+ "  AND cx_o_id = orders.o_id "
+//					+ "  AND customer.c_id = orders.o_c_id "
+//					+ "  AND orders.o_bill_addr_id = bill.addr_id "
+//					+ "  AND bill.addr_co_id = bill_co.co_id "
+//					+ "  AND orders.o_ship_addr_id = ship.addr_id "
+//					+ "  AND ship.addr_co_id = ship_co.co_id "
+//					+ "  AND orders.o_c_id = customer.c_id";
+//    		query = getCurrentSession().createQuery( hql2 );
+//    		query.setMaxResults(1);
+//    		query.setParameter("orderId", order.getOId());
+//    		
+//    		List res = query.list();
+//    		if( res.isEmpty() )
+//    			return null;
+//    		
+//    		order = new Orders((Object[]) query.list().get( 0 ));
+//    		
+//    		String hql3 = "SELECT * "
+//					+ "FROM order_line, item "
+//					+ "WHERE ol_o_id = :orderId " + "AND ol_i_id = i_id";
+//    		
+//    		query = getCurrentSession().createQuery( hql3 );
+//    		query.setParameter( "orderId", order.getOId() );
+//    		List<Object[]> res3 = query.list();
+//    		
+//    		for( Object[] obj : res3 )
+//    		{
+//    			orderLines.add( (OrderLine) obj[0] );
+//    		}
+//    		
+//    	    return order;
+//      }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartDaoImpl.java
new file mode 100644
index 0000000..60bc0ae
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartDaoImpl.java
@@ -0,0 +1,74 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCart;
+
+@Repository
+public class ShoppingCartDaoImpl extends DaoImpl<IShoppingCart> implements IShoppingCartDao
+{
+
+
+	@Autowired
+	public ShoppingCartDaoImpl(SessionFactory sessionFactory)
+	{
+		super(sessionFactory);
+	}
+
+    @SuppressWarnings( "rawtypes" )
+    @Override
+//    @Transactional(readOnly=true)
+    public IShoppingCart findById(Integer shoppingId)
+    {
+    	Session session = getCurrentSession();
+	    String hql = "SELECT SC FROM ShoppingCart as SC WHERE SC.scId = :scId";
+	    
+	    Query query = session.createQuery(hql);
+	    query.setParameter( "scId", shoppingId );
+	    
+	   
+    	List res = query.list();
+	    
+	    if( res.isEmpty() )
+	    {
+//	    	System.out.println("results are empty! " + query.getQueryString());
+	    	return null;
+	    }
+	    
+	    ShoppingCart sc = (ShoppingCart) res.get( 0 );
+	    Hibernate.initialize( sc.getShoppingCartLines() );
+	    return sc;
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+//    @Transactional(readOnly=true)
+    public List<IShoppingCartLine> findAllBySC(IShoppingCart shoppingCart)
+    {
+		String hql = "SELECT SCL FROM ShoppingCartLine as SCL WHERE SCL.shoppingCart = :shoppingCart";
+		
+		Query query = getCurrentSession().createQuery( hql );
+		query.setParameter( "shoppingCart", shoppingCart );
+		
+		return query.list();
+    }
+	
+	@Override
+	public IShoppingCart getObject()
+	{
+		return new ShoppingCart();
+	}
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartLineDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartLineDaoImpl.java
new file mode 100644
index 0000000..220145c
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/hibernate/impl/ShoppingCartLineDaoImpl.java
@@ -0,0 +1,95 @@
+package eu.cloudscale.showcase.db.dao.hibernate.impl;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCartLine;
+
+@Repository
+//@Transactional(readOnly=true)
+public class ShoppingCartLineDaoImpl extends DaoImpl<IShoppingCartLine> implements IShoppingCartLineDao
+{
+
+	
+	public ShoppingCartLineDaoImpl()
+	{
+//		super( (SessionFactory) ContextHelper.getApplicationContext().getBean( "sessionFactory" ) );
+	}
+	
+	@Autowired
+	public ShoppingCartLineDaoImpl(SessionFactory sessionFactory)
+	{
+		super( sessionFactory );
+	}
+
+    @SuppressWarnings( "unchecked" )
+    @Override
+    public IShoppingCartLine getBySCandItem(Integer shoppingId, int itemId)
+    {
+		String hql1 = "SELECT SCL FROM ShoppingCartLine as SCL WHERE SCL.shoppingCart.scId = :scId AND SCL.item.IId = :itemId";
+	    Query q1 = getCurrentSession().createQuery( hql1 );
+	    q1.setMaxResults( 1 );
+	    q1.setParameter( "scId", shoppingId );
+	    q1.setParameter( "itemId", itemId);
+	    
+	    List<Object> res = q1.list();
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    return (IShoppingCartLine) res.get( 0 );
+	    
+    }
+
+	@Override
+    public void delete(IShoppingCartLine obj)
+    {
+		Session session = getCurrentSession();
+		session.delete( obj );
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public boolean isCartEmpty(int scId)
+    {
+		String hql = "SELECT COUNT(SCL) FROM ShoppingCartLine as SCL WHERE SCL.shoppingCart.scId = :scId";
+		Query q1 = getCurrentSession().createQuery( hql );
+	    q1.setMaxResults( 1 );
+	    q1.setParameter( "scId", scId);
+	    
+	    List<Long> res = q1.list();
+	    if( res != null && res.get(0) == 0 )
+	    	return true;
+	    
+	    return false;
+    }
+
+	@SuppressWarnings( "unchecked" )
+    @Override
+    public List<Object[]> findBySCId(Integer shoppingId)
+    {
+		String hql = "SELECT SCL, I FROM ShoppingCartLine as SCL, Item as I WHERE SCL.item.IId = I.IId AND SCL.shoppingCart.scId = :scId";
+		Query q1 = getCurrentSession().createQuery( hql );
+	    q1.setMaxResults( 1 );
+	    q1.setParameter( "scId", shoppingId);
+	    
+	    List<Object[]> res = q1.list();
+	    if( res.isEmpty() )
+	    	return null;
+	    
+	    return res;
+    }
+    
+    @Override
+    public IShoppingCartLine getObject()
+    {
+        return new ShoppingCartLine();
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/IAddressDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/IAddressDao.java
new file mode 100644
index 0000000..a66f55e
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/IAddressDao.java
@@ -0,0 +1,14 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+
+
+public interface IAddressDao extends IDao<IAddress>
+{	
+	public List<IAddress> findAll();
+
+	public IAddress findById(int id);
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/IAuthorDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/IAuthorDao.java
new file mode 100644
index 0000000..a45d8d4
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/IAuthorDao.java
@@ -0,0 +1,15 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+
+public interface IAuthorDao extends IDao<IAuthor>
+{
+	public List<IAuthor> findAll();
+
+	public IAuthor findById(int id);
+
+	public List<IAuthor> findBySoundexLname(String keyword);
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/ICcXactsDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/ICcXactsDao.java
new file mode 100644
index 0000000..3165388
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/ICcXactsDao.java
@@ -0,0 +1,11 @@
+package eu.cloudscale.showcase.db.dao;
+
+import eu.cloudscale.showcase.db.model.ICcXacts;
+
+public interface ICcXactsDao extends IDao<ICcXacts> 
+{
+
+	int getLastCcXactsId();
+
+	public ICcXacts findById(Integer id);
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/ICountryDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/ICountryDao.java
new file mode 100644
index 0000000..b3cb8f2
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/ICountryDao.java
@@ -0,0 +1,14 @@
+package eu.cloudscale.showcase.db.dao;
+
+import eu.cloudscale.showcase.db.model.ICountry;
+
+public interface ICountryDao extends IDao<ICountry>
+{
+
+	public ICountry findById(int id);
+
+	public ICountry getByName(String country);
+	
+	public void createTable();
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/ICustomerDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/ICustomerDao.java
new file mode 100644
index 0000000..ebf0fe2
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/ICustomerDao.java
@@ -0,0 +1,20 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+
+public interface ICustomerDao extends IDao<ICustomer> 
+{
+
+	public ICustomer findById(Integer id);
+
+	public ICustomer getUserBy(String username, String password);
+
+	public List<ICustomer> findByAddress(IAddress addrId);
+
+	
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/IDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/IDao.java
new file mode 100644
index 0000000..5e85562
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/IDao.java
@@ -0,0 +1,14 @@
+package eu.cloudscale.showcase.db.dao;
+
+
+public interface IDao<T>
+{
+	public T shrani(T object);
+
+	public void finish();
+		
+	public T getObject();
+
+	T shrani(T object, boolean flag);
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/IItemDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/IItemDao.java
new file mode 100644
index 0000000..9aadafb
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/IItemDao.java
@@ -0,0 +1,21 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+
+
+public interface IItemDao extends IDao<IItem>
+{
+	public List<IItem> findAll();
+	public IItem findById(int id);
+	public List<IItem> getPromotional();
+	public List<IItem> getNewProducts(String category);
+	public List<Object[]> getBestSellers(String category);
+	public IItem getRandomItem();
+	public IItem getObject();
+	public List<IItem> findAllByAuthor(IAuthor author);
+	public List<IItem> findAllByTitle(String keyword);
+	public List<IItem> findAllBySubject(String keyword);
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/IOrderLineDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/IOrderLineDao.java
new file mode 100644
index 0000000..db4c42d
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/IOrderLineDao.java
@@ -0,0 +1,14 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+public interface IOrderLineDao extends IDao<IOrderLine> 
+{
+
+	List<IOrderLine> findAllByOrder(IOrders orders);
+	IOrderLine findById(Integer id);
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/IOrdersDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/IOrdersDao.java
new file mode 100644
index 0000000..e397e3c
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/IOrdersDao.java
@@ -0,0 +1,11 @@
+package eu.cloudscale.showcase.db.dao;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+public interface IOrdersDao extends IDao<IOrders> 
+{
+	public IOrders getMostRecentOrder(ICustomer customer);
+
+	public IOrders findById(Integer cxOId);
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartDao.java
new file mode 100644
index 0000000..db6d063
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartDao.java
@@ -0,0 +1,16 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+
+public interface IShoppingCartDao extends IDao<IShoppingCart> 
+{
+//	public Integer createEmptyCart();
+
+	public IShoppingCart findById(Integer shoppingId);
+
+	public List<IShoppingCartLine> findAllBySC(IShoppingCart shoppingCart);
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartLineDao.java b/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartLineDao.java
new file mode 100644
index 0000000..a24ec57
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/IShoppingCartLineDao.java
@@ -0,0 +1,19 @@
+package eu.cloudscale.showcase.db.dao;
+
+import java.util.List;
+
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+public interface IShoppingCartLineDao extends IDao<IShoppingCartLine> 
+{
+
+	public IShoppingCartLine getBySCandItem(Integer shoppingId, int itemId);
+
+	public void delete(IShoppingCartLine bySCandItem);
+
+	public boolean isCartEmpty(int scId);
+
+	public List<Object[]> findBySCId(Integer shoppingId);
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AddressDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AddressDaoImpl.java
new file mode 100644
index 0000000..69ff6cc
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AddressDaoImpl.java
@@ -0,0 +1,75 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.mongo.Address;
+
+@Repository("mongoAddressDao")
+public class AddressDaoImpl extends DaoImpl<IAddress> implements IAddressDao
+{
+	
+//	@Autowired
+//	private MongoTemplate mongoOps;	
+	
+	public AddressDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+		System.out.println("Created AddressDao instance");
+	}
+	
+//	public AddressDaoImpl(MongoTemplate mongoOps)
+//	{
+//		super( mongoOps );
+//	}
+
+    @Override
+	public List<IAddress> findAll()
+	{
+		return (List<IAddress>) mongoOps.findAll( IAddress.class, "address" );
+	}
+
+    @Override
+    public IAddress findById(int id)
+    {
+	    return (IAddress) mongoOps.findOne( Query.query( Criteria.where( "addrId" ).is( id )), Address.class );
+    }
+	
+    @Override
+	public IAddress getObject()
+	{
+	    return new Address();
+	}
+    
+    @Override
+    public IAddress shrani(IAddress object)
+    {
+        if( object.getAddrId() == null)
+        {
+        	object.setAddrId( getLastId() + 1 );
+        }
+        return super.shrani( object );
+    }
+
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "addrId" );
+	
+	    IAddress a = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Address.class);
+	    
+	    if( a == null || a.getAddrId() == null)
+	    	return 0;
+	    
+	    return a.getAddrId(); 
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AuthorDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AuthorDaoImpl.java
new file mode 100644
index 0000000..38c9796
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/AuthorDaoImpl.java
@@ -0,0 +1,86 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.Soundex;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.mongo.Author;
+
+@Repository("mongoAuthorDao")
+public class AuthorDaoImpl extends DaoImpl<IAuthor> implements IAuthorDao
+{
+//	@Autowired
+//	MongoTemplate mongoOps;
+	
+	public AuthorDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+	
+//	public AuthorDaoImpl(MongoTemplate mongoOps)
+//    {
+//	    super( mongoOps );
+//    }
+	
+    @SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+	public List<IAuthor> findAll()
+	{
+		List authors = mongoOps.findAll( Author.class, "author" );
+		return (List<IAuthor>) authors;
+	}
+
+    @Override
+    public IAuthor findById(int id)
+    {
+	    return (IAuthor) mongoOps.findOne( Query.query( Criteria.where( "authorId" ).is( id ) ), Author.class);
+    }
+    
+    @Override
+    public IAuthor getObject()
+    {
+    	return new Author();
+    }
+    
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "authorId" );
+	
+	    Author a = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Author.class);
+	    
+	    if( a == null || a.getAId() == null)
+	    	return 0;
+	    
+	    return a.getAId();
+    }
+	
+	@Override
+	public IAuthor shrani(IAuthor object)
+	{
+		if( object.getAId() == null)
+		{
+			object.setAId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+	@Override
+    public List<IAuthor> findBySoundexLname(String keyword)
+    {
+	    List res = mongoOps.find( Query.query( Criteria.where( "lNameSoundex" ).is( Soundex.soundex( keyword ) ) ).limit( 50 ), Author.class );
+	    
+	    return res;
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CcXactsDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CcXactsDaoImpl.java
new file mode 100644
index 0000000..35e5274
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CcXactsDaoImpl.java
@@ -0,0 +1,78 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.mongo.CcXacts;
+
+@Repository("mongoCcXactsDao")
+public class CcXactsDaoImpl extends DaoImpl<ICcXacts> implements ICcXactsDao
+{
+	public CcXactsDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+	
+//	public CcXactsDaoImpl(MongoTemplate mongoOps)
+//	{
+//		super( mongoOps );
+//	}
+	
+    @Override
+	public ICcXacts getObject()
+	{
+		return new CcXacts();
+	}
+    
+    @Override
+    public ICcXacts findById(Integer id)
+    {
+		return (ICcXacts) mongoOps.findOne( Query.query(Criteria.where( "ccXactsId" ).is( id )), CcXacts.class);
+    }
+
+
+	@Override
+    public int getLastCcXactsId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "ccXactsId" );		 
+				
+	    ICcXacts cc = mongoOps.findOne( Query.query(new Criteria()).with( sort ), CcXacts.class);
+	    
+	    
+	    if( cc == null || cc.getId() == null)
+	    	return 0;
+	    
+	    return cc.getId();    
+	}
+
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "ccXactsId" );
+	
+	    CcXacts o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), CcXacts.class);
+	    
+	    if( o == null || o.getId() == null)
+	    	return 0;
+	    
+	    return o.getId();
+    }
+	
+	@Override
+	public ICcXacts shrani(ICcXacts object)
+	{
+		if( object.getId() == null)
+		{
+			object.setId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CountryDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CountryDaoImpl.java
new file mode 100644
index 0000000..00cc255
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CountryDaoImpl.java
@@ -0,0 +1,68 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.mongo.Country;
+
+@Repository("mongoCountryDao")
+public class CountryDaoImpl extends DaoImpl<ICountry> implements ICountryDao
+{
+	public CountryDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+    @Override
+    public ICountry findById(int id)
+    {
+	    return mongoOps.findOne( Query.query( Criteria.where( "coId" ).is(id) ), Country.class );
+    }
+
+	@Override
+    public ICountry getByName(String country)
+    {
+		return mongoOps.findOne( Query.query( Criteria.where( "coName" ).regex(country, "i")), Country.class );
+    }
+	
+	@Override
+	public ICountry getObject()
+	{
+	    return new Country(); 
+	}
+	
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "coId" );
+	
+	    Country o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Country.class);
+	    
+	    if( o == null || o.getCoId() == null)
+	    	return 0;
+	    
+	    return o.getCoId();
+    }
+	
+	@Override
+	public ICountry shrani(ICountry object)
+	{
+		if( object.getCoId() == null)
+		{
+			object.setCoId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+	@Override
+    public void createTable()
+    {
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CustomerDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CustomerDaoImpl.java
new file mode 100644
index 0000000..45e556b
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/CustomerDaoImpl.java
@@ -0,0 +1,78 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.mongo.Customer;
+
+@Repository("mongoCustomerDao")
+public class CustomerDaoImpl extends DaoImpl<ICustomer> implements ICustomerDao
+{
+	public CustomerDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );	
+	}
+	
+//	public CustomerDaoImpl(MongoTemplate mongoOps)
+//    {
+//	    super( mongoOps );
+//    }
+
+    @Override
+    public ICustomer findById(Integer id)
+    {
+		return mongoOps.findOne( Query.query(Criteria.where( "CId" ).is( id )), Customer.class);
+    }
+
+	@Override
+    public ICustomer getUserBy(String username, String password)
+    {
+		return mongoOps.findOne( Query.query( Criteria.where( "CUname" ).is( username.toLowerCase()).and( "CPasswd" ).is(password.toLowerCase())), Customer.class );
+    }
+	
+    @Override
+	public ICustomer getObject()
+	{
+		return new Customer();
+	}
+
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+    public List<ICustomer> findByAddress(IAddress address)
+    {
+		List res = mongoOps.find( Query.query(Criteria.where( "addrId" ).is( address.getAddrId() )), Customer.class );
+		
+		return res;
+    }
+
+	@Override
+    public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "cId" );
+		
+	    Customer c = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Customer.class);
+	    
+	    if( c == null || c.getCId() == null)
+	    	return 0;
+	    
+	    return c.getCId();
+    }
+	
+	@Override
+	public ICustomer shrani(ICustomer object)
+	{
+		if( object.getCId() == null)
+		{
+			object.setCId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/DaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/DaoImpl.java
new file mode 100644
index 0000000..5236fd6
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/DaoImpl.java
@@ -0,0 +1,58 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.mongodb.Mongo;
+
+public abstract class DaoImpl<T> implements IDaoExt<T>
+{
+	@Autowired
+	protected MongoTemplate mongoOps;
+	
+	public DaoImpl()
+    {
+    }
+	
+//	public DaoImpl(MongoTemplate mongoOps)
+//	{
+//		this.mongoOps = mongoOps;
+//	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public T shrani(T object) 
+	{	
+		mongoOps.save( object );
+		return object;
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public T shrani(T object, boolean flag) 
+	{	
+		mongoOps.save( object );
+		return object;
+	}
+
+	@Override
+    public void finish()
+    {
+    }
+
+	@Override
+    public T getObject()
+    {
+		try
+        {
+	        throw new UnsupportedOperationException( "Implement in DAO implementation!" );
+        }
+        catch ( UnsupportedOperationException e )
+        {
+	        e.printStackTrace();
+        }
+       
+		return null;
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/IDaoExt.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/IDaoExt.java
new file mode 100644
index 0000000..24b2e4d
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/IDaoExt.java
@@ -0,0 +1,10 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import eu.cloudscale.showcase.db.dao.IDao;
+
+
+public interface IDaoExt<T> extends IDao<T>
+{
+	public Integer getLastId();
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ItemDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ItemDaoImpl.java
new file mode 100644
index 0000000..edc9f35
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ItemDaoImpl.java
@@ -0,0 +1,237 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.Soundex;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.mongo.Item;
+
+@Repository("mongoItemDao")
+public class ItemDaoImpl extends DaoImpl<IItem> implements IItemDao
+{
+	public ItemDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+    @SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+	public List<IItem> findAll()
+	{
+		List items = mongoOps.find( Query.query(new Criteria()).limit( 50 ), Item.class, "item");
+		return (List<IItem>) items;
+	}
+
+    @Override
+	public IItem findById(int id)
+	{
+		Item item = mongoOps.findOne( Query.query( Criteria.where( "IId" ).is( id ) ), Item.class);
+		return item;
+	}
+	
+    @Override
+	public IItem getRandomItem()
+	{
+		return (IItem) mongoOps.findOne( Query.query( Criteria.where( "IRandom" ).gt( new Random().nextDouble() )), Item.class, "item" );
+	}
+
+	@Override
+	public List<IItem> getPromotional() 
+	{
+
+		IItem item = getRandomItem();
+		if ( item == null)
+		{
+			System.out.println("Item is null");
+			item = getRandomItem();
+		}
+		ArrayList<IItem> promotional = new ArrayList<IItem>();
+		
+		promotional.add( findById( item.getIRelated1()));
+		
+		promotional.add(findById( item.getIRelated2()));
+		
+		promotional.add(findById( item.getIRelated3()));
+		
+		promotional.add(findById( item.getIRelated4()));
+		
+		promotional.add(findById( item.getIRelated5()));
+		
+		return promotional;
+	}
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> getNewProducts(String category)
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "IPubDate").and( new Sort(Sort.Direction.ASC, "ITitle") );
+		List items = mongoOps.find( Query.query(Criteria.where( "ISubject" ).is(category) ).with( sort ).limit( 50 ), Item.class );
+		return (List<IItem>) items;
+    }
+	
+	class ValueObject
+	{
+		private String id;
+		private float value;
+		
+        public String getId()
+        {
+        	return id;
+        }
+		
+        public void setId(String id)
+        {
+        	this.id = id;
+        }
+		
+        public float getValue()
+        {
+        	return value;
+        }
+		
+        public void setValue(float value)
+        {
+        	this.value = value;
+        }
+		
+	}
+
+	@Override
+    public List<Object[]> getBestSellers(String category)
+    {
+    	Sort sort = new Sort( Sort.Direction.DESC, "olQty" );
+    	
+    	List<Item> res = mongoOps.find( Query.query(Criteria.where( "ISubject" ).is( category )).limit( 50 ).with( sort ), Item.class);
+    	
+    	ArrayList<Object[]> items = new ArrayList<Object[]>();
+    	for( Item item : res)
+    	{
+    		Object[] itemObj = new Object[5];
+    		itemObj[0] = item.getIId();
+    		itemObj[1] = item.getITitle();
+    		itemObj[2] = item.getAuthor().getAFname();
+    		itemObj[3] = item.getAuthor().getALname();
+    		itemObj[4] = item.getOlQty();
+    		
+    		items.add( itemObj );
+    	}
+    	
+    	return items;
+    	
+//    	BasicDBObject groupFields = new BasicDBObject("_id", "$itemId");
+//    	groupFields.put( "qty", new BasicDBObject("$sum", "$olQty") );
+//    	
+//    	BasicDBObject group = new BasicDBObject("$group", groupFields);
+//    	
+//    	BasicDBObject limit = new BasicDBObject("$limit", 3333);
+//    	
+//    	BasicDBObject sort = new BasicDBObject("$sort", new BasicDBObject("qty", -1));
+//    	
+//    	AggregationOutput output = mongoOps.getCollection( mongoOps.getCollectionName( OrderLine.class ) ).aggregate( group, sort, limit );
+//    	
+//    	IItemDao itemDao = DatabaseHelper.getDatabase().getItemDaoImpl();
+//    	ArrayList<Object[]> items = new ArrayList<Object[]>();
+//    	
+//    	for( DBObject object : output.results() )
+//    	{
+//    		if( items.size() == 50 )
+//    		{
+//    			break;
+//    		}
+//    		
+//    		IItem item = itemDao.findById( (Integer) object.get( "_id" ) );
+//    		
+//    		if(item.getISubject().equals( category ))
+//    		{
+//        		Object[] itemObj = new Object[5];
+//        		itemObj[0] = item.getIId();
+//        		itemObj[1] = item.getITitle();
+//        		itemObj[2] = item.getAuthor().getAFname();
+//        		itemObj[3] = item.getAuthor().getALname(); 
+//        		itemObj[4] = object.get( "qty" );
+//        		items.add( itemObj );
+//    		}
+//    		   		
+//    		
+//    	}
+//    	
+//    	return items;
+//    	DELA FUL POCAS!!! - glej http://stackoverflow.com/questions/4430407/mongodb-mapreduce-is-much-slower-than-pure-java-processing
+//    	String mapFunction = "function()" +
+//    			"{" +
+//    			"	emit(this.itemId, this.olQty)" +
+//    			"}";
+//    	String reduceFunction = "function(k, v)" +
+//    			"{" +
+//    			"	return Array.sum(v)" +
+//    			"}";
+//    	MapReduceResults<ValueObject> results = mongoOps.mapReduce( "orderLine", mapFunction, reduceFunction, ValueObject.class );
+    }
+    
+    @Override
+    public IItem getObject()
+    {
+    	return new Item();
+    }
+    
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "iId" );
+	
+	    Item o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Item.class);
+	    
+	    if( o == null || o.getIId() == null)
+	    	return 0;
+	    
+	    return o.getIId();
+    }
+	
+	@Override
+	public IItem shrani(IItem object)
+	{
+		if( object.getIId() == null)
+		{
+			object.setIId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+    @SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> findAllByAuthor(IAuthor author)
+    {
+    	List res = mongoOps.find( Query.query( Criteria.where( "authId" ).is( author.getAId() ) ).limit( 50 ), Item.class );
+	    return res;
+    }
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> findAllByTitle(String keyword)
+    {
+		List res = mongoOps.find( Query.query( Criteria.where( "iTitleSoundex" ).is( Soundex.soundex( keyword ) ) ).limit( 50 ), Item.class );
+		
+		return res;
+    }
+
+	@SuppressWarnings( {"rawtypes", "unchecked" } )
+    @Override
+    public List<IItem> findAllBySubject(String keyword)
+    {
+		List res = mongoOps.find( Query.query( Criteria.where( "iSubject" ).is( keyword )).limit( 50 ), Item.class );
+		
+	    return res;
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrderLineDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrderLineDaoImpl.java
new file mode 100644
index 0000000..7f3749f
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrderLineDaoImpl.java
@@ -0,0 +1,67 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.mongo.OrderLine;
+
+@Repository("mongoOrderLineDao")
+public class OrderLineDaoImpl extends DaoImpl<IOrderLine> implements IOrderLineDao
+{
+	
+	public OrderLineDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+	
+    @Override
+	public IOrderLine getObject()
+	{
+		return new OrderLine();
+	}
+
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+    public List<IOrderLine> findAllByOrder(IOrders orders)
+    {
+	    List res = mongoOps.find( Query.query( Criteria.where( "orderId" ).is( orders.getOId() )), OrderLine.class );
+	    return res;
+    }
+	
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "olId" );
+		
+	    OrderLine o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), OrderLine.class);
+
+	    if( o == null || o.getOlId() == null)
+	    	return 0;
+	    
+	    return o.getOlId();
+    }
+	
+	@Override
+	public IOrderLine shrani(IOrderLine object)
+	{
+		if( object.getOlId() == null)
+		{
+			object.setOlId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+
+	@Override
+    public IOrderLine findById(Integer id)
+    {
+		return mongoOps.findOne(Query.query( Criteria.where("olId").is(id) ), OrderLine.class);
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrdersDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrdersDaoImpl.java
new file mode 100644
index 0000000..93c50a5
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/OrdersDaoImpl.java
@@ -0,0 +1,70 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.mongo.Customer;
+import eu.cloudscale.showcase.db.model.mongo.Orders;
+
+@Repository("mongoOrdersDao")
+public class OrdersDaoImpl extends DaoImpl<IOrders> implements IOrdersDao
+{
+
+	public OrdersDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+	@Override
+    public IOrders getMostRecentOrder(ICustomer customer)
+    {
+
+		Sort sort = new Sort( Sort.Direction.DESC, "ODate" );
+		Orders order = mongoOps.findOne( Query.query(Criteria.where( "customer" ).is(customer.getCId())).with( sort ), Orders.class );
+		
+		return order;
+    }
+	
+    @Override
+	public IOrders getObject()
+	{
+		return new Orders();
+	}
+
+	@Override
+    public IOrders findById(Integer cxOId)
+    {
+		return mongoOps.findOne(Query.query(new Criteria().where( "oId" ).is( cxOId )), Orders.class);
+    }
+	
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "oId" );
+	
+	    Orders o = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), Orders.class);
+	    
+	    if( o == null || o.getOId() == null)
+	    	return 0;
+	    
+	    return o.getOId();
+    }
+	
+	@Override
+	public IOrders shrani(IOrders object)
+	{
+		if( object.getOId() == null)
+		{
+			object.setOId( getLastId() +1 );
+		}
+		
+		return super.shrani( object );
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartDaoImpl.java
new file mode 100644
index 0000000..6b364e3
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartDaoImpl.java
@@ -0,0 +1,71 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.mongo.ShoppingCart;
+import eu.cloudscale.showcase.db.model.mongo.ShoppingCartLine;
+
+@Repository("mongoShoppingCartDao")
+public class ShoppingCartDaoImpl extends DaoImpl<IShoppingCart> implements IShoppingCartDao
+{
+	public ShoppingCartDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );
+	}
+
+
+	@Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "scId" );
+	
+	    ShoppingCart sc = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), ShoppingCart.class);
+	    
+	    if( sc == null || sc.getScId() == null)
+	    	return 0;
+	    
+	    return sc.getScId();
+    }
+
+	@Override
+    public IShoppingCart findById(Integer shoppingId)
+    {
+	    return mongoOps.findOne( Query.query(Criteria.where("scId").is(shoppingId)), ShoppingCart.class );
+    }
+	
+    @Override
+	public IShoppingCart getObject()
+	{
+		return new ShoppingCart();
+	}
+
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @Override
+    public List<IShoppingCartLine> findAllBySC(IShoppingCart shoppingCart)
+    {
+		List res = mongoOps.find( Query.query(Criteria.where( "shoppingCart" ).is( shoppingCart.getScId() )), ShoppingCartLine.class );
+		return res;
+    }
+	
+	@Override
+	public IShoppingCart shrani(IShoppingCart object)
+	{
+	    if( object.getScId() == null )
+	    {
+	    	object.setScId( getLastId()+1 );
+	    }
+	    return super.shrani( object );
+	}
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartLineDaoImpl.java b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartLineDaoImpl.java
new file mode 100644
index 0000000..8a08f51
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/dao/mongo/impl/ShoppingCartLineDaoImpl.java
@@ -0,0 +1,86 @@
+package eu.cloudscale.showcase.db.dao.mongo.impl;
+
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.mongo.ShoppingCartLine;
+
+@Repository("mongoShoppingCartLineDao")
+public class ShoppingCartLineDaoImpl extends DaoImpl<IShoppingCartLine> implements IShoppingCartLineDao
+{
+	public ShoppingCartLineDaoImpl()
+	{
+//		super( (MongoTemplate) ContextHelper.getApplicationContext().getBean( "mongoTemplate" ) );	
+	}
+	
+//	public ShoppingCartLineDaoImpl(MongoTemplate mongoOps)
+//    {
+//		super(mongoOps);
+//    }
+
+	@Override
+    public IShoppingCartLine getBySCandItem(Integer shoppingId, int itemId)
+    {
+		IShoppingCartLine scl = mongoOps.findOne( Query.query( Criteria.where( "shoppingCart" ).is( shoppingId ).andOperator( Criteria.where( "item" ).is( itemId ) )), ShoppingCartLine.class );
+			
+		return scl;
+    }
+
+	@Override
+    public void delete(IShoppingCartLine bySCandItem)
+    {
+	    // TODO Auto-generated method stub
+	    
+    }
+
+	@Override
+    public boolean isCartEmpty(int scId)
+    {
+		return mongoOps.count(Query.query(Criteria.where("shoppingCart").is(scId)), ShoppingCartLine.class) > 0;
+    }
+
+	@Override
+    public List<Object[]> findBySCId(Integer shoppingId)
+    {
+	    // TODO Auto-generated method stub
+	    return null;
+    }
+    
+    @Override
+    public IShoppingCartLine getObject()
+    {
+    	return new ShoppingCartLine();
+    }
+
+    @Override
+	public Integer getLastId()
+    {
+		Sort sort = new Sort(Sort.Direction.DESC, "sclId" );
+	
+	    ShoppingCartLine scl = mongoOps.findOne(Query.query( new Criteria() ).with( sort ).limit( 1 ), ShoppingCartLine.class);
+	    
+	    if( scl == null || scl.getSclId() == null)
+	    	return 0;
+	    
+	    return scl.getSclId();
+    }
+    
+    @Override
+    public IShoppingCartLine shrani(IShoppingCartLine object)
+    {
+    	if( object.getSclId() == null )
+    	{
+    		object.setSclId( getLastId() + 1 );
+    	}
+        return super.shrani( object );
+    }
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/IDao.java b/src/main/java/eu/cloudscale/showcase/db/IDao.java
new file mode 100644
index 0000000..a09a0fb
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/IDao.java
@@ -0,0 +1,25 @@
+package eu.cloudscale.showcase.db;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+
+
+public interface IDao
+{
+	
+	public IItemDao getItemDao();
+
+	public IShoppingCartLineDao getShoppingCartLineDao();
+
+	public IShoppingCartDao getShoppingCartDao();
+
+	public IAddressDao getAddressDao();
+
+	public ICustomerDao getCustomerDao();
+
+	public IShoppingCartLineDao getShoppingCartLineDaoImpl();
+	 
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/IDaos.java b/src/main/java/eu/cloudscale/showcase/db/IDaos.java
new file mode 100644
index 0000000..7eac450
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/IDaos.java
@@ -0,0 +1,37 @@
+package eu.cloudscale.showcase.db;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+
+
+public interface IDaos
+{
+	public IAddressDao getAddressDaoImpl();
+	
+	public IAuthorDao getAuthorDaoImpl();
+	
+	public ICcXactsDao getCcXactsDaoImpl();
+	
+	public ICountryDao getCountryDaoImpl();
+	
+	public ICustomerDao getCustomerDaoImpl();
+	
+	public IItemDao getItemDaoImpl();
+
+	public IOrderLineDao getOrderLineDaoImpl();
+	
+	public IOrdersDao getOrdersDaoImpl();
+	
+	public IShoppingCartLineDao getShoppingCartLineDaoImpl();
+
+	public IShoppingCartDao getShoppingCartDaoImpl();
+	 
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Address.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Address.java
new file mode 100644
index 0000000..ee89c24
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Address.java
@@ -0,0 +1,187 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * Address generated by hbm2java
+ */
+@Entity
+@Table( name = "address", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class Address implements IAddress
+{
+
+	private Integer        addrId;
+
+	private ICountry        country;
+
+	private String         addrStreet1;
+
+	private String         addrStreet2;
+
+	private String         addrCity;
+
+	private String         addrState;
+
+	private String         addrZip;
+
+	private Set<IOrders>   ordersesForOBillAddrId = new HashSet<IOrders>( 0 );
+
+	private Set<IOrders>   ordersesForOShipAddrId = new HashSet<IOrders>( 0 );
+
+	private Set<ICustomer> customers              = new HashSet<ICustomer>( 0 );
+
+	public Address()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "ADDR_ID", unique = true, nullable = false )
+	@Override
+	public Integer getAddrId()
+	{
+		return this.addrId;
+	}
+
+	public void setAddrId(Integer addrId)
+	{
+		this.addrId = addrId;
+	}
+
+	@ManyToOne( targetEntity=Country.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "ADDR_CO_ID", nullable = false )
+	@Override
+	public ICountry getCountry()
+	{
+		return this.country;
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.country = (Country) country;
+	}
+
+	@Column( name = "ADDR_STREET1", length = 40 )
+	@Override
+	public String getAddrStreet1()
+	{
+		return this.addrStreet1;
+	}
+
+	@Override
+	public void setAddrStreet1(String addrStreet1)
+	{
+		this.addrStreet1 = addrStreet1;
+	}
+
+	@Column( name = "ADDR_STREET2", length = 40 )
+	@Override
+	public String getAddrStreet2()
+	{
+		return this.addrStreet2;
+	}
+
+	@Override
+	public void setAddrStreet2(String addrStreet2)
+	{
+		this.addrStreet2 = addrStreet2;
+	}
+
+	@Column( name = "ADDR_CITY", length = 30 )
+	@Override
+	public String getAddrCity()
+	{
+		return this.addrCity;
+	}
+
+	@Override
+	public void setAddrCity(String addrCity)
+	{
+		this.addrCity = addrCity;
+	}
+
+	@Column( name = "ADDR_STATE", length = 20 )
+	@Override
+	public String getAddrState()
+	{
+		return this.addrState;
+	}
+
+	@Override
+	public void setAddrState(String addrState)
+	{
+		this.addrState = addrState;
+	}
+
+	@Column( name = "ADDR_ZIP", length = 10 )
+	@Override
+	public String getAddrZip()
+	{
+		return this.addrZip;
+	}
+
+	@Override
+	public void setAddrZip(String addrZip)
+	{
+		this.addrZip = addrZip;
+	}
+
+	@OneToMany( targetEntity=Orders.class, fetch = FetchType.LAZY, mappedBy = "addressByOBillAddrId" )
+	public Set<IOrders> getOrdersesForOBillAddrId()
+	{
+		return this.ordersesForOBillAddrId;
+	}
+
+	public void setOrdersesForOBillAddrId(Set<IOrders> ordersesForOBillAddrId)
+	{
+		this.ordersesForOBillAddrId = ordersesForOBillAddrId;
+	}
+
+	@OneToMany( targetEntity=Orders.class, fetch = FetchType.LAZY, mappedBy = "addressByOShipAddrId" )
+	public Set<IOrders> getOrdersesForOShipAddrId()
+	{
+		return this.ordersesForOShipAddrId;
+	}
+
+	public void setOrdersesForOShipAddrId(Set<IOrders> ordersesForOShipAddrId)
+	{
+		this.ordersesForOShipAddrId = ordersesForOShipAddrId;
+	}
+
+	@OneToMany( targetEntity=Customer.class, fetch = FetchType.LAZY, mappedBy = "address" )
+	public Set<ICustomer> getCustomers()
+	{
+		return this.customers;
+	}
+
+	public void setCustomers(Set<ICustomer> customers)
+	{
+		this.customers = customers;
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Author.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Author.java
new file mode 100644
index 0000000..4f30f61
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Author.java
@@ -0,0 +1,160 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+
+/**
+ * Author generated by hbm2java
+ */
+@Entity
+@Table( name = "author", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class Author implements IAuthor, Serializable
+{
+
+    private static final long serialVersionUID = 1L;
+
+	private Integer      aId;
+
+	private String      AFname;
+
+	private String      ALname;
+
+	private String      AMname;
+
+	private Date        ADob;
+
+	private String      ABio;
+
+	private Set<IItem> items = new HashSet<IItem>( 0 );
+
+	public Author()
+	{
+	}
+
+	public Author(String AFname, String ALname, String AMname, Date ADob,
+	        String ABio, Set<IItem> items)
+	{
+		this.AFname = AFname;
+		this.ALname = ALname;
+		this.AMname = AMname;
+		this.ADob = ADob;
+		this.ABio = ABio;
+		this.items = items;
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "A_ID", unique = true, nullable = false )
+	@Override
+	public Integer getAId()
+	{
+		return this.aId;
+	}
+
+	@Override
+	public void setAId(Integer AId)
+	{
+		this.aId = AId;
+	}
+
+	@Column( name = "A_FNAME", length = 20 )
+	@Override
+	public String getAFname()
+	{
+		return this.AFname;
+	}
+
+	@Override
+	public void setAFname(String AFname)
+	{
+		this.AFname = AFname;
+	}
+
+	@Column( name = "A_LNAME", length = 20 )
+	@Override
+	public String getALname()
+	{
+		return this.ALname;
+	}
+
+	@Override
+	public void setALname(String ALname)
+	{
+		this.ALname = ALname;
+	}
+
+	@Column( name = "A_MNAME", length = 20 )
+	@Override
+	public String getAMname()
+	{
+		return this.AMname;
+	}
+
+	@Override
+	public void setAMname(String AMname)
+	{
+		this.AMname = AMname;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "A_DOB", length = 19 )
+	@Override
+	public Date getADob()
+	{
+		return this.ADob;
+	}
+
+	@Override
+	public void setADob(Date ADob)
+	{
+		this.ADob = ADob;
+	}
+
+	@Column( name = "A_BIO", length = 65535 )
+	@Override
+	public String getABio()
+	{
+		return this.ABio;
+	}
+
+	@Override
+	public void setABio(String ABio)
+	{
+		this.ABio = ABio;
+	}
+
+	@OneToMany( targetEntity=Item.class, fetch = FetchType.LAZY, mappedBy = "author" )
+	public Set<IItem> getItems()
+	{
+		return this.items;
+	}
+
+	public void setItems(Set<IItem> items)
+	{
+		this.items = items;
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/CcXacts.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/CcXacts.java
new file mode 100644
index 0000000..874defc
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/CcXacts.java
@@ -0,0 +1,191 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * CcXacts generated by hbm2java
+ */
+@Entity
+@Table( name = "cc_xacts", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class CcXacts implements ICcXacts
+{
+
+	private ICountry country;
+
+	private IOrders  orders;
+
+	private Integer  id;
+
+	private String   cxType;
+
+	private Integer  cxNum;
+
+	private String   cxName;
+
+	private Date     cxExpiry;
+
+	private String  cxAuthId;
+
+	private Double   cxXactAmt;
+
+	private Date     cxXactDate;
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "CX_ID", unique = true, nullable = false )
+	@Override
+	public Integer getId()
+	{
+		return this.id;
+	}
+
+	@Override
+	public void setId(Integer string)
+	{
+		this.id = string;
+	}
+
+	@ManyToOne( targetEntity=Orders.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "CX_O_ID", nullable = false )
+	@Override
+	public IOrders getOrders()
+	{
+		return this.orders;
+	}
+
+	@Override
+	public void setOrders(IOrders orders)
+	{
+		this.orders = orders;
+	}
+
+	@Column( name = "CX_TYPE", length = 10 )
+	@Override
+	public String getCxType()
+	{
+		return this.cxType;
+	}
+
+	@Override
+	public void setCxType(String cxType)
+	{
+		this.cxType = cxType;
+	}
+
+	@Column( name = "CX_NUM" )
+	@Override
+	public Integer getCxNum()
+	{
+		return this.cxNum;
+	}
+
+	@Override
+	public void setCxNum(Integer cxNum)
+	{
+		this.cxNum = cxNum;
+	}
+
+	@Column( name = "CX_NAME", length = 31 )
+	@Override
+	public String getCxName()
+	{
+		return this.cxName;
+	}
+
+	@Override
+	public void setCxName(String cxName)
+	{
+		this.cxName = cxName;
+	}
+
+	@Column( name = "CX_EXPIRY", length = 10 )
+	@Override
+	public Date getCxExpiry()
+	{
+		return this.cxExpiry;
+	}
+
+	@Override
+	public void setCxExpiry(Date cxExpiry)
+	{
+		this.cxExpiry = cxExpiry;
+	}
+
+	@Column( name = "CX_AUTH_ID", length = 15 )
+//	@OneToOne( targetEntity=Author.class, fetch=FetchType.EAGER)
+//	@JoinColumn( name="CX_AUTH_ID" )
+	@Override
+	public String getCxAuthId()
+	{
+		return this.cxAuthId;
+	}
+
+	@Override
+	public void setCxAuthId(String cxAuthId)
+	{
+		this.cxAuthId = cxAuthId;
+	}
+
+	@Column( name = "CX_XACT_AMT", precision = 15 )
+	@Override
+	public Double getCxXactAmt()
+	{
+		return this.cxXactAmt;
+	}
+
+	@Override
+	public void setCxXactAmt(Double o_TOTAL)
+	{
+		this.cxXactAmt = o_TOTAL;
+	}
+
+	@Column( name = "CX_XACT_DATE", length = 19 )
+	@Override
+	public Date getCxXactDate()
+	{
+		return this.cxXactDate;
+	}
+
+	@Override
+	public void setCxXactDate(Date cxXactDate)
+	{
+		this.cxXactDate = cxXactDate;
+	}
+
+	@ManyToOne( targetEntity=Country.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "CX_CO_ID", nullable = false)
+	@Override
+	public ICountry getCountry()
+	{
+		return this.country;
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.country = country;
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Country.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Country.java
new file mode 100644
index 0000000..0c674b1
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Country.java
@@ -0,0 +1,136 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+
+/**
+ * Country generated by hbm2java
+ */
+@Entity
+@Table( name = "country", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class Country implements ICountry
+{
+
+	private Integer      coId;
+
+	private String      coName;
+
+	private Double      coExchange;
+
+	private String      coCurrency;
+
+	private Set<IAddress> addresses = new HashSet<IAddress>( 0 );
+
+	private Set<ICcXacts> ccXactses = new HashSet<ICcXacts>( 0 );
+
+	public Country()
+	{
+	}
+
+	public Country(String coName, Double coExchange, String coCurrency,
+	        Set<IAddress> addresses, Set<ICcXacts> ccXactses)
+	{
+		this.coName = coName;
+		this.coExchange = coExchange;
+		this.coCurrency = coCurrency;
+		this.addresses = addresses;
+		this.ccXactses = ccXactses;
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "CO_ID", unique = true, nullable = false )
+	@Override
+	public Integer getCoId()
+	{
+		return this.coId;
+	}
+
+	@Override
+	public void setCoId(Integer coId)
+	{
+		this.coId = coId;
+	}
+
+	@Column( name = "CO_NAME", length = 50 )
+	@Override
+	public String getCoName()
+	{
+		return this.coName;
+	}
+
+	@Override
+	public void setCoName(String coName)
+	{
+		this.coName = coName;
+	}
+
+	@Column( name = "CO_EXCHANGE", precision = 22, scale = 0 )
+	@Override
+	public Double getCoExchange()
+	{
+		return this.coExchange;
+	}
+
+	@Override
+	public void setCoExchange(Double coExchange)
+	{
+		this.coExchange = coExchange;
+	}
+
+	@Column( name = "CO_CURRENCY", length = 18 )
+	@Override
+	public String getCoCurrency()
+	{
+		return this.coCurrency;
+	}
+
+	@Override
+	public void setCoCurrency(String coCurrency)
+	{
+		this.coCurrency = coCurrency;
+	}
+
+	@OneToMany( targetEntity=Address.class, fetch = FetchType.LAZY, mappedBy = "country" )
+	public Set<IAddress> getAddresses()
+	{
+		return this.addresses;
+	}
+
+	public void setAddresses(Set<IAddress> addresses)
+	{
+		this.addresses = addresses;
+	}
+
+	@OneToMany( targetEntity=CcXacts.class, fetch = FetchType.LAZY, mappedBy = "country" )
+	public Set<ICcXacts> getCcXactses()
+	{
+		return this.ccXactses;
+	}
+
+	public void setCcXactses(Set<ICcXacts> ccXactses)
+	{
+		this.ccXactses = ccXactses;
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Customer.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Customer.java
new file mode 100644
index 0000000..5f36edf
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Customer.java
@@ -0,0 +1,286 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * Customer generated by hbm2java
+ */
+@Entity
+@Table( name = "customer", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class Customer implements ICustomer
+{
+
+	private Integer      cId;
+
+	private IAddress    address;
+
+	private String      CUname;
+
+	private String      CPasswd;
+
+	private String      CFname;
+
+	private String      CLname;
+
+	private String      CPhone;
+
+	private String      CEmail;
+
+	private Date        CSince;
+
+	private Date        CLastVisit;
+
+	private Date        CLogin;
+
+	private Date        CExpiration;
+
+	private Double      CDiscount;
+
+	private Double      CBalance;
+
+	private Double      CYtdPmt;
+
+	private Date        CBirthdate;
+
+	private String      CData;
+
+	private Set<IOrders> orderses = new HashSet<IOrders>( 0 );
+
+	public Customer()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "C_ID", unique = true, nullable = false )
+	public Integer getCId()
+	{
+		return this.cId;
+	}
+
+	public void setCId(Integer CId)
+	{
+		this.cId = CId;
+	}
+
+	@ManyToOne( targetEntity=Address.class, fetch = FetchType.EAGER)
+	@JoinColumn( name = "C_ADDR_ID", nullable = false )
+	public IAddress getAddress()
+	{
+		return this.address;
+	}
+
+	public void setAddress(IAddress address)
+	{
+		this.address = address;
+	}
+
+	@Column( name = "C_UNAME", length = 20 )
+	public String getCUname()
+	{
+		return this.CUname;
+	}
+
+	public void setCUname(String CUname)
+	{
+		this.CUname = CUname;
+	}
+
+	@Column( name = "C_PASSWD", length = 20 )
+	public String getCPasswd()
+	{
+		return this.CPasswd;
+	}
+
+	public void setCPasswd(String CPasswd)
+	{
+		this.CPasswd = CPasswd;
+	}
+
+	@Column( name = "C_FNAME", length = 15 )
+	public String getCFname()
+	{
+		return this.CFname;
+	}
+
+	public void setCFname(String CFname)
+	{
+		this.CFname = CFname;
+	}
+
+	@Column( name = "C_LNAME", length = 15 )
+	public String getCLname()
+	{
+		return this.CLname;
+	}
+
+	public void setCLname(String CLname)
+	{
+		this.CLname = CLname;
+	}
+
+	@Column( name = "C_PHONE", length = 16 )
+	public String getCPhone()
+	{
+		return this.CPhone;
+	}
+
+	public void setCPhone(String CPhone)
+	{
+		this.CPhone = CPhone;
+	}
+
+	@Column( name = "C_EMAIL", length = 50 )
+	public String getCEmail()
+	{
+		return this.CEmail;
+	}
+
+	public void setCEmail(String CEmail)
+	{
+		this.CEmail = CEmail;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "C_SINCE", length = 10 )
+	public Date getCSince()
+	{
+		return this.CSince;
+	}
+
+	public void setCSince(Date CSince)
+	{
+		this.CSince = CSince;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "C_LAST_VISIT", length = 10 )
+	public Date getCLastVisit()
+	{
+		return this.CLastVisit;
+	}
+
+	public void setCLastVisit(Date CLastVisit)
+	{
+		this.CLastVisit = CLastVisit;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "C_LOGIN", length = 19 )
+	public Date getCLogin()
+	{
+		return this.CLogin;
+	}
+
+	public void setCLogin(Date CLogin)
+	{
+		this.CLogin = CLogin;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "C_EXPIRATION", length = 19 )
+	public Date getCExpiration()
+	{
+		return this.CExpiration;
+	}
+
+	public void setCExpiration(Date CExpiration)
+	{
+		this.CExpiration = CExpiration;
+	}
+
+	@Column( name = "C_DISCOUNT" )
+	public Double getCDiscount()
+	{
+		return this.CDiscount;
+	}
+
+	public void setCDiscount(double c_DISCOUNT)
+	{
+		this.CDiscount = c_DISCOUNT;
+	}
+
+	@Column( name = "C_BALANCE" )
+	public Double getCBalance()
+	{
+		return this.CBalance;
+	}
+
+	public void setCBalance(Double c_BALANCE)
+	{
+		this.CBalance = c_BALANCE;
+	}
+
+	@Column( name = "C_YTD_PMT" )
+	public Double getCYtdPmt()
+	{
+		return this.CYtdPmt;
+	}
+
+	public void setCYtdPmt(Double c_YTD_PMT)
+	{
+		this.CYtdPmt = c_YTD_PMT;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "C_BIRTHDATE", length = 10 )
+	public Date getCBirthdate()
+	{
+		return this.CBirthdate;
+	}
+
+	public void setCBirthdate(Date CBirthdate)
+	{
+		this.CBirthdate = CBirthdate;
+	}
+
+	@Column( name = "C_DATA", length = 65535 )
+	public String getCData()
+	{
+		return this.CData;
+	}
+
+	public void setCData(String CData)
+	{
+		this.CData = CData;
+	}
+
+	@OneToMany( targetEntity=Orders.class, fetch = FetchType.LAZY, mappedBy = "customer" )
+	public Set<IOrders> getOrderses()
+	{
+		return this.orderses;
+	}
+
+	public void setOrderses(Set<IOrders> orderses)
+	{
+		this.orderses = orderses;
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Item.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Item.java
new file mode 100644
index 0000000..edb455b
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Item.java
@@ -0,0 +1,380 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+import org.hibernate.annotations.Index;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+/**
+ * Item generated by hbm2java
+ */
+@Entity
+@Table( name = "item", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class Item implements java.io.Serializable, IItem
+{
+
+	private static final long serialVersionUID  = 8806932749710043085L;
+
+	private Integer           IId;
+
+	private IAuthor           author;
+
+	private String            ITitle;
+
+	private Date              IPubDate;
+
+	private String            IPublisher;
+
+	private String            ISubject;
+
+	private String            IDesc;
+
+	private Integer           IRelated1;
+
+	private Integer           IRelated2;
+
+	private Integer           IRelated3;
+
+	private Integer           IRelated4;
+
+	private Integer           IRelated5;
+
+	private String            IThumbnail;
+
+	private String            IImage;
+
+	private Double            ISrp;
+
+	private Double            ICost;
+
+	private Date              IAvail;
+
+	private Integer           IStock;
+
+	private String            IIsbn;
+
+	private String            IPage;
+
+	private String            IBacking;
+
+	private String            IDimension;
+	
+	private double			  IRandom;
+
+	private Set<IOrderLine>       orderLines        = new HashSet<IOrderLine>( 0 );
+
+	private Set<IShoppingCartLine>       shoppingCartLines = new HashSet<IShoppingCartLine>( 0 );
+
+	public Item()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "I_ID", unique = true, nullable = false )
+	public Integer getIId()
+	{
+		return this.IId;
+	}
+
+	public void setIId(Integer IId)
+	{
+		this.IId = IId;
+	}
+
+	@ManyToOne( targetEntity=Author.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "I_A_ID", nullable = false )
+	public IAuthor getAuthor()
+	{
+		return this.author;
+	}
+
+	public void setAuthor(IAuthor author)
+	{
+		this.author = author;
+	}
+
+	@Column( name = "I_TITLE", length = 60 )
+	public String getITitle()
+	{
+		return this.ITitle;
+	}
+
+	public void setITitle(String ITitle)
+	{
+		this.ITitle = ITitle;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "I_PUB_DATE", length = 19 )
+	public Date getIPubDate()
+	{
+		return this.IPubDate;
+	}
+
+	public void setIPubDate(Date IPubDate)
+	{
+		this.IPubDate = IPubDate;
+	}
+
+	@Column( name = "I_PUBLISHER", length = 60 )
+	public String getIPublisher()
+	{
+		return this.IPublisher;
+	}
+
+	public void setIPublisher(String IPublisher)
+	{
+		this.IPublisher = IPublisher;
+	}
+
+	@Column( name = "I_SUBJECT", length = 60 )
+	public String getISubject()
+	{
+		return this.ISubject;
+	}
+
+	public void setISubject(String ISubject)
+	{
+		this.ISubject = ISubject;
+	}
+
+	@Column( name = "I_DESC", length = 65535 )
+	public String getIDesc()
+	{
+		return this.IDesc;
+	}
+
+	public void setIDesc(String IDesc)
+	{
+		this.IDesc = IDesc;
+	}
+
+	@Column( name = "I_RELATED1" )
+	public Integer getIRelated1()
+	{
+		return this.IRelated1;
+	}
+
+	public void setIRelated1(Integer IRelated1)
+	{
+		this.IRelated1 = IRelated1;
+	}
+
+	@Column( name = "I_RELATED2" )
+	public Integer getIRelated2()
+	{
+		return this.IRelated2;
+	}
+
+	public void setIRelated2(Integer IRelated2)
+	{
+		this.IRelated2 = IRelated2;
+	}
+
+	@Column( name = "I_RELATED3" )
+	public Integer getIRelated3()
+	{
+		return this.IRelated3;
+	}
+
+	public void setIRelated3(Integer IRelated3)
+	{
+		this.IRelated3 = IRelated3;
+	}
+
+	@Column( name = "I_RELATED4" )
+	public Integer getIRelated4()
+	{
+		return this.IRelated4;
+	}
+
+	public void setIRelated4(Integer IRelated4)
+	{
+		this.IRelated4 = IRelated4;
+	}
+
+	@Column( name = "I_RELATED5" )
+	public Integer getIRelated5()
+	{
+		return this.IRelated5;
+	}
+
+	public void setIRelated5(Integer IRelated5)
+	{
+		this.IRelated5 = IRelated5;
+	}
+
+	@Column( name = "I_THUMBNAIL", length = 60 )
+	public String getIThumbnail()
+	{
+		return this.IThumbnail;
+	}
+
+	public void setIThumbnail(String IThumbnail)
+	{
+		this.IThumbnail = IThumbnail;
+	}
+
+	@Column( name = "I_IMAGE", length = 60 )
+	public String getIImage()
+	{
+		return this.IImage;
+	}
+
+	public void setIImage(String IImage)
+	{
+		this.IImage = IImage;
+	}
+
+	@Column( name = "I_SRP" )
+	public Double getISrp()
+	{
+		return this.ISrp;
+	}
+
+	public void setISrp(Double i_SRP)
+	{
+		this.ISrp = i_SRP;
+	}
+
+	@Column( name = "I_COST" )
+	public Double getICost()
+	{
+		return this.ICost;
+	}
+
+	public void setICost(Double i_COST)
+	{
+		this.ICost = i_COST;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "I_AVAIL", length = 19 )
+	public Date getIAvail()
+	{
+		return this.IAvail;
+	}
+
+	public void setIAvail(Date IAvail)
+	{
+		this.IAvail = IAvail;
+	}
+
+	@Column( name = "I_STOCK" )
+	public Integer getIStock()
+	{
+		return this.IStock;
+	}
+
+	public void setIStock(Integer IStock)
+	{
+		this.IStock = IStock;
+	}
+
+	@Column( name = "I_ISBN", length = 13 )
+	public String getIIsbn()
+	{
+		return this.IIsbn;
+	}
+
+	public void setIIsbn(String IIsbn)
+	{
+		this.IIsbn = IIsbn;
+	}
+
+	@Column( name = "I_PAGE", length = 4 )
+	public String getIPage()
+	{
+		return this.IPage;
+	}
+
+	public void setIPage(String IPage)
+	{
+		this.IPage = IPage;
+	}
+
+	@Column( name = "I_BACKING", length = 15 )
+	public String getIBacking()
+	{
+		return this.IBacking;
+	}
+
+	public void setIBacking(String IBacking)
+	{
+		this.IBacking = IBacking;
+	}
+
+	@Column( name = "I_DIMENSION", length = 25 )
+	public String getIDimension()
+	{
+		return this.IDimension;
+	}
+
+	public void setIDimension(String IDimension)
+	{
+		this.IDimension = IDimension;
+	}
+
+	@OneToMany( targetEntity=OrderLine.class, fetch = FetchType.LAZY, mappedBy = "item" )
+	public Set<IOrderLine> getOrderLines()
+	{
+		return this.orderLines;
+	}
+
+	public void setOrderLines(Set<IOrderLine> orderLines)
+	{
+		this.orderLines = orderLines;
+	}
+
+	@OneToMany( targetEntity=ShoppingCartLine.class, fetch = FetchType.LAZY, mappedBy = "item" )
+	public Set<IShoppingCartLine> getShoppingCartLines()
+	{
+		return this.shoppingCartLines;
+	}
+
+	public void setShoppingCartLines(Set<IShoppingCartLine> shoppingCartLines)
+	{
+		this.shoppingCartLines = shoppingCartLines;
+	}
+
+	@Override
+	@Column( name="I_RANDOM")
+    public double getIRandom()
+    {
+	    return IRandom;
+    }
+
+	@Override
+    public void setIRandom(double num)
+    {
+	    IRandom = num;	    
+    }
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/OrderLine.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/OrderLine.java
new file mode 100644
index 0000000..581a16a
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/OrderLine.java
@@ -0,0 +1,118 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+/**
+ * OrderLine generated by hbm2java
+ */
+@Entity
+@Table( name = "order_line", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class OrderLine implements IOrderLine
+{
+	private Integer     id;
+
+	private IOrders  orders;
+
+	private IItem    item;
+
+	private Integer olQty;
+
+	private Double olDiscount;
+
+	private String  olComment;
+
+	public OrderLine()
+	{
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "OL_ID", unique = true, nullable = false )
+	public Integer getOlId()
+	{
+		return this.id;
+	}
+
+	public void setOlId(Integer olId)
+	{
+		this.id = olId;
+	}
+
+	@ManyToOne( targetEntity=Orders.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "OL_O_ID", nullable = false )
+	public IOrders getOrders()
+	{
+		return this.orders;
+	}
+
+	public void setOrders(IOrders orders)
+	{
+		this.orders = orders;
+	}
+
+	@ManyToOne( targetEntity=Item.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "OL_I_ID", nullable = false )
+	public IItem getItem()
+	{
+		return this.item;
+	}
+
+	public void setItem(IItem item)
+	{
+		this.item = item;
+	}
+
+	@Column( name = "OL_QTY" )
+	public Integer getOlQty()
+	{
+		return this.olQty;
+	}
+
+	public void setOlQty(Integer olQty)
+	{
+		this.olQty = olQty;
+	}
+
+	@Column( name = "OL_DISCOUNT" )
+	public Double getOlDiscount()
+	{
+		return this.olDiscount;
+	}
+
+	public void setOlDiscount(Double oL_DISCOUNT)
+	{
+		this.olDiscount = oL_DISCOUNT;
+	}
+
+	@Column( name = "OL_COMMENT", length = 100 )
+	public String getOlComment()
+	{
+		return this.olComment;
+	}
+
+	public void setOlComment(String olComment)
+	{
+		this.olComment = olComment;
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Orders.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Orders.java
new file mode 100644
index 0000000..0c41b86
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/Orders.java
@@ -0,0 +1,220 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+@Entity
+@Table( name = "orders", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class Orders implements IOrders
+{
+
+	private Integer      id;
+
+	private IAddress     addressByOShipAddrId;
+
+	private ICustomer    customer;
+
+	private IAddress     addressByOBillAddrId;
+
+	private Date        ODate;
+
+	private Double      OSubTotal;
+
+	private Double      OTax;
+
+	private Double      OTotal;
+
+	private String      OShipType;
+
+	private Date        OShipDate;
+
+	private String      OStatus;
+
+	private Set<ICcXacts> ccXactses  = new HashSet<ICcXacts>( 0 );
+
+	private Set<IOrderLine> orderLines = new HashSet<IOrderLine>( 0 );
+
+	public Orders()
+	{
+
+	}
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "O_ID", unique = true, nullable = false )
+	public Integer getOId()
+	
+	{
+		return this.id;
+	}
+
+	public void setOId(Integer OId)
+	{
+		this.id = OId;
+	}
+
+	@ManyToOne( targetEntity=Address.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "O_SHIP_ADDR_ID", nullable = false )
+	public IAddress getAddressByOShipAddrId()
+	{
+		return this.addressByOShipAddrId;
+	}
+
+	public void setAddressByOShipAddrId(IAddress addressByOShipAddrId)
+	{
+		this.addressByOShipAddrId = addressByOShipAddrId;
+	}
+
+	@ManyToOne( targetEntity=Customer.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "O_C_ID", nullable = false )
+	public ICustomer getCustomer()
+	{
+		return this.customer;
+	}
+
+	public void setCustomer(ICustomer customer)
+	{
+		this.customer = customer;
+	}
+
+	@ManyToOne( targetEntity=Address.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "O_BILL_ADDR_ID", nullable = false )
+	public IAddress getAddressByOBillAddrId()
+	{
+		return this.addressByOBillAddrId;
+	}
+
+	public void setAddressByOBillAddrId(IAddress addressByOBillAddrId)
+	{
+		this.addressByOBillAddrId = addressByOBillAddrId;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "O_DATE", length = 19 )
+	public Date getODate()
+	{
+		return this.ODate;
+	}
+
+	public void setODate(Date ODate)
+	{
+		this.ODate = ODate;
+	}
+
+	@Column( name = "O_SUB_TOTAL" )
+	public Double getOSubTotal()
+	{
+		return this.OSubTotal;
+	}
+
+	public void setOSubTotal(Double o_SUB_TOTAL)
+	{
+		this.OSubTotal = o_SUB_TOTAL;
+	}
+
+	@Column( name = "O_TAX" )
+	public Double getOTax()
+	{
+		return this.OTax;
+	}
+
+	public void setOTax(Double o_TAX)
+	{
+		this.OTax = o_TAX;
+	}
+
+	@Column( name = "O_TOTAL" )
+	public Double getOTotal()
+	{
+		return this.OTotal;
+	}
+
+	public void setOTotal(double o_TOTAL)
+	{
+		this.OTotal = o_TOTAL;
+	}
+
+	@Column( name = "O_SHIP_TYPE", length = 10 )
+	public String getOShipType()
+	{
+		return this.OShipType;
+	}
+
+	public void setOShipType(String OShipType)
+	{
+		this.OShipType = OShipType;
+	}
+
+	@Temporal( TemporalType.DATE )
+	@Column( name = "O_SHIP_DATE", length = 19 )
+	public Date getOShipDate()
+	{
+		return this.OShipDate;
+	}
+
+	public void setOShipDate(Date OShipDate)
+	{
+		this.OShipDate = OShipDate;
+	}
+
+	@Column( name = "O_STATUS", length = 15 )
+	public String getOStatus()
+	{
+		return this.OStatus;
+	}
+
+	public void setOStatus(String OStatus)
+	{
+		this.OStatus = OStatus;
+	}
+
+	@OneToMany( targetEntity=CcXacts.class, fetch = FetchType.LAZY, mappedBy = "orders" )
+	public Set<ICcXacts> getCcXactses()
+	{
+		return this.ccXactses;
+	}
+
+	public void setCcXactses(Set<ICcXacts> ccXactses)
+	{
+		this.ccXactses = ccXactses;
+	}
+
+	@OneToMany( targetEntity=OrderLine.class, fetch = FetchType.LAZY, mappedBy = "orders" )
+	public Set<IOrderLine> getOrderLines()
+	{
+		return this.orderLines;
+	}
+
+	public void setOrderLines(Set<IOrderLine> orderLines)
+	{
+		this.orderLines = orderLines;
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCart.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCart.java
new file mode 100644
index 0000000..c1d1af5
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCart.java
@@ -0,0 +1,92 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+
+/**
+ * ShoppingCart generated by hbm2java
+ */
+@Entity
+@Table( name = "shopping_cart", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+
+public class ShoppingCart implements IShoppingCart
+{
+	private Integer scId;
+
+	private Date    scTime;
+	
+	private Set<IShoppingCartLine> shoppingCartLines = new HashSet<IShoppingCartLine>( 0 );
+
+	public ShoppingCart()
+	{
+	}
+
+	public ShoppingCart(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+	@OneToMany( targetEntity=ShoppingCartLine.class, fetch = FetchType.LAZY, mappedBy = "shoppingCart" )
+    public Set<IShoppingCartLine> getShoppingCartLines()
+    {
+    	return shoppingCartLines;
+    }
+
+    public void setShoppingCartLines(Set<IShoppingCartLine> shoppingCartLines)
+    {
+    	this.shoppingCartLines = shoppingCartLines;
+    }
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "SC_ID", unique = true, nullable = false )
+	@Override
+	public Integer getScId()
+	{
+		return this.scId;
+	}
+
+	@Override
+	public void setScId(Integer scId)
+	{
+		this.scId = scId;
+	}
+
+	@Temporal( TemporalType.TIMESTAMP )
+	@Column( name = "SC_TIME", length = 19 )
+	@Override
+	public Date getScTime()
+	{
+		return this.scTime;
+	}
+
+	@Override
+	public void setScTime(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCartLine.java b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCartLine.java
new file mode 100644
index 0000000..d993052
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/hibernate/ShoppingCartLine.java
@@ -0,0 +1,99 @@
+package eu.cloudscale.showcase.db.model.hibernate;
+
+// Generated May 16, 2013 3:07:18 PM by Hibernate Tools 4.0.0
+
+import static javax.persistence.GenerationType.IDENTITY;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+/**
+ * ShoppingCartLine generated by hbm2java
+ */
+@Entity
+@Table( name = "shopping_cart_line", catalog = "tpcw" )
+@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
+public class ShoppingCartLine implements IShoppingCartLine
+{
+	private Integer sclId;
+
+	private IItem    item;
+
+	private Integer sclQty;
+	
+	private IShoppingCart shoppingCart;	
+
+	public ShoppingCartLine()
+	{
+	}
+	
+	@ManyToOne( targetEntity=ShoppingCart.class, fetch = FetchType.LAZY )
+	@JoinColumn( name = "SCL_SC_ID", nullable = false )
+	@Override
+    public IShoppingCart getShoppingCart()
+    {
+    	return shoppingCart;
+    }
+
+	@Override
+    public void setShoppingCart(IShoppingCart shoppingCart)
+    {
+    	this.shoppingCart = shoppingCart;
+    }
+
+
+	@Id
+	@GeneratedValue( strategy = IDENTITY )
+	@Column( name = "SCL_ID", unique = true, nullable = false )
+	@Override
+	public Integer getSclId()
+	{
+		return this.sclId;
+	}
+
+	@Override
+	public void setSclId( Integer sclScId )
+	{
+		this.sclId = sclScId;
+	}
+
+	@ManyToOne( targetEntity=Item.class, fetch = FetchType.EAGER )
+	@JoinColumn( name = "SCL_I_ID", nullable = false )
+	@Override
+	public IItem getItem()
+	{
+		return this.item;
+	}
+
+	@Override
+	public void setItem(IItem item)
+	{
+		this.item = item;
+	}
+
+	@Column( name = "SCL_QTY" )
+	@Override
+	public Integer getSclQty()
+	{
+		return this.sclQty;
+	}
+
+	@Override
+	public void setSclQty(Integer sclQty)
+	{
+		this.sclQty = sclQty;
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/IAddress.java b/src/main/java/eu/cloudscale/showcase/db/model/IAddress.java
new file mode 100644
index 0000000..21df49c
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/IAddress.java
@@ -0,0 +1,40 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Set;
+
+
+
+public interface IAddress
+{
+
+	public Integer getAddrId();
+
+	public void setAddrId(Integer addrId);
+
+	public  ICountry getCountry();
+
+	public void setCountry(ICountry country);
+
+	public String getAddrStreet1();
+
+	public void setAddrStreet1(String addrStreet1);
+
+	public String getAddrStreet2();
+
+	public void setAddrStreet2(String addrStreet2);
+
+	public String getAddrCity();
+
+	public void setAddrCity(String addrCity);
+
+	public String getAddrState();
+
+	public void setAddrState(String addrState);
+
+	public String getAddrZip();
+
+	public void setAddrZip(String addrZip);
+
+	public Set<ICustomer> getCustomers();
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/IAuthor.java b/src/main/java/eu/cloudscale/showcase/db/model/IAuthor.java
new file mode 100644
index 0000000..a1ebe5a
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/IAuthor.java
@@ -0,0 +1,34 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+
+public interface IAuthor
+{
+
+	public Integer getAId();
+
+	public void setAId(Integer AId);
+
+	public String getAFname();
+
+	public void setAFname(String AFname);
+
+	public String getALname();
+
+	public void setALname(String ALname);
+
+	public String getAMname();
+
+	public void setAMname(String AMname);
+
+	public Date getADob();
+
+	public void setADob(Date ADob);
+
+	public String getABio();
+
+	public void setABio(String ABio);
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/ICcXacts.java b/src/main/java/eu/cloudscale/showcase/db/model/ICcXacts.java
new file mode 100644
index 0000000..c695622
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/ICcXacts.java
@@ -0,0 +1,50 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+
+public interface ICcXacts
+{
+
+	public Integer getId();
+
+	public void setId(Integer id);
+
+	public ICountry getCountry();
+
+	public void setCountry(ICountry country);
+
+	public IOrders getOrders();
+
+	public String getCxType();
+
+	public void setCxType(String cxType);
+
+	public Integer getCxNum();
+
+	public void setCxNum(Integer cxNum);
+
+	public String getCxName();
+
+	public void setCxName(String cxName);
+
+	public Date getCxExpiry();
+
+	public void setCxExpiry(Date cxExpiry);
+
+	public String getCxAuthId();
+
+	public void setCxAuthId(String cxAuthId);
+
+	public Double getCxXactAmt();
+
+	public void setCxXactAmt(Double o_TOTAL);
+
+	public Date getCxXactDate();
+
+	public void setCxXactDate(Date cxXactDate);
+
+	public void setOrders(IOrders orders);
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/ICountry.java b/src/main/java/eu/cloudscale/showcase/db/model/ICountry.java
new file mode 100644
index 0000000..376b67c
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/ICountry.java
@@ -0,0 +1,23 @@
+package eu.cloudscale.showcase.db.model;
+
+
+public interface ICountry
+{
+
+	public Integer getCoId();
+
+	public void setCoId(Integer coId);
+
+	public String getCoName();
+
+	public void setCoName(String coName);
+
+	public Double getCoExchange();
+
+	public void setCoExchange(Double coExchange);
+
+	public String getCoCurrency();
+
+	public void setCoCurrency(String coCurrency);
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/ICustomer.java b/src/main/java/eu/cloudscale/showcase/db/model/ICustomer.java
new file mode 100644
index 0000000..4046c24
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/ICustomer.java
@@ -0,0 +1,76 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+public interface ICustomer
+{
+
+	public Integer getCId();
+
+	public void setCId(Integer CId);
+
+	public IAddress getAddress();
+
+	public void setAddress(IAddress address);
+
+	public String getCUname();
+
+	public void setCUname(String CUname);
+
+	public String getCPasswd();
+
+	public void setCPasswd(String CPasswd);
+
+	public String getCFname();
+
+	public void setCFname(String CFname);
+
+	public String getCLname();
+
+	public void setCLname(String CLname);
+
+	public String getCPhone();
+
+	public void setCData(String CData);
+
+	public String getCData();
+
+	public void setCBirthdate(Date CBirthdate);
+
+	public Date getCBirthdate();
+
+	public void setCYtdPmt(Double c_YTD_PMT);
+
+	public Double getCYtdPmt();
+
+	public void setCBalance(Double c_BALANCE);
+
+	public Double getCBalance();
+
+	public void setCDiscount(double c_DISCOUNT);
+
+	public Double getCDiscount();
+
+	public void setCExpiration(Date CExpiration);
+
+	public Date getCExpiration();
+
+	public void setCLogin(Date CLogin);
+
+	public Date getCLogin();
+
+	public void setCLastVisit(Date CLastVisit);
+
+	public Date getCLastVisit();
+
+	public void setCSince(Date CSince);
+
+	public Date getCSince();
+
+	public void setCEmail(String CEmail);
+
+	public String getCEmail();
+
+	public void setCPhone(String CPhone);
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/IItem.java b/src/main/java/eu/cloudscale/showcase/db/model/IItem.java
new file mode 100644
index 0000000..700e485
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/IItem.java
@@ -0,0 +1,100 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+
+
+public interface IItem
+{
+
+	public Integer getIId();
+
+	public void setIDimension(String IDimension);
+
+	public String getIDimension();
+
+	public void setIBacking(String IBacking);
+
+	public String getIBacking();
+
+	public void setIPage(String IPage);
+
+	public String getIPage();
+
+	public void setIIsbn(String IIsbn);
+
+	public String getIIsbn();
+
+	public void setIStock(Integer IStock);
+
+	public Integer getIStock();
+
+	public void setIAvail(Date IAvail);
+
+	public Date getIAvail();
+
+	public void setICost(Double i_COST);
+
+	public Double getICost();
+
+	public void setISrp(Double i_SRP);
+
+	public Double getISrp();
+
+	public void setIImage(String IImage);
+
+	public String getIImage();
+
+	public void setIThumbnail(String IThumbnail);
+
+	public String getIThumbnail();
+
+	public void setIRelated5(Integer IRelated5);
+
+	public Integer getIRelated5();
+
+	public void setIRelated4(Integer IRelated4);
+
+	public Integer getIRelated4();
+
+	public void setIRelated3(Integer IRelated3);
+
+	public Integer getIRelated3();
+
+	public void setIRelated2(Integer IRelated2);
+
+	public Integer getIRelated2();
+
+	public void setIRelated1(Integer IRelated1);
+
+	public Integer getIRelated1();
+
+	public void setIDesc(String IDesc);
+
+	public String getIDesc();
+
+	public void setISubject(String ISubject);
+
+	public String getISubject();
+
+	public void setIPublisher(String IPublisher);
+
+	public String getIPublisher();
+
+	public void setIPubDate(Date IPubDate);
+
+	public Date getIPubDate();
+
+	public void setITitle(String ITitle);
+
+	public String getITitle();
+
+	public void setAuthor(IAuthor author);
+
+	public IAuthor getAuthor();
+
+	public void setIId(Integer IId);
+	
+	public double getIRandom();
+	
+	public void setIRandom(double num);
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/IOrderLine.java b/src/main/java/eu/cloudscale/showcase/db/model/IOrderLine.java
new file mode 100644
index 0000000..581c9c8
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/IOrderLine.java
@@ -0,0 +1,31 @@
+package eu.cloudscale.showcase.db.model;
+
+
+public interface IOrderLine
+{
+
+	public Integer getOlId();
+
+	public void setOlId(Integer olId);
+
+	public IOrders getOrders();
+
+	public void setOrders(IOrders orders);
+
+	public IItem getItem();
+
+	public void setItem(IItem item);
+
+	public Integer getOlQty();
+
+	public void setOlQty(Integer olQty);
+
+	public Double getOlDiscount();
+
+	public void setOlDiscount(Double oL_DISCOUNT);
+
+	public String getOlComment();
+
+	public void setOlComment(String olComment);
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/IOrders.java b/src/main/java/eu/cloudscale/showcase/db/model/IOrders.java
new file mode 100644
index 0000000..6b0ad44
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/IOrders.java
@@ -0,0 +1,56 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+import java.util.Set;
+
+public interface IOrders
+{
+
+	public Integer getOId();
+
+	public void setOId(Integer OId);
+
+	IAddress getAddressByOShipAddrId();
+
+	void setAddressByOShipAddrId(IAddress addressByOShipAddrId);
+
+	ICustomer getCustomer();
+
+	void setCustomer(ICustomer customer);
+
+	IAddress getAddressByOBillAddrId();
+
+	void setAddressByOBillAddrId(IAddress addressByOBillAddrId);
+
+
+	void setOStatus(String OStatus);
+
+	String getOStatus();
+
+	void setOShipDate(Date OShipDate);
+
+	Date getOShipDate();
+
+	void setOShipType(String OShipType);
+
+	String getOShipType();
+
+	void setOTotal(double o_TOTAL);
+
+	Double getOTotal();
+
+	void setOTax(Double o_TAX);
+
+	Double getOTax();
+
+	void setOSubTotal(Double o_SUB_TOTAL);
+
+	Double getOSubTotal();
+
+	void setODate(Date ODate);
+
+	Date getODate();
+
+	public Set<IOrderLine> getOrderLines();
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCart.java b/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCart.java
new file mode 100644
index 0000000..7b69ab3
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCart.java
@@ -0,0 +1,20 @@
+package eu.cloudscale.showcase.db.model;
+
+import java.util.Date;
+import java.util.Set;
+
+
+public interface IShoppingCart
+{
+
+	public void setScTime(Date scTime);
+
+	public Date getScTime();
+
+	public void setScId(Integer scId);
+
+	public Integer getScId();
+
+	public Set<IShoppingCartLine> getShoppingCartLines();
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCartLine.java b/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCartLine.java
new file mode 100644
index 0000000..3a8b308
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/IShoppingCartLine.java
@@ -0,0 +1,24 @@
+package eu.cloudscale.showcase.db.model;
+
+
+
+public interface IShoppingCartLine
+{
+
+	public IShoppingCart getShoppingCart();
+
+	public void setShoppingCart(IShoppingCart shoppingCart);
+
+	public Integer getSclId();
+
+	public void setSclId(Integer sclScId);
+
+	public IItem getItem();
+
+	public void setItem(IItem item);
+
+	public Integer getSclQty();
+
+	public void setSclQty(Integer sclQty);
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/Address.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Address.java
new file mode 100644
index 0000000..ad0d4d1
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Address.java
@@ -0,0 +1,161 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "address" )
+public class Address implements IAddress, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//	private MongoService service;
+//	
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 926688150220849693L;
+
+	@Id
+	private ObjectId      id;
+	
+	@Indexed
+	private Integer       addrId;
+
+	private Integer		  coId;
+
+	private String        addrStreet1;
+
+	private String        addrStreet2;
+
+	private String        addrCity;
+
+	private String        addrState;
+
+	private String        addrZip;
+	
+	public Address()
+	{
+		
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	public ObjectId getId()
+	{
+		return this.id;
+	}
+
+	@Override
+	public Integer getAddrId()
+	{
+		return addrId;
+	}
+
+	@Override
+	public void setAddrId(Integer addrId)
+	{
+		this.addrId = addrId;
+	}
+
+	@Override
+	public ICountry getCountry()
+	{
+		return DatabaseHelper.getDatabase().getCountryById(this.coId);
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.coId = country.getCoId();
+	}
+
+	@Override
+	public String getAddrStreet1()
+	{
+		return this.addrStreet1;
+	}
+
+	@Override
+	public void setAddrStreet1(String addrStreet1)
+	{
+		this.addrStreet1 = addrStreet1;
+	}
+
+	@Override
+	public String getAddrStreet2()
+	{
+		return this.addrStreet2;
+	}
+
+	@Override
+	public void setAddrStreet2(String addrStreet2)
+	{
+		this.addrStreet2 = addrStreet2;
+	}
+
+	@Override
+	public String getAddrCity()
+	{
+		return this.addrCity;
+	}
+
+	@Override
+	public void setAddrCity(String addrCity)
+	{
+		this.addrCity = addrCity;
+	}
+
+	@Override
+	public String getAddrState()
+	{
+		return this.addrState;
+	}
+
+	@Override
+	public void setAddrState(String addrState)
+	{
+		this.addrState = addrState;
+	}
+
+	@Override
+	public String getAddrZip()
+	{
+		return this.addrZip;
+	}
+
+	@Override
+	public void setAddrZip(String addrZip)
+	{
+		this.addrZip = addrZip;
+	}
+
+	@Override
+    public Set<ICustomer> getCustomers()
+    {
+		if( this.addrId == null )
+			return new HashSet<ICustomer>(0);
+		
+		IAddress address = DatabaseHelper.getDatabase().findAddressById( this.addrId );
+		return new HashSet<ICustomer>(DatabaseHelper.getDatabase().findCustomerByAddress( address )); 
+    }
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/Author.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Author.java
new file mode 100644
index 0000000..d1129a0
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Author.java
@@ -0,0 +1,137 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import eu.cloudscale.showcase.db.model.IAuthor;
+
+@Document( collection = "author" )
+public class Author implements IAuthor, Serializable
+{
+
+	/**
+     * 
+     */
+    private static final long serialVersionUID = -658143403409650089L;
+
+	@Id
+	private ObjectId id;
+
+	@Indexed
+	private Integer  authorId;
+
+	private String   AFname;
+
+	private String   ALname;
+
+	private String   AMname;
+
+	private Date     ADob;
+
+	private String   ABio;
+
+	private String   lNameSoundex;
+
+	public Author()
+	{
+
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	public ObjectId getId()
+	{
+		return this.id;
+	}
+
+	@Override
+	public Integer getAId()
+	{
+		return this.authorId;
+	}
+
+	@Override
+	public void setAId(Integer AId)
+	{
+		this.authorId = AId;
+	}
+
+	@Override
+	public String getAFname()
+	{
+		return this.AFname;
+	}
+
+	@Override
+	public void setAFname(String AFname)
+	{
+		this.AFname = AFname;
+	}
+
+	@Override
+	public String getALname()
+	{
+		return this.ALname;
+	}
+
+	@Override
+	public void setALname(String ALname)
+	{
+		this.ALname = ALname;
+	}
+
+	@Override
+	public String getAMname()
+	{
+		return this.AMname;
+	}
+
+	@Override
+	public void setAMname(String AMname)
+	{
+		this.AMname = AMname;
+	}
+
+	@Override
+	public Date getADob()
+	{
+		return this.ADob;
+	}
+
+	@Override
+	public void setADob(Date ADob)
+	{
+		this.ADob = ADob;
+	}
+
+	@Override
+	public String getABio()
+	{
+		return this.ABio;
+	}
+
+	@Override
+	public void setABio(String ABio)
+	{
+		this.ABio = ABio;
+	}
+
+	public String getlNameSoundex()
+	{
+		return lNameSoundex;
+	}
+
+	public void setlNameSoundex(String lNameSoundex)
+	{
+		this.lNameSoundex = lNameSoundex;
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/CcXacts.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/CcXacts.java
new file mode 100644
index 0000000..5351530
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/CcXacts.java
@@ -0,0 +1,185 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "ccxacts" )
+public class CcXacts implements ICcXacts, Serializable
+{
+
+//	@Autowired
+//	@Qualifier("service")
+//	private MongoService service;
+	
+    private static final long serialVersionUID = -8752879558532267562L;
+
+	@Id
+	private ObjectId id;
+	
+	@Indexed
+	private Integer   ccXactsId;
+
+	private Integer cxCoId;
+
+	private Integer cxOId;
+
+	private String   cxType;
+
+	private Integer  cxNum;
+
+	private String   cxName;
+
+	private Date     cxExpiry;
+
+	private String cxAuthId;
+
+	private Double   cxXactAmt;
+
+	private Date     cxXactDate;
+	
+	public CcXacts()
+	{
+	}
+	
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public Integer getId()
+	{
+		return this.ccXactsId;
+	}
+
+	@Override
+	public void setId(Integer id)
+	{
+		this.ccXactsId = id;
+	}
+
+	@Override
+	public ICountry getCountry()
+	{
+		return DatabaseHelper.getDatabase().getCountryById( this.cxCoId );
+	}
+
+	@Override
+	public void setCountry(ICountry country)
+	{
+		this.cxCoId = country.getCoId();
+	}
+
+	@Override
+	public IOrders getOrders()
+	{
+		return DatabaseHelper.getDatabase().findOrdersById( this.cxOId );
+	}
+
+	@Override
+	public String getCxType()
+	{
+		return this.cxType;
+	}
+
+	@Override
+	public void setCxType(String cxType)
+	{
+		this.cxType = cxType;
+	}
+
+	@Override
+	public Integer getCxNum()
+	{
+		return this.cxNum;
+	}
+
+	@Override
+	public void setCxNum(Integer cxNum)
+	{
+		this.cxNum = cxNum;
+	}
+
+	@Override
+	public String getCxName()
+	{
+		return this.cxName;
+	}
+
+	@Override
+	public void setCxName(String cxName)
+	{
+		this.cxName = cxName;
+	}
+
+	@Override
+	public Date getCxExpiry()
+	{
+		return this.cxExpiry;
+	}
+
+	@Override
+	public void setCxExpiry(Date cxExpiry)
+	{
+		this.cxExpiry = cxExpiry;
+	}
+
+	@Override
+	public String getCxAuthId()
+	{
+		return this.cxAuthId;
+	}
+
+	@Override
+	public void setCxAuthId(String cxAuthId)
+	{
+		this.cxAuthId = cxAuthId;
+	}
+
+	@Override
+	public Double getCxXactAmt()
+	{
+		return this.cxXactAmt;
+	}
+
+	@Override
+	public void setCxXactAmt(Double o_TOTAL)
+	{
+		this.cxXactAmt = o_TOTAL;
+	}
+
+	@Override
+	public Date getCxXactDate()
+	{
+		return this.cxXactDate;
+	}
+
+	@Override
+	public void setCxXactDate(Date cxXactDate)
+	{
+		this.cxXactDate = cxXactDate;
+	}
+
+	@Override
+	public void setOrders(IOrders orders)
+	{
+		this.cxOId = orders.getOId();
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/Country.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Country.java
new file mode 100644
index 0000000..5bf2f63
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Country.java
@@ -0,0 +1,96 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+
+import org.bson.types.ObjectId;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import eu.cloudscale.showcase.db.model.ICountry;
+
+@Document( collection = "country" )
+public class Country implements ICountry, Serializable
+{
+
+	/**
+     * 
+     */
+    private static final long serialVersionUID = 2938841459454938022L;
+
+	@Id
+	private ObjectId      id;
+
+	@Indexed
+	private Integer        coId;
+
+	@Indexed
+	private String        coName;
+
+	private Double        coExchange;
+
+	private String        coCurrency;
+
+	public Country()
+	{
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	@Override
+	public Integer getCoId()
+	{
+		return this.coId;
+	}
+
+	@Override
+	public void setCoId(Integer coId)
+	{
+		this.coId = coId;
+	}
+
+	@Override
+	public String getCoName()
+	{
+		return this.coName;
+	}
+
+	@Override
+	public void setCoName(String coName)
+	{
+		this.coName = coName;
+	}
+
+	@Override
+	public Double getCoExchange()
+	{
+		return this.coExchange;
+	}
+
+	@Override
+	public void setCoExchange(Double coExchange)
+	{
+		this.coExchange = coExchange;
+	}
+
+	@Override
+	public String getCoCurrency()
+	{
+		return this.coCurrency;
+	}
+
+	@Override
+	public void setCoCurrency(String coCurrency)
+	{
+		this.coCurrency = coCurrency;
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/Customer.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Customer.java
new file mode 100644
index 0000000..6ff68ab
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Customer.java
@@ -0,0 +1,287 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "customer" )
+public class Customer implements ICustomer, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//
+//	private MongoService service;
+//	
+    private static final long serialVersionUID = 1920560375336316671L;
+
+	@Id
+	private ObjectId id;
+
+	@Indexed
+	private Integer  cId;
+
+	@Indexed
+	private Integer  addrId;
+
+	private String   cUname;
+
+	private String   cPasswd;
+
+	private String   cFname;
+
+	private String   cLname;
+
+	private String   cPhone;
+
+	private String   cEmail;
+
+	private Date     cSince;
+
+	private Date     cLastVisit;
+
+	private Date     cLogin;
+
+	private Date     cExpiration;
+
+	private Double   cDiscount;
+
+	private Double   cBalance;
+
+	private Double   cYtdPmt;
+
+	private Date     cBirthdate;
+
+	private String   cData;
+	
+	public Customer()
+	{
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	@Override
+	public Integer getCId()
+	{
+		return this.cId;
+	}
+
+	@Override
+	public void setCId(Integer CId)
+	{
+		this.cId = CId;
+	}
+
+	@Override
+	public IAddress getAddress()
+	{
+		return DatabaseHelper.getDatabase().findAddressById( addrId );
+	}
+
+	@Override
+	public void setAddress(IAddress address)
+	{
+		this.addrId = address.getAddrId();
+	}
+
+	@Override
+	public String getCUname()
+	{
+		return this.cUname;
+	}
+
+	@Override
+	public void setCUname(String CUname)
+	{
+		this.cUname = CUname;
+	}
+
+	@Override
+	public String getCPasswd()
+	{
+		return this.cPasswd;
+	}
+
+	@Override
+	public void setCPasswd(String CPasswd)
+	{
+		this.cPasswd = CPasswd;
+	}
+
+	@Override
+	public String getCFname()
+	{
+		return this.cFname;
+	}
+
+	@Override
+	public void setCFname(String CFname)
+	{
+		this.cFname = CFname;
+	}
+
+	@Override
+	public String getCLname()
+	{
+		return this.cLname;
+	}
+
+	@Override
+	public void setCLname(String CLname)
+	{
+		this.cLname = CLname;
+	}
+
+	@Override
+	public String getCPhone()
+	{
+		return this.cPhone;
+	}
+
+	@Override
+	public void setCPhone(String CPhone)
+	{
+		this.cPhone = CPhone;
+	}
+
+	@Override
+	public String getCEmail()
+	{
+		return this.cEmail;
+	}
+
+	@Override
+	public void setCEmail(String CEmail)
+	{
+		this.cEmail = CEmail;
+	}
+
+	@Override
+	public Date getCSince()
+	{
+		return this.cSince;
+	}
+
+	@Override
+	public void setCSince(Date CSince)
+	{
+		this.cSince = CSince;
+	}
+
+	@Override
+	public Date getCLastVisit()
+	{
+		return this.cLastVisit;
+	}
+
+	@Override
+	public void setCLastVisit(Date CLastVisit)
+	{
+		this.cLastVisit = CLastVisit;
+	}
+
+	@Override
+	public Date getCLogin()
+	{
+		return this.cLogin;
+	}
+
+	@Override
+	public void setCLogin(Date CLogin)
+	{
+		this.cLogin = CLogin;
+	}
+
+	@Override
+	public Date getCExpiration()
+	{
+		return this.cExpiration;
+	}
+
+	@Override
+	public void setCExpiration(Date CExpiration)
+	{
+		this.cExpiration = CExpiration;
+	}
+
+	@Override
+	public Double getCDiscount()
+	{
+		return this.cDiscount;
+	}
+
+	@Override
+	public void setCDiscount(double c_DISCOUNT)
+	{
+		this.cDiscount = c_DISCOUNT;
+	}
+
+	@Override
+	public Double getCBalance()
+	{
+		return this.cBalance;
+	}
+
+	@Override
+	public void setCBalance(Double c_BALANCE)
+	{
+		this.cBalance = c_BALANCE;
+	}
+
+	@Override
+	public Double getCYtdPmt()
+	{
+		return this.cYtdPmt;
+	}
+
+	@Override
+	public void setCYtdPmt(Double c_YTD_PMT)
+	{
+		this.cYtdPmt = c_YTD_PMT;
+	}
+
+	@Override
+	public Date getCBirthdate()
+	{
+		return this.cBirthdate;
+	}
+
+	@Override
+	public void setCBirthdate(Date CBirthdate)
+	{
+		this.cBirthdate = CBirthdate;
+	}
+
+	@Override
+	public String getCData()
+	{
+		return this.cData;
+	}
+
+	@Override
+	public void setCData(String CData)
+	{
+		this.cData = CData;
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/Item.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Item.java
new file mode 100644
index 0000000..a14b300
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Item.java
@@ -0,0 +1,405 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "item" )
+public class Item implements IItem, Serializable
+{
+
+//	@Autowired
+//	@Qualifier("service")
+//	private IService service;
+	
+    private static final long serialVersionUID = -1311610290364285271L;
+
+	@Id
+	private ObjectId id;
+
+	@Indexed
+	private Integer  iId;
+
+	private Integer  authId;
+
+	private String   iTitle;
+
+	private Date     iPubDate;
+
+	private String   iPublisher;
+
+	private String   iSubject;
+
+	private String   iDesc;
+
+	private Integer  iRelated1;
+
+	private Integer  iRelated2;
+
+	private Integer  iRelated3;
+
+	private Integer  iRelated4;
+
+	private Integer  iRelated5;
+
+	private String   iThumbnail;
+
+	private String   iImage;
+
+	private Double   iSrp;
+
+	private Double   iCost;
+
+	private Date     iAvail;
+
+	private Integer  iStock;
+
+	private String   iIsbn;
+
+	private String   iPage;
+
+	private String   iBacking;
+
+	private String   iDimension;
+
+	private Integer  olQty;
+
+	/* for random selection */
+	private double   iRandom;
+	
+	private String iTitleSoundex;
+
+	public Integer getOlQty()
+	{
+		return olQty;
+	}
+
+	public void setOlQty(Integer olQty)
+	{
+		this.olQty = olQty;
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	
+    public String getiTitleSoundex()
+    {
+    	return iTitleSoundex;
+    }
+
+	
+    public void setiTitleSoundex(String iTitleSoundex)
+    {
+    	this.iTitleSoundex = iTitleSoundex;
+    }
+
+	@Override
+	public Integer getIId()
+	{
+		return this.iId;
+	}
+
+	@Override
+	public void setIId(Integer IId)
+	{
+		this.iId = IId;
+	}
+
+	@Override
+	public IAuthor getAuthor()
+	{
+		return DatabaseHelper.getDatabase().findAuthorById( this.authId );
+	}
+
+	@Override
+	public void setAuthor(IAuthor author)
+	{
+		this.setAuthId( author.getAId() );
+	}
+
+	@Override
+	public String getITitle()
+	{
+		return this.iTitle;
+	}
+
+	@Override
+	public void setITitle(String ITitle)
+	{
+		this.iTitle = ITitle;
+	}
+
+	@Override
+	public Date getIPubDate()
+	{
+		return this.iPubDate;
+	}
+
+	@Override
+	public void setIPubDate(Date IPubDate)
+	{
+		this.iPubDate = IPubDate;
+	}
+
+	@Override
+	public String getIPublisher()
+	{
+		return this.iPublisher;
+	}
+
+	@Override
+	public void setIPublisher(String IPublisher)
+	{
+		this.iPublisher = IPublisher;
+	}
+
+	@Override
+	public String getISubject()
+	{
+		return this.iSubject;
+	}
+
+	@Override
+	public void setISubject(String ISubject)
+	{
+		this.iSubject = ISubject;
+	}
+
+	@Override
+	public String getIDesc()
+	{
+		return this.iDesc;
+	}
+
+	@Override
+	public void setIDesc(String IDesc)
+	{
+		this.iDesc = IDesc;
+	}
+
+	@Override
+	public Integer getIRelated1()
+	{
+		return this.iRelated1;
+	}
+
+	@Override
+	public void setIRelated1(Integer IRelated1)
+	{
+		this.iRelated1 = IRelated1;
+	}
+
+	@Override
+	public Integer getIRelated2()
+	{
+		return this.iRelated2;
+	}
+
+	@Override
+	public void setIRelated2(Integer IRelated2)
+	{
+		this.iRelated2 = IRelated2;
+	}
+
+	@Override
+	public Integer getIRelated3()
+	{
+		return this.iRelated3;
+	}
+
+	@Override
+	public void setIRelated3(Integer IRelated3)
+	{
+		this.iRelated3 = IRelated3;
+	}
+
+	@Override
+	public Integer getIRelated4()
+	{
+		return this.iRelated4;
+	}
+
+	@Override
+	public void setIRelated4(Integer IRelated4)
+	{
+		this.iRelated4 = IRelated4;
+	}
+
+	@Override
+	public Integer getIRelated5()
+	{
+		return this.iRelated5;
+	}
+
+	@Override
+	public void setIRelated5(Integer IRelated5)
+	{
+		this.iRelated5 = IRelated5;
+	}
+
+	@Override
+	public String getIThumbnail()
+	{
+		return this.iThumbnail;
+	}
+
+	@Override
+	public void setIThumbnail(String IThumbnail)
+	{
+		this.iThumbnail = IThumbnail;
+	}
+
+	@Override
+	public String getIImage()
+	{
+		return this.iImage;
+	}
+
+	@Override
+	public void setIImage(String IImage)
+	{
+		this.iImage = IImage;
+	}
+
+	@Override
+	public Double getISrp()
+	{
+		return this.iSrp;
+	}
+
+	@Override
+	public void setISrp(Double i_SRP)
+	{
+		this.iSrp = i_SRP;
+	}
+
+	@Override
+	public Double getICost()
+	{
+		return this.iCost;
+	}
+
+	@Override
+	public void setICost(Double i_COST)
+	{
+		this.iCost = i_COST;
+	}
+
+	@Override
+	public Date getIAvail()
+	{
+		return this.iAvail;
+	}
+
+	@Override
+	public void setIAvail(Date IAvail)
+	{
+		this.iAvail = IAvail;
+	}
+
+	@Override
+	public Integer getIStock()
+	{
+		return this.iStock;
+	}
+
+	@Override
+	public void setIStock(Integer IStock)
+	{
+		this.iStock = IStock;
+	}
+
+	@Override
+	public String getIIsbn()
+	{
+		return this.iIsbn;
+	}
+
+	@Override
+	public void setIIsbn(String IIsbn)
+	{
+		this.iIsbn = IIsbn;
+	}
+
+	@Override
+	public String getIPage()
+	{
+		return this.iPage;
+	}
+
+	@Override
+	public void setIPage(String IPage)
+	{
+		this.iPage = IPage;
+	}
+
+	@Override
+	public String getIBacking()
+	{
+		return this.iBacking;
+	}
+
+	@Override
+	public void setIBacking(String IBacking)
+	{
+		this.iBacking = IBacking;
+	}
+
+	@Override
+	public String getIDimension()
+	{
+		return this.iDimension;
+	}
+
+	@Override
+	public void setIDimension(String IDimension)
+	{
+		this.iDimension = IDimension;
+	}
+
+	@Override
+	public double getIRandom()
+	{
+		return iRandom;
+	}
+
+	@Override
+	public void setIRandom(double iRandom)
+	{
+		this.iRandom = iRandom;
+	}
+
+	public Integer getAuthId()
+	{
+		return authId;
+	}
+
+	public void setAuthId(Integer authId)
+	{
+		this.authId = authId;
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/OrderLine.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/OrderLine.java
new file mode 100644
index 0000000..16d08b8
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/OrderLine.java
@@ -0,0 +1,134 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "orderLine")
+public class OrderLine implements IOrderLine, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//
+//	private MongoService service;
+	
+    private static final long serialVersionUID = -6695288937139715783L;
+
+	@Id
+	private ObjectId id;
+	
+	@Indexed
+	private Integer    olId;
+
+	private Integer orderId;
+
+	private Integer itemId;
+
+	private Integer olQty;
+
+	private Double olDiscount;
+
+	private String  olComment;
+	
+
+	public OrderLine()
+	{
+		
+	}
+	
+    public ObjectId getId()
+    {
+    	return id;
+    }
+	
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public Integer getOlId()
+	{
+		return this.olId;
+	}
+
+	@Override
+	public void setOlId(Integer olId)
+	{
+		this.olId = olId;
+	}
+	
+	@Override
+	public IOrders getOrders()
+	{
+		return DatabaseHelper.getDatabase().findOrdersById( orderId );
+	}
+
+	@Override
+	public void setOrders(IOrders orders)
+	{
+		this.orderId = orders.getOId();
+	}
+
+	@Override
+	public IItem getItem()
+	{
+		return DatabaseHelper.getDatabase().findItemById( this.itemId );
+	}
+
+	@Override
+	public void setItem(IItem item)
+	{
+		this.itemId = item.getIId();
+	}
+
+	@Override
+	public Integer getOlQty()
+	{
+		return this.olQty;
+	}
+
+	@Override
+	public void setOlQty(Integer olQty)
+	{
+		this.olQty = olQty;
+	}
+
+	@Override
+	public Double getOlDiscount()
+	{
+		return this.olDiscount;
+	}
+
+	@Override
+	public void setOlDiscount(Double oL_DISCOUNT)
+	{
+		this.olDiscount = oL_DISCOUNT;
+	}
+
+	@Override
+	public String getOlComment()
+	{
+		return this.olComment;
+	}
+
+	@Override
+	public void setOlComment(String olComment)
+	{
+		this.olComment = olComment;
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/Orders.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Orders.java
new file mode 100644
index 0000000..bc4cfb1
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/Orders.java
@@ -0,0 +1,265 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "orders")
+public class Orders implements IOrders, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//
+//	private MongoService service;
+	
+    private static final long serialVersionUID = -4867580403414098274L;
+
+	@Id
+	private ObjectId id;
+	
+	@Indexed
+	private Integer        oId;
+
+	private Integer addressByOShipAddrId;
+	
+	private Integer       customer;
+
+	private Integer addressByOBillAddrId;
+
+	private Date           ODate;
+
+	private Double        OSubTotal;
+
+	private Double        OTax;
+
+	private Double 		OTotal;
+
+	private String         OShipType;
+
+	private Date           OShipDate;
+
+	private String         OStatus;
+	
+	private List<Integer> ccXactIds;
+
+	private List<Integer> orderLinesIds;
+	
+	public Orders()
+	{
+
+	}
+	
+    public ObjectId getId()
+    {
+    	return id;
+    }
+
+	
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public Integer getOId()
+	{
+		return this.oId;
+	}
+	
+	@Override
+	public void setOId(Integer OId)
+	{
+		this.oId = OId;
+	}
+
+	@Override
+	public IAddress getAddressByOShipAddrId()
+	{
+		return DatabaseHelper.getDatabase().findAddressById( this.addressByOShipAddrId );
+	}
+	
+	@Override
+	public void setAddressByOShipAddrId(IAddress addressByOShipAddrId)
+	{
+		this.addressByOShipAddrId = addressByOShipAddrId.getAddrId();
+	}
+
+	@Override
+	public ICustomer getCustomer()
+	{
+		return DatabaseHelper.getDatabase().findCustomerById( this.customer );
+	}
+
+	@Override
+	public void setCustomer(ICustomer customer)
+	{
+		this.customer = customer.getCId();
+	}
+
+	@Override
+	public IAddress getAddressByOBillAddrId()
+	{
+		return DatabaseHelper.getDatabase().findAddressById( this.addressByOBillAddrId );
+	}
+
+	@Override
+	public void setAddressByOBillAddrId(IAddress addressByOBillAddrId)
+	{
+		this.addressByOBillAddrId = addressByOBillAddrId.getAddrId();
+	}
+
+	@Override
+	public Date getODate()
+	{
+		return this.ODate;
+	}
+
+	@Override
+	public void setODate(Date ODate)
+	{
+		this.ODate = ODate;
+	}
+	
+	@Override
+	public Double getOSubTotal()
+	{
+		return this.OSubTotal;
+	}
+
+	@Override
+	public void setOSubTotal(Double o_SUB_TOTAL)
+	{
+		this.OSubTotal = o_SUB_TOTAL;
+	}
+
+	@Override
+	public Double getOTax()
+	{
+		return this.OTax;
+	}
+	
+	@Override
+	public void setOTax(Double o_TAX)
+	{
+		this.OTax = o_TAX;
+	}
+
+	@Override
+	public Double getOTotal()
+	{
+		return this.OTotal;
+	}
+
+	@Override
+	public void setOTotal(double o_TOTAL)
+	{
+		this.OTotal = o_TOTAL;
+	}
+
+	@Override
+	public String getOShipType()
+	{
+		return this.OShipType;
+	}
+
+	@Override
+	public void setOShipType(String OShipType)
+	{
+		this.OShipType = OShipType;
+	}
+
+	@Override
+	public Date getOShipDate()
+	{
+		return this.OShipDate;
+	}
+
+	@Override
+	public void setOShipDate(Date OShipDate)
+	{
+		this.OShipDate = OShipDate;
+	}
+	
+	@Override
+	public String getOStatus()
+	{
+		return this.OStatus;
+	}
+
+	@Override
+	public void setOStatus(String OStatus)
+	{
+		this.OStatus = OStatus;
+	}
+
+	@Override
+    public HashSet<IOrderLine> getOrderLines()
+    {
+		HashSet<IOrderLine> orderLinesSet = new HashSet<IOrderLine>();
+		if ( this.orderLinesIds != null )
+		{
+    		for( Integer olId : this.orderLinesIds )
+    		{
+    			IOrderLine orderLine = DatabaseHelper.getDatabase().findOrderLineById(olId);
+    			orderLinesSet.add(orderLine);
+    		}	
+    	}
+		
+		return orderLinesSet;
+    }
+
+	public void setCcXactses(HashSet<ICcXacts> ccXacts)
+    {
+	    ArrayList<Integer> ccXactIds = new ArrayList<Integer>();
+	    for(ICcXacts ccXact : ccXacts)
+	    {
+	    	ccXactIds.add(ccXact.getId());
+	    }
+	    this.ccXactIds = ccXactIds;
+    }
+
+	public void setOrderLines(HashSet<IOrderLine> set)
+    {
+	    ArrayList<Integer> list = new ArrayList<Integer>();
+	    for (IOrderLine ol : set)
+	    {
+	    	list.add(ol.getOlId());
+	    }
+	    this.orderLinesIds = list;
+    }
+
+	public HashSet<ICcXacts> getCcXactses()
+    {
+		HashSet<ICcXacts> set = new HashSet<ICcXacts>();
+		for(Integer ccXactId : this.ccXactIds)
+		{
+			ICcXacts ccXact = DatabaseHelper.getDatabase().findCcXactsById( ccXactId );
+			set.add(ccXact);
+		}
+		
+		return set;
+    }
+	
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCart.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCart.java
new file mode 100644
index 0000000..35316e7
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCart.java
@@ -0,0 +1,96 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.bson.types.ObjectId;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+
+@Component
+@Document( collection = "shoppingCart" )
+public class ShoppingCart implements IShoppingCart, Serializable
+{
+//
+//	@Autowired
+//	@Qualifier("service")
+//	private IService service;
+	
+    private static final long serialVersionUID = -235081098185134853L;
+
+	@Id
+	private ObjectId               id;
+
+	@Indexed
+	private Integer                scId;
+
+	private Date                   scTime;
+	
+	
+
+	public ShoppingCart()
+	{
+	}
+
+	public ShoppingCart(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+	public ObjectId getId()
+	{
+		return id;
+	}
+
+	public void setId(ObjectId id)
+	{
+		this.id = id;
+	}
+
+	@Override
+	public Integer getScId()
+	{
+		return this.scId;
+	}
+
+	@Override
+	public void setScId(Integer scId)
+	{
+		this.scId = scId;
+	}
+
+	@Override
+	public Date getScTime()
+	{
+		return this.scTime;
+	}
+
+	@Override
+	public void setScTime(Date scTime)
+	{
+		this.scTime = scTime;
+	}
+
+	@Override
+    public Set<IShoppingCartLine> getShoppingCartLines()
+    {
+		List  res = DatabaseHelper.getDatabase().findAllShoppingCartLinesBySC( this );
+		if( res == null || res.isEmpty() )
+			return new HashSet<IShoppingCartLine>();
+		
+		return new HashSet<IShoppingCartLine>(res);
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCartLine.java b/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCartLine.java
new file mode 100644
index 0000000..0fa8813
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/model/mongo/ShoppingCartLine.java
@@ -0,0 +1,101 @@
+package eu.cloudscale.showcase.db.model.mongo;
+
+import java.io.Serializable;
+
+import org.bson.types.ObjectId;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+@Component
+@Document( collection = "shoppingCartLine" )
+public class ShoppingCartLine implements IShoppingCartLine, Serializable
+{
+//	@Autowired
+//	@Qualifier("service")
+//	private IService service;
+	
+    private static final long serialVersionUID = 767045854888711002L;
+
+	@Id
+	private ObjectId id;
+	
+	@Indexed
+	private Integer sclId;
+
+	private Integer item;
+
+	private Integer sclQty;
+	
+	private Integer shoppingCart;
+	
+	public ShoppingCartLine()
+	{
+	}
+
+	
+    public ObjectId getId()
+    {
+    	return id;
+    }
+
+    public void setId(ObjectId id)
+    {
+    	this.id = id;
+    }
+
+	@Override
+	public IShoppingCart getShoppingCart()
+    {
+    	return DatabaseHelper.getDatabase().findShoppingCartById( shoppingCart );
+    }
+
+	@Override
+    public void setShoppingCart(IShoppingCart shoppingCart)
+    {
+    	this.shoppingCart = shoppingCart.getScId();
+    }
+
+	@Override
+	public Integer getSclId()
+	{
+		return this.sclId;
+	}
+
+	@Override
+	public void setSclId(Integer sclScId)
+	{
+		this.sclId = sclScId;
+	}
+
+	@Override
+	public IItem getItem()
+	{
+		IItem item = DatabaseHelper.getDatabase().findItemById( this.item );
+		return item;
+	}
+
+	@Override
+	public void setItem(IItem item)
+	{
+		this.item = item.getIId();
+	}
+
+	@Override
+	public Integer getSclQty()
+	{
+		return this.sclQty;
+	}
+
+	@Override
+	public void setSclQty(Integer sclQty)
+	{
+		this.sclQty = sclQty;
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/services/AService.java b/src/main/java/eu/cloudscale/showcase/db/services/AService.java
new file mode 100644
index 0000000..4a6a958
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/services/AService.java
@@ -0,0 +1,639 @@
+package eu.cloudscale.showcase.db.services;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.BuyConfirmResult;
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.dao.mongo.impl.ShoppingCartDaoImpl;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCart;
+@Transactional(readOnly=true)
+public abstract class AService implements IService
+{	
+	@Autowired
+    protected IAddressDao addressDao;
+	
+	@Autowired
+	protected IAuthorDao authorDao;
+	
+	@Autowired
+	protected ICcXactsDao ccXactsDao;
+	
+	@Autowired
+	protected ICountryDao countryDao;
+	
+	@Autowired
+	protected ICustomerDao customerDao;
+	
+	@Autowired
+    protected IItemDao itemDao;
+	
+	@Autowired
+    protected IOrderLineDao orderLineDao;
+	
+	@Autowired
+    protected IOrdersDao ordersDao;
+	
+	@Autowired
+    protected IShoppingCartDao shoppingCartDao;
+	
+	@Autowired
+	protected IShoppingCartLineDao shoppingCartLineDao;
+	
+	@Override
+	@Transactional(readOnly=false)
+    public IShoppingCart createEmptyCart()
+    {
+		IShoppingCartDao scDao = shoppingCartDao;
+		IShoppingCart sc = new ShoppingCart();
+		sc.setScTime( new Date() );
+		//getCurrentSession().saveOrUpdate(sc);
+		scDao.shrani( sc );
+		
+		return sc;
+    }
+	
+	@SuppressWarnings( "rawtypes" )
+	@Override
+	@Cacheable("newProducts")
+	public List getNewProducts(String category)
+	{
+		//System.out.println("getNewProducts(" + category + ") called!");
+		return itemDao.getNewProducts( category );
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public IShoppingCart doCart(IShoppingCart sc, Integer itemId,
+	        List<Integer> ids, List<Integer> quantities)
+	{
+
+		IShoppingCartLineDao sclDao = shoppingCartLineDao;
+		IShoppingCartDao scDao = shoppingCartDao;
+
+		if ( itemId != null )
+		{
+			addItem( sc, itemDao.findById( itemId.intValue() ) );
+		}
+
+		refreshCart( sc, ids, quantities );
+		addRandomItemToCartIfNecessary( sc );
+		resetCartTime(  sc );
+		
+		//System.out.println("[scDao.shrani] doCart()");
+		
+		scDao.shrani(sc, true);
+		
+		return sc;
+	}
+	
+	public void resetCartTime(IShoppingCart sc)
+	{
+		try 
+		{
+			sc.setScTime( new Date() );
+		}
+		catch(Exception e)
+		{
+			System.out.println("ShoppingId = " + sc.getScId());
+			e.printStackTrace();
+		}
+	}
+	
+	//@Transactional(readOnly=false)
+	public void addRandomItemToCartIfNecessary(IShoppingCart sc)
+	{
+		// check and see if the cart is empty. If it's not, we do
+		// nothing.
+		try
+		{
+			// Check to see if the cart is empty
+			if ( sc.getShoppingCartLines().size() == 0 )
+			{
+				// Cart is empty
+				addItem( sc, itemDao.getRandomItem() );
+			}
+
+		}
+		catch ( java.lang.Exception ex )
+		{
+			ex.printStackTrace();
+		}
+	}
+	
+	protected IShoppingCart getCart(Integer shoppingId, double discount)
+	{
+		IShoppingCartDao scDao = shoppingCartDao;
+		IShoppingCart sc = scDao.findById( shoppingId );
+		return sc;
+	}
+
+	// protected void addRandomItemToCartIfNecessary(
+	// IShoppingCartLineDao sclDao, Integer shoppingId)
+	// {
+	// IItemDao itemDao = getItemDaoImpl();
+	//
+	// if ( sclDao.isCartEmpty( shoppingId ) )
+	// {
+	// IItem randItem = itemDao.getRandomItem();
+	// // related_item = getRelated1(sclDao, shoppingId, randItem);
+	// addItem( shoppingId, randItem );
+	// }
+	//
+	// }
+
+	// protected IItem getRelated1(IShoppingCartLineDao<IShoppingCartLine>
+	// sclDao,
+	// Integer shoppingId,
+	// IItem randItem)
+	// {
+	// IItemDao<IItem> itemDao = getItemDaoImpl();
+	// IItem relatedItem = itemDao.getRelated1( randItem );
+	// return relatedItem;
+	// }
+
+	//@Transactional(readOnly=false)
+	public void refreshCart(IShoppingCart sc, List<Integer> ids,
+	        List<Integer> quantities)
+	{
+		IShoppingCartLineDao sclDao = shoppingCartLineDao;
+		for ( int i = 0; i < ids.size(); i++ )
+		{
+			int itemId = ids.get( i );
+			int QTY = quantities.get( i );
+			IShoppingCartLine scl = sclDao.getBySCandItem( sc.getScId(), itemId );
+			if ( QTY == 0 )
+			{
+				//System.out.println("[sclDao.delete] addItem()");
+				sclDao.delete( scl );
+			}
+			else
+			{
+				scl.setSclQty( QTY );
+				//System.out.println("[sclDao.shrani] refreshCart()");
+				sclDao.shrani( scl );
+			}
+		}
+
+	}
+
+	//@Transactional(readOnly=false)
+	public void addItem(IShoppingCart sc, IItem item)
+	{
+		IShoppingCartLineDao sclDao = shoppingCartLineDao;
+		IShoppingCartDao scDao = shoppingCartDao;
+
+		IShoppingCartLine scl = sclDao.getBySCandItem( sc.getScId(),
+		        item.getIId() );
+
+		if ( scl != null )
+		{
+			scl.setSclQty( scl.getSclQty() + 1 );
+			//System.out.println("[sclDao.shrani] addItem()");
+			sclDao.shrani( scl );
+		}
+		else
+		{
+			scl = sclDao.getObject();
+			scl.setItem( item );
+			scl.setSclQty( 1 );
+			
+			scl.setShoppingCart( sc );
+			//System.out.println("[sclDao.shrani] addItem()");
+			sclDao.shrani( scl );
+			
+			sc.getShoppingCartLines().add( scl );
+			//scDao.shrani( sc );
+		}
+		
+	}
+
+	@Override
+	@Transactional(readOnly=false)
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId,
+	        Integer customerId, String ccType, long ccNumber, String ccName,
+	        Date ccExpiry, String shipping, String street1, String street2,
+	        String city, String state, String zip, String country)
+	{
+
+		IShoppingCart sc = shoppingCartDao.findById( shoppingId );
+		ICustomer customer = customerDao.findById( customerId );
+
+		double cDiscount = getCDiscount( customer );
+//		IShoppingCart cart = getCart( shoppingId, cDiscount );
+		IAddress address = saveAddress( street1, street2, city, state, zip,
+		        country );
+		
+		IOrders order = saveOrder( address, customer, shipping, sc, cDiscount );
+
+		saveCcXacts( order, ccType, ccNumber, ccName, ccExpiry, sc, address );
+		
+		clearCart( shoppingId );
+
+		return new BuyConfirmResult( order, sc );
+	}
+
+	@Override
+	@Transactional(readOnly=false)
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId,
+	        Integer customerId, String ccType, Long ccNumber, String ccName,
+	        Date ccExpiry, String shipping)
+	{
+
+		ICustomer customer = customerDao.findById( customerId );
+
+		double discount = getCDiscount(  customer );
+		IShoppingCart sc = getCart( shoppingId, discount );
+		IAddress address = customer.getAddress();
+
+		IOrders order = saveOrder( address, customer, shipping, sc, discount );
+		
+		saveCcXacts( order, ccType, ccNumber, ccName, ccExpiry, sc, address );
+
+		clearCart( shoppingId );
+
+		return new BuyConfirmResult( order, sc );
+	}
+	
+	@Transactional(readOnly=false)
+	protected void clearCart(Integer shoppingId)
+	{
+		IShoppingCartDao scDao = shoppingCartDao;
+		IShoppingCart sc = (IShoppingCart) scDao.findById( shoppingId );
+
+		IShoppingCartLineDao sclDao = shoppingCartLineDao;
+
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl :  res )
+    		{
+    			sclDao.delete( scl );
+    		}
+		}
+	}
+
+    @Transactional(readOnly=false)
+	protected ICcXacts saveCcXacts(IOrders order, String ccType, long ccNumber,
+	        String ccName, Date ccExpiry, IShoppingCart cart, IAddress address)
+	{
+		if ( ccType.length() > 10 )
+			ccType = ccType.substring( 0, 10 );
+
+		if ( ccName.length() > 30 )
+			ccName = ccName.substring( 0, 30 );
+
+		ICcXacts ccXacts = ccXactsDao.getObject();
+		ccXacts.setCountry( address.getCountry() );
+		ccXacts.setOrders( order );
+		ccXacts.setCxType( ccType );
+		ccXacts.setCxNum( (int) ccNumber );
+		ccXacts.setCxName( ccName );
+		ccXacts.setCxExpiry( ccExpiry );
+		ccXacts.setCxXactAmt( calculateTotal( cart ) );
+		ccXacts.setCxXactDate( new Date() );
+		ccXacts.setCountry( address.getCountry() );
+
+		ccXactsDao.shrani( ccXacts );
+
+		return ccXacts;
+	}
+	
+	@Transactional(readOnly=false)
+	protected IAddress saveAddress(String street1, String street2, String city,
+	        String state, String zip, String country)
+	{
+
+		IAddress address = addressDao.getObject();
+
+		address.setAddrStreet1( street1 );
+		address.setAddrStreet2( street2 );
+		address.setAddrCity( city );
+		address.setAddrState( state );
+		address.setAddrZip( zip );
+
+		address.setCountry( countryDao.getByName( country ) );
+		addressDao.shrani( address );
+
+		return address;
+	}
+	
+	@Transactional(readOnly=false)
+	protected IOrders saveOrder(IAddress address, ICustomer customer,
+	        String shipping, IShoppingCart sc, double discount)
+	{
+
+		Calendar cal = Calendar.getInstance();
+		Random rand = new Random();
+
+		IOrders order = ordersDao.getObject();
+		order.setCustomer( customer );
+		order.setOTax( 8.25 );
+		order.setODate( new Date() );
+		order.setAddressByOBillAddrId( customer.getAddress() );
+		order.setAddressByOShipAddrId( address );
+
+		cal.add( Calendar.DATE, rand.nextInt( 7 ) );
+		order.setOShipDate( cal.getTime() );
+		order.setOShipType( shipping );
+		order.setOStatus( "PENDING" );
+		order.setOTotal( calculateTotal( sc ) );
+		// TODO: order.setOSubTotal( calculateSubTotal(sc) );
+
+		order.setOSubTotal( calculateTotal( sc ) );
+		ordersDao.shrani( order );
+
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl :  res)
+    		{
+    			IOrderLine ol = orderLineDao.getObject();
+    			ol.setItem( scl.getItem() );
+    			ol.setOlComment( getRandomString( 20, 100 ) );
+    			ol.setOlDiscount( discount );
+    			ol.setOlQty( scl.getSclQty() );
+    			ol.setOrders( order );
+    			order.getOrderLines().add( ol );
+    			orderLineDao.shrani( ol );
+    		}
+		}
+		
+		ordersDao.shrani( order );
+
+		return order;
+	}
+
+	public String getRandomString(int min, int max)
+	{
+		String newstring = new String();
+		Random rand = new Random();
+		int i;
+		final char[] chars = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+		        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+		        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+		        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+		        'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^',
+		        '&', '*', '(', ')', '_', '-', '=', '+', '{', '}', '[', ']',
+		        '|', ':', ';', ',', '.', '?', '/', '~', ' ' }; // 79
+		                                                       // characters
+		int strlen = (int) Math.floor( rand.nextDouble() * ( max - min + 1 ) );
+		strlen += min;
+		for ( i = 0; i < strlen; i++ )
+		{
+			char c = chars[(int) Math.floor( rand.nextDouble() * 79 )];
+			newstring = newstring.concat( String.valueOf( c ) );
+		}
+		return newstring;
+	}
+	
+	protected double calculateTotal(IShoppingCart sc)
+	{
+		double total = 0;
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl : res )
+    		{
+    			if( scl != null )
+    			{
+    				total += scl.getItem().getICost();
+    			}
+    		}
+		}
+
+		return total;
+	}
+
+	protected double getCDiscount(ICustomer customer)
+	{
+		return customer.getCDiscount();
+	}
+
+	@Override
+	public List searchByAuthor(String keyword)
+	{
+
+		List<IAuthor> authors = authorDao.findBySoundexLname( keyword );
+
+		List<IItem> items = new ArrayList<IItem>();
+
+		for ( IAuthor author : authors )
+		{
+			if ( items.size() >= 50 )
+			{
+				break;
+			}
+
+			items.addAll( itemDao.findAllByAuthor( author ) );
+		}
+
+		return items;
+	}
+	
+	@Override
+	public List<IItem> getPromotional()
+	{
+		return itemDao.getPromotional();
+	}
+	
+	@Override
+	public boolean countryExist( String country)
+    {
+		ICountry country1 = countryDao.getByName( country );
+		return country1 == null;
+    }
+	
+	@Override
+	public ICustomer getUserBy(String uname, String passwd)
+	{
+	    return customerDao.getUserBy( uname, passwd );
+	}
+	
+	@Override
+	public ICustomer getCustomerObject()
+	{
+		return customerDao.getObject();
+	}
+	
+	@Override
+	public IAddress getAddressObject()
+	{
+		return addressDao.getObject();
+	}
+	
+	@Override
+	public ICountry getCountryByName(String country)
+	{
+		return countryDao.getByName( country );
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public void saveAddress(IAddress address)
+	{
+	    addressDao.shrani(address);
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+	public void saveCustomer(ICustomer customer)
+	{
+	    customerDao.shrani( customer );
+	}
+	
+	@Override
+	public IShoppingCart findShoppingCartById(Integer shoppingId)
+	{
+		return shoppingCartDao.findById( shoppingId );
+	}
+	
+	@Override
+	public ICustomer findCustomerById(Integer customerId)
+	{
+		return customerDao.findById( customerId );
+	}
+	
+	@Override
+	@Cacheable("bestSellers")
+	public List<Object[]> getBestSellers(String category)
+	{
+		return itemDao.getBestSellers( category );
+	}
+	
+	@Override
+	@Cacheable("search")
+    public List<IItem> searchByTitle(String keyword)
+    {
+	    List<IItem> items = itemDao.findAllByTitle( keyword );
+	    
+	    return items;
+    }
+
+	@Override
+	@Cacheable("search")
+    public List<IItem> searchBySubject(String keyword)
+    {
+	    List<IItem> items = itemDao.findAllBySubject( keyword );
+	    
+	    return items;
+    }
+	
+	@Override
+	public IOrders getMostRecentOrder(ICustomer customer)
+	{
+		return ordersDao.getMostRecentOrder( customer );
+	}
+	
+	@Override
+	public List<IOrderLine> findAllOrderLineByOrder(IOrders order)
+	{
+	    return orderLineDao.findAllByOrder( order );
+	}
+	@Override
+	public IItem findItemById(Integer itemId)
+	{
+	    return itemDao.findById( itemId );
+	}
+	
+	@Override
+	public IAddress findAddressById(Integer addrId)
+    {
+	    return addressDao.findById( addrId );
+    }
+	
+	@Override
+	public ICountry getCountryById(Integer coId)
+    {
+	    return countryDao.findById( coId );
+    }
+
+	@Override
+	public List<ICustomer> findCustomerByAddress(IAddress address)
+    {
+	    return customerDao.findByAddress( address );
+    }
+
+	@Override
+	public IOrders findOrdersById(Integer cxOId)
+    {
+		return ordersDao.findById( cxOId );
+    }
+
+	@Override
+	public IAuthor findAuthorById(Integer cxAuthId)
+    {
+		try 
+		{
+			return authorDao.findById( cxAuthId );
+		}
+		catch(Exception e)
+		{
+			System.out.println("AuthorDao is null");
+			return null;
+		}
+    }
+
+	@Override
+	public IOrderLine findOrderLineById(Integer olId)
+    {
+		return orderLineDao.findById( olId );
+    }
+
+	@Override
+	public ICcXacts findCcXactsById(Integer ccXactId)
+    {
+		return ccXactsDao.findById( ccXactId );
+    }
+	
+	@Override
+	public List findAllShoppingCartLinesBySC(IShoppingCart shoppingCart)
+    {
+		try 
+		{
+			return shoppingCartDao.findAllBySC( shoppingCart );
+		}
+		catch(NullPointerException e)
+		{
+			e.printStackTrace();
+			return null;
+		}
+    }
+	
+	@Override
+	@Transactional(readOnly=false)
+	public void saveItem(IItem item) {
+		itemDao.shrani(item);
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/services/HibernateService.java b/src/main/java/eu/cloudscale/showcase/db/services/HibernateService.java
new file mode 100644
index 0000000..03be0e7
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/services/HibernateService.java
@@ -0,0 +1,10 @@
+package eu.cloudscale.showcase.db.services;
+
+import org.springframework.stereotype.Service;
+
+@Service
+public class HibernateService extends AService
+{
+
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/services/IService.java b/src/main/java/eu/cloudscale/showcase/db/services/IService.java
new file mode 100644
index 0000000..8e5716e
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/services/IService.java
@@ -0,0 +1,89 @@
+package eu.cloudscale.showcase.db.services;
+
+import java.util.Date;
+import java.util.List;
+
+import eu.cloudscale.showcase.db.BuyConfirmResult;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+
+public interface IService 
+{
+	
+    public List getNewProducts(String category);
+
+	public IShoppingCart doCart(IShoppingCart sc, Integer itemId,
+            List<Integer> ids, List<Integer> quantities);
+
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId, Integer customerId,
+            String ccType, long ccNumber, String ccName, Date ccExpiry,
+            String shipping, String street1, String street2, String city,
+            String state, String zip, String country);
+
+	public BuyConfirmResult doBuyConfirm(Integer shoppingId, Integer customerId,
+            String ccType, Long ccNumber, String ccName, Date ccExpiry,
+            String shipping);
+
+	public List<IItem> searchByAuthor(String keyword);
+
+	public List<IItem> searchByTitle(String keyword);
+
+	public List<IItem> searchBySubject(String keyword);
+
+	public List<Object[]> getBestSellers(String category);
+
+	public IShoppingCart createEmptyCart();
+
+	public IShoppingCart findShoppingCartById(Integer shoppingId);
+
+	public List<IItem> getPromotional();
+
+	boolean countryExist(String country);
+
+	public ICustomer getUserBy(String uname, String passwd);
+
+	public ICustomer getCustomerObject();
+
+	public IAddress getAddressObject();
+
+	public ICountry getCountryByName(String country);
+
+	public void saveAddress(IAddress address);
+
+	public void saveCustomer(ICustomer customer);
+
+	public ICustomer findCustomerById(Integer customerId);
+
+	public IOrders getMostRecentOrder(ICustomer customer);
+
+	public List<IOrderLine> findAllOrderLineByOrder(IOrders order);
+
+	public IItem findItemById(Integer itemId);
+
+	List findAllShoppingCartLinesBySC(IShoppingCart shoppingCart);
+
+	ICcXacts findCcXactsById(Integer ccXactId);
+
+	IOrderLine findOrderLineById(Integer olId);
+
+	IAuthor findAuthorById(Integer cxAuthId);
+
+	IOrders findOrdersById(Integer cxOId);
+
+	List<ICustomer> findCustomerByAddress(IAddress address);
+
+	ICountry getCountryById(Integer coId);
+
+	IAddress findAddressById(Integer addrId);
+
+	public void saveItem(IItem item);
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/db/services/MongoService.java b/src/main/java/eu/cloudscale/showcase/db/services/MongoService.java
new file mode 100644
index 0000000..45295d4
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/db/services/MongoService.java
@@ -0,0 +1,94 @@
+package eu.cloudscale.showcase.db.services;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Random;
+import java.util.Set;
+
+import org.springframework.stereotype.Service;
+
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.mongo.Item;
+import eu.cloudscale.showcase.db.model.mongo.Orders;
+
+@Service
+//@Component
+public class MongoService extends AService
+{
+	public MongoService()
+	{	
+		System.out.println("Creating MongoService");
+//		addressDao = ContextHelper.getApplicationContext().getBean( AddressDaoImpl.class );
+	}
+	
+	
+	@Override
+	protected IOrders saveOrder(IAddress address, ICustomer customer,
+	        String shipping, IShoppingCart sc, double discount)
+	{
+		Calendar cal = Calendar.getInstance();
+		Random rand = new Random();
+
+		Orders order = (Orders) ordersDao.getObject();
+		order.setCustomer( customer );
+		order.setOTax( 8.25 );
+		order.setODate( new Date() );
+		order.setAddressByOBillAddrId( customer.getAddress() );
+		order.setAddressByOShipAddrId( address );
+
+		cal.add( Calendar.DATE, rand.nextInt( 7 ) );
+		order.setOShipDate( cal.getTime() );
+		order.setOShipType( shipping );
+		order.setOStatus( "PENDING" );
+		order.setOTotal( calculateTotal( sc ) );
+		// TODO: order.setOSubTotal( calculateSubTotal(sc) );
+
+		order.setOSubTotal( calculateTotal( sc ) );
+		//ordersDao.shrani( order );
+		
+		Set<IShoppingCartLine> res = sc.getShoppingCartLines();
+		
+		if( res != null && !res.isEmpty() )
+		{
+    		for ( IShoppingCartLine scl :  res)
+    		{
+    			IOrderLine ol = orderLineDao.getObject();
+    			ol.setItem( scl.getItem() );
+    			ol.setOlComment( getRandomString( 20, 100 ) );
+    			ol.setOlDiscount( discount );
+    			ol.setOlQty( scl.getSclQty() );
+    			ol.setOrders( order );
+    			
+    			orderLineDao.shrani( ol );
+    			
+    			HashSet<IOrderLine> set = new HashSet<IOrderLine>();
+				set.add(ol);
+				set.addAll(order.getOrderLines());
+    			
+    			order.setOrderLines( set );
+    			//ordersDao.shrani(order);
+    			
+    			Item item = (Item) itemDao.findById( scl.getItem().getIId() );
+
+    			Integer olQty = item.getOlQty();
+    			item.setOlQty( (olQty == null ? 0 : olQty ) + 1 );
+    			
+    			itemDao.shrani( item );
+    
+    			// TODO: Update item IStock property
+    		}
+		}
+
+		ordersDao.shrani( order );
+
+		return order;
+	}
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/generate/AGenerate.java b/src/main/java/eu/cloudscale/showcase/generate/AGenerate.java
new file mode 100644
index 0000000..6dea3a2
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/generate/AGenerate.java
@@ -0,0 +1,633 @@
+package eu.cloudscale.showcase.generate;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Random;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.support.GenericXmlApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.common.ContextHelper;
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.IAuthorDao;
+import eu.cloudscale.showcase.db.dao.ICcXactsDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.dao.IOrderLineDao;
+import eu.cloudscale.showcase.db.dao.IOrdersDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartLineDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.IAuthor;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IItem;
+import eu.cloudscale.showcase.db.services.IService;
+import eu.cloudscale.showcase.db.services.MongoService;
+@Transactional
+public abstract class AGenerate implements IGenerate
+{
+	@Autowired(required=true)
+    protected IAddressDao addressDao;
+	
+	@Autowired(required=true)
+	protected IAuthorDao authorDao;
+	
+	@Autowired
+	protected ICcXactsDao ccXactsDao;
+	
+	@Autowired
+	protected ICountryDao countryDao;
+	
+	@Autowired
+	protected ICustomerDao customerDao;
+	
+	@Autowired
+    protected IItemDao itemDao;
+	
+	@Autowired
+    protected IOrderLineDao orderLineDao;
+	
+	@Autowired
+    protected IOrdersDao ordersDao;
+	
+	@Autowired
+    protected IShoppingCartDao shoppingCartDao;
+	
+	@Autowired
+	protected IShoppingCartLineDao shoppingCartLineDao;
+
+	// TODO: Move this to properties file
+	protected static final int    NUM_EBS       = 100;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_ITEMS     = 10000;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_CUSTOMERS = NUM_EBS * 2880;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_ADDRESSES = 2 * NUM_CUSTOMERS;
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_AUTHORS   = (int) ( .25 * NUM_ITEMS );
+	
+	// TODO: Move this to properties file
+	protected static final int    NUM_ORDERS    = (int) ( .9 * NUM_CUSTOMERS );
+
+	// TODO: Move this to properties file
+	protected static String[][]   tables        = {
+	        {"address", "addr_co_id", "addr_zip" }, {"author", "a_lname" },
+	        {"cc_xacts" }, {"country", "co_name" },
+	        {"customer", "c_addr_id", "c_uname" },
+	        {"item", "i_title", "i_subject", "i_a_id" },
+	        {"order_line", "ol_i_id", "ol_o_id" }, {"orders", "o_c_id" },
+	        {"shopping_cart" }, {"shopping_cart_line", "scl_i_id" } };
+
+	protected Random       rand          = new Random();
+	
+	//protected GenericXmlApplicationContext ctx = null;
+	
+	protected IService db = null;
+	
+	public AGenerate()
+	{
+		//ctx = ContextHelper.getApplicationContext();
+		//db = DatabaseHelper.getDatabase();
+	}
+	
+	
+	protected String getRandomAString(int min, int max)
+	{
+		String newstring = new String();
+		int i;
+		final char[] chars = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+		        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+		        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+		        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+		        'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^',
+		        '&', '*', '(', ')', '_', '-', '=', '+', '{', '}', '[', ']',
+		        '|', ':', ';', ',', '.', '?', '/', '~', ' ' }; // 79 characters
+		int strlen = (int) Math
+		        .floor( rand.nextDouble() * ( ( max - min ) + 1 ) );
+		strlen += min;
+		for ( i = 0; i < strlen; i++ )
+		{
+			char c = chars[(int) Math.floor( rand.nextDouble() * 79 )];
+			newstring = newstring.concat( String.valueOf( c ) );
+		}
+		return newstring;
+	}
+
+	protected  String getRandomAString(int length)
+	{
+		String newstring = new String();
+		int i;
+		final char[] chars = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+		        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+		        'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+		        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
+		        'U', 'V', 'W', 'X', 'Y', 'Z', '!', '@', '#', '$', '%', '^',
+		        '&', '*', '(', ')', '_', '-', '=', '+', '{', '}', '[', ']',
+		        '|', ':', ';', ',', '.', '?', '/', '~', ' ' }; // 79 characters
+		for ( i = 0; i < length; i++ )
+		{
+			char c = chars[(int) Math.floor( rand.nextDouble() * 79 )];
+			newstring = newstring.concat( String.valueOf( c ) );
+		}
+		return newstring;
+	}
+
+	protected  int getRandomNString(int num_digits)
+	{
+		int return_num = 0;
+		for ( int i = 0; i < num_digits; i++ )
+		{
+			return_num += getRandomInt( 0, 9 )
+			        * (int) java.lang.Math.pow( 10.0, (double) i );
+		}
+		return return_num;
+	}
+
+	protected  int getRandomNString(int min, int max)
+	{
+		int strlen = (int) Math
+		        .floor( rand.nextDouble() * ( ( max - min ) + 1 ) ) + min;
+		return getRandomNString( strlen );
+	}
+
+	protected  int getRandomInt(int lower, int upper)
+	{
+
+		int num = (int) Math.floor( rand.nextDouble()
+		        * ( ( upper + 1 ) - lower ) );
+		if ( num + lower > upper || num + lower < lower )
+		{
+			System.out.println( "ERROR: Random returned value of of range!" );
+			System.exit( 1 );
+		}
+		return num + lower;
+	}
+
+	protected  String DigSyl(int D, int N)
+	{
+		int i;
+		String resultString = new String();
+		String Dstr = Integer.toString( D );
+
+		if ( N > Dstr.length() )
+		{
+			int padding = N - Dstr.length();
+			for ( i = 0; i < padding; i++ )
+				resultString = resultString.concat( "BA" );
+		}
+
+		for ( i = 0; i < Dstr.length(); i++ )
+		{
+			if ( Dstr.charAt( i ) == '0' )
+				resultString = resultString.concat( "BA" );
+			else if ( Dstr.charAt( i ) == '1' )
+				resultString = resultString.concat( "OG" );
+			else if ( Dstr.charAt( i ) == '2' )
+				resultString = resultString.concat( "AL" );
+			else if ( Dstr.charAt( i ) == '3' )
+				resultString = resultString.concat( "RI" );
+			else if ( Dstr.charAt( i ) == '4' )
+				resultString = resultString.concat( "RE" );
+			else if ( Dstr.charAt( i ) == '5' )
+				resultString = resultString.concat( "SE" );
+			else if ( Dstr.charAt( i ) == '6' )
+				resultString = resultString.concat( "AT" );
+			else if ( Dstr.charAt( i ) == '7' )
+				resultString = resultString.concat( "UL" );
+			else if ( Dstr.charAt( i ) == '8' )
+				resultString = resultString.concat( "IN" );
+			else if ( Dstr.charAt( i ) == '9' )
+				resultString = resultString.concat( "NG" );
+		}
+
+		return resultString;
+	}
+	
+	@Override
+	@Transactional(readOnly=false)
+    public void populateCountryTable()
+	{
+		String[] countries = {"United States", "United Kingdom", "Canada",
+		        "Germany", "France", "Japan", "Netherlands", "Italy",
+		        "Switzerland", "Australia", "Algeria", "Argentina", "Armenia",
+		        "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangla Desh",
+		        "Barbados", "Belarus", "Belgium", "Bermuda", "Bolivia",
+		        "Botswana", "Brazil", "Bulgaria", "Cayman Islands", "Chad",
+		        "Chile", "China", "Christmas Island", "Colombia", "Croatia",
+		        "Cuba", "Cyprus", "Czech Republic", "Denmark",
+		        "Dominican Republic", "Eastern Caribbean", "Ecuador", "Egypt",
+		        "El Salvador", "Estonia", "Ethiopia", "Falkland Island",
+		        "Faroe Island", "Fiji", "Finland", "Gabon", "Gibraltar",
+		        "Greece", "Guam", "Hong Kong", "Hungary", "Iceland", "India",
+		        "Indonesia", "Iran", "Iraq", "Ireland", "Israel", "Jamaica",
+		        "Jordan", "Kazakhstan", "Kuwait", "Lebanon", "Luxembourg",
+		        "Malaysia", "Mexico", "Mauritius", "New Zealand", "Norway",
+		        "Pakistan", "Philippines", "Poland", "Portugal", "Romania",
+		        "Russia", "Saudi Arabia", "Singapore", "Slovakia",
+		        "South Africa", "South Korea", "Spain", "Sudan", "Sweden",
+		        "Taiwan", "Thailand", "Trinidad", "Turkey", "Venezuela",
+		        "Zambia" };
+
+		double[] exchanges = {1, .625461, 1.46712, 1.86125, 6.24238, 121.907,
+		        2.09715, 1842.64, 1.51645, 1.54208, 65.3851, 0.998, 540.92,
+		        13.0949, 3977, 1, .3757, 48.65, 2, 248000, 38.3892, 1, 5.74,
+		        4.7304, 1.71, 1846, .8282, 627.1999, 494.2, 8.278, 1.5391,
+		        1677, 7.3044, 23, .543, 36.0127, 7.0707, 15.8, 2.7, 9600,
+		        3.33771, 8.7, 14.9912, 7.7, .6255, 7.124, 1.9724, 5.65822,
+		        627.1999, .6255, 309.214, 1, 7.75473, 237.23, 74.147, 42.75,
+		        8100, 3000, .3083, .749481, 4.12, 37.4, 0.708, 150, .3062,
+		        1502, 38.3892, 3.8, 9.6287, 25.245, 1.87539, 7.83101, 52,
+		        37.8501, 3.9525, 190.788, 15180.2, 24.43, 3.7501, 1.72929,
+		        43.9642, 6.25845, 1190.15, 158.34, 5.282, 8.54477, 32.77,
+		        37.1414, 6.1764, 401500, 596, 2447.7 };
+
+		String[] currencies = {"Dollars", "Pounds", "Dollars",
+		        "Deutsche Marks", "Francs", "Yen", "Guilders", "Lira",
+		        "Francs", "Dollars", "Dinars", "Pesos", "Dram", "Schillings",
+		        "Manat", "Dollars", "Dinar", "Taka", "Dollars", "Rouble",
+		        "Francs", "Dollars", "Boliviano", "Pula", "Real", "Lev",
+		        "Dollars", "Franc", "Pesos", "Yuan Renmimbi", "Dollars",
+		        "Pesos", "Kuna", "Pesos", "Pounds", "Koruna", "Kroner",
+		        "Pesos", "Dollars", "Sucre", "Pounds", "Colon", "Kroon",
+		        "Birr", "Pound", "Krone", "Dollars", "Markka", "Franc",
+		        "Pound", "Drachmas", "Dollars", "Dollars", "Forint", "Krona",
+		        "Rupees", "Rupiah", "Rial", "Dinar", "Punt", "Shekels",
+		        "Dollars", "Dinar", "Tenge", "Dinar", "Pounds", "Francs",
+		        "Ringgit", "Pesos", "Rupees", "Dollars", "Kroner", "Rupees",
+		        "Pesos", "Zloty", "Escudo", "Leu", "Rubles", "Riyal",
+		        "Dollars", "Koruna", "Rand", "Won", "Pesetas", "Dinar",
+		        "Krona", "Dollars", "Baht", "Dollars", "Lira", "Bolivar",
+		        "Kwacha" };
+
+		int NUM_COUNTRIES = 92;
+
+		System.out.println( "Populating COUNTRY with " + NUM_COUNTRIES
+		        + " countries" );
+		
+		countryDao.createTable();
+		
+		for ( int i = 1; i <= NUM_COUNTRIES; i++ )
+		{
+			ICountry c = countryDao.getObject();
+			
+			if( db instanceof MongoService)
+			{
+				c.setCoId( i );
+			}
+			c.setCoName( countries[i - 1] );
+			c.setCoExchange( exchanges[i - 1] );
+			c.setCoCurrency( currencies[i - 1] );
+
+			countryDao.shrani( c );
+		}
+
+		countryDao.finish();
+
+		//System.out.println( "" );
+    }
+
+
+	@Override
+    public void populateAuthorTable()
+    {
+		String A_FNAME, A_MNAME, A_LNAME, A_BIO;
+		java.sql.Date A_DOB;
+		GregorianCalendar cal;
+
+		System.out.println( "Populating AUTHOR Table with " + NUM_AUTHORS
+		        + " authors" );
+		
+		
+		for ( int i = 1; i <= NUM_AUTHORS; i++ )
+		{
+			IAuthor a = authorDao.getObject();
+
+			int month, day, year, maxday;
+			A_FNAME = getRandomAString( 3, 20 );
+			A_MNAME = getRandomAString( 1, 20 );
+			A_LNAME = getRandomAString( 1, 20 );
+			year = getRandomInt( 1800, 1990 );
+			month = getRandomInt( 0, 11 );
+			maxday = 31;
+			if ( month == 3 | month == 5 | month == 8 | month == 10 )
+				maxday = 30;
+			else if ( month == 1 )
+				maxday = 28;
+			day = getRandomInt( 1, maxday );
+			cal = new GregorianCalendar( year, month, day );
+			A_DOB = new java.sql.Date( cal.getTime().getTime() );
+			A_BIO = getRandomAString( 125, 500 );
+
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+			if( db instanceof MongoService)
+			{
+				a.setAId( i );
+			}
+			a.setAFname( A_FNAME );
+			a.setALname( A_LNAME );
+			a.setAMname( A_MNAME );
+			a.setADob( A_DOB );
+			a.setABio( A_BIO );
+
+			authorDao.shrani( a );
+		}
+
+		authorDao.finish();
+
+		System.out.println( "" );    
+    }
+
+
+	@Override
+    public void populateAddressTable()
+    {
+		System.out.println( "Populating ADDRESS Table with " + NUM_ADDRESSES
+		        + " addresses" );
+		System.out.print( "Complete (in 10,000's): " );
+		String ADDR_STREET1, ADDR_STREET2, ADDR_CITY, ADDR_STATE;
+		String ADDR_ZIP;
+		int ADDR_CO_ID;
+		
+
+		for ( int i = 569450; i <= NUM_ADDRESSES; i++ )
+		{
+			IAddress a = addressDao.getObject();
+
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+
+			ADDR_STREET1 = getRandomAString( 15, 40 );
+			ADDR_STREET2 = getRandomAString( 15, 40 );
+			ADDR_CITY = getRandomAString( 4, 30 );
+			ADDR_STATE = getRandomAString( 2, 20 );
+			ADDR_ZIP = getRandomAString( 5, 10 );
+			ADDR_CO_ID = getRandomInt( 1, 92 );
+
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+			if( db instanceof MongoService)
+			{
+				a.setAddrId( i );
+			}
+			a.setAddrStreet1( ADDR_STREET1 );
+			a.setAddrStreet2( ADDR_STREET2 );
+			a.setAddrCity( ADDR_CITY );
+			a.setAddrState( ADDR_STATE );
+			a.setAddrZip( ADDR_ZIP );
+			a.setCountry( countryDao.findById( ADDR_CO_ID ) );
+
+			addressDao.shrani( a );
+		}
+
+		addressDao.finish();
+
+		System.out.println( "" );
+    }
+
+
+	@Override
+    public void populateCustomerTable()
+    {
+		String C_UNAME, C_PASSWD, C_LNAME, C_FNAME;
+		int C_ADDR_ID, C_PHONE;
+		String C_EMAIL;
+		java.sql.Date C_SINCE, C_LAST_LOGIN;
+		java.sql.Timestamp C_LOGIN, C_EXPIRATION;
+		double C_DISCOUNT, C_BALANCE, C_YTD_PMT;
+		java.sql.Date C_BIRTHDATE;
+		String C_DATA;
+		int i;
+
+		System.out.println( "Populating CUSTOMER Table with " + NUM_CUSTOMERS
+		        + " customers" );
+		System.out.print( "Complete (in 10,000's): " );
+		
+		for ( i = 1; i <= NUM_CUSTOMERS; i++ )
+		{
+			ICustomer c = customerDao.getObject();
+
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+			
+			C_UNAME = DigSyl( i, 0 ).toLowerCase();
+			C_PASSWD = C_UNAME.toLowerCase();
+			C_LNAME = getRandomAString( 8, 15 );
+			C_FNAME = getRandomAString( 8, 15 );
+			C_ADDR_ID = getRandomInt( 1, NUM_ADDRESSES );
+			C_PHONE = getRandomNString( 9, 16 );
+			C_EMAIL = C_UNAME + "@" + getRandomAString( 2, 9 ) + ".com";
+
+			GregorianCalendar cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, -1 * getRandomInt( 1, 730 ) );
+			C_SINCE = new java.sql.Date( cal.getTime().getTime() );
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 0, 60 ) );
+			if ( cal.after( new GregorianCalendar() ) )
+				cal = new GregorianCalendar();
+
+			C_LAST_LOGIN = new java.sql.Date( cal.getTime().getTime() );
+			C_LOGIN = new java.sql.Timestamp( System.currentTimeMillis() );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.HOUR, 2 );
+			C_EXPIRATION = new java.sql.Timestamp( cal.getTime().getTime() );
+
+			C_DISCOUNT = (double) getRandomInt( 0, 50 ) / 100.0;
+			C_BALANCE = 0.00;
+			C_YTD_PMT = (double) getRandomInt( 0, 99999 ) / 100.0;
+			int year = getRandomInt( 1880, 2000 );
+			int month = getRandomInt( 0, 11 );
+			int maxday = 31;
+			int day;
+			if ( month == 3 | month == 5 | month == 8 | month == 10 )
+				maxday = 30;
+			else if ( month == 1 )
+				maxday = 28;
+			day = getRandomInt( 1, maxday );
+			cal = new GregorianCalendar( year, month, day );
+			C_BIRTHDATE = new java.sql.Date( cal.getTime().getTime() );
+
+			C_DATA = getRandomAString( 100, 500 );
+
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+    		if( db instanceof MongoService)
+    		{
+    			c.setCId( i );
+    		}
+			c.setCUname( C_UNAME );
+			c.setCPasswd( C_PASSWD );
+			c.setCFname( C_FNAME );
+			c.setCLname( C_LNAME );
+			IAddress addr = addressDao.findById( C_ADDR_ID );
+			c.setAddress( addr );
+			c.setCPhone( String.valueOf( C_PHONE ) );
+			c.setCEmail( C_EMAIL );
+			c.setCSince( C_SINCE );
+			c.setCLastVisit( C_LAST_LOGIN );
+			c.setCLogin( C_LOGIN );
+			c.setCExpiration( C_EXPIRATION );
+			c.setCDiscount( C_DISCOUNT );
+			c.setCBalance( C_BALANCE );
+			c.setCYtdPmt( C_YTD_PMT );
+			c.setCBirthdate( C_BIRTHDATE );
+			c.setCData( C_DATA );
+
+			customerDao.shrani( c );
+		}
+
+		customerDao.finish();
+
+		//System.out.print( "\n" );
+    }
+
+
+	@Override
+    public void populateItemTable()
+    {
+		String I_TITLE;
+		GregorianCalendar cal;
+		int I_A_ID;
+		java.sql.Date I_PUB_DATE;
+		String I_PUBLISHER, I_SUBJECT, I_DESC;
+		int I_RELATED1, I_RELATED2, I_RELATED3, I_RELATED4, I_RELATED5;
+		String I_THUMBNAIL, I_IMAGE;
+		double I_SRP, I_COST, I_RANDOM;
+		java.sql.Date I_AVAIL;
+		int I_STOCK;
+		String I_ISBN;
+		int I_PAGE;
+		String I_BACKING;
+		String I_DIMENSIONS;
+
+		String[] SUBJECTS = {"ARTS", "BIOGRAPHIES", "BUSINESS", "CHILDREN",
+		        "COMPUTERS", "COOKING", "HEALTH", "HISTORY", "HOME", "HUMOR",
+		        "LITERATURE", "MYSTERY", "NON-FICTION", "PARENTING",
+		        "POLITICS", "REFERENCE", "RELIGION", "ROMANCE", "SELF-HELP",
+		        "SCIENCE-NATURE", "SCIENCE-FICTION", "SPORTS", "YOUTH",
+		        "TRAVEL" };
+		int NUM_SUBJECTS = 24;
+
+		String[] BACKINGS = {"HARDBACK", "PAPERBACK", "USED", "AUDIO",
+		        "LIMITED-EDITION" };
+		int NUM_BACKINGS = 5;
+
+		System.out.println( "Populating ITEM table with " + NUM_ITEMS
+		        + " items" );
+		
+		
+		Random rand = new Random();
+		
+		for ( int i = 1; i <= NUM_ITEMS; i++ )
+		{
+			I_RANDOM = rand.nextDouble();
+			int month, day, year, maxday;
+			I_TITLE = getRandomAString( 14, 60 );
+			if ( i <= ( NUM_ITEMS / 4 ) )
+				I_A_ID = i;
+			else
+				I_A_ID = getRandomInt( 1, NUM_ITEMS / 4 );
+
+			year = getRandomInt( 1930, 2000 );
+			month = getRandomInt( 0, 11 );
+			maxday = 31;
+			if ( month == 3 | month == 5 | month == 8 | month == 10 )
+				maxday = 30;
+			else if ( month == 1 )
+				maxday = 28;
+			day = getRandomInt( 1, maxday );
+			cal = new GregorianCalendar( year, month, day );
+			I_PUB_DATE = new java.sql.Date( cal.getTime().getTime() );
+
+			I_PUBLISHER = getRandomAString( 14, 60 );
+			I_SUBJECT = SUBJECTS[getRandomInt( 0, NUM_SUBJECTS - 1 )];
+			I_DESC = getRandomAString( 100, 500 );
+
+			I_RELATED1 = getRandomInt( 1, NUM_ITEMS );
+			do
+			{
+				I_RELATED2 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED2 == I_RELATED1 );
+			do
+			{
+				I_RELATED3 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED3 == I_RELATED1 || I_RELATED3 == I_RELATED2 );
+			do
+			{
+				I_RELATED4 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED4 == I_RELATED1 || I_RELATED4 == I_RELATED2
+			        || I_RELATED4 == I_RELATED3 );
+			do
+			{
+				I_RELATED5 = getRandomInt( 1, NUM_ITEMS );
+			}
+			while ( I_RELATED5 == I_RELATED1 || I_RELATED5 == I_RELATED2
+			        || I_RELATED5 == I_RELATED3 || I_RELATED5 == I_RELATED4 );
+
+			I_THUMBNAIL = new String( "img" + i % 100 + "/thumb_" + i + ".gif" );
+			I_IMAGE = new String( "img" + i % 100 + "/image_" + i + ".gif" );
+			I_SRP = (double) getRandomInt( 100, 99999 );
+			I_SRP /= 100.0;
+
+			I_COST = I_SRP
+			        - ( ( ( (double) getRandomInt( 0, 50 ) / 100.0 ) ) * I_SRP );
+
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 1, 30 ) );
+			I_AVAIL = new java.sql.Date( cal.getTime().getTime() );
+			I_STOCK = getRandomInt( 10, 30 );
+			I_ISBN = getRandomAString( 13 );
+			I_PAGE = getRandomInt( 20, 9999 );
+			I_BACKING = BACKINGS[getRandomInt( 0, NUM_BACKINGS - 1 )];
+			I_DIMENSIONS = ( (double) getRandomInt( 1, 9999 ) / 100.0 ) + "x"
+			        + ( (double) getRandomInt( 1, 9999 ) / 100.0 ) + "x"
+			        + ( (double) getRandomInt( 1, 9999 ) / 100.0 );
+
+			IItem item = itemDao.getObject();
+			// Set parameter
+			// MongoDB doesn't have autoincrement field so we must set ID manually
+			if( db instanceof MongoService)
+			{
+				item.setIId( i );
+			}
+			item.setIRandom( I_RANDOM );
+			item.setITitle( I_TITLE );
+			item.setIPubDate( I_PUB_DATE );
+			item.setIPublisher( I_PUBLISHER );
+			item.setISubject( I_SUBJECT );
+			item.setIDesc( I_DESC );
+			item.setIRelated1( I_RELATED1 );
+			item.setIRelated2( I_RELATED2 );
+			item.setIRelated3( I_RELATED3 );
+			item.setIRelated4( I_RELATED4 );
+			item.setIRelated5( I_RELATED5 );
+			item.setIThumbnail( I_THUMBNAIL );
+			item.setIImage( I_IMAGE );
+			item.setISrp( I_SRP );
+			item.setICost( I_COST );
+			item.setIAvail( I_AVAIL );
+			item.setIStock( I_STOCK );
+			item.setIIsbn( I_ISBN );
+			item.setIPage( String.valueOf( I_PAGE ) );
+			item.setIBacking( I_BACKING );
+			item.setIDimension( I_DIMENSIONS );
+			item.setAuthor( authorDao.findById( I_A_ID ) );
+
+			itemDao.shrani( item );
+			
+			itemDao.findById( item.getIId() );
+		}
+
+		itemDao.finish();
+		//System.out.println( "" );
+    }
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/generate/Generate.java b/src/main/java/eu/cloudscale/showcase/generate/Generate.java
new file mode 100644
index 0000000..e139c3a
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/generate/Generate.java
@@ -0,0 +1,46 @@
+package eu.cloudscale.showcase.generate;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+
+@Component
+public class Generate
+{
+	public Generate()
+	{
+		
+	}
+
+	public void generate(IGenerate db)
+	{
+
+		//db.dropTables( tables );
+		//db.populateCountryTable();
+		//db.populateAuthorTable();
+		db.populateAddressTable();
+		//db.populateCustomerTable();
+		//db.populateItemTable();
+		//db.populateOrdersAndCC_XACTSTable();
+		// db.createIndexes(tables);
+
+		System.out.println( "FINISHED!" );
+	}
+
+	public static void main(String[] args)
+	{
+		if( args.length < 1 )
+		{
+			System.out.println("Usage: $ java Generate <mysql|mongodb>");
+			System.exit(0);			
+		}
+
+		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:app-context.xml");
+		
+	    Generate generate = context.getBean(Generate.class);
+    
+		generate.generate(args[0] == "mysql" ? (IGenerate) context.getBean("generateHibernate") : (IGenerate) context.getBean("generateMongo"));
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/generate/GenerateHibernate.java b/src/main/java/eu/cloudscale/showcase/generate/GenerateHibernate.java
new file mode 100644
index 0000000..3ad3b8c
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/generate/GenerateHibernate.java
@@ -0,0 +1,158 @@
+package eu.cloudscale.showcase.generate;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.hibernate.CcXacts;
+import eu.cloudscale.showcase.db.model.hibernate.OrderLine;
+import eu.cloudscale.showcase.db.model.hibernate.Orders;
+
+@Component
+
+public class GenerateHibernate extends AGenerate
+{
+	
+	public GenerateHibernate()
+	{
+		super();
+	}
+
+	@Override
+    public void populateOrdersAndCC_XACTSTable()
+    {
+		GregorianCalendar cal;
+		String[] credit_cards = {"VISA", "MASTERCARD", "DISCOVER", "AMEX",
+		        "DINERS" };
+		int num_card_types = 5;
+		String[] ship_types = {"AIR", "UPS", "FEDEX", "SHIP", "COURIER", "MAIL" };
+		int num_ship_types = 6;
+
+		String[] status_types = {"PROCESSING", "SHIPPED", "PENDING", "DENIED" };
+		int num_status_types = 4;
+
+		// Order variables
+		int O_C_ID;
+		java.sql.Timestamp O_DATE;
+		double O_SUB_TOTAL;
+		double O_TAX;
+		double O_TOTAL;
+		String O_SHIP_TYPE;
+		java.sql.Timestamp O_SHIP_DATE;
+		int O_BILL_ADDR_ID, O_SHIP_ADDR_ID;
+		String O_STATUS;
+
+		String CX_TYPE;
+		int CX_NUM;
+		String CX_NAME;
+		java.sql.Date CX_EXPIRY;
+		String CX_AUTH_ID;
+		int CX_CO_ID;
+
+		System.out.println( "Populating ORDERS, ORDER_LINES, CC_XACTS with "
+		        + NUM_ORDERS + " orders" );
+
+		System.out.print( "Complete (in 10,000's): " );
+
+
+		for ( int i = 1; i <= NUM_ORDERS; i++ )
+		{
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+
+			int num_items = getRandomInt( 1, 5 );
+			O_C_ID = getRandomInt( 1, NUM_CUSTOMERS );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, -1 * getRandomInt( 1, 60 ) );
+			O_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+			O_SUB_TOTAL = (double) getRandomInt( 1000, 999999 ) / 100;
+			O_TAX = O_SUB_TOTAL * 0.0825;
+			O_TOTAL = O_SUB_TOTAL + O_TAX + 3.00 + num_items;
+			O_SHIP_TYPE = ship_types[getRandomInt( 0, num_ship_types - 1 )];
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 0, 7 ) );
+			O_SHIP_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+
+			O_BILL_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_SHIP_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_STATUS = status_types[getRandomInt( 0, num_status_types - 1 )];
+
+			Orders order = new Orders();
+
+			// Set parameter
+			order.setCustomer( customerDao.findById( O_C_ID ) );
+			order.setODate( new Date( O_DATE.getTime() ) );
+			order.setOSubTotal( O_SUB_TOTAL );
+			order.setOTax( O_TAX );
+			order.setOTotal( O_TOTAL );
+			order.setOShipType( O_SHIP_TYPE );
+			order.setOShipDate( O_SHIP_DATE );
+			order.setAddressByOBillAddrId( addressDao.findById( O_BILL_ADDR_ID ) );
+			order.setAddressByOShipAddrId( addressDao.findById( O_SHIP_ADDR_ID ) );
+			order.setOStatus( O_STATUS );
+			order.setCcXactses( new HashSet<ICcXacts>() );
+			order.setOrderLines( new HashSet<IOrderLine>() );
+			ordersDao.shrani( order );
+
+			for ( int j = 1; j <= num_items; j++ )
+			{
+				int OL_ID = j;
+				int OL_O_ID = i;
+				int OL_I_ID = getRandomInt( 1, NUM_ITEMS );
+				int OL_QTY = getRandomInt( 1, 300 );
+				double OL_DISCOUNT = (double) getRandomInt( 0, 30 ) / 100;
+				String OL_COMMENTS = getRandomAString( 20, 100 );
+				
+				OrderLine orderLine = new OrderLine();
+				orderLine.setItem( itemDao.findById( OL_I_ID ) );
+				orderLine.setOlQty( OL_QTY );
+				orderLine.setOlDiscount( OL_DISCOUNT );
+				orderLine.setOlComment( OL_COMMENTS );
+				orderLine.setOrders( order );
+
+				orderLineDao.shrani( orderLine );
+				order.getOrderLines().add( orderLine );
+
+			}
+
+			CX_TYPE = credit_cards[getRandomInt( 0, num_card_types - 1 )];
+			CX_NUM = getRandomNString( 16 );
+			CX_NAME = getRandomAString( 14, 30 );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 10, 730 ) );
+			CX_EXPIRY = new java.sql.Date( cal.getTime().getTime() );
+			CX_AUTH_ID = getRandomAString( 15 );
+			CX_CO_ID = getRandomInt( 1, 92 );
+
+			CcXacts ccXacts = new CcXacts();
+
+			ccXacts.setCountry( countryDao.findById( CX_CO_ID ) );
+			ccXacts.setOrders( order );
+			ccXacts.setCxType( CX_TYPE );
+			ccXacts.setCxNum( CX_NUM );
+			ccXacts.setCxName( CX_NAME );
+			ccXacts.setCxExpiry( CX_EXPIRY );
+			ccXacts.setCxAuthId( CX_AUTH_ID );
+			ccXacts.setCxXactAmt( O_TOTAL );
+			ccXacts.setCxXactDate( O_SHIP_DATE );
+
+//			ccXacts.setOrders( order );
+
+			ccXacts.setCountry( countryDao.findById( CX_CO_ID ) );
+
+			order.getCcXactses().add( ccXacts );
+
+			ccXactsDao.shrani( ccXacts );
+
+		}
+
+		System.out.println( "" );
+    }
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/generate/GenerateMongo.java b/src/main/java/eu/cloudscale/showcase/generate/GenerateMongo.java
new file mode 100644
index 0000000..b666096
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/generate/GenerateMongo.java
@@ -0,0 +1,163 @@
+package eu.cloudscale.showcase.generate;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashSet;
+
+import org.springframework.stereotype.Component;
+
+import eu.cloudscale.showcase.db.model.ICcXacts;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.mongo.CcXacts;
+import eu.cloudscale.showcase.db.model.mongo.OrderLine;
+import eu.cloudscale.showcase.db.model.mongo.Orders;
+
+@Component
+public class GenerateMongo extends AGenerate
+{
+	
+	public GenerateMongo()
+	{
+		super();
+	}
+
+	@Override
+    public void populateOrdersAndCC_XACTSTable()
+    {
+		GregorianCalendar cal;
+		String[] credit_cards = {"VISA", "MASTERCARD", "DISCOVER", "AMEX",
+		        "DINERS" };
+		int num_card_types = 5;
+		String[] ship_types = {"AIR", "UPS", "FEDEX", "SHIP", "COURIER", "MAIL" };
+		int num_ship_types = 6;
+
+		String[] status_types = {"PROCESSING", "SHIPPED", "PENDING", "DENIED" };
+		int num_status_types = 4;
+
+		// Order variables
+		int O_C_ID;
+		java.sql.Timestamp O_DATE;
+		double O_SUB_TOTAL;
+		double O_TAX;
+		double O_TOTAL;
+		String O_SHIP_TYPE;
+		java.sql.Timestamp O_SHIP_DATE;
+		int O_BILL_ADDR_ID, O_SHIP_ADDR_ID;
+		String O_STATUS;
+
+		String CX_TYPE;
+		int CX_NUM;
+		String CX_NAME;
+		java.sql.Date CX_EXPIRY;
+		String CX_AUTH_ID;
+		int CX_CO_ID;
+
+		System.out.println( "Populating ORDERS, ORDER_LINES, CC_XACTS with "
+		        + NUM_ORDERS + " orders" );
+
+		System.out.print( "Complete (in 10,000's): " );
+		
+		
+		for ( int i = 1; i <= NUM_ORDERS; i++ )
+		{
+			if ( i % 10000 == 0 )
+				System.out.print( i / 10000 + " " );
+
+			int num_items = getRandomInt( 1, 5 );
+			O_C_ID = getRandomInt( 1, NUM_CUSTOMERS );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, -1 * getRandomInt( 1, 60 ) );
+			O_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+			O_SUB_TOTAL = (double) getRandomInt( 1000, 999999 ) / 100;
+			O_TAX = O_SUB_TOTAL * 0.0825;
+			O_TOTAL = O_SUB_TOTAL + O_TAX + 3.00 + num_items;
+			O_SHIP_TYPE = ship_types[getRandomInt( 0, num_ship_types - 1 )];
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 0, 7 ) );
+			O_SHIP_DATE = new java.sql.Timestamp( cal.getTime().getTime() );
+
+			O_BILL_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_SHIP_ADDR_ID = getRandomInt( 1, 2 * NUM_CUSTOMERS );
+			O_STATUS = status_types[getRandomInt( 0, num_status_types - 1 )];
+
+			Orders order = new Orders();
+			
+			// Set parameter
+			order.setOId( i );
+			order.setCustomer( customerDao.findById( O_C_ID ) );
+			order.setODate( new Date( O_DATE.getTime() ) );
+			order.setOSubTotal( O_SUB_TOTAL );
+			order.setOTax( O_TAX );
+			order.setOTotal( O_TOTAL );
+			order.setOShipType( O_SHIP_TYPE );
+			order.setOShipDate( O_SHIP_DATE );
+			order.setAddressByOBillAddrId( addressDao.findById( O_BILL_ADDR_ID ) );
+			order.setAddressByOShipAddrId( addressDao.findById( O_SHIP_ADDR_ID ) );
+			order.setOStatus( O_STATUS );
+			order.setCcXactses( new HashSet<ICcXacts>() );
+			order.setOrderLines( new HashSet<IOrderLine>() );
+
+			for ( int j = 1; j <= num_items; j++ )
+			{
+				int OL_ID = j;
+				int OL_O_ID = i;
+				int OL_I_ID = getRandomInt( 1, NUM_ITEMS );
+				int OL_QTY = getRandomInt( 1, 300 );
+				double OL_DISCOUNT = (double) getRandomInt( 0, 30 ) / 100;
+				String OL_COMMENTS = getRandomAString( 20, 100 );
+				
+				OrderLine orderLine = new OrderLine();				
+				orderLine.setOlId( OL_ID );
+				orderLine.setItem(itemDao.findById( OL_I_ID ));
+				orderLine.setOlQty( OL_QTY );
+				orderLine.setOlDiscount( OL_DISCOUNT );
+				orderLine.setOlComment( OL_COMMENTS );
+				orderLine.setOrders( order );
+				
+				orderLineDao.shrani( orderLine );
+				
+				HashSet<IOrderLine> set = new HashSet<IOrderLine>();
+				set.add(orderLine);
+				set.addAll(order.getOrderLines());
+				
+				order.setOrderLines( set );
+				ordersDao.shrani( order );
+			}
+
+			CX_TYPE = credit_cards[getRandomInt( 0, num_card_types - 1 )];
+			CX_NUM = getRandomNString( 16 );
+			CX_NAME = getRandomAString( 14, 30 );
+			cal = new GregorianCalendar();
+			cal.add( Calendar.DAY_OF_YEAR, getRandomInt( 10, 730 ) );
+			CX_EXPIRY = new java.sql.Date( cal.getTime().getTime() );
+			CX_AUTH_ID = getRandomAString( 15 );
+			CX_CO_ID = getRandomInt( 1, 92 );
+					
+			CcXacts ccXacts = new CcXacts();
+			ccXacts.setId( i );
+			ccXacts.setCountry( countryDao.findById( CX_CO_ID ) );
+			ccXacts.setCxType( CX_TYPE );
+			ccXacts.setCxNum( CX_NUM );
+			ccXacts.setCxName( CX_NAME );
+			ccXacts.setCxExpiry( CX_EXPIRY );
+			ccXacts.setCxAuthId( CX_AUTH_ID );
+			ccXacts.setCxXactAmt( O_TOTAL );
+			ccXacts.setCxXactDate( O_SHIP_DATE );
+			
+			ccXacts.setOrders(order);
+			ccXactsDao.shrani( ccXacts );
+			
+			HashSet<ICcXacts> set = new HashSet<ICcXacts>();
+			set.add(ccXacts);
+			set.addAll(order.getCcXactses());
+			
+			order.setCcXactses(set);
+			
+			ordersDao.shrani( order );
+			
+		}
+
+		System.out.println( "" );
+    }
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/generate/IGenerate.java b/src/main/java/eu/cloudscale/showcase/generate/IGenerate.java
new file mode 100644
index 0000000..21c8137
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/generate/IGenerate.java
@@ -0,0 +1,18 @@
+package eu.cloudscale.showcase.generate;
+
+import org.springframework.context.ApplicationContext;
+
+public interface IGenerate
+{
+	public void populateCountryTable();
+	
+	public void populateAuthorTable();
+	
+	public void populateAddressTable();
+	
+	public void populateCustomerTable();
+	
+	public void populateItemTable();
+	
+	public void populateOrdersAndCC_XACTSTable();
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/AController.java b/src/main/java/eu/cloudscale/showcase/servlets/AController.java
new file mode 100644
index 0000000..250d361
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/AController.java
@@ -0,0 +1,130 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PropertiesLoaderUtils;
+import org.springframework.ui.Model;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+import eu.cloudscale.showcase.db.services.IService;
+
+public abstract class AController
+{
+	
+	@Autowired
+	@Qualifier("service")
+    protected IService service;
+	
+	
+	public HttpSession getHttpSession(Class c, HttpServletRequest request)
+	{
+		//DatabaseHelper.getDatabase();
+		Logger log = LogManager.getLogger(c.getName());
+		HttpSession session = request.getSession();
+		
+		//System.out.println("SESSION_ID = " + session.getId());
+		
+		return session;
+	}
+	
+	protected String getUrl2(Integer shoppingId, Integer customerId, String url1)
+    {
+		String url = new String(url1);
+		if( shoppingId != null)
+	    {
+	    	url += "?SHOPPING_ID=" + shoppingId;
+	    	if( customerId != null )
+	    	{
+	    		url += "&C_ID=" + customerId;
+	    	}
+	    }
+	    else if ( customerId != null )
+	    {
+	    	url += "?C_ID=" + customerId;
+	    }
+		
+		return url;
+    }
+
+	protected String getUrl1(Integer shoppingId, Integer customerId, String url1)
+    {
+		String url = new String(url1);
+		if( shoppingId != null )
+		{
+			url += "&SHOPPING_ID=" + shoppingId;
+		}
+		
+		if( customerId != null )
+		{
+			url += "&C_ID=" + customerId;
+		}
+		
+		return url;
+    }	
+	
+	protected String getShoppingCartUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl2( shoppingId, customerId, "/shopping-cart" );
+	}
+
+	protected String getHomeUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl2( shoppingId, customerId, "/" );
+	}
+
+	protected String getSearchRequestUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl2( shoppingId, customerId, "/search" );
+	}
+	
+	protected String getOrderInquiryUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl2( shoppingId, customerId, "/order-inquiry" );
+    }
+	
+	protected void setupFrontend(Model model, Integer shoppingId, Integer customerId)
+	{
+		String shoppingCartUrl = getShoppingCartUrl( shoppingId, customerId );
+		model.addAttribute( "shoppingCartUrl", shoppingCartUrl );
+
+		String searchUrl = getSearchRequestUrl( shoppingId, customerId );
+		model.addAttribute( "searchUrl", searchUrl );
+
+		String homeUrl = getHomeUrl( shoppingId, customerId );
+		model.addAttribute( "homeUrl", homeUrl );
+		
+		String orderInquiryUrl = getOrderInquiryUrl(shoppingId, customerId);
+		model.addAttribute( "orderInquiryUrl", orderInquiryUrl );
+		
+		model.addAttribute( "cssResourceUrl", getApplicationProperties().get( "eu.cloudscale.files.url.css" ));
+		model.addAttribute( "imgResourceUrl", getApplicationProperties().get( "eu.cloudscale.files.url.img" ));
+		model.addAttribute( "jsResourceUrl", getApplicationProperties().get( "eu.cloudscale.files.url.js" ));
+	}
+
+	protected Properties getApplicationProperties()
+	{
+		Resource resource = new ClassPathResource("/app.properties");
+		Properties props = null;
+		try
+        {
+	        props = PropertiesLoaderUtils.loadProperties(resource);
+        }
+        catch ( IOException e )
+        {
+	        e.printStackTrace();
+        }
+		
+		return props;
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/AdminConfirmController.java b/src/main/java/eu/cloudscale/showcase/servlets/AdminConfirmController.java
new file mode 100644
index 0000000..c204c0b
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/AdminConfirmController.java
@@ -0,0 +1,38 @@
+package eu.cloudscale.showcase.servlets;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import eu.cloudscale.showcase.db.model.IItem;
+
+@Controller
+@RequestMapping("/admin-confirm")
+public class AdminConfirmController extends AController 
+{
+	@RequestMapping(value="", method=RequestMethod.POST)
+	public String post(@RequestParam(value="I_ID") Integer itemId,
+						@RequestParam(value = "new_price", required=false) Double newPrice,
+						@RequestParam(value = "new_picture", required=false) String newPicture,
+						@RequestParam(value = "new_thumbnail", required=false) String newThumbnail,
+						HttpServletRequest request, Model model, RedirectAttributes redirectAttributes)
+	{
+		IItem item = service.findItemById(itemId);
+		if (newPrice != null)
+			item.setICost(newPrice);
+		if (newPicture != null && newPicture != "")
+			item.setIImage(newPicture);
+		if (newThumbnail != null && newThumbnail != "")
+			item.setIThumbnail(newThumbnail);
+		service.saveItem(item);
+		
+		setupFrontend( model, null, null );
+		redirectAttributes.addAttribute("I_ID", itemId);
+		return "redirect:/product-detail";
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/AdminRequestController.java b/src/main/java/eu/cloudscale/showcase/servlets/AdminRequestController.java
new file mode 100644
index 0000000..9a38036
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/AdminRequestController.java
@@ -0,0 +1,37 @@
+package eu.cloudscale.showcase.servlets;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.model.IItem;
+
+@Controller
+@RequestMapping("/admin")
+public class AdminRequestController extends AController 
+{
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(@RequestParam( value="I_ID", required=false) Integer itemId, HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(BestSellersController.class, request);
+		
+		if ( itemId != null)
+		{
+			IItem item = service.findItemById(itemId);
+			model.addAttribute("item", item);	
+		}
+		else
+		{
+			model.addAttribute("error", "No item with that ID!");
+		}
+		
+		setupFrontend( model, null, null );
+		return "admin";
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/BestSellersController.java b/src/main/java/eu/cloudscale/showcase/servlets/BestSellersController.java
new file mode 100644
index 0000000..d1d6fc4
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/BestSellersController.java
@@ -0,0 +1,46 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+@RequestMapping("/best-sellers")
+public class BestSellersController extends AController
+{
+	static final Logger log = LogManager.getLogger(BestSellersController.class.getName());
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String bestSellers(@RequestParam( value="SUBJECT", required=false) String category, 
+							  @RequestParam( value="C_ID", required=false) Integer customerId,
+							  @RequestParam( value="SHOPPING_ID", required=false ) Integer shoppingId,
+							  HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(BestSellersController.class, request);
+
+		List<Object[]> res = service.getBestSellers( category );
+		model.addAttribute( "products", res );
+		
+		String productUrl = getProductUrl(shoppingId, customerId);
+		model.addAttribute( "productUrl", productUrl);
+		model.addAttribute( "promotional", service.getPromotional() );	
+		setupFrontend( model, shoppingId, customerId );
+		
+		return "best-sellers";
+	}
+	
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl2(shoppingId, customerId, "");
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/BuyConfirmController.java b/src/main/java/eu/cloudscale/showcase/servlets/BuyConfirmController.java
new file mode 100644
index 0000000..594cbbd
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/BuyConfirmController.java
@@ -0,0 +1,143 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.BuyConfirmResult;
+
+@Controller
+@RequestMapping("/buy-confirm")
+public class BuyConfirmController extends AController
+{
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request,
+						Model model)
+	{
+		HttpSession session = super.getHttpSession(BuyConfirmController.class, request);
+		
+		
+		ArrayList<String> errors = new ArrayList<String>();
+		
+		String shoppingIdString = request.getParameter( "SHOPPING_ID" );
+		Integer shoppingId = null;
+		if( shoppingIdString != null && !shoppingIdString.isEmpty() )
+		{
+			shoppingId = Integer.parseInt(  shoppingIdString );
+		}
+		
+		String customerIdString = request.getParameter( "C_ID" );
+		Integer customerId = null;
+		if( customerIdString != null && !customerIdString.isEmpty() )
+		{
+			customerId = Integer.parseInt(  customerIdString );
+		}
+		
+		String ccType = request.getParameter( "CC_TYPE" );
+		String ccNumber_str = request.getParameter( "CC_NUMBER" );
+		Long ccNumber = null;
+		if( !ccNumber_str.isEmpty() )
+			ccNumber = Long.parseLong( ccNumber_str );
+		
+		SimpleDateFormat sdf = new SimpleDateFormat("mm/dd/yyyy");
+		String ccName = request.getParameter( "CC_NAME" );
+		Date ccExpiry = null;
+        try
+        {
+	        ccExpiry = sdf.parse(request.getParameter( "CC_EXPIRY" ));
+        }
+        catch ( ParseException e )
+        {
+	        // TODO Auto-generated catch block
+	        e.printStackTrace();
+        }
+		String shipping = request.getParameter( "SHIPPING" );
+		String street1 = request.getParameter( "street1" );
+		
+		
+		BuyConfirmResult res = null;
+		if( street1 != null && street1.equals( "" ))
+		{
+			checkEmptiness(errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping);
+			if( errors.isEmpty() )
+			{
+				res = service.doBuyConfirm( shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping);
+			}
+		}
+		else
+		{
+			String street2 = request.getParameter("street2");
+			String city = request.getParameter("city");
+			String state = request.getParameter( "state" );
+			String zip = request.getParameter("zip");
+			String country = request.getParameter("country");
+			checkEmptiness(errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping, street1, country, city, state, zip);
+			if( errors.isEmpty() )
+			{
+
+				res = service.doBuyConfirm(shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping, street1, street2, city, state, zip, country);
+
+			}
+		}	
+		
+		model.addAttribute("errors", errors);
+		model.addAttribute("results", res);
+		setupFrontend( model, shoppingId, customerId );
+		return "buy-confirm";
+	}
+
+	private void checkEmptiness(ArrayList<String> errors, Integer shoppingId,
+            Integer customerId, String ccType, Long ccNumber, String ccName,
+            Date ccExpiry, String shipping)
+    {
+		if(shoppingId == null)
+	    	errors.add( "Shipping id is null!" );
+	    if( customerId == null)
+	    	errors.add( "Customer id is null" );
+	    if( ccType == null || ccType.isEmpty() )
+	    	errors.add( "ccType is null" );
+	    if( ccNumber == null)
+	    	errors.add("ccNumber is null");
+	    if( ccName == null || ccName.isEmpty() )
+	    	errors.add( "ccName is null" );
+	    if( ccExpiry == null)
+	    	errors.add( "ccExpiry is null" );
+	    if( shipping == null || shipping.isEmpty() )
+	    	errors.add( "Shipping is null" );
+    }
+
+
+
+	private void checkEmptiness(ArrayList<String> errors, Integer shoppingId,
+            Integer customerId, String ccType, Long ccNumber, String ccName,
+            Date ccExpiry, String shipping, String street, String country, String city, String state, String zip)
+    {
+	    checkEmptiness( errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping );
+	    
+	    if( city == null )
+	    	errors.add( "City is null" );
+	    
+	    if( state == null )
+	    	errors.add( "State is null" );
+	    
+	    if( zip == null )
+	    	errors.add( "Zip is null" );
+	    
+	    if( street == null )
+	    	errors.add( "Street1 or street2 is null" );
+	    
+	    if( service.countryExist(country) )
+	    	errors.add( "That country doesn't exist!" );
+    }
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/BuyController.java b/src/main/java/eu/cloudscale/showcase/servlets/BuyController.java
new file mode 100644
index 0000000..1fc1805
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/BuyController.java
@@ -0,0 +1,225 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.dao.IAddressDao;
+import eu.cloudscale.showcase.db.dao.ICountryDao;
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IAddress;
+import eu.cloudscale.showcase.db.model.ICountry;
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+
+@Controller
+@RequestMapping( "/buy" )
+public class BuyController extends AController
+{
+	static Logger log = LogManager.getLogger(BuyController.class.getName());
+	
+	@RequestMapping( value = "", method = RequestMethod.GET )
+	@Transactional
+	public String get(
+	        @RequestParam( value = "SHOPPING_ID", required = false ) Integer shoppingId,
+	        @RequestParam( value = "C_ID", required = false ) Integer customerId,
+	        @RequestParam( value = "RETURNING_FLAG", required = false ) String returningFlag,
+	        HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(BuyController.class, request);
+
+		ArrayList<String> errors = new ArrayList<String>();
+
+		long start = System.currentTimeMillis();
+
+		ICustomer customer = null;
+		if ( returningFlag.equals( "Y" ) )
+		{
+			String uname = request.getParameter( "username" );
+			String passwd = request.getParameter( "password" );
+
+			if ( uname.length() == 0 || passwd.length() == 0 )
+			{
+				errors.add( "Username and password cannot be empty!" );
+			}
+			else
+			{
+				customer = service.getUserBy( uname, passwd );
+				if ( customer == null )
+				{
+					errors.add( "Invalid username or password!" );
+				}
+
+//				if ( errors.isEmpty() )
+//				{
+//					session.setAttribute( "customer", customer );
+//				}
+			}
+		}
+		else if ( returningFlag.equals( "N" ) )
+		{
+			String fname = request.getParameter( "fname" );
+			checkEmptiness( fname, "First name", errors );
+			String lname = request.getParameter( "lname" );
+			checkEmptiness( lname, "Last name", errors );
+			String city = request.getParameter( "city" );
+			String state = request.getParameter( "state" );
+			String street1 = request.getParameter( "street1" );
+			String street2 = request.getParameter( "street2" );
+			String zip = request.getParameter( "zip" );
+			String country = request.getParameter( "country" );
+			checkEmptiness( country, "Country", errors );
+			String phone = request.getParameter( "phone" );
+			String email = request.getParameter( "email" );
+			String birthdate = request.getParameter( "birthdate" );
+			String data = request.getParameter( "data" );
+
+			if ( errors.isEmpty() )
+			{
+				customer = service.getCustomerObject();
+				customer.setCFname( fname );
+				customer.setCLname( lname );
+
+				IAddress address = service.getAddressObject();
+				address.setAddrCity( city );
+				address.setAddrState( state );
+				address.setAddrStreet1( street1 );
+				address.setAddrStreet2( street2 );
+				address.setAddrZip( zip );
+				System.out.println("getCountryByName()");
+				ICountry countryObj = service.getCountryByName( country );
+				if ( countryObj == null )
+				{
+					errors.add( "Country " + country + " doesn't exist" );
+				}
+				else
+				{
+					address.setCountry( countryObj );
+				}
+				
+				address.getCustomers().add( customer );
+				service.saveAddress( address );
+				
+				customer.setAddress( address );
+				customer.setCPhone( phone );
+				SimpleDateFormat sdf = new SimpleDateFormat( "dd/mm/yyyy" );
+
+				try
+				{
+					customer.setCBirthdate( sdf.parse( birthdate ) );
+				}
+				catch ( ParseException e )
+				{
+					e.printStackTrace();
+				}
+				customer.setCData( data );
+				customer.setCEmail( email );
+				customer.setCBalance( 0.0 );
+				customer.setCDiscount( (int) ( java.lang.Math.random() * 51 ) );
+				customer.setCExpiration( new Date(
+				        System.currentTimeMillis() + 7200000 ) );
+				customer.setCLastVisit( new Date( System.currentTimeMillis() ) );
+				customer.setCLogin( new Date( System.currentTimeMillis() ) );
+				customer.setCSince( new Date( System.currentTimeMillis() ) );
+				customer.setCYtdPmt( 0.0 );
+				customer.setCUname( "" );
+				customer.setCPasswd( "" );
+				service.saveCustomer( customer );
+				customer.setCUname( DigSyl( customer.getCId(), 0 ).toLowerCase() );
+				customer.setCPasswd( customer.getCUname().toLowerCase() );
+				service.saveCustomer( customer ); // update it with username and
+												// password
+			}
+		}
+		else
+		{
+			errors.add( "RETURNING_FLAG not set to Y or N!" );
+		}
+
+		if ( shoppingId == null )
+		{
+			errors.add( "Shopping cart ID not set!" );
+		}
+		
+		IShoppingCart cart = service.findShoppingCartById( shoppingId );
+		model.addAttribute( "errors", errors );
+		model.addAttribute( "cart", cart );
+		model.addAttribute( "customer", customer );
+		
+//		if( cart != null )
+//			model.addAttribute( "subTotal", getSubTotal( cart.getShoppingCartLines() ) );
+
+		setupFrontend(model, shoppingId, customerId);
+//		System.out.println("[Buy controller] " + (System.currentTimeMillis() - start) );
+		return "buy";
+	}
+
+	private double getSubTotal(Set<IShoppingCartLine> shoppingCartLines)
+	{
+		double total = 0;
+		for ( IShoppingCartLine scl : shoppingCartLines )
+		{
+			total += scl.getItem().getICost();
+		}
+
+		return total;
+	}
+
+	private void checkEmptiness(String obj, String desc,
+	        ArrayList<String> errors)
+	{
+		if ( obj == null || obj.isEmpty() )
+		{
+			errors.add( desc + " is empty!" );
+		}
+	}
+
+	private static final String[] digS = {"BA", "OG", "AL", "RI", "RE", "SE",
+	        "AT", "UL", "IN", "NG"    };
+
+	public String DigSyl(int d, int n)
+	{
+		String s = "";
+
+		if ( n == 0 )
+			return ( DigSyl( d ) );
+		for ( ; n > 0; n-- )
+		{
+			int c = d % 10;
+			s = digS[c] + s;
+			d = d / 10;
+		}
+
+		return ( s );
+	}
+
+	private String DigSyl(int d)
+	{
+		String s = "";
+
+		for ( ; d != 0; d = d / 10 )
+		{
+			int c = d % 10;
+			s = digS[c] + s;
+		}
+
+		return ( s );
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/CustomerRegistrationController.java b/src/main/java/eu/cloudscale/showcase/servlets/CustomerRegistrationController.java
new file mode 100644
index 0000000..327cd39
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/CustomerRegistrationController.java
@@ -0,0 +1,52 @@
+package eu.cloudscale.showcase.servlets;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+
+@Controller
+@RequestMapping( "/customer-registration" )
+public class CustomerRegistrationController extends AController
+{
+	
+	
+
+	@RequestMapping( "" )
+	public String get(
+	        @RequestParam( value = "C_ID", required = false ) Integer customerId,
+	        @RequestParam( value = "SHOPPING_ID", required = false ) Integer shoppingId,
+	        HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(CustomerRegistrationController.class, request);
+		
+		ICustomer customer = null;
+		if ( customerId != null )
+		{
+			customer = service.findCustomerById( customerId );
+		}
+
+		model.addAttribute( "shoppingId", shoppingId );
+		model.addAttribute( "customerId", customerId );
+
+		String shoppingCartUrl = getShoppingCartUrl( shoppingId, customerId );
+		model.addAttribute( "shoppingCartUrl", shoppingCartUrl );
+
+		String searchUrl = getSearchRequestUrl( shoppingId, customerId );
+		model.addAttribute( "searchUrl", searchUrl );
+
+		String homeUrl = getHomeUrl( shoppingId, customerId );
+		model.addAttribute( "homeUrl", homeUrl );
+
+		model.addAttribute( "sessionId", session.getId() );
+
+		setupFrontend( model, shoppingId, customerId );
+		return "customer-registration";
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/helpers/PaymentService.java b/src/main/java/eu/cloudscale/showcase/servlets/helpers/PaymentService.java
new file mode 100644
index 0000000..c6e8320
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/helpers/PaymentService.java
@@ -0,0 +1,81 @@
+package eu.cloudscale.showcase.servlets.helpers;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.apache.commons.io.IOUtils;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.AsyncResult;
+import org.springframework.stereotype.Service;
+
+@Service("paymentService")
+public class PaymentService{
+	private static final String BASE_URL = "http://openstack.cloudscale.xlab.si/response-generator/";	
+	
+	@Async
+	public Future<String> callPaymentService(String distribution, String attr1, String attr2, String attr3)
+	{
+		try {
+			ExecutorService executor = Executors.newFixedThreadPool(1);
+			String url = this.getUrl(distribution, attr1, attr2, attr3);
+			Future<Response> response = executor.submit(new Request(new URL(url)));
+			InputStream input = response.get().getBody();
+			executor.shutdown();
+		
+			String body = IOUtils.toString(input, "UTF-8");
+			return new AsyncResult<String>(body);
+		} catch (MalformedURLException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} 
+		catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} 
+		catch (ExecutionException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return null;
+	}
+	
+	private String getUrl(String distribution, String attr1, String attr2, String attr3)
+	{
+		String url = "";
+		if (distribution.equals("gauss")) {
+            url = "?mu=" + attr1 + "&sigma=" + attr2 + "&k=0";
+        }
+        if (distribution.equals("expo")) {
+            url = "?lambda=" + attr1 + "&k=" + attr3;
+        }
+        if (distribution.equals("gamma")) {
+            url = "?alpha=" + attr1 + "&beta=" + attr2 + "&k=" + attr3;
+        }
+        if (distribution.equals("log")) {
+            url = "?mu=" + attr1 + "&sigma=" + attr2 + "&k=" + attr3;
+        }
+        if (distribution.equals("pareto")) {
+            url = "?alpha=" + attr1 + "&k=" + attr3;
+        }
+        if (distribution.equals("weibull")) {
+            url = "?alpha=" + attr1 + "&beta=" + attr2 + "&k=" + attr3;
+        }
+        if (distribution.equals("uniform")){
+            url = "?a=" + attr1 + "&b=" + attr2;
+        }
+        if (distribution.equals("constant"))
+        {
+            url = "?c=" + attr1;
+        }
+        return BASE_URL + distribution + url;
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/helpers/Request.java b/src/main/java/eu/cloudscale/showcase/servlets/helpers/Request.java
new file mode 100644
index 0000000..cbcfec6
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/helpers/Request.java
@@ -0,0 +1,19 @@
+package eu.cloudscale.showcase.servlets.helpers;
+
+import java.net.URL;
+import java.util.concurrent.Callable;
+
+import eu.cloudscale.showcase.servlets.helpers.Response;
+
+public class Request implements Callable<Response> {
+    private URL url;
+
+    public Request(URL url) {
+        this.url = url;
+    }
+
+    @Override
+    public Response call() throws Exception {
+        return new Response(url.openStream());
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/helpers/Response.java b/src/main/java/eu/cloudscale/showcase/servlets/helpers/Response.java
new file mode 100644
index 0000000..2449310
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/helpers/Response.java
@@ -0,0 +1,15 @@
+package eu.cloudscale.showcase.servlets.helpers;
+
+import java.io.InputStream;
+
+public class Response {
+    private InputStream body;
+
+    public Response(InputStream body) {
+        this.body = body;
+    }
+
+    public InputStream getBody() {
+        return body;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/HomeController.java b/src/main/java/eu/cloudscale/showcase/servlets/HomeController.java
new file mode 100644
index 0000000..a4fbc86
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/HomeController.java
@@ -0,0 +1,105 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+
+
+@Controller
+@RequestMapping( "/" )
+public class HomeController extends AController
+{
+	static Logger log = LogManager.getLogger(HomeController.class.getName());
+	
+	private String[]            categories = {"ARTS", "NON-FICTION",
+	        "BIOGRAPHIES", "PARENTING", "BUSINESS", "POLITICS", "CHILDREN",
+	        "REFERENCE", "COMPUTERS", "RELIGION", "COOKING", "ROMANCE",
+	        "HEALTH", "SELF-HELP", "HISTORY", "SCIENCE-NATURE", "HOME",
+	        "SCIENCE-FICTION", "HUMOR", "SPORTS", "LITERATURE", "MYSTERY" };
+
+
+	private class Split
+	{
+
+		public String left, right, leftUrl, rightUrl;
+
+		public Split(String l, String lUrl, String r, String rUrl)
+		{
+			left = l;
+			leftUrl = lUrl;
+			rightUrl = rUrl;
+			right = r;
+		}
+	}
+
+	/**
+	 * Simply selects the home view to render by returning its name.
+	 */
+	@RequestMapping( value = "/", method = RequestMethod.GET )
+	public String home(
+	        @RequestParam( value = "SHOPPING_ID", required = false ) Integer shoppingId,
+	        @RequestParam( value = "C_ID", required = false ) Integer customerId,
+	        Locale locale, HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(HomeController.class, request);
+	
+		String categoryUrl = getUrl1( shoppingId, customerId, "" );
+		
+		model.addAttribute( "promotional", service.getPromotional() );
+		model.addAttribute( "categories", prepareCategories( categoryUrl ) );
+
+		model.addAttribute( "categoryUrl", categoryUrl );
+
+
+		String productUrl = getProductUrl( shoppingId, customerId );
+		model.addAttribute( "productUrl", productUrl );
+		setupFrontend( model, shoppingId, customerId );
+
+		return "home";
+	}
+
+
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+	{
+		return getUrl1( shoppingId, customerId, "" );
+	}
+
+	// private String getCategoryUrl(Integer shoppingId, Integer customerId)
+	// {
+	// String url = "";
+	// if( shoppingId != null)
+	// url+="&SHOPPING_ID=" + shoppingId;
+	//
+	// if( customerId != null )
+	// url += "&C_ID=" + customerId;
+	//
+	// return url;
+	// }
+
+	private List<Split> prepareCategories(String url)
+	{
+		ArrayList<Split> cats = new ArrayList<Split>();
+
+		for ( int i = 0; i < categories.length; i += 2 )
+		{
+			cats.add( new Split( categories[i], categories[i] + url,
+			        categories[i + 1], categories[i + 1] + url ) );
+		}
+		return cats;
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/LoginController.java b/src/main/java/eu/cloudscale/showcase/servlets/LoginController.java
new file mode 100644
index 0000000..622dfe9
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/LoginController.java
@@ -0,0 +1,64 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.dao.ICustomerDao;
+import eu.cloudscale.showcase.db.model.ICustomer;
+
+@Controller
+@RequestMapping("/login")
+public class LoginController extends AController
+{
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request, HttpSession session, Model model)
+	{		
+		String referer = request.getParameter("next");
+		if( referer.isEmpty() )
+			referer = request.getHeader( "referer" );
+		
+		if( session.getAttribute( "customer" ) != null)
+			return "redirect:" + referer == null ? "/" : referer;
+		
+		model.addAttribute("referer", referer);
+		return "login";
+	}
+	
+	@RequestMapping(value="", method=RequestMethod.POST)
+	public String post(@RequestParam("username") String username, 
+						@RequestParam("password") String password,
+						@RequestParam("referer") String referer,
+						HttpSession session, Model model)
+	{
+		ICustomer customer = null;
+		
+		if( (customer = service.getUserBy(username, password)) != null )
+		{
+			Date currDate = new Date(); 
+			
+			
+			Calendar c = Calendar.getInstance();
+			c.setTime( currDate );
+			c.add( Calendar.HOUR, -1 );
+			
+			customer.setCLogin( currDate );
+			customer.setCExpiration( c.getTime() );
+			service.saveCustomer(customer);
+			session.setAttribute( "customer", customer );
+			return "redirect:" + referer;
+		}
+		
+		model.addAttribute("errors", "Login failed. Check username and password");
+		return "login";
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/NewProductsController.java b/src/main/java/eu/cloudscale/showcase/servlets/NewProductsController.java
new file mode 100644
index 0000000..0616cb2
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/NewProductsController.java
@@ -0,0 +1,76 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@Controller
+@RequestMapping( "/new-products" )
+public class NewProductsController extends AController
+{
+
+//	@RequestMapping( value = "/", method = RequestMethod.GET )
+//	public String newProducts(Locale locale, Model model)
+//	{
+//		return "new-products";
+//	}
+
+	@RequestMapping( value = "", method = RequestMethod.GET )
+	public String newProductsCategory(
+	        @RequestParam( value="SUBJECT", required=false) String category,
+	        @RequestParam( value="C_ID", required=false) Integer customerId,
+	        @RequestParam( value="SHOPPING_ID", required=false ) Integer shoppingId,
+	        Locale locale,
+	        HttpServletRequest request,
+	        Model model)
+	{
+		HttpSession session = super.getHttpSession(NewProductsController.class, request);
+		
+		return getNewProducts(category, model, customerId, shoppingId );
+	}
+	
+//	@RequestMapping( value = "/", method = RequestMethod.GET )
+//	public String newProducts(@PathVariable("category") String category, 
+//								@PathVariable("customerId") Integer customerId,
+//								Model model)
+//	{
+//		
+//		return getNewProducts( category, model, customerId, null);
+//	}
+//	
+//	@RequestMapping( value = "/{category}/{customerId}/{shoppingId}", method = RequestMethod.GET )
+//	public String newProducts(@PathVariable("category") String category, 
+//								@PathVariable("customerId") Integer customerId,
+//								@PathVariable("shoppingId") Integer shoppingId,
+//								Model model)
+//	{
+//		
+//		return getNewProducts( category, model, customerId, shoppingId);
+//	}
+
+	private String getNewProducts(String category, Model model, Integer customerId, Integer shoppingId)
+	{
+		
+		String productUrl = getProductUrl(shoppingId, customerId);
+		model.addAttribute( "productUrl", productUrl);
+		
+		model.addAttribute( "products", service.getNewProducts( category ) );
+		model.addAttribute( "promotional", service.getPromotional() );
+		
+		setupFrontend(model, shoppingId, customerId);
+		return "new-products";
+	}
+
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl1(shoppingId, customerId, "");
+    }
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/OrderDisplayController.java b/src/main/java/eu/cloudscale/showcase/servlets/OrderDisplayController.java
new file mode 100644
index 0000000..92cf341
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/OrderDisplayController.java
@@ -0,0 +1,92 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.model.ICustomer;
+import eu.cloudscale.showcase.db.model.IOrderLine;
+import eu.cloudscale.showcase.db.model.IOrders;
+
+@Controller
+@RequestMapping("/order-display")
+public class OrderDisplayController extends AController
+{
+	@SuppressWarnings( {"unchecked", "rawtypes" } )
+    @RequestMapping(method=RequestMethod.GET)
+	public String get(HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(OrderDisplayController.class, request);
+		
+		if( session == null )
+			session = request.getSession(true);
+		
+		Integer customerId = null;
+		try
+		{
+			customerId = Integer.parseInt( request.getParameter("C_ID") );
+		}
+		catch(Exception e) {}
+		
+		Integer shoppingId = null;
+		try
+		{
+			shoppingId = Integer.parseInt( request.getParameter("SHOPPING_ID") );
+		}
+		catch(Exception e) {}
+		
+		String uname = request.getParameter("username");
+		String passwd = request.getParameter("password");
+		
+		ArrayList<String> errors = new ArrayList<String>();
+		
+		IOrders order = null;
+		List<IOrderLine> orderLines = null;
+		
+		if (uname != null && passwd != null) 
+		{
+
+			ICustomer customer = service.getUserBy( uname, passwd);
+			
+			if (customer == null) 
+			{
+				errors.add( "Error: Incorrect password or username.\n" );
+			} 
+			else 
+			{
+				order = service.getMostRecentOrder( customer );
+				if (order == null)
+				{
+					errors.add("User doesn't have orders");
+				}
+				else 
+				{
+					orderLines = service.findAllOrderLineByOrder( order );
+				}
+			}
+
+		} 
+		else
+		{
+			errors.add("Error: TPCW_order_display_servlet, uname and passwd not set!.\n");
+		}
+		
+		if( errors.isEmpty() )
+		{
+			model.addAttribute( "order", order );
+			model.addAttribute( "orderLines", orderLines );
+		}
+		
+		model.addAttribute( "errors", errors);
+		
+		setupFrontend( model, shoppingId, customerId );
+		return "order-display";
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/OrderInquiryController.java b/src/main/java/eu/cloudscale/showcase/servlets/OrderInquiryController.java
new file mode 100644
index 0000000..e23dfaf
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/OrderInquiryController.java
@@ -0,0 +1,56 @@
+package eu.cloudscale.showcase.servlets;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@Controller
+@RequestMapping( "/order-inquiry" )
+public class OrderInquiryController extends AController
+{
+
+	@RequestMapping( method = RequestMethod.GET )
+	public String get(HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(OrderInquiryController.class, request);
+
+		if ( session == null )
+			session = request.getSession( true );
+
+		Integer C_ID = null;
+		try
+		{
+			C_ID = Integer.parseInt(request.getParameter( "C_ID" ));
+		}
+		catch(Exception e)
+		{
+		}
+		
+		Integer SHOPPING_ID = null;
+		try
+		{
+			SHOPPING_ID = Integer.parseInt(request.getParameter( "SHOPPING_ID" ));
+		}
+		catch(Exception e)
+		{
+		}
+
+		if ( C_ID != null )
+		{
+			model.addAttribute( "customerId", C_ID );
+		}
+
+		if ( SHOPPING_ID != null )
+		{
+			model.addAttribute( "shoppingId", SHOPPING_ID );
+		}
+
+		setupFrontend( model, SHOPPING_ID, C_ID );
+		return "order-inquiry";
+	}
+
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/PaymentController.java b/src/main/java/eu/cloudscale/showcase/servlets/PaymentController.java
new file mode 100644
index 0000000..295f2be
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/PaymentController.java
@@ -0,0 +1,190 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Future;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import eu.cloudscale.showcase.db.BuyConfirmResult;
+import eu.cloudscale.showcase.servlets.helpers.PaymentService;
+
+@Controller
+@RequestMapping( "/payment" )
+public class PaymentController extends AController
+{
+	
+	@Autowired
+	@Qualifier("paymentService")
+	PaymentService paymentService;
+	
+	static Future<String> paymentResult;
+
+	private static Map<String, String[]> redirectAttrsMap = new HashMap<String, String[]>();
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request,
+						Model model, RedirectAttributes redirectAttributes)
+	{
+		HttpSession session = super.getHttpSession(BuyConfirmController.class, request);
+		ArrayList<String> errors = new ArrayList<String>();
+	
+		redirectAttrsMap.putAll(request.getParameterMap());
+		
+		String shoppingIdString = request.getParameter( "SHOPPING_ID" );
+		Integer shoppingId = null;
+		if( shoppingIdString != null && !shoppingIdString.isEmpty() )
+		{
+			shoppingId = Integer.parseInt(  shoppingIdString );
+		}
+		
+		String customerIdString = request.getParameter( "C_ID" );
+		Integer customerId = null;
+		if( customerIdString != null && !customerIdString.isEmpty() )
+		{
+			customerId = Integer.parseInt(  customerIdString );
+		}
+		
+		String ccType = request.getParameter( "CC_TYPE" );
+		String ccNumber_str = request.getParameter( "CC_NUMBER" );
+		Long ccNumber = null;
+		if( !ccNumber_str.isEmpty() )
+			ccNumber = Long.parseLong( ccNumber_str );
+		
+		SimpleDateFormat sdf = new SimpleDateFormat("mm/dd/yyyy");
+		String ccName = request.getParameter( "CC_NAME" );
+		Date ccExpiry = null;
+        try
+        {
+	        ccExpiry = sdf.parse(request.getParameter( "CC_EXPIRY" ));
+        }
+        catch ( ParseException e )
+        {
+	        // TODO Auto-generated catch block
+	        e.printStackTrace();
+        }
+		String shipping = request.getParameter( "SHIPPING" );
+		String street1 = request.getParameter( "street1" );
+		
+		
+		BuyConfirmResult res = null;
+		if( street1 != null && street1.equals( "" ))
+		{
+			checkEmptiness(errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping);
+		}
+		else
+		{
+			String street2 = request.getParameter("street2");
+			String city = request.getParameter("city");
+			String state = request.getParameter( "state" );
+			String zip = request.getParameter("zip");
+			String country = request.getParameter("country");
+			checkEmptiness(errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping, street1, country, city, state, zip);
+		}
+		
+		String distribution = request.getParameter("distribution");
+		String attr1 = request.getParameter("attr1");
+		String attr2 = request.getParameter("attr2");
+		String attr3 = request.getParameter("attr3");
+		
+		if (distribution != null && (attr1 == null || attr2 == null || attr3 == null))
+		{
+			errors.add("You provided 'distribution' parameter but not 'attr1', 'attr2' or 'attr3'");
+		}
+		
+		if( distribution == null)
+		{
+			errors.add("You must provide 'distribution' parameter! See https://openstack.cloudscale.xlab.si/response-generator for more info.");
+		}
+		
+		model.addAttribute("errors", errors);
+		model.addAttribute("results", res);
+		setupFrontend( model, shoppingId, customerId );
+		
+		if( errors.isEmpty() )
+		{
+			paymentResult = paymentService.callPaymentService(distribution, attr1, attr2, attr3);
+		}
+		
+		return "payment";
+		
+	}
+	
+	@RequestMapping(value="/status")
+	@ResponseBody
+	public String getStatus(HttpServletRequest request,
+						Model model, RedirectAttributes redirectAttributes)
+	{
+		
+		if(paymentResult.isDone())
+		{
+			String url = "";
+			for(String key : redirectAttrsMap.keySet())
+			{
+				url += key +"=" + redirectAttrsMap.get(key)[0] + "&";
+			}			
+			return "buy-confirm?" + url.substring(0, url.length()-1);
+		}
+		return "WORKING";
+	}
+	
+	
+	
+	private void checkEmptiness(ArrayList<String> errors, Integer shoppingId,
+            Integer customerId, String ccType, Long ccNumber, String ccName,
+            Date ccExpiry, String shipping)
+    {
+		if(shoppingId == null)
+	    	errors.add( "Shipping id is null!" );
+	    if( customerId == null)
+	    	errors.add( "Customer id is null" );
+	    if( ccType == null || ccType.isEmpty() )
+	    	errors.add( "ccType is null" );
+	    if( ccNumber == null)
+	    	errors.add("ccNumber is null");
+	    if( ccName == null || ccName.isEmpty() )
+	    	errors.add( "ccName is null" );
+	    if( ccExpiry == null)
+	    	errors.add( "ccExpiry is null" );
+	    if( shipping == null || shipping.isEmpty() )
+	    	errors.add( "Shipping is null" );
+    }
+
+
+
+	private void checkEmptiness(ArrayList<String> errors, Integer shoppingId,
+            Integer customerId, String ccType, Long ccNumber, String ccName,
+            Date ccExpiry, String shipping, String street, String country, String city, String state, String zip)
+    {
+	    checkEmptiness( errors, shoppingId, customerId, ccType, ccNumber, ccName, ccExpiry, shipping );
+	    
+	    if( city == null )
+	    	errors.add( "City is null" );
+	    
+	    if( state == null )
+	    	errors.add( "State is null" );
+	    
+	    if( zip == null )
+	    	errors.add( "Zip is null" );
+	    
+	    if( street == null )
+	    	errors.add( "Street1 or street2 is null" );
+	    
+	    if( service.countryExist(country) )
+	    	errors.add( "That country doesn't exist!" );
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/ProductDetailServlet.java b/src/main/java/eu/cloudscale/showcase/servlets/ProductDetailServlet.java
new file mode 100644
index 0000000..31650a0
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/ProductDetailServlet.java
@@ -0,0 +1,66 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.Locale;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import eu.cloudscale.showcase.db.dao.IItemDao;
+import eu.cloudscale.showcase.db.model.IItem;
+
+@Controller
+@RequestMapping("/product-detail")
+public class ProductDetailServlet extends AController
+{
+	
+	@RequestMapping(method = RequestMethod.GET)
+	public String get(
+					@RequestParam(value= "I_ID", required=false) Integer itemId,
+					@RequestParam(value = "C_ID", required=false ) Integer customerId,
+					@RequestParam(value = "SHOPPING_ID", required=false) Integer shoppingId,
+					HttpServletRequest request,
+					Locale locale, 
+					Model model)
+	{
+		HttpSession session = super.getHttpSession(ProductDetailServlet.class, request);
+				
+
+		IItem item = service.findItemById(itemId);
+		
+		String addToShoppingCartUrl = buildAddToShoppingCartUrl(shoppingId, customerId, itemId);
+		model.addAttribute( "addToShoppingCartUrl", addToShoppingCartUrl);
+		
+		String adminUrl = buildAdminUrl(shoppingId, customerId, itemId);
+		model.addAttribute( "adminUrl", adminUrl );
+		
+		model.addAttribute( "item", item);
+		setupFrontend( model, shoppingId, customerId );
+		
+		return "product_detail";
+	}
+
+	private String buildAddToShoppingCartUrl(Integer shoppingId, Integer customerId, Integer itemId)
+    {
+		String url = getUrl2(shoppingId, customerId, "/shopping-cart");
+		if( url.equals( "/shopping-cart" ))
+			url += "?";
+		
+		url += "&I_ID=" + itemId + "&QTY=1&ADD_FLAG=Y";
+		return url;
+    }
+
+	private String buildAdminUrl(Integer shoppingId, Integer customerId, int id)
+    {
+	    return getUrl2(shoppingId, customerId, "/admin");
+    }
+
+	
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/SearchController.java b/src/main/java/eu/cloudscale/showcase/servlets/SearchController.java
new file mode 100644
index 0000000..dc2ec2b
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/SearchController.java
@@ -0,0 +1,83 @@
+package eu.cloudscale.showcase.servlets;
+
+import java.util.ArrayList;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.common.DatabaseHelper;
+
+@Controller
+@RequestMapping("/search")
+public class SearchController extends AController
+{
+	
+	@RequestMapping( method=RequestMethod.GET )
+	public String get(HttpServletRequest request, Model model)
+	{
+	
+		HttpSession session = super.getHttpSession(SearchController.class, request);
+		
+		String field = request.getParameter("searchField");
+		String keyword = request.getParameter( "keyword" );
+		ArrayList<String> errors = new ArrayList<String>();
+		
+		if( keyword == null)
+		{
+			keyword = "";
+			errors.add( "Search string is empty" );
+			model.addAttribute( "errors", errors );
+		}
+		
+		if( errors.isEmpty() )
+		{
+    		if( field.equalsIgnoreCase( "author" ))
+    		{
+    			model.addAttribute( "results", service.searchByAuthor(keyword) );
+    		}
+    		else if( field.equalsIgnoreCase( "title" ))
+    		{
+    			model.addAttribute( "results", service.searchByTitle(keyword) );
+    		}
+    		else if( field.equalsIgnoreCase( "subject" ))
+    		{
+    			model.addAttribute( "results", service.searchBySubject(keyword) );
+    		}
+		}
+		
+		model.addAttribute( "searchField", field );
+		model.addAttribute( "keyword", keyword );
+		setupUrls( model, request);
+		return "search";
+	}
+	
+	private void setupUrls(Model model, HttpServletRequest request)
+	{
+		Integer shoppingId = null;
+		if( request.getParameter( "SHOPPING_ID" ) != null)
+		{
+			shoppingId = Integer.valueOf(request.getParameter( "SHOPPING_ID" ));
+		}
+		
+		Integer customerId = null;
+		if( request.getParameter( "C_ID" ) != null)
+		{
+			shoppingId = Integer.valueOf(request.getParameter( "C_ID" ));
+		}
+		setupFrontend( model, shoppingId, customerId);
+		
+		String productUrl = getProductUrl(shoppingId, customerId);
+		model.addAttribute( "productUrl", productUrl);
+	}
+	
+
+	private String getProductUrl(Integer shoppingId, Integer customerId)
+    {
+	    return getUrl2(shoppingId, customerId, "");
+    }
+}
diff --git a/src/main/java/eu/cloudscale/showcase/servlets/ShoppingCartController.java b/src/main/java/eu/cloudscale/showcase/servlets/ShoppingCartController.java
new file mode 100644
index 0000000..59a0bff
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/servlets/ShoppingCartController.java
@@ -0,0 +1,129 @@
+package eu.cloudscale.showcase.servlets;
+
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import eu.cloudscale.showcase.db.dao.IShoppingCartDao;
+import eu.cloudscale.showcase.db.model.IShoppingCart;
+import eu.cloudscale.showcase.db.model.IShoppingCartLine;
+import eu.cloudscale.showcase.db.model.hibernate.ShoppingCart;
+
+@Controller
+@RequestMapping("/shopping-cart")
+public class ShoppingCartController extends AController
+{
+	
+	@RequestMapping(value="", method=RequestMethod.GET)
+	public String get(HttpServletRequest request, Model model)
+	{
+		HttpSession session = super.getHttpSession(ShoppingCartController.class, request);
+				
+		
+		ArrayList<String> errors = new ArrayList<String>();
+		Integer itemId = null;
+		Integer customerId = null;
+		Integer shoppingId = null;
+		if( request.getParameter( "I_ID" ) != null )
+		{
+			itemId = Integer.parseInt(request.getParameter( "I_ID" ));
+		}
+		
+		if( request.getParameter( "C_ID" ) != null )
+		{
+			customerId = Integer.parseInt(request.getParameter( "C_ID" ));
+		}
+		
+		if( request.getParameter( "SHOPPING_ID" ) != null )
+		{
+			shoppingId = Integer.parseInt(request.getParameter( "SHOPPING_ID" ));
+		}
+		
+
+		String addFlag = request.getParameter("ADD_FLAG");
+		IShoppingCart sc =  service.findShoppingCartById( shoppingId );
+		
+		if( shoppingId == null || sc == null )
+		{
+			sc =  service.createEmptyCart();
+			//System.out.println("Ustvarjam nov shoppingCart. ID = " + sc.getScId());
+		}
+		
+		if( addFlag != null && addFlag.equals( "Y" ) )
+		{
+			if(itemId == null)
+				errors.add("No item id!");
+		}
+		
+		if( errors.isEmpty() )
+		{
+    		List<Integer> quantities = new ArrayList<Integer>();
+    		List<Integer> ids = new ArrayList<Integer>();
+    		int i = 0;
+    		String curr_QTYstr = request.getParameter( "QTY_" + i ) ;
+    		String curr_I_IDstr = request.getParameter( "I_ID_" + i );
+    		
+    		while (curr_I_IDstr != null) 
+    		{
+    			ids.add(Integer.parseInt(curr_I_IDstr));
+    			quantities.add(Integer.parseInt((curr_QTYstr)));
+    			i++;
+    			curr_QTYstr = request.getParameter("QTY_" + i);
+    			curr_I_IDstr = request.getParameter("I_ID_" + i);
+    		}
+    		
+    		try
+    		{
+    			IShoppingCart cart = service.doCart(sc, itemId, ids, quantities);
+    			model.addAttribute( "cart", cart);
+    		}
+    		catch(Exception e)
+    		{
+    			System.out.println("[EXCEPTION] ShoppingCartController.java");
+    			System.out.println("ADD_FLAG = " + addFlag + ", itemId = " + itemId + ", customerId = " + customerId + ", shoppingId = " + shoppingId + ", sc = " + sc.getScId());
+    			e.printStackTrace();
+    			System.out.println("----------------------------------------------------------------------");
+    		}
+    		
+//    		model.addAttribute( "subTotal", getSubTotal(cart.getShoppingCartLines()));
+		
+    		String customerRegistration = getCustomerRegistrationURL(customerId, sc.getScId());
+    		model.addAttribute( "checkoutUrl", customerRegistration);
+		
+    		if( customerId != null )
+    			model.addAttribute("customerId", customerId);
+		}
+		
+		model.addAttribute("errors", errors);
+		setupFrontend(model, sc.getScId(), customerId);
+		return "shopping-cart";
+	}
+
+	private double getSubTotal(Set<IShoppingCartLine> shoppingCartLines)
+    {
+		double subtotal = 0;
+		for(IShoppingCartLine scl : shoppingCartLines)
+		{
+			subtotal += scl.getItem().getICost();
+		}
+		
+		return subtotal;
+    }
+
+
+	private String getCustomerRegistrationURL(Integer customerId, Integer shoppingId)
+    {
+		return getUrl2(shoppingId, customerId, "/customer-registration");
+    }	
+	
+}
diff --git a/src/main/java/eu/cloudscale/showcase/test/JDBCtest.java b/src/main/java/eu/cloudscale/showcase/test/JDBCtest.java
new file mode 100644
index 0000000..ced040f
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/test/JDBCtest.java
@@ -0,0 +1,34 @@
+package eu.cloudscale.showcase.test;
+
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import java.sql.Connection;
+
+
+public class JDBCtest
+{
+	public static void main(String args[])
+	{
+		try
+        {
+	        Class.forName("com.mysql.jdbc.Driver");
+			Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/tpcw?user=root&password=toor");
+			Statement statment = conn.createStatement();
+			long start = System.currentTimeMillis();
+			ResultSet resultSet = statment.executeQuery( "SELECT i_id, i_title, a_fname, a_lname , SUM(ol_qty) AS val FROM orders, order_line, item, author WHERE order_line.ol_o_id = orders.o_id AND item.i_id = order_line.ol_i_id AND item.i_subject = 'ARTS' AND item.i_a_id = author.a_id GROUP BY i_id ORDER BY orders.o_date, val DESC LIMIT 50" );
+			System.out.println(start-(System.currentTimeMillis())/1E9);
+        }
+        catch ( ClassNotFoundException e )
+        {
+	        e.printStackTrace();
+        }
+        catch ( SQLException e )
+        {
+	        // TODO Auto-generated catch block
+	        e.printStackTrace();
+        }
+	}
+}
diff --git a/src/main/java/eu/cloudscale/showcase/test/ProbabilityTest.java b/src/main/java/eu/cloudscale/showcase/test/ProbabilityTest.java
new file mode 100644
index 0000000..f3d305d
--- /dev/null
+++ b/src/main/java/eu/cloudscale/showcase/test/ProbabilityTest.java
@@ -0,0 +1,143 @@
+package eu.cloudscale.showcase.test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Random;
+
+public class ProbabilityTest 
+{
+	static int cumulativeProb = 0;
+	Random rand = new Random();
+	
+	ArrayList<Item> items = new ArrayList<Item>(){{
+			add(new Item("Home", 29)); 
+			add(new Item("New products", 11)); 
+			add(new Item("Best Sellers", 11));
+			add(new Item("Product Detail", 21)); 
+			add(new Item("Search Request", 12));
+			add(new Item("Search Results", 11)); 
+			add(new Item("Order", 5));
+			add(new Item("Shopping Cart", 2));
+			add(new Item("Customer Registration", 0.82));
+			add(new Item("Buy Request", 0.75));
+			add(new Item("Buy Confirm", 0.69));
+			add(new Item("Order Inquiry", 0.30));
+			add(new Item("Order Display", 0.25));
+			add(new Item("Admin Request", 0.10));
+			add(new Item("Admin Confirm", 0.09));
+	}};
+	
+	public ProbabilityTest()
+	{
+		items = this.transfromProbs();
+		for(Item item : items)
+		{
+			cumulativeProb = cumulativeProb + (int) item.probability;
+		}
+		
+	}
+	
+	public Item getRandom()
+	{
+		int index = rand.nextInt(cumulativeProb);
+		int sum=0;
+		int i=0;
+		while(sum < index)
+		{
+			sum = sum + (int) items.get(i++).probability;
+		}
+		return items.get(Math.max(0, i-1));
+	}
+	
+	private ArrayList<Item> createNewItemsArray() {
+		int sum = this.sumProbs();
+		ArrayList<Item> newItems = new ArrayList<Item>(sum);
+		for(Item item : items)
+		{
+			for(int i=0; i<item.probability; i++)
+			{
+				newItems.add(new Item(item.operation, item.probability));
+			}
+		}
+		return newItems;
+	}
+
+	private int sumProbs()
+	{
+		int sum = 0;
+		for(Item i : items)
+		{
+			sum+=i.probability;
+		}
+		
+		return sum;
+	}
+	
+	public Item generate()
+	{
+		Random random = new Random();
+		int p = random.nextInt(items.size());		
+		
+		return items.get(p);
+	}
+	
+	public ArrayList<Item> transfromProbs()
+	{
+		ArrayList<Item> newItems = new ArrayList<Item>();
+		
+		for(Item i : items)
+		{
+			newItems.add(new Item(i.operation, i.probability * 100));
+		}
+		
+		return newItems;
+	}
+	
+	public int maxProb()
+	{
+		int max=-1;
+		for(Item item : items)
+		{
+			if(item.probability > max )
+			{
+				max = (int) item.probability;
+			}
+		}
+		return max;
+	}
+	
+	public static void main(String[] args)
+	{
+		ProbabilityTest probTest = new ProbabilityTest();
+		
+		HashMap<String, Integer> probs = new HashMap<String, Integer>();
+		for( int i=0; i < 10000; i++)
+		{
+			Item generatedItem = probTest.getRandom();
+			if (!probs.containsKey(generatedItem.operation))
+			{
+				probs.put(generatedItem.operation, 1);
+			}
+			
+			probs.put(generatedItem.operation, probs.get(generatedItem.operation)+1);
+		}
+		
+		for (String operation : probs.keySet())
+		{
+			System.out.println(operation + " -> " + probs.get(operation) + " (" + ((probs.get(operation)*100)/10000.0) + "%)");
+		}
+		
+	}	
+}
+
+class Item
+{
+	String operation;
+	double probability;
+	
+	public Item(String operation, double probability)
+	{
+		this.operation = operation;
+		this.probability = probability;
+	}
+}
diff --git a/src/main/java/tresholds.java b/src/main/java/tresholds.java
new file mode 100644
index 0000000..8f1e736
--- /dev/null
+++ b/src/main/java/tresholds.java
@@ -0,0 +1,66 @@
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+
+
+
+public class tresholds
+{
+	static final int HOME_INTERACTION_ID = 0;
+	static final int BEST_SELLERS_INTERACTION_ID = 1;
+	static final int NEW_PRODUCTS_INTERACTION_ID = 2;
+	static final int PRODUCT_DETAIL_INTERACTION_ID = 3;
+	static final int SEARCH1_INTERACTION_ID = 4;
+	static final int SEARCH2_INTERACTION_ID = 5;
+	static final int SEARCH3_INTERACTION_ID = 6;
+	static final int SHOPPING_CART1_INTERACTION_ID = 7;
+	static final int SHOPPING_CART2_INTERACTION_ID = 8;
+	static final int BUY_INTERACTION_ID = 9;
+	static final int ORDER_INQUIRY_INTERACTION_ID = 10;
+	static final int BUY_CONFIRM_INTERACTION_ID = (Integer) null;
+
+	public static void main(String[] args)
+	{
+		HashMap<Integer, LinkedHashMap<Integer, Integer[]>> tresholds = new HashMap<Integer, LinkedHashMap<Integer, Integer[]>>();
+		
+		LinkedHashMap<Integer, Integer[]> homeMap = new LinkedHashMap<Integer, Integer[]>();
+		homeMap.put(9999, new Integer[] {SHOPPING_CART1_INTERACTION_ID, SHOPPING_CART2_INTERACTION_ID});
+		homeMap.put(9559, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		homeMap.put(7688, new Integer[] {ORDER_INQUIRY_INTERACTION_ID});
+		homeMap.put(7585, new Integer[] {NEW_PRODUCTS_INTERACTION_ID});
+		homeMap.put(3792, new Integer[] {BEST_SELLERS_INTERACTION_ID});
+		
+		LinkedHashMap<Integer, Integer[]> bestSellersMap = new LinkedHashMap<Integer, Integer[]>();
+		bestSellersMap.put(9999, new Integer[] {SHOPPING_CART1_INTERACTION_ID, SHOPPING_CART2_INTERACTION_ID});
+		bestSellersMap.put(9942, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		bestSellersMap.put(4607, new Integer[] {HOME_INTERACTION_ID});
+		
+		LinkedHashMap<Integer, Integer[]> buyConfirmMap = new LinkedHashMap<Integer, Integer[]>();
+		buyConfirmMap.put(9999, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		buyConfirmMap.put(342, new Integer[] {HOME_INTERACTION_ID});
+
+		LinkedHashMap<Integer, Integer[]> buyRequestMap = new LinkedHashMap<Integer, Integer[]>();
+		buyRequestMap.put(9999, new Integer[] {SHOPPING_CART1_INTERACTION_ID, SHOPPING_CART2_INTERACTION_ID});
+		buyRequestMap.put(9595, new Integer[] {HOME_INTERACTION_ID});
+		buyRequestMap.put(9199, new Integer[] {BUY_CONFIRM_INTERACTION_ID});
+				
+		LinkedHashMap<Integer, Integer[]> customerRegistrationMap = new LinkedHashMap<Integer, Integer[]>();
+		customerRegistrationMap.put(9999, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		customerRegistrationMap.put(9619, new Integer[] {HOME_INTERACTION_ID});
+		customerRegistrationMap.put(9145, new Integer[] {BUY_INTERACTION_ID});
+		
+		LinkedHashMap<Integer, Integer[]> newProductsMap = new LinkedHashMap<Integer, Integer[]>();
+		newProductsMap.put( 9999, new Integer[] {SHOPPING_CART1_INTERACTION_ID, SHOPPING_CART2_INTERACTION_ID});
+		newProductsMap.put(9941, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		newProductsMap.put(9867, new Integer[] {PRODUCT_DETAIL_INTERACTION_ID});
+		newProductsMap.put(299, new Integer[] {HOME_INTERACTION_ID});
+		
+		LinkedHashMap<Integer, Integer[]> orderDisplayMap = new LinkedHashMap<Integer, Integer[]>();
+		orderDisplayMap.put(9999, new Integer[] {SEARCH1_INTERACTION_ID, SEARCH2_INTERACTION_ID, SEARCH3_INTERACTION_ID});
+		orderDisplayMap.put(802, new Integer[] {HOME_INTERACTION_ID});
+		
+		
+		
+		tresholds.put(HOME_INTERACTION_ID, homeMap);
+	}
+}
diff --git a/src/main/resources/app.properties b/src/main/resources/app.properties
new file mode 100644
index 0000000..ff5fd0b
--- /dev/null
+++ b/src/main/resources/app.properties
@@ -0,0 +1,3 @@
+eu.cloudscale.files.url.css=https\://do8l4xp249hdy.cloudfront.net/css
+eu.cloudscale.files.url.img=https\://do8l4xp249hdy.cloudfront.net/img
+eu.cloudscale.files.url.js=https\://do8l4xp249hdy.cloudfront.net/js
diff --git a/src/main/resources/app-context.xml b/src/main/resources/app-context.xml
new file mode 100644
index 0000000..c3e9893
--- /dev/null
+++ b/src/main/resources/app-context.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:task="http://www.springframework.org/schema/task"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/context 
+			http://www.springframework.org/schema/context/spring-context.xsd
+			http://www.springframework.org/schema/task 
+			http://www.springframework.org/schema/task/spring-task-3.0.xsd">
+	
+   	<import resource="classpath:cache.xml" />
+	<import resource="classpath:hibernate.xml" />
+<!-- 	<import resource="classpath:hibernate.xml" /> -->
+	<import resource="classpath:servlet-context.xml" />
+	
+    <context:annotation-config /> 
+    <task:annotation-driven />  
+    <context:component-scan base-package="eu.cloudscale.showcase.generate" />
+    
+	<!-- These variables are replaced with ones defined in pom.xml -->
+</beans>
\ No newline at end of file
diff --git a/src/main/resources/cache.xml b/src/main/resources/cache.xml
new file mode 100644
index 0000000..1709a98
--- /dev/null
+++ b/src/main/resources/cache.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:cache="http://www.springframework.org/schema/cache"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:p="http://www.springframework.org/schema/p"
+	xsi:schemaLocation="
+			http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/cache
+			http://www.springframework.org/schema/cache/spring-cache.xsd">
+
+	<cache:annotation-driven />
+				
+	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
+		p:cache-manager-ref="ehcache" />
+	<bean id="ehcache"
+		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
+		p:cacheManagerName="myCacheManager" p:shared="true" p:config-location="classpath:ehcache.xml" />
+		
+</beans>
\ No newline at end of file
diff --git a/src/main/resources/database/database.aws.hibernate.properties b/src/main/resources/database/database.aws.hibernate.properties
new file mode 100644
index 0000000..2b6f02c
--- /dev/null
+++ b/src/main/resources/database/database.aws.hibernate.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mysql
+jdbc.driverClassName=com.mysql.jdbc.ReplicationDriver
+jdbc.url=jdbc:mysql:replication://master,slave1,slave2/tpcw?autoReconnect=true
+jdbc.username=root
+jdbc.password=password
+jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect
diff --git a/src/main/resources/database/database.aws.mongodb.properties b/src/main/resources/database/database.aws.mongodb.properties
new file mode 100644
index 0000000..5f2f6cd
--- /dev/null
+++ b/src/main/resources/database/database.aws.mongodb.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mongodb
+mongodb.dbname=tpcw_test
+mongodb.host=localhost
+mongodb.port=27017
+mongodb.username=tpcw
+mongodb.password=tpcw
diff --git a/src/main/resources/ehcache.xml b/src/main/resources/ehcache.xml
new file mode 100644
index 0000000..58ecc72
--- /dev/null
+++ b/src/main/resources/ehcache.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">    
+    <diskStore path="java.io.tmpdir/Cloudscale-cache"/>
+    <defaultCache 
+    	eternal="false" 
+    	maxElementsInMemory="100000"
+        overflowToDisk="false" 
+        diskPersistent="false" 
+        timeToIdleSeconds="0"
+        timeToLiveSeconds="600" 
+        memoryStoreEvictionPolicy="LRU"
+    />
+    
+    <cache 
+     	name="bestSellers"
+  		maxElementsInMemory="10000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+  		
+  	<cache 
+     	name="newProducts"
+  		maxElementsInMemory="10000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+  		
+  	<cache 
+     	name="search"
+  		maxElementsInMemory="10000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+    
+    <cache 
+     	name="org.hibernate.cache.spi.UpdateTimestampsCache"
+  		maxElementsInMemory="5000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/>
+   
+ 	<cache 
+ 		name="org.hibernate.cache.internal.StandardQueryCache"
+  		maxElementsInMemory="5000"
+  		eternal="false"
+  		timeToIdleSeconds="0"
+  		timeToLiveSeconds="86400"
+  		overflowToDisk="false"/> 
+</ehcache>
\ No newline at end of file
diff --git a/src/main/resources/generate/database.aws.hibernate.properties b/src/main/resources/generate/database.aws.hibernate.properties
new file mode 100644
index 0000000..4b2129e
--- /dev/null
+++ b/src/main/resources/generate/database.aws.hibernate.properties
@@ -0,0 +1,6 @@
+jdbc.dbtype=mysql
+jdbc.driverClassName=com.mysql.jdbc.Driver
+jdbc.url=jdbc:mysql://localhost/tpcw
+jdbc.username=root
+jdbc.password=password
+jdbc.hibernate.dialect=org.hibernate.dialect.MySQLDialect
diff --git a/src/main/resources/hibernate.xml b/src/main/resources/hibernate.xml
new file mode 100644
index 0000000..fb75fac
--- /dev/null
+++ b/src/main/resources/hibernate.xml
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:p="http://www.springframework.org/schema/p"
+	xmlns:tx="http://www.springframework.org/schema/tx"
+	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:cache="http://www.springframework.org/schema/cache"
+	xsi:schemaLocation="http://www.springframework.org/schema/jdbc 
+			http://www.springframework.org/schema/jdbc/spring-jdbc.xsd 
+			http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/tx 
+			http://www.springframework.org/schema/tx/spring-tx.xsd 
+			http://www.springframework.org/schema/context 
+			http://www.springframework.org/schema/context/spring-context.xsd
+			http://www.springframework.org/schema/cache
+			http://www.springframework.org/schema/cache/spring-cache.xsd">
+	
+		<context:property-placeholder 
+			location="classpath:database/database.aws.hibernate.properties" />
+	<context:component-scan base-package="eu.cloudscale.showcase.db.dao.hibernate" />
+	
+	<bean id="service" class="eu.cloudscale.showcase.db.services.HibernateService" />
+	
+	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
+		destroy-method="close">
+
+		<property name="driverClass" value="${jdbc.driverClassName}" />
+		<property name="jdbcUrl" value="${jdbc.url}" />
+		<property name="user" value="${jdbc.username}" />
+		<property name="password" value="${jdbc.password}" />
+		<!-- these are C3P0 properties -->
+		<property name="acquireIncrement" value="1" />
+		<property name="minPoolSize" value="4" />
+<!--		<property name="maxPoolSize" value="${connection_pool_size}" /> -->
+		<property name="maxPoolSize" value="${connection_pool_size}"/> 
+<!-- 		<property name="maxIdleTime" value="30" /> -->
+<!-- 		<property name="maxConnectionAge" value="180" /> -->
+		<!-- <property name="debugUnreturnedConnectionStackTraces" value="true" 
+			/> -->
+		<property name="initialPoolSize" value="4" />
+<!-- 		<property name="idleConnectionTestPeriod" value="5" /> -->
+<!-- 		<property name="checkoutTimeout" value="60000" /> -->
+<!-- 		<property name="maxIdleTimeExcessConnections" value="30" /> -->
+<!-- 		<property name="unreturnedConnectionTimeout" value="60" /> -->
+<!-- 		<property name="debugUnreturnedConnectionStackTraces" value="true" /> -->
+		<!-- <property name="automaticTestTable" value="conTest" /> -->
+<!-- 		<property name="testConnectionOnCheckin" value="true" /> -->
+<!-- 		<property name="testConnectionOnCheckout" value="true" /> -->
+	</bean>
+
+	<tx:annotation-driven transaction-manager="transactionManager" />
+
+	<bean id="sessionFactory"
+		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
+		<property name="dataSource" ref="dataSource" />
+		
+		<property name="packagesToScan" value="eu.cloudscale.showcase.db.dao" />
+		<property name="hibernateProperties">
+			<props>
+<!-- 				<prop key="hibernate.hbm2ddl.auto">create</prop> -->
+<!-- 				<prop key="hibernate.jdbc.batch_size">50</prop> -->
+				<prop key="hibernate.show_sql">false</prop>
+				<prop key="hibernate.dialect">${jdbc.hibernate.dialect}</prop>
+<!-- 				<prop key="hibernate.max_fetch_depth">4</prop> -->
+				<!-- <prop key="hibernate.connection.release_mode">after_statement</prop> -->
+				<prop key="hibernate.cache.use_second_level_cache">true</prop>
+				<prop key="hibernate.cache.use_query_cache">true</prop>
+				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
+				<prop key="hibernate.cache.provider_configuration_file_resource_path">classpath:ehcache.xml</prop>
+<!-- 				<prop key="hibernate.generate_statistics">true</prop> -->
+			</props>
+		</property>
+		<property name="annotatedClasses">
+			<list>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Address</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Author</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.CcXacts</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Country</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Customer</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.Item</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.OrderLine</value>
+				<!-- <value>eu.cloudscale.showcase.db.model.rbms.CcXactsId</value> -->
+				<value>eu.cloudscale.showcase.db.model.hibernate.Orders</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.ShoppingCart
+				</value>
+				<value>eu.cloudscale.showcase.db.model.hibernate.ShoppingCartLine
+				</value>
+			</list>
+		</property>
+	</bean>
+	<bean id="transactionManager"
+		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
+		<property name="sessionFactory" ref="sessionFactory" />
+	</bean>
+</beans>
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
new file mode 100644
index 0000000..21d09a8
--- /dev/null
+++ b/src/main/resources/log4j.properties
@@ -0,0 +1,8 @@
+log4j.rootCategory=ERROR, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%n
+log4j.category.org.springframework.beans.factory=ERROR
+log4j.logger.eu.cloudscale.showcase.servlets=ERROR
+log4j.logger.com.mchange=INFO
+log4j.cy.org.springframework.data.document.mongodb=DEBUG
diff --git a/src/main/resources/logging.properties b/src/main/resources/logging.properties
new file mode 100644
index 0000000..cc8af99
--- /dev/null
+++ b/src/main/resources/logging.properties
@@ -0,0 +1,2 @@
+org.apache.catalina.core.ContainerBase.[Catalina].level = INFO
+org.apache.catalina.core.ContainerBase.[Catalina].handlers = java.util.logging.ConsoleHandler
\ No newline at end of file
diff --git a/src/main/resources/mongodb.xml b/src/main/resources/mongodb.xml
new file mode 100644
index 0000000..30cd791
--- /dev/null
+++ b/src/main/resources/mongodb.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xmlns:context="http://www.springframework.org/schema/context"
+	xmlns:mongo="http://www.springframework.org/schema/data/mongo"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans 
+			http://www.springframework.org/schema/beans/spring-beans.xsd 
+			http://www.springframework.org/schema/context 
+			http://www.springframework.org/schema/context/spring-context.xsd
+			http://www.springframework.org/schema/data/mongo
+			http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">
+	
+    
+	
+    <context:annotation-config /> 
+	<!-- More information: http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/mongo.core.html -->
+	<context:property-placeholder
+		location="classpath:database/database.aws.mongodb.properties" />
+	
+	<context:component-scan base-package="eu.cloudscale.showcase.db.dao.mongo.impl" />
+<!-- 	<context:component-scan base-package="eu.cloudscale.showcase.db.services" /> -->
+<!-- 	<context:component-scan base-package="eu.cloudscale.showcase.db.model.mongo" /> -->
+	
+	
+	<mongo:mongo host="${mongodb.host}" port="${mongodb.port}" >
+		<mongo:options connections-per-host="${connection_pool_size}"
+                   	connect-timeout="30000"
+		/>
+	</mongo:mongo>
+
+	<mongo:db-factory dbname="${mongodb.dbname}" username="${mongodb.username}" password="${mongodb.password}" mongo-ref="mongo" />
+
+	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
+		<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
+	</bean>
+	<bean id="service" class="eu.cloudscale.showcase.db.services.MongoService">
+	</bean>
+</beans>
\ No newline at end of file
diff --git a/src/main/resources/servlet-context.xml b/src/main/resources/servlet-context.xml
new file mode 100644
index 0000000..29131b6
--- /dev/null
+++ b/src/main/resources/servlet-context.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/mvc"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+
+	<!-- DispatcherServlet Context: defines this servlet's request-processing 
+		infrastructure -->
+
+	<!-- Enables the Spring MVC @Controller programming model -->
+	<annotation-driven />
+
+	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
+		up static resources in the ${webappRoot}/resources directory -->
+	<resources mapping="/resources/**" location="/resources/" />
+
+	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
+		in the /WEB-INF/views directory -->
+	<beans:bean id="templateResolver"
+		class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="suffix" value=".html" />
+		<beans:property name="templateMode" value="HTML5" />
+	</beans:bean>
+
+	<beans:bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
+		<beans:property name="templateResolver" ref="templateResolver" />
+		<beans:property name="additionalDialects">
+			<beans:set>
+				<beans:bean class="nz.net.ultraq.thymeleaf.LayoutDialect" />
+			</beans:set>
+		</beans:property>
+	</beans:bean>
+
+	<beans:bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
+		<beans:property name="templateEngine" ref="templateEngine" />
+		<beans:property name="order" value="1" />
+	</beans:bean>
+
+	<beans:bean
+		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="order" value="2" />
+		<beans:property name="suffix" value=".html" />
+	</beans:bean>
+
+	<context:component-scan base-package="eu.cloudscale.showcase.servlets" />
+
+</beans:beans>
diff --git a/src/main/webapp/resources/css/bootstrap.css b/src/main/webapp/resources/css/bootstrap.css
new file mode 100644
index 0000000..2f56af3
--- /dev/null
+++ b/src/main/webapp/resources/css/bootstrap.css
@@ -0,0 +1,6158 @@
+/*!
+ * Bootstrap v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+
+audio:not([controls]) {
+  display: none;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+a:hover,
+a:active {
+  outline: 0;
+}
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+img {
+  width: auto\9;
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+
+#map_canvas img,
+.google-maps img {
+  max-width: none;
+}
+
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+
+label,
+select,
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+input[type="radio"],
+input[type="checkbox"] {
+  cursor: pointer;
+}
+
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+
+@media print {
+  * {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !important;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  .ir a:after,
+  a[href^="javascript:"]:after,
+  a[href^="#"]:after {
+    content: "";
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  @page  {
+    margin: 0.5cm;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+}
+
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  background-color: #ffffff;
+}
+
+a {
+  color: #0088cc;
+  text-decoration: none;
+}
+
+a:hover,
+a:focus {
+  color: #005580;
+  text-decoration: underline;
+}
+
+.img-rounded {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+.img-circle {
+  -webkit-border-radius: 500px;
+     -moz-border-radius: 500px;
+          border-radius: 500px;
+}
+
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+
+.row:before,
+.row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row:after {
+  clear: both;
+}
+
+[class*="span"] {
+  float: left;
+  min-height: 1px;
+  margin-left: 20px;
+}
+
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.span12 {
+  width: 940px;
+}
+
+.span11 {
+  width: 860px;
+}
+
+.span10 {
+  width: 780px;
+}
+
+.span9 {
+  width: 700px;
+}
+
+.span8 {
+  width: 620px;
+}
+
+.span7 {
+  width: 540px;
+}
+
+.span6 {
+  width: 460px;
+}
+
+.span5 {
+  width: 380px;
+}
+
+.span4 {
+  width: 300px;
+}
+
+.span3 {
+  width: 220px;
+}
+
+.span2 {
+  width: 140px;
+}
+
+.span1 {
+  width: 60px;
+}
+
+.offset12 {
+  margin-left: 980px;
+}
+
+.offset11 {
+  margin-left: 900px;
+}
+
+.offset10 {
+  margin-left: 820px;
+}
+
+.offset9 {
+  margin-left: 740px;
+}
+
+.offset8 {
+  margin-left: 660px;
+}
+
+.offset7 {
+  margin-left: 580px;
+}
+
+.offset6 {
+  margin-left: 500px;
+}
+
+.offset5 {
+  margin-left: 420px;
+}
+
+.offset4 {
+  margin-left: 340px;
+}
+
+.offset3 {
+  margin-left: 260px;
+}
+
+.offset2 {
+  margin-left: 180px;
+}
+
+.offset1 {
+  margin-left: 100px;
+}
+
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row-fluid:after {
+  clear: both;
+}
+
+.row-fluid [class*="span"] {
+  display: block;
+  float: left;
+  width: 100%;
+  min-height: 30px;
+  margin-left: 2.127659574468085%;
+  *margin-left: 2.074468085106383%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+
+.row-fluid .controls-row [class*="span"] + [class*="span"] {
+  margin-left: 2.127659574468085%;
+}
+
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680851063829%;
+}
+
+.row-fluid .span11 {
+  width: 91.48936170212765%;
+  *width: 91.43617021276594%;
+}
+
+.row-fluid .span10 {
+  width: 82.97872340425532%;
+  *width: 82.92553191489361%;
+}
+
+.row-fluid .span9 {
+  width: 74.46808510638297%;
+  *width: 74.41489361702126%;
+}
+
+.row-fluid .span8 {
+  width: 65.95744680851064%;
+  *width: 65.90425531914893%;
+}
+
+.row-fluid .span7 {
+  width: 57.44680851063829%;
+  *width: 57.39361702127659%;
+}
+
+.row-fluid .span6 {
+  width: 48.93617021276595%;
+  *width: 48.88297872340425%;
+}
+
+.row-fluid .span5 {
+  width: 40.42553191489362%;
+  *width: 40.37234042553192%;
+}
+
+.row-fluid .span4 {
+  width: 31.914893617021278%;
+  *width: 31.861702127659576%;
+}
+
+.row-fluid .span3 {
+  width: 23.404255319148934%;
+  *width: 23.351063829787233%;
+}
+
+.row-fluid .span2 {
+  width: 14.893617021276595%;
+  *width: 14.840425531914894%;
+}
+
+.row-fluid .span1 {
+  width: 6.382978723404255%;
+  *width: 6.329787234042553%;
+}
+
+.row-fluid .offset12 {
+  margin-left: 104.25531914893617%;
+  *margin-left: 104.14893617021275%;
+}
+
+.row-fluid .offset12:first-child {
+  margin-left: 102.12765957446808%;
+  *margin-left: 102.02127659574467%;
+}
+
+.row-fluid .offset11 {
+  margin-left: 95.74468085106382%;
+  *margin-left: 95.6382978723404%;
+}
+
+.row-fluid .offset11:first-child {
+  margin-left: 93.61702127659574%;
+  *margin-left: 93.51063829787232%;
+}
+
+.row-fluid .offset10 {
+  margin-left: 87.23404255319149%;
+  *margin-left: 87.12765957446807%;
+}
+
+.row-fluid .offset10:first-child {
+  margin-left: 85.1063829787234%;
+  *margin-left: 84.99999999999999%;
+}
+
+.row-fluid .offset9 {
+  margin-left: 78.72340425531914%;
+  *margin-left: 78.61702127659572%;
+}
+
+.row-fluid .offset9:first-child {
+  margin-left: 76.59574468085106%;
+  *margin-left: 76.48936170212764%;
+}
+
+.row-fluid .offset8 {
+  margin-left: 70.2127659574468%;
+  *margin-left: 70.10638297872339%;
+}
+
+.row-fluid .offset8:first-child {
+  margin-left: 68.08510638297872%;
+  *margin-left: 67.9787234042553%;
+}
+
+.row-fluid .offset7 {
+  margin-left: 61.70212765957446%;
+  *margin-left: 61.59574468085106%;
+}
+
+.row-fluid .offset7:first-child {
+  margin-left: 59.574468085106375%;
+  *margin-left: 59.46808510638297%;
+}
+
+.row-fluid .offset6 {
+  margin-left: 53.191489361702125%;
+  *margin-left: 53.085106382978715%;
+}
+
+.row-fluid .offset6:first-child {
+  margin-left: 51.063829787234035%;
+  *margin-left: 50.95744680851063%;
+}
+
+.row-fluid .offset5 {
+  margin-left: 44.68085106382979%;
+  *margin-left: 44.57446808510638%;
+}
+
+.row-fluid .offset5:first-child {
+  margin-left: 42.5531914893617%;
+  *margin-left: 42.4468085106383%;
+}
+
+.row-fluid .offset4 {
+  margin-left: 36.170212765957444%;
+  *margin-left: 36.06382978723405%;
+}
+
+.row-fluid .offset4:first-child {
+  margin-left: 34.04255319148936%;
+  *margin-left: 33.93617021276596%;
+}
+
+.row-fluid .offset3 {
+  margin-left: 27.659574468085104%;
+  *margin-left: 27.5531914893617%;
+}
+
+.row-fluid .offset3:first-child {
+  margin-left: 25.53191489361702%;
+  *margin-left: 25.425531914893618%;
+}
+
+.row-fluid .offset2 {
+  margin-left: 19.148936170212764%;
+  *margin-left: 19.04255319148936%;
+}
+
+.row-fluid .offset2:first-child {
+  margin-left: 17.02127659574468%;
+  *margin-left: 16.914893617021278%;
+}
+
+.row-fluid .offset1 {
+  margin-left: 10.638297872340425%;
+  *margin-left: 10.53191489361702%;
+}
+
+.row-fluid .offset1:first-child {
+  margin-left: 8.51063829787234%;
+  *margin-left: 8.404255319148938%;
+}
+
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+
+.container:before,
+.container:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container:after {
+  clear: both;
+}
+
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container-fluid:after {
+  clear: both;
+}
+
+p {
+  margin: 0 0 10px;
+}
+
+.lead {
+  margin-bottom: 20px;
+  font-size: 21px;
+  font-weight: 200;
+  line-height: 30px;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong {
+  font-weight: bold;
+}
+
+em {
+  font-style: italic;
+}
+
+cite {
+  font-style: normal;
+}
+
+.muted {
+  color: #999999;
+}
+
+a.muted:hover,
+a.muted:focus {
+  color: #808080;
+}
+
+.text-warning {
+  color: #c09853;
+}
+
+a.text-warning:hover,
+a.text-warning:focus {
+  color: #a47e3c;
+}
+
+.text-error {
+  color: #b94a48;
+}
+
+a.text-error:hover,
+a.text-error:focus {
+  color: #953b39;
+}
+
+.text-info {
+  color: #3a87ad;
+}
+
+a.text-info:hover,
+a.text-info:focus {
+  color: #2d6987;
+}
+
+.text-success {
+  color: #468847;
+}
+
+a.text-success:hover,
+a.text-success:focus {
+  color: #356635;
+}
+
+.text-left {
+  text-align: left;
+}
+
+.text-right {
+  text-align: right;
+}
+
+.text-center {
+  text-align: center;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 10px 0;
+  font-family: inherit;
+  font-weight: bold;
+  line-height: 20px;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  line-height: 1;
+  color: #999999;
+}
+
+h1,
+h2,
+h3 {
+  line-height: 40px;
+}
+
+h1 {
+  font-size: 38.5px;
+}
+
+h2 {
+  font-size: 31.5px;
+}
+
+h3 {
+  font-size: 24.5px;
+}
+
+h4 {
+  font-size: 17.5px;
+}
+
+h5 {
+  font-size: 14px;
+}
+
+h6 {
+  font-size: 11.9px;
+}
+
+h1 small {
+  font-size: 24.5px;
+}
+
+h2 small {
+  font-size: 17.5px;
+}
+
+h3 small {
+  font-size: 14px;
+}
+
+h4 small {
+  font-size: 14px;
+}
+
+.page-header {
+  padding-bottom: 9px;
+  margin: 20px 0 30px;
+  border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 10px 25px;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+
+li {
+  line-height: 20px;
+}
+
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+ul.inline,
+ol.inline {
+  margin-left: 0;
+  list-style: none;
+}
+
+ul.inline > li,
+ol.inline > li {
+  display: inline-block;
+  *display: inline;
+  padding-right: 5px;
+  padding-left: 5px;
+  *zoom: 1;
+}
+
+dl {
+  margin-bottom: 20px;
+}
+
+dt,
+dd {
+  line-height: 20px;
+}
+
+dt {
+  font-weight: bold;
+}
+
+dd {
+  margin-left: 10px;
+}
+
+.dl-horizontal {
+  *zoom: 1;
+}
+
+.dl-horizontal:before,
+.dl-horizontal:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.dl-horizontal:after {
+  clear: both;
+}
+
+.dl-horizontal dt {
+  float: left;
+  width: 160px;
+  overflow: hidden;
+  clear: left;
+  text-align: right;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.dl-horizontal dd {
+  margin-left: 180px;
+}
+
+hr {
+  margin: 20px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #999999;
+}
+
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 20px;
+  border-left: 5px solid #eeeeee;
+}
+
+blockquote p {
+  margin-bottom: 0;
+  font-size: 17.5px;
+  font-weight: 300;
+  line-height: 1.25;
+}
+
+blockquote small {
+  display: block;
+  line-height: 20px;
+  color: #999999;
+}
+
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+
+blockquote.pull-right small:before {
+  content: '';
+}
+
+blockquote.pull-right small:after {
+  content: '\00A0 \2014';
+}
+
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+address {
+  display: block;
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 20px;
+}
+
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+code {
+  padding: 2px 4px;
+  color: #d14;
+  white-space: nowrap;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 20px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+pre.prettyprint {
+  margin-bottom: 20px;
+}
+
+pre code {
+  padding: 0;
+  color: inherit;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border: 0;
+}
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+
+form {
+  margin: 0 0 20px;
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: 40px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+
+legend small {
+  font-size: 15px;
+  color: #999999;
+}
+
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+}
+
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: 20px;
+  padding: 4px 6px;
+  margin-bottom: 10px;
+  font-size: 14px;
+  line-height: 20px;
+  color: #555555;
+  vertical-align: middle;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+input,
+textarea,
+.uneditable-input {
+  width: 206px;
+}
+
+textarea {
+  height: auto;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+          transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  *margin-top: 0;
+  line-height: normal;
+}
+
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto;
+}
+
+select,
+input[type="file"] {
+  height: 30px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 30px;
+}
+
+select {
+  width: 220px;
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+}
+
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.uneditable-input,
+.uneditable-textarea {
+  color: #999999;
+  cursor: not-allowed;
+  background-color: #fcfcfc;
+  border-color: #cccccc;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+  color: #999999;
+}
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+  color: #999999;
+}
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+  color: #999999;
+}
+
+.radio,
+.checkbox {
+  min-height: 20px;
+  padding-left: 20px;
+}
+
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -20px;
+}
+
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+
+.input-mini {
+  width: 60px;
+}
+
+.input-small {
+  width: 90px;
+}
+
+.input-medium {
+  width: 150px;
+}
+
+.input-large {
+  width: 210px;
+}
+
+.input-xlarge {
+  width: 270px;
+}
+
+.input-xxlarge {
+  width: 530px;
+}
+
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+
+.controls-row [class*="span"] + [class*="span"] {
+  margin-left: 20px;
+}
+
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+  width: 926px;
+}
+
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+  width: 846px;
+}
+
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+  width: 766px;
+}
+
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+  width: 686px;
+}
+
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+  width: 606px;
+}
+
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+  width: 526px;
+}
+
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+  width: 446px;
+}
+
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+  width: 366px;
+}
+
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+  width: 286px;
+}
+
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+  width: 206px;
+}
+
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+  width: 126px;
+}
+
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+  width: 46px;
+}
+
+.controls-row {
+  *zoom: 1;
+}
+
+.controls-row:before,
+.controls-row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.controls-row:after {
+  clear: both;
+}
+
+.controls-row [class*="span"],
+.row-fluid .controls-row [class*="span"] {
+  float: left;
+}
+
+.controls-row .checkbox[class*="span"],
+.controls-row .radio[class*="span"] {
+  padding-top: 5px;
+}
+
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+
+.control-group.warning .control-label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+}
+
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  border-color: #c09853;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+
+.control-group.error .control-label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+}
+
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  border-color: #b94a48;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+
+.control-group.success .control-label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+}
+
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  border-color: #468847;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+
+.control-group.info .control-label,
+.control-group.info .help-block,
+.control-group.info .help-inline {
+  color: #3a87ad;
+}
+
+.control-group.info .checkbox,
+.control-group.info .radio,
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  color: #3a87ad;
+}
+
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  border-color: #3a87ad;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.info input:focus,
+.control-group.info select:focus,
+.control-group.info textarea:focus {
+  border-color: #2d6987;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+}
+
+.control-group.info .input-prepend .add-on,
+.control-group.info .input-append .add-on {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #3a87ad;
+}
+
+input:focus:invalid,
+textarea:focus:invalid,
+select:focus:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+
+input:focus:invalid:focus,
+textarea:focus:invalid:focus,
+select:focus:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+     -moz-box-shadow: 0 0 6px #f8b9b7;
+          box-shadow: 0 0 6px #f8b9b7;
+}
+
+.form-actions {
+  padding: 19px 20px 20px;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #e5e5e5;
+  *zoom: 1;
+}
+
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-actions:after {
+  clear: both;
+}
+
+.help-block,
+.help-inline {
+  color: #595959;
+}
+
+.help-block {
+  display: block;
+  margin-bottom: 10px;
+}
+
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  padding-left: 5px;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.input-append,
+.input-prepend {
+  display: inline-block;
+  margin-bottom: 10px;
+  font-size: 0;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input,
+.input-append .dropdown-menu,
+.input-prepend .dropdown-menu,
+.input-append .popover,
+.input-prepend .popover {
+  font-size: 14px;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  vertical-align: top;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+  z-index: 2;
+}
+
+.input-append .add-on,
+.input-prepend .add-on {
+  display: inline-block;
+  width: auto;
+  height: 20px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+}
+
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn,
+.input-append .btn-group > .dropdown-toggle,
+.input-prepend .btn-group > .dropdown-toggle {
+  vertical-align: top;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-append .active,
+.input-prepend .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-append input + .btn-group .btn:last-child,
+.input-append select + .btn-group .btn:last-child,
+.input-append .uneditable-input + .btn-group .btn:last-child {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-append .add-on,
+.input-append .btn,
+.input-append .btn-group {
+  margin-left: -1px;
+}
+
+.input-append .add-on:last-child,
+.input-append .btn:last-child,
+.input-append .btn-group:last-child > .dropdown-toggle {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-prepend.input-append input + .btn-group .btn,
+.input-prepend.input-append select + .btn-group .btn,
+.input-prepend.input-append .uneditable-input + .btn-group .btn {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .btn-group:first-child {
+  margin-left: 0;
+}
+
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+/* Allow for input prepend/append in search forms */
+
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.form-search .input-append .search-query {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search .input-append .btn {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .btn {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+
+.control-group {
+  margin-bottom: 10px;
+}
+
+legend + .control-group {
+  margin-top: 20px;
+  -webkit-margin-top-collapse: separate;
+}
+
+.form-horizontal .control-group {
+  margin-bottom: 20px;
+  *zoom: 1;
+}
+
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-horizontal .control-group:after {
+  clear: both;
+}
+
+.form-horizontal .control-label {
+  float: left;
+  width: 160px;
+  padding-top: 5px;
+  text-align: right;
+}
+
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 180px;
+  *margin-left: 0;
+}
+
+.form-horizontal .controls:first-child {
+  *padding-left: 180px;
+}
+
+.form-horizontal .help-block {
+  margin-bottom: 0;
+}
+
+.form-horizontal input + .help-block,
+.form-horizontal select + .help-block,
+.form-horizontal textarea + .help-block,
+.form-horizontal .uneditable-input + .help-block,
+.form-horizontal .input-prepend + .help-block,
+.form-horizontal .input-append + .help-block {
+  margin-top: 10px;
+}
+
+.form-horizontal .form-actions {
+  padding-left: 180px;
+}
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+.table {
+  width: 100%;
+  margin-bottom: 20px;
+}
+
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 20px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+
+.table th {
+  font-weight: bold;
+}
+
+.table thead th {
+  vertical-align: bottom;
+}
+
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+
+.table .table {
+  background-color: #ffffff;
+}
+
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapse;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table-bordered thead:first-child tr:first-child > th:first-child,
+.table-bordered tbody:first-child tr:first-child > td:first-child,
+.table-bordered tbody:first-child tr:first-child > th:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered thead:first-child tr:first-child > th:last-child,
+.table-bordered tbody:first-child tr:first-child > td:last-child,
+.table-bordered tbody:first-child tr:first-child > th:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:first-child,
+.table-bordered tbody:last-child tr:last-child > td:first-child,
+.table-bordered tbody:last-child tr:last-child > th:first-child,
+.table-bordered tfoot:last-child tr:last-child > td:first-child,
+.table-bordered tfoot:last-child tr:last-child > th:first-child {
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:last-child,
+.table-bordered tbody:last-child tr:last-child > td:last-child,
+.table-bordered tbody:last-child tr:last-child > th:last-child,
+.table-bordered tfoot:last-child tr:last-child > td:last-child,
+.table-bordered tfoot:last-child tr:last-child > th:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
+  -webkit-border-bottom-left-radius: 0;
+          border-bottom-left-radius: 0;
+  -moz-border-radius-bottomleft: 0;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 0;
+          border-bottom-right-radius: 0;
+  -moz-border-radius-bottomright: 0;
+}
+
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-striped tbody > tr:nth-child(odd) > td,
+.table-striped tbody > tr:nth-child(odd) > th {
+  background-color: #f9f9f9;
+}
+
+.table-hover tbody tr:hover > td,
+.table-hover tbody tr:hover > th {
+  background-color: #f5f5f5;
+}
+
+table td[class*="span"],
+table th[class*="span"],
+.row-fluid table td[class*="span"],
+.row-fluid table th[class*="span"] {
+  display: table-cell;
+  float: none;
+  margin-left: 0;
+}
+
+.table td.span1,
+.table th.span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+
+.table td.span2,
+.table th.span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+
+.table td.span3,
+.table th.span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+
+.table td.span4,
+.table th.span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+
+.table td.span5,
+.table th.span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+
+.table td.span6,
+.table th.span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+
+.table td.span7,
+.table th.span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+
+.table td.span8,
+.table th.span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+
+.table td.span9,
+.table th.span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+
+.table td.span10,
+.table th.span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+
+.table td.span11,
+.table th.span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+
+.table td.span12,
+.table th.span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+
+.table tbody tr.success > td {
+  background-color: #dff0d8;
+}
+
+.table tbody tr.error > td {
+  background-color: #f2dede;
+}
+
+.table tbody tr.warning > td {
+  background-color: #fcf8e3;
+}
+
+.table tbody tr.info > td {
+  background-color: #d9edf7;
+}
+
+.table-hover tbody tr.success:hover > td {
+  background-color: #d0e9c6;
+}
+
+.table-hover tbody tr.error:hover > td {
+  background-color: #ebcccc;
+}
+
+.table-hover tbody tr.warning:hover > td {
+  background-color: #faf2cc;
+}
+
+.table-hover tbody tr.info:hover > td {
+  background-color: #c4e3f3;
+}
+
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  margin-top: 1px;
+  *margin-right: .3em;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+}
+
+/* White icons with optional class, or on hover/focus/active states of certain elements */
+
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:focus > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > li > a:focus > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:focus > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"],
+.dropdown-submenu:focus > a > [class*=" icon-"] {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+
+.icon-glass {
+  background-position: 0      0;
+}
+
+.icon-music {
+  background-position: -24px 0;
+}
+
+.icon-search {
+  background-position: -48px 0;
+}
+
+.icon-envelope {
+  background-position: -72px 0;
+}
+
+.icon-heart {
+  background-position: -96px 0;
+}
+
+.icon-star {
+  background-position: -120px 0;
+}
+
+.icon-star-empty {
+  background-position: -144px 0;
+}
+
+.icon-user {
+  background-position: -168px 0;
+}
+
+.icon-film {
+  background-position: -192px 0;
+}
+
+.icon-th-large {
+  background-position: -216px 0;
+}
+
+.icon-th {
+  background-position: -240px 0;
+}
+
+.icon-th-list {
+  background-position: -264px 0;
+}
+
+.icon-ok {
+  background-position: -288px 0;
+}
+
+.icon-remove {
+  background-position: -312px 0;
+}
+
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+
+.icon-off {
+  background-position: -384px 0;
+}
+
+.icon-signal {
+  background-position: -408px 0;
+}
+
+.icon-cog {
+  background-position: -432px 0;
+}
+
+.icon-trash {
+  background-position: -456px 0;
+}
+
+.icon-home {
+  background-position: 0 -24px;
+}
+
+.icon-file {
+  background-position: -24px -24px;
+}
+
+.icon-time {
+  background-position: -48px -24px;
+}
+
+.icon-road {
+  background-position: -72px -24px;
+}
+
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+
+.icon-download {
+  background-position: -120px -24px;
+}
+
+.icon-upload {
+  background-position: -144px -24px;
+}
+
+.icon-inbox {
+  background-position: -168px -24px;
+}
+
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+
+.icon-repeat {
+  background-position: -216px -24px;
+}
+
+.icon-refresh {
+  background-position: -240px -24px;
+}
+
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+
+.icon-lock {
+  background-position: -287px -24px;
+}
+
+.icon-flag {
+  background-position: -312px -24px;
+}
+
+.icon-headphones {
+  background-position: -336px -24px;
+}
+
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+
+.icon-barcode {
+  background-position: -456px -24px;
+}
+
+.icon-tag {
+  background-position: 0 -48px;
+}
+
+.icon-tags {
+  background-position: -25px -48px;
+}
+
+.icon-book {
+  background-position: -48px -48px;
+}
+
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+
+.icon-print {
+  background-position: -96px -48px;
+}
+
+.icon-camera {
+  background-position: -120px -48px;
+}
+
+.icon-font {
+  background-position: -144px -48px;
+}
+
+.icon-bold {
+  background-position: -167px -48px;
+}
+
+.icon-italic {
+  background-position: -192px -48px;
+}
+
+.icon-text-height {
+  background-position: -216px -48px;
+}
+
+.icon-text-width {
+  background-position: -240px -48px;
+}
+
+.icon-align-left {
+  background-position: -264px -48px;
+}
+
+.icon-align-center {
+  background-position: -288px -48px;
+}
+
+.icon-align-right {
+  background-position: -312px -48px;
+}
+
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+
+.icon-list {
+  background-position: -360px -48px;
+}
+
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+
+.icon-picture {
+  background-position: -456px -48px;
+}
+
+.icon-pencil {
+  background-position: 0 -72px;
+}
+
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+
+.icon-adjust {
+  background-position: -48px -72px;
+}
+
+.icon-tint {
+  background-position: -72px -72px;
+}
+
+.icon-edit {
+  background-position: -96px -72px;
+}
+
+.icon-share {
+  background-position: -120px -72px;
+}
+
+.icon-check {
+  background-position: -144px -72px;
+}
+
+.icon-move {
+  background-position: -168px -72px;
+}
+
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+
+.icon-backward {
+  background-position: -240px -72px;
+}
+
+.icon-play {
+  background-position: -264px -72px;
+}
+
+.icon-pause {
+  background-position: -288px -72px;
+}
+
+.icon-stop {
+  background-position: -312px -72px;
+}
+
+.icon-forward {
+  background-position: -336px -72px;
+}
+
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+
+.icon-eject {
+  background-position: -408px -72px;
+}
+
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+
+.icon-plus {
+  background-position: -408px -96px;
+}
+
+.icon-minus {
+  background-position: -433px -96px;
+}
+
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+
+.icon-gift {
+  background-position: -24px -120px;
+}
+
+.icon-leaf {
+  background-position: -48px -120px;
+}
+
+.icon-fire {
+  background-position: -72px -120px;
+}
+
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+
+.icon-plane {
+  background-position: -168px -120px;
+}
+
+.icon-calendar {
+  background-position: -192px -120px;
+}
+
+.icon-random {
+  width: 16px;
+  background-position: -216px -120px;
+}
+
+.icon-comment {
+  background-position: -240px -120px;
+}
+
+.icon-magnet {
+  background-position: -264px -120px;
+}
+
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+
+.icon-retweet {
+  background-position: -336px -120px;
+}
+
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+
+.icon-folder-close {
+  width: 16px;
+  background-position: -384px -120px;
+}
+
+.icon-folder-open {
+  width: 16px;
+  background-position: -408px -120px;
+}
+
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+
+.icon-hdd {
+  background-position: 0 -144px;
+}
+
+.icon-bullhorn {
+  background-position: -24px -144px;
+}
+
+.icon-bell {
+  background-position: -48px -144px;
+}
+
+.icon-certificate {
+  background-position: -72px -144px;
+}
+
+.icon-thumbs-up {
+  background-position: -96px -144px;
+}
+
+.icon-thumbs-down {
+  background-position: -120px -144px;
+}
+
+.icon-hand-right {
+  background-position: -144px -144px;
+}
+
+.icon-hand-left {
+  background-position: -168px -144px;
+}
+
+.icon-hand-up {
+  background-position: -192px -144px;
+}
+
+.icon-hand-down {
+  background-position: -216px -144px;
+}
+
+.icon-circle-arrow-right {
+  background-position: -240px -144px;
+}
+
+.icon-circle-arrow-left {
+  background-position: -264px -144px;
+}
+
+.icon-circle-arrow-up {
+  background-position: -288px -144px;
+}
+
+.icon-circle-arrow-down {
+  background-position: -312px -144px;
+}
+
+.icon-globe {
+  background-position: -336px -144px;
+}
+
+.icon-wrench {
+  background-position: -360px -144px;
+}
+
+.icon-tasks {
+  background-position: -384px -144px;
+}
+
+.icon-filter {
+  background-position: -408px -144px;
+}
+
+.icon-briefcase {
+  background-position: -432px -144px;
+}
+
+.icon-fullscreen {
+  background-position: -456px -144px;
+}
+
+.dropup,
+.dropdown {
+  position: relative;
+}
+
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #000000;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+}
+
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 20px;
+  color: #333333;
+  white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus,
+.dropdown-submenu:hover > a,
+.dropdown-submenu:focus > a {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  outline: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #999999;
+}
+
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.open {
+  *z-index: 1000;
+}
+
+.open > .dropdown-menu {
+  display: block;
+}
+
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #000000;
+  content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+
+.dropdown-submenu {
+  position: relative;
+}
+
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+     -moz-border-radius: 0 6px 6px 6px;
+          border-radius: 0 6px 6px 6px;
+}
+
+.dropdown-submenu:hover > .dropdown-menu {
+  display: block;
+}
+
+.dropup .dropdown-submenu > .dropdown-menu {
+  top: auto;
+  bottom: 0;
+  margin-top: 0;
+  margin-bottom: -2px;
+  -webkit-border-radius: 5px 5px 5px 0;
+     -moz-border-radius: 5px 5px 5px 0;
+          border-radius: 5px 5px 5px 0;
+}
+
+.dropdown-submenu > a:after {
+  display: block;
+  float: right;
+  width: 0;
+  height: 0;
+  margin-top: 5px;
+  margin-right: -10px;
+  border-color: transparent;
+  border-left-color: #cccccc;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  content: " ";
+}
+
+.dropdown-submenu:hover > a:after {
+  border-left-color: #ffffff;
+}
+
+.dropdown-submenu.pull-left {
+  float: none;
+}
+
+.dropdown-submenu.pull-left > .dropdown-menu {
+  left: -100%;
+  margin-left: 10px;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.dropdown .dropdown-menu .nav-header {
+  padding-right: 20px;
+  padding-left: 20px;
+}
+
+.typeahead {
+  z-index: 1051;
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+     -moz-transition: opacity 0.15s linear;
+       -o-transition: opacity 0.15s linear;
+          transition: opacity 0.15s linear;
+}
+
+.fade.in {
+  opacity: 1;
+}
+
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition: height 0.35s ease;
+     -moz-transition: height 0.35s ease;
+       -o-transition: height 0.35s ease;
+          transition: height 0.35s ease;
+}
+
+.collapse.in {
+  height: auto;
+}
+
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+
+.close:hover,
+.close:focus {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+
+.btn {
+  display: inline-block;
+  *display: inline;
+  padding: 4px 12px;
+  margin-bottom: 0;
+  *margin-left: .3em;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  cursor: pointer;
+  background-color: #f5f5f5;
+  *background-color: #e6e6e6;
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  border: 1px solid #cccccc;
+  *border: 0;
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border-bottom-color: #b3b3b3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn:hover,
+.btn:focus,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  color: #333333;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+}
+
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+
+.btn:first-child {
+  *margin-left: 0;
+}
+
+.btn:hover,
+.btn:focus {
+  color: #333333;
+  text-decoration: none;
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+     -moz-transition: background-position 0.1s linear;
+       -o-transition: background-position 0.1s linear;
+          transition: background-position 0.1s linear;
+}
+
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.btn.active,
+.btn:active {
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-large {
+  padding: 11px 19px;
+  font-size: 17.5px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.btn-large [class^="icon-"],
+.btn-large [class*=" icon-"] {
+  margin-top: 4px;
+}
+
+.btn-small {
+  padding: 2px 10px;
+  font-size: 11.9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.btn-small [class^="icon-"],
+.btn-small [class*=" icon-"] {
+  margin-top: 0;
+}
+
+.btn-mini [class^="icon-"],
+.btn-mini [class*=" icon-"] {
+  margin-top: -1px;
+}
+
+.btn-mini {
+  padding: 0 6px;
+  font-size: 10.5px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+.btn-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #006dcc;
+  *background-color: #0044cc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  color: #ffffff;
+  background-color: #0044cc;
+  *background-color: #003bb3;
+}
+
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #003399 \9;
+}
+
+.btn-warning {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #faa732;
+  *background-color: #f89406;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  color: #ffffff;
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+
+.btn-danger {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #da4f49;
+  *background-color: #bd362f;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  color: #ffffff;
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+
+.btn-success {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #5bb75b;
+  *background-color: #51a351;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(to bottom, #62c462, #51a351);
+  background-repeat: repeat-x;
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  color: #ffffff;
+  background-color: #51a351;
+  *background-color: #499249;
+}
+
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+
+.btn-info {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #49afcd;
+  *background-color: #2f96b4;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  color: #ffffff;
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+
+.btn-inverse {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #363636;
+  *background-color: #222222;
+  background-image: -moz-linear-gradient(top, #444444, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+  background-image: -webkit-linear-gradient(top, #444444, #222222);
+  background-image: -o-linear-gradient(top, #444444, #222222);
+  background-image: linear-gradient(to bottom, #444444, #222222);
+  background-repeat: repeat-x;
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-inverse:hover,
+.btn-inverse:focus,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  color: #ffffff;
+  background-color: #222222;
+  *background-color: #151515;
+}
+
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #080808 \9;
+}
+
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link[disabled] {
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-link {
+  color: #0088cc;
+  cursor: pointer;
+  border-color: transparent;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-link:hover,
+.btn-link:focus {
+  color: #005580;
+  text-decoration: underline;
+  background-color: transparent;
+}
+
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus {
+  color: #333333;
+  text-decoration: none;
+}
+
+.btn-group {
+  position: relative;
+  display: inline-block;
+  *display: inline;
+  *margin-left: .3em;
+  font-size: 0;
+  white-space: nowrap;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.btn-group:first-child {
+  *margin-left: 0;
+}
+
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-toolbar {
+  margin-top: 10px;
+  margin-bottom: 10px;
+  font-size: 0;
+}
+
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-group > .btn {
+  position: relative;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+
+.btn-group > .btn,
+.btn-group > .dropdown-menu,
+.btn-group > .popover {
+  font-size: 14px;
+}
+
+.btn-group > .btn-mini {
+  font-size: 10.5px;
+}
+
+.btn-group > .btn-small {
+  font-size: 11.9px;
+}
+
+.btn-group > .btn-large {
+  font-size: 17.5px;
+}
+
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+  *padding-top: 5px;
+  padding-right: 8px;
+  *padding-bottom: 5px;
+  padding-left: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group > .btn-mini + .dropdown-toggle {
+  *padding-top: 2px;
+  padding-right: 5px;
+  *padding-bottom: 2px;
+  padding-left: 5px;
+}
+
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+
+.btn-group > .btn-large + .dropdown-toggle {
+  *padding-top: 7px;
+  padding-right: 12px;
+  *padding-bottom: 7px;
+  padding-left: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #e6e6e6;
+}
+
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #0044cc;
+}
+
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #222222;
+}
+
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+
+.btn-large .caret {
+  margin-top: 6px;
+}
+
+.btn-large .caret {
+  border-top-width: 5px;
+  border-right-width: 5px;
+  border-left-width: 5px;
+}
+
+.btn-mini .caret,
+.btn-small .caret {
+  margin-top: 8px;
+}
+
+.dropup .btn-large .caret {
+  border-bottom-width: 5px;
+}
+
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.btn-group-vertical {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-group-vertical > .btn {
+  display: block;
+  float: none;
+  max-width: 100%;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group-vertical > .btn + .btn {
+  margin-top: -1px;
+  margin-left: 0;
+}
+
+.btn-group-vertical > .btn:first-child {
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.btn-group-vertical > .btn:last-child {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.btn-group-vertical > .btn-large:first-child {
+  -webkit-border-radius: 6px 6px 0 0;
+     -moz-border-radius: 6px 6px 0 0;
+          border-radius: 6px 6px 0 0;
+}
+
+.btn-group-vertical > .btn-large:last-child {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 20px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.alert,
+.alert h4 {
+  color: #c09853;
+}
+
+.alert h4 {
+  margin: 0;
+}
+
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 20px;
+}
+
+.alert-success {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+
+.alert-success h4 {
+  color: #468847;
+}
+
+.alert-danger,
+.alert-error {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #eed3d7;
+}
+
+.alert-danger h4,
+.alert-error h4 {
+  color: #b94a48;
+}
+
+.alert-info {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+
+.alert-info h4 {
+  color: #3a87ad;
+}
+
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+
+.alert-block p + p {
+  margin-top: 5px;
+}
+
+.nav {
+  margin-bottom: 20px;
+  margin-left: 0;
+  list-style: none;
+}
+
+.nav > li > a {
+  display: block;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+
+.nav > li > a > img {
+  max-width: none;
+}
+
+.nav > .pull-right {
+  float: right;
+}
+
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+
+.nav-list {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-bottom: 0;
+}
+
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-right: -15px;
+  margin-left: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+
+.nav-list > .active > a,
+.nav-list > .active > a:hover,
+.nav-list > .active > a:focus {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #0088cc;
+}
+
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+  margin-right: 2px;
+}
+
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 20px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover,
+.nav-tabs > li > a:focus {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover,
+.nav-tabs > .active > a:focus {
+  color: #555555;
+  cursor: default;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover,
+.nav-pills > .active > a:focus {
+  color: #ffffff;
+  background-color: #0088cc;
+}
+
+.nav-stacked > li {
+  float: none;
+}
+
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li > a:hover,
+.nav-tabs.nav-stacked > li > a:focus {
+  z-index: 2;
+  border-color: #ddd;
+}
+
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.nav .dropdown-toggle .caret {
+  margin-top: 6px;
+  border-top-color: #0088cc;
+  border-bottom-color: #0088cc;
+}
+
+.nav .dropdown-toggle:hover .caret,
+.nav .dropdown-toggle:focus .caret {
+  border-top-color: #005580;
+  border-bottom-color: #005580;
+}
+
+/* move down carets for tabs */
+
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.nav > .dropdown.active > a:hover,
+.nav > .dropdown.active > a:focus {
+  cursor: pointer;
+}
+
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover,
+.nav > li.dropdown.open.active > a:focus {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret,
+.nav li.dropdown.open a:focus .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+
+.tabs-stacked .open > a:hover,
+.tabs-stacked .open > a:focus {
+  border-color: #999999;
+}
+
+.tabbable {
+  *zoom: 1;
+}
+
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.tabbable:after {
+  clear: both;
+}
+
+.tab-content {
+  overflow: auto;
+}
+
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.tabs-below > .nav-tabs > li > a:hover,
+.tabs-below > .nav-tabs > li > a:focus {
+  border-top-color: #ddd;
+  border-bottom-color: transparent;
+}
+
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover,
+.tabs-below > .nav-tabs > .active > a:focus {
+  border-color: transparent #ddd #ddd #ddd;
+}
+
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.tabs-left > .nav-tabs > li > a:hover,
+.tabs-left > .nav-tabs > li > a:focus {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover,
+.tabs-left > .nav-tabs .active > a:focus {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.tabs-right > .nav-tabs > li > a:hover,
+.tabs-right > .nav-tabs > li > a:focus {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover,
+.tabs-right > .nav-tabs .active > a:focus {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+
+.nav > .disabled > a {
+  color: #999999;
+}
+
+.nav > .disabled > a:hover,
+.nav > .disabled > a:focus {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.navbar {
+  *position: relative;
+  *z-index: 2;
+  margin-bottom: 20px;
+  overflow: visible;
+}
+
+.navbar-inner {
+  min-height: 40px;
+  padding-right: 20px;
+  padding-left: 20px;
+  background-color: #fafafa;
+  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
+  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+  background-repeat: repeat-x;
+  border: 1px solid #d4d4d4;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+
+.navbar-inner:before,
+.navbar-inner:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-inner:after {
+  clear: both;
+}
+
+.navbar .container {
+  width: auto;
+}
+
+.nav-collapse.collapse {
+  height: auto;
+  overflow: visible;
+}
+
+.navbar .brand {
+  display: block;
+  float: left;
+  padding: 10px 20px 10px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  color: #777777;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .brand:hover,
+.navbar .brand:focus {
+  text-decoration: none;
+}
+
+.navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+  color: #777777;
+}
+
+.navbar-link {
+  color: #777777;
+}
+
+.navbar-link:hover,
+.navbar-link:focus {
+  color: #333333;
+}
+
+.navbar .divider-vertical {
+  height: 40px;
+  margin: 0 9px;
+  border-right: 1px solid #ffffff;
+  border-left: 1px solid #f2f2f2;
+}
+
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 5px;
+}
+
+.navbar .btn-group .btn,
+.navbar .input-prepend .btn,
+.navbar .input-append .btn,
+.navbar .input-prepend .btn-group,
+.navbar .input-append .btn-group {
+  margin-top: 0;
+}
+
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-form:after {
+  clear: both;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+  display: inline-block;
+  margin-bottom: 0;
+}
+
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 5px;
+  white-space: nowrap;
+}
+
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+
+.navbar-search .search-query {
+  padding: 4px 14px;
+  margin-bottom: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.navbar-static-top {
+  position: static;
+  margin-bottom: 0;
+}
+
+.navbar-static-top .navbar-inner {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  border-width: 1px 0 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.navbar-fixed-top {
+  top: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+
+.navbar .nav.pull-right {
+  float: right;
+  margin-right: 0;
+}
+
+.navbar .nav > li {
+  float: left;
+}
+
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 15px 10px;
+  color: #777777;
+  text-decoration: none;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: transparent;
+}
+
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: #555555;
+  text-decoration: none;
+  background-color: #e5e5e5;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-right: 5px;
+  margin-left: 5px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #ededed;
+  *background-color: #e5e5e5;
+  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
+  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
+  background-repeat: repeat-x;
+  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:focus,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #e5e5e5;
+  *background-color: #d9d9d9;
+}
+
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #cccccc \9;
+}
+
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+     -moz-border-radius: 1px;
+          border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+
+.navbar .nav > li > .dropdown-menu:before {
+  position: absolute;
+  top: -7px;
+  left: 9px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.navbar .nav > li > .dropdown-menu:after {
+  position: absolute;
+  top: -6px;
+  left: 10px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+  top: auto;
+  bottom: -7px;
+  border-top: 7px solid #ccc;
+  border-bottom: 0;
+  border-top-color: rgba(0, 0, 0, 0.2);
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+  top: auto;
+  bottom: -6px;
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+}
+
+.navbar .nav li.dropdown > a:hover .caret,
+.navbar .nav li.dropdown > a:focus .caret {
+  border-top-color: #333333;
+  border-bottom-color: #333333;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #555555;
+  background-color: #e5e5e5;
+}
+
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #777777;
+  border-bottom-color: #777777;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+  right: 12px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+  right: 13px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+  right: 100%;
+  left: auto;
+  margin-right: -1px;
+  margin-left: 0;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.navbar-inverse .navbar-inner {
+  background-color: #1b1b1b;
+  background-image: -moz-linear-gradient(top, #222222, #111111);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+  background-image: -webkit-linear-gradient(top, #222222, #111111);
+  background-image: -o-linear-gradient(top, #222222, #111111);
+  background-image: linear-gradient(to bottom, #222222, #111111);
+  background-repeat: repeat-x;
+  border-color: #252525;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+}
+
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+  color: #999999;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover,
+.navbar-inverse .brand:focus,
+.navbar-inverse .nav > li > a:focus {
+  color: #ffffff;
+}
+
+.navbar-inverse .brand {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-text {
+  color: #999999;
+}
+
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+  background-color: transparent;
+}
+
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .navbar-link {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-link:hover,
+.navbar-inverse .navbar-link:focus {
+  color: #ffffff;
+}
+
+.navbar-inverse .divider-vertical {
+  border-right-color: #222222;
+  border-left-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown > a:hover .caret,
+.navbar-inverse .nav li.dropdown > a:focus .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #999999;
+  border-bottom-color: #999999;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .navbar-search .search-query {
+  color: #ffffff;
+  background-color: #515151;
+  border-color: #111111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  -webkit-transition: none;
+     -moz-transition: none;
+       -o-transition: none;
+          transition: none;
+}
+
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+  padding: 5px 15px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  outline: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+.navbar-inverse .btn-navbar {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e0e0e;
+  *background-color: #040404;
+  background-image: -moz-linear-gradient(top, #151515, #040404);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+  background-image: -webkit-linear-gradient(top, #151515, #040404);
+  background-image: -o-linear-gradient(top, #151515, #040404);
+  background-image: linear-gradient(to bottom, #151515, #040404);
+  background-repeat: repeat-x;
+  border-color: #040404 #040404 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:focus,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #040404;
+  *background-color: #000000;
+}
+
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+  background-color: #000000 \9;
+}
+
+.breadcrumb {
+  padding: 8px 15px;
+  margin: 0 0 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.breadcrumb > li {
+  display: inline-block;
+  *display: inline;
+  text-shadow: 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+
+.breadcrumb > li > .divider {
+  padding: 0 5px;
+  color: #ccc;
+}
+
+.breadcrumb > .active {
+  color: #999999;
+}
+
+.pagination {
+  margin: 20px 0;
+}
+
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  margin-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.pagination ul > li {
+  display: inline;
+}
+
+.pagination ul > li > a,
+.pagination ul > li > span {
+  float: left;
+  padding: 4px 12px;
+  line-height: 20px;
+  text-decoration: none;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-left-width: 0;
+}
+
+.pagination ul > li > a:hover,
+.pagination ul > li > a:focus,
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  background-color: #f5f5f5;
+}
+
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  color: #999999;
+  cursor: default;
+}
+
+.pagination ul > .disabled > span,
+.pagination ul > .disabled > a,
+.pagination ul > .disabled > a:hover,
+.pagination ul > .disabled > a:focus {
+  color: #999999;
+  cursor: default;
+  background-color: transparent;
+}
+
+.pagination ul > li:first-child > a,
+.pagination ul > li:first-child > span {
+  border-left-width: 1px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.pagination ul > li:last-child > a,
+.pagination ul > li:last-child > span {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.pagination-centered {
+  text-align: center;
+}
+
+.pagination-right {
+  text-align: right;
+}
+
+.pagination-large ul > li > a,
+.pagination-large ul > li > span {
+  padding: 11px 19px;
+  font-size: 17.5px;
+}
+
+.pagination-large ul > li:first-child > a,
+.pagination-large ul > li:first-child > span {
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.pagination-large ul > li:last-child > a,
+.pagination-large ul > li:last-child > span {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.pagination-mini ul > li:first-child > a,
+.pagination-small ul > li:first-child > a,
+.pagination-mini ul > li:first-child > span,
+.pagination-small ul > li:first-child > span {
+  -webkit-border-bottom-left-radius: 3px;
+          border-bottom-left-radius: 3px;
+  -webkit-border-top-left-radius: 3px;
+          border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -moz-border-radius-topleft: 3px;
+}
+
+.pagination-mini ul > li:last-child > a,
+.pagination-small ul > li:last-child > a,
+.pagination-mini ul > li:last-child > span,
+.pagination-small ul > li:last-child > span {
+  -webkit-border-top-right-radius: 3px;
+          border-top-right-radius: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+          border-bottom-right-radius: 3px;
+  -moz-border-radius-topright: 3px;
+  -moz-border-radius-bottomright: 3px;
+}
+
+.pagination-small ul > li > a,
+.pagination-small ul > li > span {
+  padding: 2px 10px;
+  font-size: 11.9px;
+}
+
+.pagination-mini ul > li > a,
+.pagination-mini ul > li > span {
+  padding: 0 6px;
+  font-size: 10.5px;
+}
+
+.pager {
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+  *zoom: 1;
+}
+
+.pager:before,
+.pager:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.pager:after {
+  clear: both;
+}
+
+.pager li {
+  display: inline;
+}
+
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #999999;
+  cursor: default;
+  background-color: #fff;
+}
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+
+.modal-backdrop.fade {
+  opacity: 0;
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.modal {
+  position: fixed;
+  top: 10%;
+  left: 50%;
+  z-index: 1050;
+  width: 560px;
+  margin-left: -280px;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  outline: none;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding-box;
+          background-clip: padding-box;
+}
+
+.modal.fade {
+  top: -25%;
+  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
+     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
+       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
+          transition: opacity 0.3s linear, top 0.3s ease-out;
+}
+
+.modal.fade.in {
+  top: 10%;
+}
+
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+
+.modal-header .close {
+  margin-top: 2px;
+}
+
+.modal-header h3 {
+  margin: 0;
+  line-height: 30px;
+}
+
+.modal-body {
+  position: relative;
+  max-height: 400px;
+  padding: 15px;
+  overflow-y: auto;
+}
+
+.modal-form {
+  margin-bottom: 0;
+}
+
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+     -moz-box-shadow: inset 0 1px 0 #ffffff;
+          box-shadow: inset 0 1px 0 #ffffff;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.modal-footer:after {
+  clear: both;
+}
+
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  font-size: 11px;
+  line-height: 1.4;
+  opacity: 0;
+  filter: alpha(opacity=0);
+  visibility: visible;
+}
+
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.tooltip.top {
+  padding: 5px 0;
+  margin-top: -3px;
+}
+
+.tooltip.right {
+  padding: 0 5px;
+  margin-left: 3px;
+}
+
+.tooltip.bottom {
+  padding: 5px 0;
+  margin-top: 3px;
+}
+
+.tooltip.left {
+  padding: 0 5px;
+  margin-left: -3px;
+}
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-top-color: #000000;
+  border-width: 5px 5px 0;
+}
+
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-right-color: #000000;
+  border-width: 5px 5px 5px 0;
+}
+
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-left-color: #000000;
+  border-width: 5px 0 5px 5px;
+}
+
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-bottom-color: #000000;
+  border-width: 0 5px 5px;
+}
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  text-align: left;
+  white-space: normal;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.popover.top {
+  margin-top: -10px;
+}
+
+.popover.right {
+  margin-left: 10px;
+}
+
+.popover.bottom {
+  margin-top: 10px;
+}
+
+.popover.left {
+  margin-left: -10px;
+}
+
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  -webkit-border-radius: 5px 5px 0 0;
+     -moz-border-radius: 5px 5px 0 0;
+          border-radius: 5px 5px 0 0;
+}
+
+.popover-title:empty {
+  display: none;
+}
+
+.popover-content {
+  padding: 9px 14px;
+}
+
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.popover .arrow {
+  border-width: 11px;
+}
+
+.popover .arrow:after {
+  border-width: 10px;
+  content: "";
+}
+
+.popover.top .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  border-bottom-width: 0;
+}
+
+.popover.top .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  border-top-color: #ffffff;
+  border-bottom-width: 0;
+}
+
+.popover.right .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, 0.25);
+  border-left-width: 0;
+}
+
+.popover.right .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  border-right-color: #ffffff;
+  border-left-width: 0;
+}
+
+.popover.bottom .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  border-top-width: 0;
+}
+
+.popover.bottom .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  border-bottom-color: #ffffff;
+  border-top-width: 0;
+}
+
+.popover.left .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, 0.25);
+  border-right-width: 0;
+}
+
+.popover.left .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  border-left-color: #ffffff;
+  border-right-width: 0;
+}
+
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.thumbnails:after {
+  clear: both;
+}
+
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+
+.thumbnails > li {
+  float: left;
+  margin-bottom: 20px;
+  margin-left: 20px;
+}
+
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 20px;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -webkit-transition: all 0.2s ease-in-out;
+     -moz-transition: all 0.2s ease-in-out;
+       -o-transition: all 0.2s ease-in-out;
+          transition: all 0.2s ease-in-out;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus {
+  border-color: #0088cc;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.thumbnail .caption {
+  padding: 9px;
+  color: #555555;
+}
+
+.media,
+.media-body {
+  overflow: hidden;
+  *overflow: visible;
+  zoom: 1;
+}
+
+.media,
+.media .media {
+  margin-top: 15px;
+}
+
+.media:first-child {
+  margin-top: 0;
+}
+
+.media-object {
+  display: block;
+}
+
+.media-heading {
+  margin: 0 0 5px;
+}
+
+.media > .pull-left {
+  margin-right: 10px;
+}
+
+.media > .pull-right {
+  margin-left: 10px;
+}
+
+.media-list {
+  margin-left: 0;
+  list-style: none;
+}
+
+.label,
+.badge {
+  display: inline-block;
+  padding: 2px 4px;
+  font-size: 11.844px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  white-space: nowrap;
+  vertical-align: baseline;
+  background-color: #999999;
+}
+
+.label {
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.badge {
+  padding-right: 9px;
+  padding-left: 9px;
+  -webkit-border-radius: 9px;
+     -moz-border-radius: 9px;
+          border-radius: 9px;
+}
+
+.label:empty,
+.badge:empty {
+  display: none;
+}
+
+a.label:hover,
+a.label:focus,
+a.badge:hover,
+a.badge:focus {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+
+.label-info,
+.badge-info {
+  background-color: #3a87ad;
+}
+
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+
+.label-inverse,
+.badge-inverse {
+  background-color: #333333;
+}
+
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #1a1a1a;
+}
+
+.btn .label,
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+
+.btn-mini .label,
+.btn-mini .badge {
+  top: 0;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+@-o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+
+@keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress .bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(to bottom, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: width 0.6s ease;
+     -moz-transition: width 0.6s ease;
+       -o-transition: width 0.6s ease;
+          transition: width 0.6s ease;
+}
+
+.progress .bar + .bar {
+  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+}
+
+.progress-striped .bar {
+  background-color: #149bdf;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+     -moz-background-size: 40px 40px;
+       -o-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+     -moz-animation: progress-bar-stripes 2s linear infinite;
+      -ms-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-danger .bar,
+.progress .bar-danger {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-success .bar,
+.progress .bar-success {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(to bottom, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-info .bar,
+.progress .bar-info {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-warning .bar,
+.progress .bar-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.accordion {
+  margin-bottom: 20px;
+}
+
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.accordion-heading {
+  border-bottom: 0;
+}
+
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+
+.accordion-toggle {
+  cursor: pointer;
+}
+
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+
+.carousel {
+  position: relative;
+  margin-bottom: 20px;
+  line-height: 1;
+}
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+
+.carousel-inner > .item {
+  position: relative;
+  display: none;
+  -webkit-transition: 0.6s ease-in-out left;
+     -moz-transition: 0.6s ease-in-out left;
+       -o-transition: 0.6s ease-in-out left;
+          transition: 0.6s ease-in-out left;
+}
+
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  line-height: 1;
+}
+
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+
+.carousel-inner > .active {
+  left: 0;
+}
+
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+.carousel-inner > .next {
+  left: 100%;
+}
+
+.carousel-inner > .prev {
+  left: -100%;
+}
+
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+
+.carousel-inner > .active.left {
+  left: -100%;
+}
+
+.carousel-inner > .active.right {
+  left: 100%;
+}
+
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #ffffff;
+  text-align: center;
+  background: #222222;
+  border: 3px solid #ffffff;
+  -webkit-border-radius: 23px;
+     -moz-border-radius: 23px;
+          border-radius: 23px;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+
+.carousel-control.right {
+  right: 15px;
+  left: auto;
+}
+
+.carousel-control:hover,
+.carousel-control:focus {
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+
+.carousel-indicators {
+  position: absolute;
+  top: 15px;
+  right: 15px;
+  z-index: 5;
+  margin: 0;
+  list-style: none;
+}
+
+.carousel-indicators li {
+  display: block;
+  float: left;
+  width: 10px;
+  height: 10px;
+  margin-left: 5px;
+  text-indent: -999px;
+  background-color: #ccc;
+  background-color: rgba(255, 255, 255, 0.25);
+  border-radius: 5px;
+}
+
+.carousel-indicators .active {
+  background-color: #fff;
+}
+
+.carousel-caption {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 15px;
+  background: #333333;
+  background: rgba(0, 0, 0, 0.75);
+}
+
+.carousel-caption h4,
+.carousel-caption p {
+  line-height: 20px;
+  color: #ffffff;
+}
+
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+
+.carousel-caption p {
+  margin-bottom: 0;
+}
+
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 30px;
+  color: inherit;
+  background-color: #eeeeee;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  letter-spacing: -1px;
+  color: inherit;
+}
+
+.hero-unit li {
+  line-height: 30px;
+}
+
+.pull-right {
+  float: right;
+}
+
+.pull-left {
+  float: left;
+}
+
+.hide {
+  display: none;
+}
+
+.show {
+  display: block;
+}
+
+.invisible {
+  visibility: hidden;
+}
+
+.affix {
+  position: fixed;
+}
diff --git a/src/main/webapp/resources/css/bootstrap.min.css b/src/main/webapp/resources/css/bootstrap.min.css
new file mode 100644
index 0000000..c10c7f4
--- /dev/null
+++ b/src/main/webapp/resources/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed}
diff --git a/src/main/webapp/resources/css/bootstrap-responsive.css b/src/main/webapp/resources/css/bootstrap-responsive.css
new file mode 100644
index 0000000..fcd72f7
--- /dev/null
+++ b/src/main/webapp/resources/css/bootstrap-responsive.css
@@ -0,0 +1,1109 @@
+/*!
+ * Bootstrap Responsive v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+@-ms-viewport {
+  width: device-width;
+}
+
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+.visible-phone {
+  display: none !important;
+}
+
+.visible-tablet {
+  display: none !important;
+}
+
+.hidden-desktop {
+  display: none !important;
+}
+
+.visible-desktop {
+  display: inherit !important;
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+
+@media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+
+.visible-print {
+  display: none !important;
+}
+
+@media print {
+  .visible-print {
+    display: inherit !important;
+  }
+  .hidden-print {
+    display: none !important;
+  }
+}
+
+@media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.564102564102564%;
+    *margin-left: 2.5109110747408616%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 2.564102564102564%;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145299145%;
+    *width: 91.39979996362975%;
+  }
+  .row-fluid .span10 {
+    width: 82.90598290598291%;
+    *width: 82.8527914166212%;
+  }
+  .row-fluid .span9 {
+    width: 74.35897435897436%;
+    *width: 74.30578286961266%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581196582%;
+    *width: 65.75877432260411%;
+  }
+  .row-fluid .span7 {
+    width: 57.26495726495726%;
+    *width: 57.21176577559556%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948717948715%;
+    *width: 48.664757228587014%;
+  }
+  .row-fluid .span5 {
+    width: 40.17094017094017%;
+    *width: 40.11774868157847%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931623931625%;
+    *width: 31.570740134569924%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923076923077%;
+    *width: 23.023731587561375%;
+  }
+  .row-fluid .span2 {
+    width: 14.52991452991453%;
+    *width: 14.476723040552828%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905982905983%;
+    *width: 5.929714493544281%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.12820512820512%;
+    *margin-left: 105.02182214948171%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.56410256410257%;
+    *margin-left: 102.45771958537915%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.58119658119658%;
+    *margin-left: 96.47481360247316%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.01709401709402%;
+    *margin-left: 93.91071103837061%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.03418803418803%;
+    *margin-left: 87.92780505546462%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.47008547008548%;
+    *margin-left: 85.36370249136206%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.48717948717949%;
+    *margin-left: 79.38079650845607%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 76.92307692307693%;
+    *margin-left: 76.81669394435352%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 70.94017094017094%;
+    *margin-left: 70.83378796144753%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.37606837606839%;
+    *margin-left: 68.26968539734497%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.393162393162385%;
+    *margin-left: 62.28677941443899%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.82905982905982%;
+    *margin-left: 59.72267685033642%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 53.84615384615384%;
+    *margin-left: 53.739770867430444%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.28205128205128%;
+    *margin-left: 51.175668303327875%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.299145299145295%;
+    *margin-left: 45.1927623204219%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.73504273504273%;
+    *margin-left: 42.62865975631933%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 36.75213675213675%;
+    *margin-left: 36.645753773413354%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.18803418803419%;
+    *margin-left: 34.081651209310785%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.205128205128204%;
+    *margin-left: 28.0987452264048%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.641025641025642%;
+    *margin-left: 25.53464266230224%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.65811965811966%;
+    *margin-left: 19.551736679396257%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.094017094017094%;
+    *margin-left: 16.98763411529369%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.11111111111111%;
+    *margin-left: 11.004728132387708%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.547008547008547%;
+    *margin-left: 8.440625568285142%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 30px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 1156px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 1056px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 956px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 856px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 756px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 656px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 556px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 456px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 356px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 256px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 156px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 56px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+
+@media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.7624309392265194%;
+    *margin-left: 2.709239449864817%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 2.7624309392265194%;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.43646408839778%;
+    *width: 91.38327259903608%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817679558%;
+    *width: 82.81973668743387%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226519337%;
+    *width: 74.25620077583166%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585635359117%;
+    *width: 65.69266486422946%;
+  }
+  .row-fluid .span7 {
+    width: 57.18232044198895%;
+    *width: 57.12912895262725%;
+  }
+  .row-fluid .span6 {
+    width: 48.61878453038674%;
+    *width: 48.56559304102504%;
+  }
+  .row-fluid .span5 {
+    width: 40.05524861878453%;
+    *width: 40.00205712942283%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712707182323%;
+    *width: 31.43852121782062%;
+  }
+  .row-fluid .span3 {
+    width: 22.92817679558011%;
+    *width: 22.87498530621841%;
+  }
+  .row-fluid .span2 {
+    width: 14.3646408839779%;
+    *width: 14.311449394616199%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972375691%;
+    *width: 5.747913483013988%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.52486187845304%;
+    *margin-left: 105.41847889972962%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.76243093922652%;
+    *margin-left: 102.6560479605031%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.96132596685082%;
+    *margin-left: 96.8549429881274%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.1988950276243%;
+    *margin-left: 94.09251204890089%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.39779005524862%;
+    *margin-left: 88.2914070765252%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.6353591160221%;
+    *margin-left: 85.52897613729868%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.8342541436464%;
+    *margin-left: 79.72787116492299%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 77.07182320441989%;
+    *margin-left: 76.96544022569647%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 71.2707182320442%;
+    *margin-left: 71.16433525332079%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.50828729281768%;
+    *margin-left: 68.40190431409427%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.70718232044199%;
+    *margin-left: 62.600799341718584%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.94475138121547%;
+    *margin-left: 59.838368402492065%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 54.14364640883978%;
+    *margin-left: 54.037263430116376%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.38121546961326%;
+    *margin-left: 51.27483249088986%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.58011049723757%;
+    *margin-left: 45.47372751851417%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.81767955801105%;
+    *margin-left: 42.71129657928765%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 37.01657458563536%;
+    *margin-left: 36.91019160691196%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.25414364640884%;
+    *margin-left: 34.14776066768544%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.45303867403315%;
+    *margin-left: 28.346655695309746%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.69060773480663%;
+    *margin-left: 25.584224756083227%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.88950276243094%;
+    *margin-left: 19.783119783707537%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.12707182320442%;
+    *margin-left: 17.02068884448102%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.32596685082873%;
+    *margin-left: 11.219583872105325%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.56353591160221%;
+    *margin-left: 8.457152932878806%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 20px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 710px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 648px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 586px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 524px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 462px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 400px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 338px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 276px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 214px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 152px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 90px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 28px;
+  }
+}
+
+@media (max-width: 767px) {
+  body {
+    padding-right: 20px;
+    padding-left: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom,
+  .navbar-static-top {
+    margin-right: -20px;
+    margin-left: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    width: auto;
+    clear: none;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .uneditable-input[class*="span"],
+  .row-fluid [class*="span"] {
+    display: block;
+    float: none;
+    width: 100%;
+    margin-left: 0;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="offset"]:first-child {
+    margin-left: 0;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 0;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    left: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade {
+    top: -100px;
+  }
+  .modal.fade.in {
+    top: 20px;
+  }
+}
+
+@media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+  .media .pull-left,
+  .media .pull-right {
+    display: block;
+    float: none;
+    margin-bottom: 10px;
+  }
+  .media-object {
+    margin-right: 0;
+    margin-left: 0;
+  }
+  .modal {
+    top: 10px;
+    right: 10px;
+    left: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+
+@media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-right: 10px;
+    padding-left: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #777777;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #777777;
+    -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+            border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+            border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .nav > li > a:focus,
+  .nav-collapse .dropdown-menu a:hover,
+  .nav-collapse .dropdown-menu a:focus {
+    background-color: #f2f2f2;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a,
+  .navbar-inverse .nav-collapse .dropdown-menu a {
+    color: #999999;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .nav > li > a:focus,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:focus {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    padding: 0;
+    margin-top: 5px;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    display: none;
+    float: none;
+    max-width: none;
+    padding: 0;
+    margin: 0 15px;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+    -webkit-box-shadow: none;
+       -moz-box-shadow: none;
+            box-shadow: none;
+  }
+  .nav-collapse .open > .dropdown-menu {
+    display: block;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .nav > li > .dropdown-menu:before,
+  .nav-collapse .nav > li > .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #f2f2f2;
+    border-bottom: 1px solid #f2f2f2;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  }
+  .navbar-inverse .nav-collapse .navbar-form,
+  .navbar-inverse .nav-collapse .navbar-search {
+    border-top-color: #111111;
+    border-bottom-color: #111111;
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    height: 0;
+    overflow: hidden;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+}
+
+@media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
diff --git a/src/main/webapp/resources/css/bootstrap-responsive.min.css b/src/main/webapp/resources/css/bootstrap-responsive.min.css
new file mode 100644
index 0000000..d1b7f4b
--- /dev/null
+++ b/src/main/webapp/resources/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}}
diff --git a/src/main/webapp/resources/img/add_B.gif b/src/main/webapp/resources/img/add_B.gif
new file mode 100644
index 0000000..b8aed96
Binary files /dev/null and b/src/main/webapp/resources/img/add_B.gif differ
diff --git a/src/main/webapp/resources/img/best_sellers.gif b/src/main/webapp/resources/img/best_sellers.gif
new file mode 100644
index 0000000..25dc936
Binary files /dev/null and b/src/main/webapp/resources/img/best_sellers.gif differ
diff --git a/src/main/webapp/resources/img/checkout_B.gif b/src/main/webapp/resources/img/checkout_B.gif
new file mode 100644
index 0000000..fd793e6
Binary files /dev/null and b/src/main/webapp/resources/img/checkout_B.gif differ
diff --git a/src/main/webapp/resources/img/display_last_order_B.gif b/src/main/webapp/resources/img/display_last_order_B.gif
new file mode 100644
index 0000000..569cb83
Binary files /dev/null and b/src/main/webapp/resources/img/display_last_order_B.gif differ
diff --git a/src/main/webapp/resources/img/glyphicons-halflings.png b/src/main/webapp/resources/img/glyphicons-halflings.png
new file mode 100644
index 0000000..a996999
Binary files /dev/null and b/src/main/webapp/resources/img/glyphicons-halflings.png differ
diff --git a/src/main/webapp/resources/img/glyphicons-halflings-white.png b/src/main/webapp/resources/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000..3bf6484
Binary files /dev/null and b/src/main/webapp/resources/img/glyphicons-halflings-white.png differ
diff --git a/src/main/webapp/resources/img/home_B.gif b/src/main/webapp/resources/img/home_B.gif
new file mode 100644
index 0000000..972c356
Binary files /dev/null and b/src/main/webapp/resources/img/home_B.gif differ
diff --git a/src/main/webapp/resources/img/logo-CloudScale.png b/src/main/webapp/resources/img/logo-CloudScale.png
new file mode 100644
index 0000000..3500f6c
Binary files /dev/null and b/src/main/webapp/resources/img/logo-CloudScale.png differ
diff --git a/src/main/webapp/resources/img/logo-CloudScale-aws.png b/src/main/webapp/resources/img/logo-CloudScale-aws.png
new file mode 100644
index 0000000..069cadd
Binary files /dev/null and b/src/main/webapp/resources/img/logo-CloudScale-aws.png differ
diff --git a/src/main/webapp/resources/img/order_status_B.gif b/src/main/webapp/resources/img/order_status_B.gif
new file mode 100644
index 0000000..91c3ffc
Binary files /dev/null and b/src/main/webapp/resources/img/order_status_B.gif differ
diff --git a/src/main/webapp/resources/img/refresh_B.gif b/src/main/webapp/resources/img/refresh_B.gif
new file mode 100644
index 0000000..944aab6
Binary files /dev/null and b/src/main/webapp/resources/img/refresh_B.gif differ
diff --git a/src/main/webapp/resources/img/search_B.gif b/src/main/webapp/resources/img/search_B.gif
new file mode 100644
index 0000000..b2f115e
Binary files /dev/null and b/src/main/webapp/resources/img/search_B.gif differ
diff --git a/src/main/webapp/resources/img/shopping_cart_B.gif b/src/main/webapp/resources/img/shopping_cart_B.gif
new file mode 100644
index 0000000..d68076f
Binary files /dev/null and b/src/main/webapp/resources/img/shopping_cart_B.gif differ
diff --git a/src/main/webapp/resources/img/submit_B.gif b/src/main/webapp/resources/img/submit_B.gif
new file mode 100644
index 0000000..a3e3b71
Binary files /dev/null and b/src/main/webapp/resources/img/submit_B.gif differ
diff --git a/src/main/webapp/resources/img/tpclogo.gif b/src/main/webapp/resources/img/tpclogo.gif
new file mode 100644
index 0000000..f0fde9d
Binary files /dev/null and b/src/main/webapp/resources/img/tpclogo.gif differ
diff --git a/src/main/webapp/resources/img/update_B.gif b/src/main/webapp/resources/img/update_B.gif
new file mode 100644
index 0000000..584a852
Binary files /dev/null and b/src/main/webapp/resources/img/update_B.gif differ
diff --git a/src/main/webapp/resources/img/whats_new.gif b/src/main/webapp/resources/img/whats_new.gif
new file mode 100644
index 0000000..892c02a
Binary files /dev/null and b/src/main/webapp/resources/img/whats_new.gif differ
diff --git a/src/main/webapp/resources/js/bootstrap.js b/src/main/webapp/resources/js/bootstrap.js
new file mode 100644
index 0000000..c298ee4
--- /dev/null
+++ b/src/main/webapp/resources/js/bootstrap.js
@@ -0,0 +1,2276 @@
+/* ===================================================
+ * bootstrap-transition.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
+ * ===================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
+   * ======================================================= */
+
+  $(function () {
+
+    $.support.transition = (function () {
+
+      var transitionEnd = (function () {
+
+        var el = document.createElement('bootstrap')
+          , transEndEventNames = {
+               'WebkitTransition' : 'webkitTransitionEnd'
+            ,  'MozTransition'    : 'transitionend'
+            ,  'OTransition'      : 'oTransitionEnd otransitionend'
+            ,  'transition'       : 'transitionend'
+            }
+          , name
+
+        for (name in transEndEventNames){
+          if (el.style[name] !== undefined) {
+            return transEndEventNames[name]
+          }
+        }
+
+      }())
+
+      return transitionEnd && {
+        end: transitionEnd
+      }
+
+    })()
+
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-alert.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* ALERT CLASS DEFINITION
+  * ====================== */
+
+  var dismiss = '[data-dismiss="alert"]'
+    , Alert = function (el) {
+        $(el).on('click', dismiss, this.close)
+      }
+
+  Alert.prototype.close = function (e) {
+    var $this = $(this)
+      , selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = $(selector)
+
+    e && e.preventDefault()
+
+    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
+
+    $parent.trigger(e = $.Event('close'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      $parent
+        .trigger('closed')
+        .remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent.on($.support.transition.end, removeElement) :
+      removeElement()
+  }
+
+
+ /* ALERT PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.alert
+
+  $.fn.alert = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('alert')
+      if (!data) $this.data('alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.alert.Constructor = Alert
+
+
+ /* ALERT NO CONFLICT
+  * ================= */
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+ /* ALERT DATA-API
+  * ============== */
+
+  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-button.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* BUTTON PUBLIC CLASS DEFINITION
+  * ============================== */
+
+  var Button = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.button.defaults, options)
+  }
+
+  Button.prototype.setState = function (state) {
+    var d = 'disabled'
+      , $el = this.$element
+      , data = $el.data()
+      , val = $el.is('input') ? 'val' : 'html'
+
+    state = state + 'Text'
+    data.resetText || $el.data('resetText', $el[val]())
+
+    $el[val](data[state] || this.options[state])
+
+    // push to event loop to allow forms to submit
+    setTimeout(function () {
+      state == 'loadingText' ?
+        $el.addClass(d).attr(d, d) :
+        $el.removeClass(d).removeAttr(d)
+    }, 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
+
+    $parent && $parent
+      .find('.active')
+      .removeClass('active')
+
+    this.$element.toggleClass('active')
+  }
+
+
+ /* BUTTON PLUGIN DEFINITION
+  * ======================== */
+
+  var old = $.fn.button
+
+  $.fn.button = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('button')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('button', (data = new Button(this, options)))
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  $.fn.button.defaults = {
+    loadingText: 'loading...'
+  }
+
+  $.fn.button.Constructor = Button
+
+
+ /* BUTTON NO CONFLICT
+  * ================== */
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+ /* BUTTON DATA-API
+  * =============== */
+
+  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
+    var $btn = $(e.target)
+    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+    $btn.button('toggle')
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-carousel.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* CAROUSEL CLASS DEFINITION
+  * ========================= */
+
+  var Carousel = function (element, options) {
+    this.$element = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options = options
+    this.options.pause == 'hover' && this.$element
+      .on('mouseenter', $.proxy(this.pause, this))
+      .on('mouseleave', $.proxy(this.cycle, this))
+  }
+
+  Carousel.prototype = {
+
+    cycle: function (e) {
+      if (!e) this.paused = false
+      if (this.interval) clearInterval(this.interval);
+      this.options.interval
+        && !this.paused
+        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+      return this
+    }
+
+  , getActiveIndex: function () {
+      this.$active = this.$element.find('.item.active')
+      this.$items = this.$active.parent().children()
+      return this.$items.index(this.$active)
+    }
+
+  , to: function (pos) {
+      var activeIndex = this.getActiveIndex()
+        , that = this
+
+      if (pos > (this.$items.length - 1) || pos < 0) return
+
+      if (this.sliding) {
+        return this.$element.one('slid', function () {
+          that.to(pos)
+        })
+      }
+
+      if (activeIndex == pos) {
+        return this.pause().cycle()
+      }
+
+      return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+    }
+
+  , pause: function (e) {
+      if (!e) this.paused = true
+      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
+        this.$element.trigger($.support.transition.end)
+        this.cycle(true)
+      }
+      clearInterval(this.interval)
+      this.interval = null
+      return this
+    }
+
+  , next: function () {
+      if (this.sliding) return
+      return this.slide('next')
+    }
+
+  , prev: function () {
+      if (this.sliding) return
+      return this.slide('prev')
+    }
+
+  , slide: function (type, next) {
+      var $active = this.$element.find('.item.active')
+        , $next = next || $active[type]()
+        , isCycling = this.interval
+        , direction = type == 'next' ? 'left' : 'right'
+        , fallback  = type == 'next' ? 'first' : 'last'
+        , that = this
+        , e
+
+      this.sliding = true
+
+      isCycling && this.pause()
+
+      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
+
+      e = $.Event('slide', {
+        relatedTarget: $next[0]
+      , direction: direction
+      })
+
+      if ($next.hasClass('active')) return
+
+      if (this.$indicators.length) {
+        this.$indicators.find('.active').removeClass('active')
+        this.$element.one('slid', function () {
+          var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
+          $nextIndicator && $nextIndicator.addClass('active')
+        })
+      }
+
+      if ($.support.transition && this.$element.hasClass('slide')) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $next.addClass(type)
+        $next[0].offsetWidth // force reflow
+        $active.addClass(direction)
+        $next.addClass(direction)
+        this.$element.one($.support.transition.end, function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () { that.$element.trigger('slid') }, 0)
+        })
+      } else {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $active.removeClass('active')
+        $next.addClass('active')
+        this.sliding = false
+        this.$element.trigger('slid')
+      }
+
+      isCycling && this.cycle()
+
+      return this
+    }
+
+  }
+
+
+ /* CAROUSEL PLUGIN DEFINITION
+  * ========================== */
+
+  var old = $.fn.carousel
+
+  $.fn.carousel = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('carousel')
+        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
+        , action = typeof option == 'string' ? option : options.slide
+      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  $.fn.carousel.defaults = {
+    interval: 5000
+  , pause: 'hover'
+  }
+
+  $.fn.carousel.Constructor = Carousel
+
+
+ /* CAROUSEL NO CONFLICT
+  * ==================== */
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+ /* CAROUSEL DATA-API
+  * ================= */
+
+  $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+    var $this = $(this), href
+      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      , options = $.extend({}, $target.data(), $this.data())
+      , slideIndex
+
+    $target.carousel(options)
+
+    if (slideIndex = $this.attr('data-slide-to')) {
+      $target.data('carousel').pause().to(slideIndex).cycle()
+    }
+
+    e.preventDefault()
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-collapse.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* COLLAPSE PUBLIC CLASS DEFINITION
+  * ================================ */
+
+  var Collapse = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.collapse.defaults, options)
+
+    if (this.options.parent) {
+      this.$parent = $(this.options.parent)
+    }
+
+    this.options.toggle && this.toggle()
+  }
+
+  Collapse.prototype = {
+
+    constructor: Collapse
+
+  , dimension: function () {
+      var hasWidth = this.$element.hasClass('width')
+      return hasWidth ? 'width' : 'height'
+    }
+
+  , show: function () {
+      var dimension
+        , scroll
+        , actives
+        , hasData
+
+      if (this.transitioning || this.$element.hasClass('in')) return
+
+      dimension = this.dimension()
+      scroll = $.camelCase(['scroll', dimension].join('-'))
+      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
+
+      if (actives && actives.length) {
+        hasData = actives.data('collapse')
+        if (hasData && hasData.transitioning) return
+        actives.collapse('hide')
+        hasData || actives.data('collapse', null)
+      }
+
+      this.$element[dimension](0)
+      this.transition('addClass', $.Event('show'), 'shown')
+      $.support.transition && this.$element[dimension](this.$element[0][scroll])
+    }
+
+  , hide: function () {
+      var dimension
+      if (this.transitioning || !this.$element.hasClass('in')) return
+      dimension = this.dimension()
+      this.reset(this.$element[dimension]())
+      this.transition('removeClass', $.Event('hide'), 'hidden')
+      this.$element[dimension](0)
+    }
+
+  , reset: function (size) {
+      var dimension = this.dimension()
+
+      this.$element
+        .removeClass('collapse')
+        [dimension](size || 'auto')
+        [0].offsetWidth
+
+      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
+
+      return this
+    }
+
+  , transition: function (method, startEvent, completeEvent) {
+      var that = this
+        , complete = function () {
+            if (startEvent.type == 'show') that.reset()
+            that.transitioning = 0
+            that.$element.trigger(completeEvent)
+          }
+
+      this.$element.trigger(startEvent)
+
+      if (startEvent.isDefaultPrevented()) return
+
+      this.transitioning = 1
+
+      this.$element[method]('in')
+
+      $.support.transition && this.$element.hasClass('collapse') ?
+        this.$element.one($.support.transition.end, complete) :
+        complete()
+    }
+
+  , toggle: function () {
+      this[this.$element.hasClass('in') ? 'hide' : 'show']()
+    }
+
+  }
+
+
+ /* COLLAPSE PLUGIN DEFINITION
+  * ========================== */
+
+  var old = $.fn.collapse
+
+  $.fn.collapse = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('collapse')
+        , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.collapse.defaults = {
+    toggle: true
+  }
+
+  $.fn.collapse.Constructor = Collapse
+
+
+ /* COLLAPSE NO CONFLICT
+  * ==================== */
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+ /* COLLAPSE DATA-API
+  * ================= */
+
+  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
+    var $this = $(this), href
+      , target = $this.attr('data-target')
+        || e.preventDefault()
+        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+      , option = $(target).data('collapse') ? 'toggle' : $this.data()
+    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+    $(target).collapse(option)
+  })
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-dropdown.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* DROPDOWN CLASS DEFINITION
+  * ========================= */
+
+  var toggle = '[data-toggle=dropdown]'
+    , Dropdown = function (element) {
+        var $el = $(element).on('click.dropdown.data-api', this.toggle)
+        $('html').on('click.dropdown.data-api', function () {
+          $el.parent().removeClass('open')
+        })
+      }
+
+  Dropdown.prototype = {
+
+    constructor: Dropdown
+
+  , toggle: function (e) {
+      var $this = $(this)
+        , $parent
+        , isActive
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      clearMenus()
+
+      if (!isActive) {
+        $parent.toggleClass('open')
+      }
+
+      $this.focus()
+
+      return false
+    }
+
+  , keydown: function (e) {
+      var $this
+        , $items
+        , $active
+        , $parent
+        , isActive
+        , index
+
+      if (!/(38|40|27)/.test(e.keyCode)) return
+
+      $this = $(this)
+
+      e.preventDefault()
+      e.stopPropagation()
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      if (!isActive || (isActive && e.keyCode == 27)) {
+        if (e.which == 27) $parent.find(toggle).focus()
+        return $this.click()
+      }
+
+      $items = $('[role=menu] li:not(.divider):visible a', $parent)
+
+      if (!$items.length) return
+
+      index = $items.index($items.filter(':focus'))
+
+      if (e.keyCode == 38 && index > 0) index--                                        // up
+      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
+      if (!~index) index = 0
+
+      $items
+        .eq(index)
+        .focus()
+    }
+
+  }
+
+  function clearMenus() {
+    $(toggle).each(function () {
+      getParent($(this)).removeClass('open')
+    })
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = selector && $(selector)
+
+    if (!$parent || !$parent.length) $parent = $this.parent()
+
+    return $parent
+  }
+
+
+  /* DROPDOWN PLUGIN DEFINITION
+   * ========================== */
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('dropdown')
+      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.dropdown.Constructor = Dropdown
+
+
+ /* DROPDOWN NO CONFLICT
+  * ==================== */
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  /* APPLY TO STANDARD DROPDOWN ELEMENTS
+   * =================================== */
+
+  $(document)
+    .on('click.dropdown.data-api', clearMenus)
+    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.dropdown-menu', function (e) { e.stopPropagation() })
+    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
+    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+
+}(window.jQuery);
+/* =========================================================
+ * bootstrap-modal.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#modals
+ * =========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* MODAL CLASS DEFINITION
+  * ====================== */
+
+  var Modal = function (element, options) {
+    this.options = options
+    this.$element = $(element)
+      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
+    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
+  }
+
+  Modal.prototype = {
+
+      constructor: Modal
+
+    , toggle: function () {
+        return this[!this.isShown ? 'show' : 'hide']()
+      }
+
+    , show: function () {
+        var that = this
+          , e = $.Event('show')
+
+        this.$element.trigger(e)
+
+        if (this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = true
+
+        this.escape()
+
+        this.backdrop(function () {
+          var transition = $.support.transition && that.$element.hasClass('fade')
+
+          if (!that.$element.parent().length) {
+            that.$element.appendTo(document.body) //don't move modals dom position
+          }
+
+          that.$element.show()
+
+          if (transition) {
+            that.$element[0].offsetWidth // force reflow
+          }
+
+          that.$element
+            .addClass('in')
+            .attr('aria-hidden', false)
+
+          that.enforceFocus()
+
+          transition ?
+            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
+            that.$element.focus().trigger('shown')
+
+        })
+      }
+
+    , hide: function (e) {
+        e && e.preventDefault()
+
+        var that = this
+
+        e = $.Event('hide')
+
+        this.$element.trigger(e)
+
+        if (!this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = false
+
+        this.escape()
+
+        $(document).off('focusin.modal')
+
+        this.$element
+          .removeClass('in')
+          .attr('aria-hidden', true)
+
+        $.support.transition && this.$element.hasClass('fade') ?
+          this.hideWithTransition() :
+          this.hideModal()
+      }
+
+    , enforceFocus: function () {
+        var that = this
+        $(document).on('focusin.modal', function (e) {
+          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
+            that.$element.focus()
+          }
+        })
+      }
+
+    , escape: function () {
+        var that = this
+        if (this.isShown && this.options.keyboard) {
+          this.$element.on('keyup.dismiss.modal', function ( e ) {
+            e.which == 27 && that.hide()
+          })
+        } else if (!this.isShown) {
+          this.$element.off('keyup.dismiss.modal')
+        }
+      }
+
+    , hideWithTransition: function () {
+        var that = this
+          , timeout = setTimeout(function () {
+              that.$element.off($.support.transition.end)
+              that.hideModal()
+            }, 500)
+
+        this.$element.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          that.hideModal()
+        })
+      }
+
+    , hideModal: function () {
+        var that = this
+        this.$element.hide()
+        this.backdrop(function () {
+          that.removeBackdrop()
+          that.$element.trigger('hidden')
+        })
+      }
+
+    , removeBackdrop: function () {
+        this.$backdrop && this.$backdrop.remove()
+        this.$backdrop = null
+      }
+
+    , backdrop: function (callback) {
+        var that = this
+          , animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+        if (this.isShown && this.options.backdrop) {
+          var doAnimate = $.support.transition && animate
+
+          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+            .appendTo(document.body)
+
+          this.$backdrop.click(
+            this.options.backdrop == 'static' ?
+              $.proxy(this.$element[0].focus, this.$element[0])
+            : $.proxy(this.hide, this)
+          )
+
+          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+          this.$backdrop.addClass('in')
+
+          if (!callback) return
+
+          doAnimate ?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (!this.isShown && this.$backdrop) {
+          this.$backdrop.removeClass('in')
+
+          $.support.transition && this.$element.hasClass('fade')?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (callback) {
+          callback()
+        }
+      }
+  }
+
+
+ /* MODAL PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.modal
+
+  $.fn.modal = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('modal')
+        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option]()
+      else if (options.show) data.show()
+    })
+  }
+
+  $.fn.modal.defaults = {
+      backdrop: true
+    , keyboard: true
+    , show: true
+  }
+
+  $.fn.modal.Constructor = Modal
+
+
+ /* MODAL NO CONFLICT
+  * ================= */
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+ /* MODAL DATA-API
+  * ============== */
+
+  $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this = $(this)
+      , href = $this.attr('href')
+      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
+
+    e.preventDefault()
+
+    $target
+      .modal(option)
+      .one('hide', function () {
+        $this.focus()
+      })
+  })
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-tooltip.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TOOLTIP PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Tooltip = function (element, options) {
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.prototype = {
+
+    constructor: Tooltip
+
+  , init: function (type, element, options) {
+      var eventIn
+        , eventOut
+        , triggers
+        , trigger
+        , i
+
+      this.type = type
+      this.$element = $(element)
+      this.options = this.getOptions(options)
+      this.enabled = true
+
+      triggers = this.options.trigger.split(' ')
+
+      for (i = triggers.length; i--;) {
+        trigger = triggers[i]
+        if (trigger == 'click') {
+          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+        } else if (trigger != 'manual') {
+          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
+          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
+          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+        }
+      }
+
+      this.options.selector ?
+        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+        this.fixTitle()
+    }
+
+  , getOptions: function (options) {
+      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
+
+      if (options.delay && typeof options.delay == 'number') {
+        options.delay = {
+          show: options.delay
+        , hide: options.delay
+        }
+      }
+
+      return options
+    }
+
+  , enter: function (e) {
+      var defaults = $.fn[this.type].defaults
+        , options = {}
+        , self
+
+      this._options && $.each(this._options, function (key, value) {
+        if (defaults[key] != value) options[key] = value
+      }, this)
+
+      self = $(e.currentTarget)[this.type](options).data(this.type)
+
+      if (!self.options.delay || !self.options.delay.show) return self.show()
+
+      clearTimeout(this.timeout)
+      self.hoverState = 'in'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'in') self.show()
+      }, self.options.delay.show)
+    }
+
+  , leave: function (e) {
+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+
+      if (this.timeout) clearTimeout(this.timeout)
+      if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+      self.hoverState = 'out'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'out') self.hide()
+      }, self.options.delay.hide)
+    }
+
+  , show: function () {
+      var $tip
+        , pos
+        , actualWidth
+        , actualHeight
+        , placement
+        , tp
+        , e = $.Event('show')
+
+      if (this.hasContent() && this.enabled) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $tip = this.tip()
+        this.setContent()
+
+        if (this.options.animation) {
+          $tip.addClass('fade')
+        }
+
+        placement = typeof this.options.placement == 'function' ?
+          this.options.placement.call(this, $tip[0], this.$element[0]) :
+          this.options.placement
+
+        $tip
+          .detach()
+          .css({ top: 0, left: 0, display: 'block' })
+
+        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+        pos = this.getPosition()
+
+        actualWidth = $tip[0].offsetWidth
+        actualHeight = $tip[0].offsetHeight
+
+        switch (placement) {
+          case 'bottom':
+            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'top':
+            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'left':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
+            break
+          case 'right':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
+            break
+        }
+
+        this.applyPlacement(tp, placement)
+        this.$element.trigger('shown')
+      }
+    }
+
+  , applyPlacement: function(offset, placement){
+      var $tip = this.tip()
+        , width = $tip[0].offsetWidth
+        , height = $tip[0].offsetHeight
+        , actualWidth
+        , actualHeight
+        , delta
+        , replace
+
+      $tip
+        .offset(offset)
+        .addClass(placement)
+        .addClass('in')
+
+      actualWidth = $tip[0].offsetWidth
+      actualHeight = $tip[0].offsetHeight
+
+      if (placement == 'top' && actualHeight != height) {
+        offset.top = offset.top + height - actualHeight
+        replace = true
+      }
+
+      if (placement == 'bottom' || placement == 'top') {
+        delta = 0
+
+        if (offset.left < 0){
+          delta = offset.left * -2
+          offset.left = 0
+          $tip.offset(offset)
+          actualWidth = $tip[0].offsetWidth
+          actualHeight = $tip[0].offsetHeight
+        }
+
+        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+      } else {
+        this.replaceArrow(actualHeight - height, actualHeight, 'top')
+      }
+
+      if (replace) $tip.offset(offset)
+    }
+
+  , replaceArrow: function(delta, dimension, position){
+      this
+        .arrow()
+        .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
+    }
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+
+      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+      $tip.removeClass('fade in top bottom left right')
+    }
+
+  , hide: function () {
+      var that = this
+        , $tip = this.tip()
+        , e = $.Event('hide')
+
+      this.$element.trigger(e)
+      if (e.isDefaultPrevented()) return
+
+      $tip.removeClass('in')
+
+      function removeWithAnimation() {
+        var timeout = setTimeout(function () {
+          $tip.off($.support.transition.end).detach()
+        }, 500)
+
+        $tip.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          $tip.detach()
+        })
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        removeWithAnimation() :
+        $tip.detach()
+
+      this.$element.trigger('hidden')
+
+      return this
+    }
+
+  , fixTitle: function () {
+      var $e = this.$element
+      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+      }
+    }
+
+  , hasContent: function () {
+      return this.getTitle()
+    }
+
+  , getPosition: function () {
+      var el = this.$element[0]
+      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+        width: el.offsetWidth
+      , height: el.offsetHeight
+      }, this.$element.offset())
+    }
+
+  , getTitle: function () {
+      var title
+        , $e = this.$element
+        , o = this.options
+
+      title = $e.attr('data-original-title')
+        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+      return title
+    }
+
+  , tip: function () {
+      return this.$tip = this.$tip || $(this.options.template)
+    }
+
+  , arrow: function(){
+      return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
+    }
+
+  , validate: function () {
+      if (!this.$element[0].parentNode) {
+        this.hide()
+        this.$element = null
+        this.options = null
+      }
+    }
+
+  , enable: function () {
+      this.enabled = true
+    }
+
+  , disable: function () {
+      this.enabled = false
+    }
+
+  , toggleEnabled: function () {
+      this.enabled = !this.enabled
+    }
+
+  , toggle: function (e) {
+      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
+      self.tip().hasClass('in') ? self.hide() : self.show()
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  }
+
+
+ /* TOOLTIP PLUGIN DEFINITION
+  * ========================= */
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tooltip')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tooltip.Constructor = Tooltip
+
+  $.fn.tooltip.defaults = {
+    animation: true
+  , placement: 'top'
+  , selector: false
+  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+  , trigger: 'hover focus'
+  , title: ''
+  , delay: 0
+  , html: false
+  , container: false
+  }
+
+
+ /* TOOLTIP NO CONFLICT
+  * =================== */
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-popover.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* POPOVER PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+
+  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
+     ========================================== */
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
+
+    constructor: Popover
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+        , content = this.getContent()
+
+      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+      $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
+
+      $tip.removeClass('fade top bottom left right in')
+    }
+
+  , hasContent: function () {
+      return this.getTitle() || this.getContent()
+    }
+
+  , getContent: function () {
+      var content
+        , $e = this.$element
+        , o = this.options
+
+      content = (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
+        || $e.attr('data-content')
+
+      return content
+    }
+
+  , tip: function () {
+      if (!this.$tip) {
+        this.$tip = $(this.options.template)
+      }
+      return this.$tip
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  })
+
+
+ /* POPOVER PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.popover
+
+  $.fn.popover = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('popover')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.popover.Constructor = Popover
+
+  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
+    placement: 'right'
+  , trigger: 'click'
+  , content: ''
+  , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+ /* POPOVER NO CONFLICT
+  * =================== */
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(window.jQuery);
+/* =============================================================
+ * bootstrap-scrollspy.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* SCROLLSPY CLASS DEFINITION
+  * ========================== */
+
+  function ScrollSpy(element, options) {
+    var process = $.proxy(this.process, this)
+      , $element = $(element).is('body') ? $(window) : $(element)
+      , href
+    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
+    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
+    this.selector = (this.options.target
+      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      || '') + ' .nav li > a'
+    this.$body = $('body')
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.prototype = {
+
+      constructor: ScrollSpy
+
+    , refresh: function () {
+        var self = this
+          , $targets
+
+        this.offsets = $([])
+        this.targets = $([])
+
+        $targets = this.$body
+          .find(this.selector)
+          .map(function () {
+            var $el = $(this)
+              , href = $el.data('target') || $el.attr('href')
+              , $href = /^#\w/.test(href) && $(href)
+            return ( $href
+              && $href.length
+              && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
+          })
+          .sort(function (a, b) { return a[0] - b[0] })
+          .each(function () {
+            self.offsets.push(this[0])
+            self.targets.push(this[1])
+          })
+      }
+
+    , process: function () {
+        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+          , maxScroll = scrollHeight - this.$scrollElement.height()
+          , offsets = this.offsets
+          , targets = this.targets
+          , activeTarget = this.activeTarget
+          , i
+
+        if (scrollTop >= maxScroll) {
+          return activeTarget != (i = targets.last()[0])
+            && this.activate ( i )
+        }
+
+        for (i = offsets.length; i--;) {
+          activeTarget != targets[i]
+            && scrollTop >= offsets[i]
+            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+            && this.activate( targets[i] )
+        }
+      }
+
+    , activate: function (target) {
+        var active
+          , selector
+
+        this.activeTarget = target
+
+        $(this.selector)
+          .parent('.active')
+          .removeClass('active')
+
+        selector = this.selector
+          + '[data-target="' + target + '"],'
+          + this.selector + '[href="' + target + '"]'
+
+        active = $(selector)
+          .parent('li')
+          .addClass('active')
+
+        if (active.parent('.dropdown-menu').length)  {
+          active = active.closest('li.dropdown').addClass('active')
+        }
+
+        active.trigger('activate')
+      }
+
+  }
+
+
+ /* SCROLLSPY PLUGIN DEFINITION
+  * =========================== */
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('scrollspy')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+  $.fn.scrollspy.defaults = {
+    offset: 10
+  }
+
+
+ /* SCROLLSPY NO CONFLICT
+  * ===================== */
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+ /* SCROLLSPY DATA-API
+  * ================== */
+
+  $(window).on('load', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      $spy.scrollspy($spy.data())
+    })
+  })
+
+}(window.jQuery);/* ========================================================
+ * bootstrap-tab.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
+ * ========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TAB CLASS DEFINITION
+  * ==================== */
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.prototype = {
+
+    constructor: Tab
+
+  , show: function () {
+      var $this = this.element
+        , $ul = $this.closest('ul:not(.dropdown-menu)')
+        , selector = $this.attr('data-target')
+        , previous
+        , $target
+        , e
+
+      if (!selector) {
+        selector = $this.attr('href')
+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+      }
+
+      if ( $this.parent('li').hasClass('active') ) return
+
+      previous = $ul.find('.active:last a')[0]
+
+      e = $.Event('show', {
+        relatedTarget: previous
+      })
+
+      $this.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      $target = $(selector)
+
+      this.activate($this.parent('li'), $ul)
+      this.activate($target, $target.parent(), function () {
+        $this.trigger({
+          type: 'shown'
+        , relatedTarget: previous
+        })
+      })
+    }
+
+  , activate: function ( element, container, callback) {
+      var $active = container.find('> .active')
+        , transition = callback
+            && $.support.transition
+            && $active.hasClass('fade')
+
+      function next() {
+        $active
+          .removeClass('active')
+          .find('> .dropdown-menu > .active')
+          .removeClass('active')
+
+        element.addClass('active')
+
+        if (transition) {
+          element[0].offsetWidth // reflow for transition
+          element.addClass('in')
+        } else {
+          element.removeClass('fade')
+        }
+
+        if ( element.parent('.dropdown-menu') ) {
+          element.closest('li.dropdown').addClass('active')
+        }
+
+        callback && callback()
+      }
+
+      transition ?
+        $active.one($.support.transition.end, next) :
+        next()
+
+      $active.removeClass('in')
+    }
+  }
+
+
+ /* TAB PLUGIN DEFINITION
+  * ===================== */
+
+  var old = $.fn.tab
+
+  $.fn.tab = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tab')
+      if (!data) $this.data('tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tab.Constructor = Tab
+
+
+ /* TAB NO CONFLICT
+  * =============== */
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+ /* TAB DATA-API
+  * ============ */
+
+  $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+    e.preventDefault()
+    $(this).tab('show')
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-typeahead.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function($){
+
+  "use strict"; // jshint ;_;
+
+
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
+  * ================================= */
+
+  var Typeahead = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.typeahead.defaults, options)
+    this.matcher = this.options.matcher || this.matcher
+    this.sorter = this.options.sorter || this.sorter
+    this.highlighter = this.options.highlighter || this.highlighter
+    this.updater = this.options.updater || this.updater
+    this.source = this.options.source
+    this.$menu = $(this.options.menu)
+    this.shown = false
+    this.listen()
+  }
+
+  Typeahead.prototype = {
+
+    constructor: Typeahead
+
+  , select: function () {
+      var val = this.$menu.find('.active').attr('data-value')
+      this.$element
+        .val(this.updater(val))
+        .change()
+      return this.hide()
+    }
+
+  , updater: function (item) {
+      return item
+    }
+
+  , show: function () {
+      var pos = $.extend({}, this.$element.position(), {
+        height: this.$element[0].offsetHeight
+      })
+
+      this.$menu
+        .insertAfter(this.$element)
+        .css({
+          top: pos.top + pos.height
+        , left: pos.left
+        })
+        .show()
+
+      this.shown = true
+      return this
+    }
+
+  , hide: function () {
+      this.$menu.hide()
+      this.shown = false
+      return this
+    }
+
+  , lookup: function (event) {
+      var items
+
+      this.query = this.$element.val()
+
+      if (!this.query || this.query.length < this.options.minLength) {
+        return this.shown ? this.hide() : this
+      }
+
+      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
+
+      return items ? this.process(items) : this
+    }
+
+  , process: function (items) {
+      var that = this
+
+      items = $.grep(items, function (item) {
+        return that.matcher(item)
+      })
+
+      items = this.sorter(items)
+
+      if (!items.length) {
+        return this.shown ? this.hide() : this
+      }
+
+      return this.render(items.slice(0, this.options.items)).show()
+    }
+
+  , matcher: function (item) {
+      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
+    }
+
+  , sorter: function (items) {
+      var beginswith = []
+        , caseSensitive = []
+        , caseInsensitive = []
+        , item
+
+      while (item = items.shift()) {
+        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
+        else if (~item.indexOf(this.query)) caseSensitive.push(item)
+        else caseInsensitive.push(item)
+      }
+
+      return beginswith.concat(caseSensitive, caseInsensitive)
+    }
+
+  , highlighter: function (item) {
+      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
+      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
+        return '<strong>' + match + '</strong>'
+      })
+    }
+
+  , render: function (items) {
+      var that = this
+
+      items = $(items).map(function (i, item) {
+        i = $(that.options.item).attr('data-value', item)
+        i.find('a').html(that.highlighter(item))
+        return i[0]
+      })
+
+      items.first().addClass('active')
+      this.$menu.html(items)
+      return this
+    }
+
+  , next: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , next = active.next()
+
+      if (!next.length) {
+        next = $(this.$menu.find('li')[0])
+      }
+
+      next.addClass('active')
+    }
+
+  , prev: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , prev = active.prev()
+
+      if (!prev.length) {
+        prev = this.$menu.find('li').last()
+      }
+
+      prev.addClass('active')
+    }
+
+  , listen: function () {
+      this.$element
+        .on('focus',    $.proxy(this.focus, this))
+        .on('blur',     $.proxy(this.blur, this))
+        .on('keypress', $.proxy(this.keypress, this))
+        .on('keyup',    $.proxy(this.keyup, this))
+
+      if (this.eventSupported('keydown')) {
+        this.$element.on('keydown', $.proxy(this.keydown, this))
+      }
+
+      this.$menu
+        .on('click', $.proxy(this.click, this))
+        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
+    }
+
+  , eventSupported: function(eventName) {
+      var isSupported = eventName in this.$element
+      if (!isSupported) {
+        this.$element.setAttribute(eventName, 'return;')
+        isSupported = typeof this.$element[eventName] === 'function'
+      }
+      return isSupported
+    }
+
+  , move: function (e) {
+      if (!this.shown) return
+
+      switch(e.keyCode) {
+        case 9: // tab
+        case 13: // enter
+        case 27: // escape
+          e.preventDefault()
+          break
+
+        case 38: // up arrow
+          e.preventDefault()
+          this.prev()
+          break
+
+        case 40: // down arrow
+          e.preventDefault()
+          this.next()
+          break
+      }
+
+      e.stopPropagation()
+    }
+
+  , keydown: function (e) {
+      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
+      this.move(e)
+    }
+
+  , keypress: function (e) {
+      if (this.suppressKeyPressRepeat) return
+      this.move(e)
+    }
+
+  , keyup: function (e) {
+      switch(e.keyCode) {
+        case 40: // down arrow
+        case 38: // up arrow
+        case 16: // shift
+        case 17: // ctrl
+        case 18: // alt
+          break
+
+        case 9: // tab
+        case 13: // enter
+          if (!this.shown) return
+          this.select()
+          break
+
+        case 27: // escape
+          if (!this.shown) return
+          this.hide()
+          break
+
+        default:
+          this.lookup()
+      }
+
+      e.stopPropagation()
+      e.preventDefault()
+  }
+
+  , focus: function (e) {
+      this.focused = true
+    }
+
+  , blur: function (e) {
+      this.focused = false
+      if (!this.mousedover && this.shown) this.hide()
+    }
+
+  , click: function (e) {
+      e.stopPropagation()
+      e.preventDefault()
+      this.select()
+      this.$element.focus()
+    }
+
+  , mouseenter: function (e) {
+      this.mousedover = true
+      this.$menu.find('.active').removeClass('active')
+      $(e.currentTarget).addClass('active')
+    }
+
+  , mouseleave: function (e) {
+      this.mousedover = false
+      if (!this.focused && this.shown) this.hide()
+    }
+
+  }
+
+
+  /* TYPEAHEAD PLUGIN DEFINITION
+   * =========================== */
+
+  var old = $.fn.typeahead
+
+  $.fn.typeahead = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('typeahead')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.typeahead.defaults = {
+    source: []
+  , items: 8
+  , menu: '<ul class="typeahead dropdown-menu"></ul>'
+  , item: '<li><a href="#"></a></li>'
+  , minLength: 1
+  }
+
+  $.fn.typeahead.Constructor = Typeahead
+
+
+ /* TYPEAHEAD NO CONFLICT
+  * =================== */
+
+  $.fn.typeahead.noConflict = function () {
+    $.fn.typeahead = old
+    return this
+  }
+
+
+ /* TYPEAHEAD DATA-API
+  * ================== */
+
+  $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
+    var $this = $(this)
+    if ($this.data('typeahead')) return
+    $this.typeahead($this.data())
+  })
+
+}(window.jQuery);
+/* ==========================================================
+ * bootstrap-affix.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#affix
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* AFFIX CLASS DEFINITION
+  * ====================== */
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, $.fn.affix.defaults, options)
+    this.$window = $(window)
+      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
+    this.$element = $(element)
+    this.checkPosition()
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var scrollHeight = $(document).height()
+      , scrollTop = this.$window.scrollTop()
+      , position = this.$element.offset()
+      , offset = this.options.offset
+      , offsetBottom = offset.bottom
+      , offsetTop = offset.top
+      , reset = 'affix affix-top affix-bottom'
+      , affix
+
+    if (typeof offset != 'object') offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function') offsetTop = offset.top()
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
+      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
+      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
+      'top'    : false
+
+    if (this.affixed === affix) return
+
+    this.affixed = affix
+    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
+
+    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
+  }
+
+
+ /* AFFIX PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.affix
+
+  $.fn.affix = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('affix')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.affix.Constructor = Affix
+
+  $.fn.affix.defaults = {
+    offset: 0
+  }
+
+
+ /* AFFIX NO CONFLICT
+  * ================= */
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+ /* AFFIX DATA-API
+  * ============== */
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+        , data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
+      data.offsetTop && (data.offset.top = data.offsetTop)
+
+      $spy.affix(data)
+    })
+  })
+
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/src/main/webapp/resources/js/bootstrap.min.js b/src/main/webapp/resources/js/bootstrap.min.js
new file mode 100644
index 0000000..95c5ac5
--- /dev/null
+++ b/src/main/webapp/resources/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||s.toggleClass("open"),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml b/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
new file mode 100644
index 0000000..7e780e1
--- /dev/null
+++ b/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/mvc"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+	xmlns:context="http://www.springframework.org/schema/context"
+	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
+		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+
+	<!-- DispatcherServlet Context: defines this servlet's request-processing 
+		infrastructure -->
+
+	<!-- Enables the Spring MVC @Controller programming model -->
+	<annotation-driven />
+
+	<!-- Handles HTTP GET requests for /resources/** by efficiently serving 
+		up static resources in the ${webappRoot}/resources directory -->
+	<resources mapping="/resources/**" location="/resources/" />
+
+	<!-- Resolves views selected for rendering by @Controllers to .jsp resources 
+		in the /WEB-INF/views directory -->
+	<beans:bean id="templateResolver"
+		class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="suffix" value=".html" />
+		<beans:property name="templateMode" value="HTML5" />
+	</beans:bean>
+
+	<beans:bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
+		<beans:property name="templateResolver" ref="templateResolver" />
+		<beans:property name="additionalDialects">
+			<beans:set>
+				<beans:bean class="nz.net.ultraq.thymeleaf.LayoutDialect" />
+			</beans:set>
+		</beans:property>
+	</beans:bean>
+
+	<beans:bean class="org.thymeleaf.spring3.view.ThymeleafViewResolver">
+		<beans:property name="templateEngine" ref="templateEngine" />
+		<beans:property name="order" value="1" />
+	</beans:bean>
+
+	<beans:bean
+		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+		<beans:property name="prefix" value="/WEB-INF/views/" />
+		<beans:property name="order" value="2" />
+		<beans:property name="suffix" value=".html" />
+	</beans:bean>
+
+	<beans:bean name="main" class="org.thymeleaf.spring3.view.ThymeleafView">
+		<beans:property name="staticVariables">
+			<beans:map>
+				<beans:entry key="footer" value="Some company: &lt;b&gt;ACME&lt;/b&gt;" />
+			</beans:map>
+		</beans:property>
+	</beans:bean>
+
+	<context:component-scan base-package="eu.cloudscale.showcase.servlets" />
+
+</beans:beans>
diff --git a/src/main/webapp/WEB-INF/spring/root-context.xml b/src/main/webapp/WEB-INF/spring/root-context.xml
new file mode 100644
index 0000000..9cbb4aa
--- /dev/null
+++ b/src/main/webapp/WEB-INF/spring/root-context.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<!-- Root Context: defines shared resources visible to all other web components -->
+	<import resource="classpath:app-context.xml" />
+</beans>
diff --git a/src/main/webapp/WEB-INF/views/admin.html b/src/main/webapp/WEB-INF/views/admin.html
new file mode 100644
index 0000000..496e5be
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/admin.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Edit item</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div th:if="${error}" class="alert alert-error">
+		<p th:text="${error}"></p>
+	</div>
+	<div th:unless="${error}">
+		<form th:action="@{/admin-confirm(I_ID= ${item.IId})}" th:object="${item}" method="post">
+			<div class="pull-left">
+				<div>
+					<strong>Title:</strong><span th:text="*{ITitle}"></span>
+				</div>
+				<div>
+					<strong>Author:</strong> <span th:text="*{author.AFname}"></span> <span th:text="*{author.ALname}"></span>
+				</div>
+				<div>
+					<strong>Suggested Retail:</strong> $<span th:text="*{ICost}"></span>
+				</div>
+				<div>
+					<strong>Our Current Price:</strong> $<span style="color: red;" th:text="*{ICost}"></span>
+				</div>
+				<div>
+					<strong>Enter new price:</strong> $<input type="text" name="new_price" />
+				</div>
+				<div>
+					<strong>Enter new picture:</strong> <input type="text" name="new_picture" />
+				</div>
+				<div>
+					<strong>Enter new thumbnail:</strong> <input type="text" name="new_thumbnail"/>
+				</div>
+			</div>
+			<div class="pull-left">
+				<img th:src="@{ ${imgResourceUrl} + '/' + *{IThumbnail}}" src="" width="100" height="100" />
+			</div>
+			<div class="clearfix"></div>
+			<input type="hidden" value="*{IId}" name="itemId"/>
+			<input type="submit" value="Submit Changes" class="btn btn-normal"/>
+		</form>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/best-sellers.html b/src/main/webapp/WEB-INF/views/best-sellers.html
new file mode 100644
index 0000000..09896ec
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/best-sellers.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Best sellers</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{${imgResourceUrl}} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<table>
+		<thead>
+			<tr>
+				<th style="width: 50px; font-weight: bold;">
+					#
+				</th>
+				<th>
+					Author
+				</th>
+				<th>
+					Title
+				</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr th:each="item, count : ${products}">
+				<td style="width: 50px; font-weight: bold;" th:text="${count.count}"></td>
+<!-- 					<td th:text="${item}"></td> -->
+					<td th:text="${item[2] + ' ' + item[3]}">
+				</td>
+				<td>
+					<a th:href="@{'/product-detail?I_ID=' + ${item[0]} + '' + ${productUrl}}" th:text="${item[1]}"></a>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	
+	<div class="footer">
+	</div>
+</div>
+</body>
+</html>
diff --git a/src/main/webapp/WEB-INF/views/buy.html b/src/main/webapp/WEB-INF/views/buy.html
new file mode 100644
index 0000000..64b2221
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/buy.html
@@ -0,0 +1,192 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Buy</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="container-narrow">
+		<div th:if="${!errors.isEmpty()}" class="alert alert-error">
+			<div th:each="error : ${errors}" th:text="${error}"></div>
+		</div>
+		<div th:unless="${!errors.isEmpty()}">
+			<form th:action="@{/payment(C_ID=${customer.CId})}" method="get">
+				<div class="billing-info">
+					<h2>Billing information:</h2>
+					<table>
+						<tr>
+							<td>Firstname:</td>
+							<td th:text="${customer.CFname}"></td>
+						</tr>
+						<tr>
+							<td>Lastname:</td>
+							<td th:text="${customer.CLname}"></td>
+						</tr>
+					</table>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet1}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street2:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet2}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">City:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrCity}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">State:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrState}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Zip:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrZip}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Country:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.country.coName}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Email</div>
+					<div class="pull-left content" th:text="${customer.CEmail}">
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Phone:</div>
+					<div class="pull-left content" th:text="${customer.CPhone}">
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet1}"></div>
+					<div class="clearfix"></div>
+				</div>
+				<hr />
+				<div class="shipping-info">
+					<h2>Shipping information:</h2>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content">
+						<input type="text" name="street1" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street 2:</div>
+					<div class="pull-left content">
+						<input type="text" name="street2" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">City:</div>
+					<div class="pull-left content">
+						<input type="text" name="city" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">State:</div>
+					<div class="pull-left content">
+						<input type="text" name="state" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Zip:</div>
+					<div class="pull-left content">
+						<input type="text" name="zip" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Country:</div>
+					<div class="pull-left content">
+						<input type="text" name="country" />
+					</div>
+					<div class="clearfix"></div>
+				</div>
+				<div class="clearfix"></div>
+				<hr />
+				<h2>Order information:</h2>
+				<div>
+					<table class="table">
+						<thead>
+							<tr>
+								<th>OTY</th>
+								<th>Product</th>
+							</tr>
+						</thead>
+						<tbody>
+							<tr th:if="${cart != null and cart.shoppingCartLines != null}" th:each="line, i : ${cart.shoppingCartLines}">
+								<td th:text="${line.sclQty}"></td>
+								<td>Title: <i th:text="${line.item.ITitle}"></i> - Backing:
+									<span th:text="${line.item.IBacking}"></span><br /> SRP. $<span
+									th:text="${line.item.ISrp}"></span> <span style="color: red;"><strong>Your
+											Price: <span th:text="${line.item.ICost}"></span>
+									</strong></span>
+								</td>
+							</tr>
+						</tbody>
+					</table>
+				</div>
+				<div>
+					Subtotal width discount (0.0%): $<span th:text="${subTotal}"></span><br />
+					Tax:<br /> Shipping and Handling: <br /> Total: $<span
+						th:text="${subTotal}"></span><br />
+				</div>
+				<hr />
+				<div class="payment">
+					<div class="pull-left myLabel">CreditCartType</div>
+					<div class="pull-left content">
+						<label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Visa" checked="checked" />Visa&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="MasterCard" />MasterCard&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Discover" />Discover&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Amex" />American Express&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Diners" />Diners&nbsp;
+						</label>
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Name on Credit Card</div>
+					<div class="pull-left content">
+						<input name="CC_NAME" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Credit Card Number</div>
+					<div class="pull-left content">
+						<input name="CC_NUMBER" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Credit Card Expiration Date
+						(mm/dd/yyyy)</div>
+					<div class="pull-left content">
+						<input name="CC_EXPIRY" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Shipping method</div>
+					<div class="pull-left content">
+						<label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="AIR" checked="checked" />AIR&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="UPS" />UPS&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="FEDEX" />FEDEX&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="SHIP" />SHIP&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="COURIER" />COURIER&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="MAIL" />MAIL&nbsp;
+						</label>
+					</div>
+					<div class="clearfix"></div>
+				</div>
+				<input type="hidden" name="distribution" value="gauss" />
+				<input type="hidden" name="attr1" value="1" />
+				<input type="hidden" name="attr2" value="2" />
+				<input type="hidden" name="attr3" value="0" />
+				<input th:if="${cart}" th:value="${cart.scId}" type="hidden"
+					name="SHOPPING_ID" /> <input th:if="${customer}"
+					th:value="${customer.CId}" type="hidden" name="C_ID" /> <input
+					class="btn btn-primary" type="submit" value="Submit" />
+			</form>
+		</div>
+	</div>
+</div>
+</body>
+</html>
diff --git a/src/main/webapp/WEB-INF/views/buy.html~ b/src/main/webapp/WEB-INF/views/buy.html~
new file mode 100644
index 0000000..3acdbcc
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/buy.html~
@@ -0,0 +1,188 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Buy</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="container-narrow">
+		<div th:if="${!errors.isEmpty()}" class="alert alert-error">
+			<div th:each="error : ${errors}" th:text="${error}"></div>
+		</div>
+		<div th:unless="${!errors.isEmpty()}">
+			<form th:action="@{/buy-confirm(C_ID=${customer.CId})}" method="get">
+				<div class="billing-info">
+					<h2>Billing information:</h2>
+					<table>
+						<tr>
+							<td>Firstname:</td>
+							<td th:text="${customer.CFname}"></td>
+						</tr>
+						<tr>
+							<td>Lastname:</td>
+							<td th:text="${customer.CLname}"></td>
+						</tr>
+					</table>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet1}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street2:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet2}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">City:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrCity}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">State:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrState}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Zip:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrZip}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Country:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.country.coName}"></div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Email</div>
+					<div class="pull-left content" th:text="${customer.CEmail}">
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Phone:</div>
+					<div class="pull-left content" th:text="${customer.CPhone}">
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content"
+						th:text="${customer.address.addrStreet1}"></div>
+					<div class="clearfix"></div>
+				</div>
+				<hr />
+				<div class="shipping-info">
+					<h2>Shipping information:</h2>
+					<div class="pull-left myLabel">Address street1:</div>
+					<div class="pull-left content">
+						<input type="text" name="street1" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Address street 2:</div>
+					<div class="pull-left content">
+						<input type="text" name="street2" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">City:</div>
+					<div class="pull-left content">
+						<input type="text" name="city" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">State:</div>
+					<div class="pull-left content">
+						<input type="text" name="state" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Zip:</div>
+					<div class="pull-left content">
+						<input type="text" name="zip" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Country:</div>
+					<div class="pull-left content">
+						<input type="text" name="country" />
+					</div>
+					<div class="clearfix"></div>
+				</div>
+				<div class="clearfix"></div>
+				<hr />
+				<h2>Order information:</h2>
+				<div>
+					<table class="table">
+						<thead>
+							<tr>
+								<th>OTY</th>
+								<th>Product</th>
+							</tr>
+						</thead>
+						<tbody>
+							<tr th:if="${cart and cart.shoppingCartLines}" th:each="line, i : ${cart.shoppingCartLines}">
+								<td th:text="${line.sclQty}"></td>
+								<td>Title: <i th:text="${line.item.ITitle}"></i> - Backing:
+									<span th:text="${line.item.IBacking}"></span><br /> SRP. $<span
+									th:text="${line.item.ISrp}"></span> <span style="color: red;"><strong>Your
+											Price: <span th:text="${line.item.ICost}"></span>
+									</strong></span>
+								</td>
+							</tr>
+						</tbody>
+					</table>
+				</div>
+				<div>
+					Subtotal width discount (0.0%): $<span th:text="${subTotal}"></span><br />
+					Tax:<br /> Shipping and Handling: <br /> Total: $<span
+						th:text="${subTotal}"></span><br />
+				</div>
+				<hr />
+				<div class="payment">
+					<div class="pull-left myLabel">CreditCartType</div>
+					<div class="pull-left content">
+						<label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Visa" checked="checked" />Visa&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="MasterCard" />MasterCard&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Discover" />Discover&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Amex" />American Express&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="CC_TYPE" value="Diners" />Diners&nbsp;
+						</label>
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Name on Credit Card</div>
+					<div class="pull-left content">
+						<input name="CC_NAME" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Credit Card Number</div>
+					<div class="pull-left content">
+						<input name="CC_NUMBER" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Credit Card Expiration Date
+						(mm/dd/yyyy)</div>
+					<div class="pull-left content">
+						<input name="CC_EXPIRY" />
+					</div>
+					<div class="clearfix"></div>
+					<div class="pull-left myLabel">Shipping method</div>
+					<div class="pull-left content">
+						<label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="AIR" checked="checked" />AIR&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="UPS" />UPS&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="FEDEX" />FEDEX&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="SHIP" />SHIP&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="COURIER" />COURIER&nbsp;
+						</label> <label class="radio pull-left"> <input type="radio"
+							name="SHIPPING" value="MAIL" />MAIL&nbsp;
+						</label>
+					</div>
+					<div class="clearfix"></div>
+				</div>
+				<input th:if="${cart}" th:value="${cart.scId}" type="hidden"
+					name="SHOPPING_ID" /> <input th:if="${customer}"
+					th:value="${customer.CId}" type="hidden" name="C_ID" /> <input
+					class="btn btn-primary" type="submit" value="Submit" />
+			</form>
+		</div>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/buy-confirm.html b/src/main/webapp/WEB-INF/views/buy-confirm.html
new file mode 100644
index 0000000..680b1d3
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/buy-confirm.html
@@ -0,0 +1,71 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Buy confirm</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div th:if="${!errors.isEmpty()}" class="alert alert-error">
+		<div th:each="error : ${errors}" th:text="${error}">
+		</div>
+	</div>
+	<div th:unless="${!errors.isEmpty()}">
+		<h2 align="center">Buy confirm</h2>
+		<h2>Order information:</h2>
+		<table class="table">
+			<thead>
+				<tr>
+					<th>
+						QTY
+					</th>
+					<th>
+						Product
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<tr th:each="line : ${results.cart.shoppingCartLines}">
+					<td th:text="${line.sclQty}">
+					</td>
+					<td>
+						Title: <i th:text="${line.item.ITitle}"></i> - Backing: 
+						<span th:text="${line.item.IBacking}"></span><br />
+						SRP. $<span th:text="${line.item.ISrp}"></span>
+						<span style="color: red;"><strong>Your Price: <span th:text="${line.item.ICost}"></span></strong></span>
+					</td>
+				</tr>
+			</tbody>
+		</table>
+		<h2>Your order has been processed</h2>
+		<div class="pull-left myLabel">
+			Subtotal with discount:
+		</div>
+		<div class="pull-left content" th:text="${scSubTotal}">
+		</div>
+		<div class="clearfix"></div>
+		<div class="pull-left myLabel">
+			Tax (8.25%):
+		</div>
+		<div class="pull-left content" th:text="${scTax}">
+		</div>
+		<div class="clearfix"></div>
+		<div class="pull-left myLabel">
+			Shipping and Handling:
+		</div>
+		<div class="pull-left content" th:text="${scShipCost}">
+		</div>
+		<div class="clearfix"></div>
+		<div class="pull-left myLabel">
+			Total:
+		</div>
+		<div class="pull-left content" th:text="${scTotal}">
+		</div>
+		<div class="clearfix"></div>
+		<h2>Order Number: <span th:text="${results.order.OId}"></span></h2>
+		<h1>Thank you for shopping at TPC-W</h1>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/customer-registration.html b/src/main/webapp/WEB-INF/views/customer-registration.html
new file mode 100644
index 0000000..d15b5ee
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/customer-registration.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Customer registration</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<h2 align="center">Customer registration</h2>
+	<form th:action="@{'/buy;jsessionid=' + ${sessionId}}" method="get">
+		<div>
+			<label class="radio">
+				<input type="radio" name="RETURNING_FLAG" value="Y" checked="checked" />I am existing user
+			</label>
+		</div>
+		<div>
+			<label class="radio">
+				<input type="radio" name="RETURNING_FLAG" value="N" />I am a first time customer
+			</label>
+		</div>
+		<hr />
+		<div>
+			<strong>If you are an existing customer, enter your username and password:</strong><br/>
+			<br />
+			<fieldset>
+				<label>
+					Username:
+				</label>
+				<input name="username" type="text" />
+				<label>
+					Password:
+				</label>
+				<input name="password" type="password" />
+			</fieldset>
+		</div>
+		<hr />
+		<div>
+			<strong>If you are a first time customer, enter the details below:</strong><br />
+			<br />
+			<fieldset>
+				<label>Enter your birth date (mm/dd/yyyy):</label>
+				<input name="birthdate" />
+				<label>Enter your first name: </label>
+				<input name="fname" />
+				<label>Enter your last name: </label>
+				<input name="lname" />
+				<label>
+					Enter your address 1:
+				</label>
+				<input name="street1" />
+				<label>
+					Enter your address 2:
+				</label>
+				<input name="street2" />
+				<label>
+					Enter your City, State, Zip:
+				</label> 
+				<input name="city" placeholder="City" /> 
+				<input name="state" placeholder="State" /> 
+				<input name="zip" placeholder="Zip" />
+				<label>
+					Enter your Country: 
+				</label>
+				<input name="country" />
+				<label>
+					Enter your Phone: 
+				</label>
+				<input name="phone" />
+				<label>
+				Enter your Email: 
+				</label>
+				<input name="email" />
+				<label>
+					Special Instructions: 
+				</label>
+				<textarea name="data" rows="4" cols="65"></textarea>
+				<input th:if="${customerId}" type="hidden" th:value="${customerId}" name="C_ID" />
+				<input th:if="${shoppingId}" type="hidden" th:value="${shoppingId}" name="SHOPPING_ID" />
+			</fieldset>
+		</div>
+		<center><input type="submit" value="Submit" class="btn" /></center>
+	</form>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/home.html b/src/main/webapp/WEB-INF/views/home.html
new file mode 100644
index 0000000..607ae5b
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/home.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>TPC-W</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+<!-- 	<div th:text="${welcomeMessage}"> -->
+<!-- 	</div> -->
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{ ${imgResourceUrl} + '/' + ${item.IThumbnail}}" src="" width="100" height="100" />
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<div class="categories">
+		<div>
+			<div class="pull-left" style="width: 340px; text-align: center;">
+				<h3>What's new</h3>
+			</div>
+			<div class="pull-right" style="width: 260px; text-align: center;">
+				<h3>Best sellers</h3>
+			</div>
+			<div class="clearfix"></div>
+		</div>
+		<div>
+			<div class="pull-left left-column">
+				<table>
+					<tr th:each="category : ${categories}">
+						<td>
+							<a th:text="${category.left}" th:href="@{'/new-products?SUBJECT=' + ${category.leftUrl}}"></a>
+						</td>
+						<td>
+							<a th:text="${category.right}" th:href="@{'/new-products?SUBJECT=' + ${category.rightUrl}}"></a>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<div class="pull-right right-column">
+				<table>
+					<tr th:each="category : ${categories}">
+						<td>
+							<a th:text="${category.left}" th:href="@{'/best-sellers?SUBJECT=' + ${category.leftUrl}}"></a>
+						</td>
+						<td>
+							<a th:text="${category.right}" th:href="@{'/best-sellers?SUBJECT=' + ${category.rightUrl}}"></a>
+						</td>
+					</tr>
+				</table>
+			</div>
+			<div class="clearfix"></div>
+		</div>		
+	</div>
+</div>
+
+</body>
+</html>
diff --git a/src/main/webapp/WEB-INF/views/login.html b/src/main/webapp/WEB-INF/views/login.html
new file mode 100644
index 0000000..f43ff9a
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/login.html
@@ -0,0 +1,92 @@
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-3.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+		xmlns:th="http://www.thymeleaf.org">
+<head>
+    <title>Order inquiry</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
+    <link rel="stylesheet" href="" th:href="@{/resources/css/bootstrap.min.css}"/>
+    <link rel="stylesheet" href="" th:href="@{/resources/css/bootstrap-responsive.min.css}"/>
+    <style type="text/css">
+        body {
+          padding-top: 20px;
+          padding-bottom: 40px;
+        }
+        
+        /* Custom container */
+        .container-narrow {
+          margin: 0 auto;
+          max-width: 700px;
+        }
+        .container-narrow > hr {
+          margin: 30px 0;
+        }
+        
+        /* Main marketing message and sign up button */
+        .jumbotron {
+          margin: 60px 0;
+          text-align: center;
+        }
+        .jumbotron h1 {
+          font-size: 72px;
+          line-height: 1;
+        }
+        .jumbotron .btn {
+          font-size: 21px;
+          padding: 14px 24px;
+        }
+        
+        /* Supporting marketing content */
+        .marketing {
+          margin: 60px 0;
+        }
+        .marketing p + h4 {
+          margin-top: 28px;
+        }
+        .promotional{
+        	margin: auto;
+        	width: 550px;
+        }
+        .promotional .pull-left{
+        	padding-right: 10px;
+        }
+        .left-column table td, 
+        .right-column table td{
+        	width: 150px;
+        	text-align: center;
+        }
+    </style>
+</head>
+<body>
+<div class="container-narrow">
+
+	<div class="masthead">
+		<ul class="nav nav-pills pull-right">
+		  <li><a href="#">Search</a></li>
+		  <li><a href="#">Shopping cart</a></li>
+		  <li><a href="#">Order list</a></li>
+		</ul>
+		<h3 class="muted"><a href="/" th:href="@{/}"><img th:src="@{/resources/img/logo-CloudScale.png}" /></a></h3>
+	</div>
+	
+	<hr />
+	<div th:if="${errors}" class="alert alert-error">
+		<div th:each="error : ${errors}" th:text="${error}"></div>
+	</div>
+	<form action="#"  th:action="@{/login}" method="post">
+		<input type="hidden" th:value="${referer}" name="referer" />
+		<fieldset>
+			<label>
+				Username:
+			</label>
+			<input name="username" type="text" />
+			<label>
+				Password:
+			</label>
+			<input name="password" type="password" />
+			<label></label>
+			<input class="btn" type="submit" value="Submit" />
+		</fieldset>
+	</form>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/new-products.html b/src/main/webapp/WEB-INF/views/new-products.html
new file mode 100644
index 0000000..cad7890
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/new-products.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>New products</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{${imgResourceUrl}} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<table>
+		<thead>
+			<tr>
+				<th style="width: 50px; font-weight: bold;">
+					#
+				</th>
+				<th>
+					Author
+				</th>
+				<th>
+					Title
+				</th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr th:each="item, count : ${products}">
+				<td style="width: 50px; font-weight: bold;" th:text="${count.count}"></td>
+				<td th:text="${item.author.AFname + ' ' + item.author.ALname}">
+				</td>
+				<td>
+					<a th:href="@{'/product-detail?I_ID=' + ${item.IId}} + ${productUrl}" th:text="${item.ITitle}"></a>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	
+	<div class="footer">
+	</div>
+</div>
+</body>
+</html>
diff --git a/src/main/webapp/WEB-INF/views/order-display.html b/src/main/webapp/WEB-INF/views/order-display.html
new file mode 100644
index 0000000..816aa1b
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/order-display.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Order display</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div class="alert alert-error" th:if="${!errors.isEmpty()}" th:each="erro : ${errors}">
+		<div th:text="${err}"></div>		
+	</div>
+	<div th:unless="${!errors.isEmpty()}">
+		<div th:if="${order}">
+			<p>
+				<strong>Order ID:</strong><span th:text="${order.OId}"></span>
+			</p>
+			<p>
+				<strong>Order Placed on:</strong>
+				<span th:text="${order.ODate}"></span>
+			</p>
+			<p>
+				<strong>Shipping Type:</strong>
+				<span th:text="${order.OShipType}"></span>
+			</p>
+			<p>
+				<strong>Ship date:</strong>
+				<span th:text="${order.OShipDate}"></span>
+			</p>
+			<p>
+				<strong>Order subtotal:</strong>
+				<span th:text="${order.OSubTotal}"></span>
+			</p>
+			<p>
+				<strong>Order Tax:</strong>
+				<span th:text="${order.OTax}"></span>
+			</p>
+			<p>
+				<strong>Order Total:</strong>
+				<span th:text="${order.OTotal}"></span>
+			</p>
+			
+			<div class="pull-left" style="width: 400px">
+				<strong>
+					Bill To:<br/>
+					<span th:text="${order.customer.CFname} + ' ' + ${order.customer.CLname}"></span><br />
+				</strong>
+				<br />
+				<address>
+					<span th:text="${order.addressByOShipAddrId.addrStreet1}"></span><br />
+					<span th:text="${order.addressByOShipAddrId.addrStreet2}"></span><br />
+					<span th:text="${order.addressByOShipAddrId.addrState} + ' ' + ${order.addressByOShipAddrId.addrZip}"></span><br />
+					<span th:text="${order.addressByOShipAddrId.country.coName}"></span>
+				</address>
+				<br />
+				Email: <span th:text="${order.customer.CEmail}"></span><br/>
+				Phone: <span th:text=" ${order.customer.CPhone}"></span><br/>
+				<br />
+				Order status: <span th:text="${order.OStatus}"></span><br />
+			</div>
+			<div class="pull-left">
+				<strong>
+					Ship to: 
+				</strong><br />
+				<br />
+				<address>
+					<span th:text="${order.addressByOBillAddrId.addrStreet1}"></span><br />
+					<span th:text="${order.addressByOBillAddrId.addrStreet2}"></span><br />
+					<span th:text="${order.addressByOBillAddrId.addrState} + ' ' + ${order.addressByOBillAddrId.addrZip}"></span><br />
+					<span th:text="${order.addressByOBillAddrId.country.coName}"></span><br />
+				</address>
+			</div>
+			
+			<table class="table">
+				<thead>
+					<tr>
+						<th>
+							Item #
+						</th>
+						<th>
+							Title
+						</th>
+						<th>
+							Cost
+						</th>
+						<th>
+							QTY
+						</th>
+						<th>
+							Discount
+						</th>
+						<th>
+							Comment
+						</th>
+					</tr>	
+				</thead>
+				<tbody>
+					<tr th:each="o : ${orderLines}">
+						<td th:text="${o.olId}"></td>
+						<td th:text="${o.item.ITitle}"></td>
+						<td th:text="${o.item.ICost}"></td>
+						<td th:text="${o.olQty}"></td>
+						<td th:text="${o.olDiscount}"></td>
+						<td th:text="${o.olComment}"></td>
+					</tr>
+				</tbody>
+			</table> 
+		</div>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/order-inquiry.html b/src/main/webapp/WEB-INF/views/order-inquiry.html
new file mode 100644
index 0000000..92c91cf
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/order-inquiry.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Order inquiry</title>
+  </head>
+<body>
+<div layout:fragment="content">	
+	<div>
+		<form th:action="@{/order-display}" method="get" >
+			<fieldset>
+			<label>
+				Username:
+			</label>
+			<input name="username" type="text" />
+			<label>
+				Password:
+			</label>
+			<input name="password" type="password" />
+			<label></label>
+			<div th:if="${shoppingId}" >
+				<input type="hidden" name="SHOPPING_ID" th:value="${shoppingId}" />
+			</div>
+			<div th:if="${customerId}">
+				<input type="hidden" name="C_ID" th:value="${customerId}" />
+			</div>
+			<input class="btn" type="submit" value="Display last order" />
+		</fieldset>
+		</form>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/payment.html b/src/main/webapp/WEB-INF/views/payment.html
new file mode 100644
index 0000000..46f051c
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/payment.html
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Payment in process</title>
+  	<script src="//code.jquery.com/jquery-1.11.2.min.js"></script>
+  	<script th:inline="javascript">
+  	/*<![CDATA[*/
+	$(document).ready(function() {
+		
+		// Check The Status Every 2 Seconds
+		var timer = setInterval(function() {
+			
+			$.ajax({
+				  url: /*[[@{'/payment/status'}]]*/,
+				  success: function(data) {
+					
+					if(data !== 'WORKING') {
+						window.location = data;
+						clearInterval(timer);
+					}
+				  }
+			});
+			
+		}, 2000);
+	});
+	/*]]>*/	
+</script>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div th:if="${!errors.isEmpty()}" class="alert alert-error">
+		<div th:each="error : ${errors}" th:text="${error}">
+		</div>
+	</div>
+	<div th:unless="${!errors.isEmpty()}">
+		Payment in progress. This may take a while...
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/product_detail.html b/src/main/webapp/WEB-INF/views/product_detail.html
new file mode 100644
index 0000000..b840526
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/product_detail.html
@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Product detail page</title>
+  </head>
+<body>
+<div layout:fragment="content">
+
+		<div class="row-fluid marketing">
+			<dl class="dl-horizontal">
+				<dt>Title</dt>
+				<dd th:text="${item.ITitle}">Title</dd>
+
+				<dt>Author</dt>
+				<dd th:text="${item.author.AFname + ' ' + item.author.ALname}">FirstName LastName</dd>
+
+				<dt>Subject</dt>
+				<dd th:text="${item.ISubject}">Subject</dd>
+				
+				<dt>Description</dt>
+				<dd th:text="${item.IDesc}">Description</dd>
+			    
+			    <dt>Suggested Retail Price</dt>
+			    <dd th:text="${item.ISrp}">Suggested Retail Price</dd>
+			    
+			    <dt>Our Price</dt>
+			    <dd th:text="${item.ICost}">Our Price</dd>
+			    
+			    <dt>You save</dt>
+			    <dd th:with="savings=(${item.ISrp} - ${item.ICost})" 
+			         th:text="${savings}">You save</dd>
+			    
+			    <dt>Backing</dt>
+			    <dd><span th:text="${item.IBacking}">Item Backing</span><span th:text="${item.IPage}">Item page</span></dd>
+			    
+			    <dt>Published by</dt>
+			    <dd th:text="${item.IPublisher}">Publisher</dd>
+			    
+			    <dt>Publication date</dt>
+			    <dd th:text="${item.IPubDate}">Pub date</dd>
+			    
+			    <dt>Avail date</dt>
+			    <dd th:text="${item.IAvail}">Avail date</dd>
+			    
+			    <dt>Dimensions</dt>
+			    <dd th:text="${item.IDimension}">Dimensions</dd>
+			    
+			    <dt>ISBN</dt>
+			    <dd th:text="${item.IIsbn}">ISBN</dd>
+			</dl>
+		</div>
+		<div>
+			<a class="btn" th:href="@{${addToShoppingCartUrl}}">Add to cart</a>
+			&nbsp;<a class="btn" th:href="@{'/admin?I_ID=' + ${item.IId}}">Update</a>
+			
+		</div>
+	</div>
+</body>
+</html>
diff --git a/src/main/webapp/WEB-INF/views/search.html b/src/main/webapp/WEB-INF/views/search.html
new file mode 100644
index 0000000..b412687
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/search.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Search</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	
+	<div class="jumbotron">
+		<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+	</div>
+	<div class="promotional">
+		<div class="pull-left" th:each="item : ${promotional}">
+			<a th:href="@{'/product-detail?I_ID=' + ${item.IId} + '' + ${productUrl}}">
+				<img th:src="@{ ${imgResourceUrl} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+			
+			</a>
+		</div>
+		<div class="clearfix"></div>
+	</div>
+	
+	<hr />
+	
+	<form method="get">
+	Search by: 
+	<select name="searchField">
+		<option value="author">
+			Author
+		</option>
+		<option value="title">
+			Title
+		</option>
+		<option value="subject">
+			Subject
+		</option>
+	</select>
+	<input type="text" name="keyword" th:value="${keyword}"/>
+	<input type="submit" value="Submit"/>
+	</form>
+	<div th:if="${results != null and not results.isEmpty()}" class="search-results">
+		<table>
+			<thead>
+				<tr>
+					<th style="width: 50px; font-weight: bold;">
+						#
+					</th>
+					<th>
+						Author
+					</th>
+					<th>
+						Title
+					</th>
+				</tr>
+			</thead>
+			<tbody>
+				<tr th:each="item, count : ${results}">
+					<td style="width: 50px; font-weight: bold;" th:text="${count.count}"></td>
+					<td th:text="${item.author.AFname + ' ' + item.author.ALname}">
+					</td>
+					<td>
+						<a th:href="@{'/product-detail?I_ID=' + ${item.IId}} + ${productUrl}" th:text="${item.ITitle}"></a>
+					</td>
+				</tr>
+			</tbody>
+		</table>
+	</div>
+	<div th:unless="${ results != null and not results.isEmpty()}">
+		No results!
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/shopping-cart.html b/src/main/webapp/WEB-INF/views/shopping-cart.html
new file mode 100644
index 0000000..d49c159
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/shopping-cart.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+  layout:decorator="/templates/layout">
+  <head>
+  	<title>Shopping cart</title>
+  </head>
+<body>
+<div layout:fragment="content">
+	<div th:if="${errors.isEmpty()}">
+		<div class="jumbotron">
+			<h1>TPC Web Commerce Benchmark (TPC-W)</h1>
+		</div>
+		<div class="promotional">
+			<div class="pull-left" th:each="item : ${promotional}">
+				<a th:href="@{'/product-detail?I_ID=' + ${item.IId}}">
+					<img th:src="@{ ${imgResourceUrl} + '/' + ${item.IThumbnail}" src="" width="100" height="100" />
+				</a>
+			</div>
+			<div class="clearfix"></div>
+		</div>
+		
+		<hr />
+		<div th:if="${cart != null and cart.shoppingCartLines != null}">
+			<form action="" method="get">
+				<table class="table">
+					<thead>
+						<tr>
+							<th>
+								QTY
+							</th>
+							<th>
+								Product
+							</th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr th:each="line, i : ${cart.shoppingCartLines}">
+							<td>
+								<input type="hidden" th:name="'I_ID_' + ${i.index}" th:value="${line.item.IId}" />
+								<input th:name="'QTY_' + ${i.index}" size="3" th:value="${line.sclQty}" />
+							</td>
+							<td>
+								Title: <i th:text="${line.item.ITitle}"></i> - Backing: 
+								<span th:text="${line.item.IBacking}"></span><br />
+								SRP. $<span th:text="${line.item.ISrp}"></span>
+								<span style="color: red;"><strong>Your Price: <span th:text="${line.item.ICost}"></span></strong></span>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+				<strong>Subtotal: <span th:text="${subTotal}"></span></strong>
+				<div style="text-align: center">
+					<a class="btn" th:href="@{${checkoutUrl}}">Checkout</a>
+					<a class="btn" th:href="@{${homeUrl}}">Home</a>
+				</div>
+				<p style="text-align:center">
+					If you have changed the quantities and/or taken anything out<br />
+					of your shopping cart, click here to refresh your shopping cart:
+				</p>
+				<input type="hidden" name="ADD_FLAG" value="N" />
+				<input type="hidden" name="SHOPPING_ID" th:value="${cart.scId}" />
+				<input th:if="${customerId}" type="hidden" name="C_ID" th:value="${customerId}"/>
+				<input type="submit" value="Update" class="btn" />
+			</form>
+		</div>
+		<div th:unless="${cart != null and cart.shoppingCartLines != null}">
+			Empty cart!
+		</div>
+		
+	</div>
+	<div th:unless="${errors.isEmpty()}">
+		<div class="alert alert-error">
+			<div th:each="error : ${errors}" th:text="error"></div>
+		</div>
+	</div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/templates/layout.html b/src/main/webapp/WEB-INF/views/templates/layout.html
new file mode 100644
index 0000000..6f0319e
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/templates/layout.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-3.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+		xmlns:th="http://www.thymeleaf.org">
+<head>
+    <title>TPC-W</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
+    <link rel="stylesheet" href="" th:href="@{${cssResourceUrl} + '/bootstrap.min.css' }"/>
+    <link rel="stylesheet" href="" th:href="@{${cssResourceUrl} + '/bootstrap-responsive.min.css'}"/>
+    <style type="text/css">
+        body {
+          padding-top: 20px;
+          padding-bottom: 40px;
+        }
+        
+        /* Custom container */
+        .container-narrow {
+          margin: 0 auto;
+          max-width: 700px;
+        }
+        .container-narrow > hr {
+          margin: 30px 0;
+        }
+        
+        /* Main marketing message and sign up button */
+        .jumbotron {
+          margin: 60px 0;
+          text-align: center;
+        }
+        .jumbotron h1 {
+          font-size: 72px;
+          line-height: 1;
+        }
+        .jumbotron .btn {
+          font-size: 21px;
+          padding: 14px 24px;
+        }
+        
+        /* Supporting marketing content */
+        .marketing {
+          margin: 60px 0;
+        }
+        .marketing p + h4 {
+          margin-top: 28px;
+        }
+        .promotional{
+        	margin: auto;
+        	width: 550px;
+        }
+        .promotional .pull-left{
+        	padding-right: 10px;
+        }
+        .left-column table td, 
+        .right-column table td{
+        	width: 150px;
+        	text-align: center;
+        }
+        
+        .footer{
+        	padding: 6px;
+        	text-align: center;
+        }
+    </style>
+</head>
+<body>
+<div class="container-narrow">
+
+	<div class="masthead">
+		<ul class="nav nav-pills pull-right">
+		  <li><a th:href="@{${searchUrl}}">Search</a></li>
+		  <li><a th:href="@{${shoppingCartUrl}}">Shopping cart</a></li>
+		  <li><a th:href="@{${orderInquiryUrl}}">Order list</a></li>
+		</ul>
+		<h3 class="muted"><a href="/" th:href="@{/}"><img th:src="@{${imgResourceUrl} + '/logo-CloudScale-aws.png'}" /></a></h3>
+	</div>
+	
+	<hr />
+	<div layout:fragment="content"></div>
+</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..60ac94c
--- /dev/null
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
+  <context-param>
+    <param-name>contextConfigLocation</param-name>
+    <param-value>classpath:app-context.xml</param-value>
+  </context-param>
+  <listener>
+    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+  </listener>
+  <servlet>
+    <servlet-name>appServlet</servlet-name>
+    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+    <init-param>
+      <param-name>contextConfigLocation</param-name>
+      <param-value></param-value>
+    </init-param>
+    <load-on-startup>1</load-on-startup>
+  </servlet>
+  <servlet-mapping>
+    <servlet-name>appServlet</servlet-name>
+    <url-pattern>/*</url-pattern>
+  </servlet-mapping>
+</web-app>
\ No newline at end of file
diff --git a/src/test/resources/log4j.xml b/src/test/resources/log4j.xml
new file mode 100644
index 0000000..b424beb
--- /dev/null
+++ b/src/test/resources/log4j.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+
+	<!-- Appenders -->
+	<appender name="console" class="org.apache.log4j.ConsoleAppender">
+		<param name="Target" value="System.out" />
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
+		</layout>
+	</appender>
+	
+	<!-- Application Loggers -->
+	<logger name="eu.cloudscale.showcase">
+		<level value="info" />
+	</logger>
+	
+	<!-- 3rdparty Loggers -->
+	<logger name="org.springframework.core">
+		<level value="info" />
+	</logger>	
+	
+	<logger name="org.springframework.beans">
+		<level value="info" />
+	</logger>
+	
+	<logger name="org.springframework.context">
+		<level value="info" />
+	</logger>
+
+	<logger name="org.springframework.web">
+		<level value="info" />
+	</logger>
+
+	<!-- Root Logger -->
+	<root>
+		<priority value="info" />
+		<appender-ref ref="console" />
+	</root>
+	
+</log4j:configuration>