You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2018/02/27 16:51:11 UTC

[openmeetings] branch OPENMEETINGS-1649-kurento updated: [OPENMEETINGS-1649] local run with jetty is fixed

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch OPENMEETINGS-1649-kurento
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/OPENMEETINGS-1649-kurento by this push:
     new 2a553a2  [OPENMEETINGS-1649] local run with jetty is fixed
2a553a2 is described below

commit 2a553a228a7a2d02f4e774a0bf59d9dfec9e83cb
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue Feb 27 23:50:59 2018 +0700

    [OPENMEETINGS-1649] local run with jetty is fixed
---
 openmeetings-install/pom.xml                       |   4 +
 .../src/site/xdoc/BuildInstructions.xml            |  12 ++-
 openmeetings-util/pom.xml                          |  12 +++
 .../openmeetings/util/OMContextListener.java       |  26 ++++-
 openmeetings-web/pom.xml                           | 119 +++++++++++----------
 .../apache/openmeetings/web/app/Application.java   |  43 ++++++++
 .../apache/openmeetings/web/app/ClientManager.java |  11 +-
 .../openmeetings/web/app/QuickPollManager.java     |   2 +-
 .../openmeetings/web/app/WhiteboardManager.java    |  14 +--
 .../openmeetings/web/pages/auth/SignInDialog.java  |   4 +
 .../WEB-INF/{classes => }/applicationContext.xml   |   0
 .../src/main/webapp/WEB-INF/red5-web.properties    |  17 ---
 .../src/main/webapp/WEB-INF/red5-web.xml           |  42 --------
 openmeetings-web/src/main/webapp/WEB-INF/web.xml   |  44 ++------
 .../apache/openmeetings/AbstractSpringTest.java    |   3 +-
 .../webservice/AbstractWebServiceTest.java         |  60 ++++++-----
 openmeetings-web/src/test/jetty/jetty-http.xml     |  54 ++++++++++
 openmeetings-web/src/test/jetty/jetty-https.xml    |  61 +++++++++++
 openmeetings-web/src/test/jetty/jetty-ssl.xml      |  52 +++++++++
 openmeetings-web/src/test/jetty/jetty.xml          |  39 +++++++
 pom.xml                                            |  37 ++++---
 21 files changed, 446 insertions(+), 210 deletions(-)

diff --git a/openmeetings-install/pom.xml b/openmeetings-install/pom.xml
index 6e9fd9d..2e8c07a 100644
--- a/openmeetings-install/pom.xml
+++ b/openmeetings-install/pom.xml
@@ -39,6 +39,10 @@
 			<artifactId>spring-context-support</artifactId>
 		</dependency>
 		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-core</artifactId>
+		</dependency>
+		<dependency>
 			<groupId>org.apache.openmeetings</groupId>
 			<artifactId>openmeetings-core</artifactId>
 		</dependency>
diff --git a/openmeetings-server/src/site/xdoc/BuildInstructions.xml b/openmeetings-server/src/site/xdoc/BuildInstructions.xml
index 6cbe1d3..e27fb4b 100644
--- a/openmeetings-server/src/site/xdoc/BuildInstructions.xml
+++ b/openmeetings-server/src/site/xdoc/BuildInstructions.xml
@@ -58,6 +58,12 @@
 			<source>mvn org.apache.maven.plugins:maven-dependency-plugin:3.0.0:analyze-only</source>
 		</section>
 		<section name="Tips and Gotchas">
+			<source><![CDATA[
+MAVEN_OPTS='-Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n' mvn clean -P allModules,quick,mysql,jetty jetty:run-exploded
+
+cd ..; mvn clean install -pl openmeetings-util -P allModules,quick; cd openmeetings-web;
+
+			]]></source>
 			<p>To compile only client you can run following command: </p>
 			<source>
 <![CDATA[
@@ -67,19 +73,19 @@ mvn install -P allModules -pl openmeetings-flash               # compiles a comp
 			<p>In case you would like to develop Openmeetings you need to run <i>"unpacked"</i> build: </p>
 			<source>
 <![CDATA[
-mvn clean install -P allModules,unpacked,mysql -DskipTests=true -Dwicket.mode=DEVELOPMENT
+mvn clean install -P allModules,unpacked,mysql -DskipTests=true -Dwicket.configuration=DEVELOPMENT
 ]]>
 			</source>
 			<p>After modifications are made you can run <i>"quick"</i> build: </p>
 			<source>
 <![CDATA[
-mvn install -P allModules,quick,mysql -pl openmeetings-web -pl openmeetings-server -Dwicket.mode=DEVELOPMENT
+mvn install -P allModules,quick,mysql -pl openmeetings-web -pl openmeetings-server -Dwicket.configuration=DEVELOPMENT
 ]]>
 			</source>
 			<p>Any number of projects can be specified during build: </p>
 			<source>
 <![CDATA[
-mvn install -P allModules,quick,mysql -pl openmeetings-util -pl openmeetings-db -pl openmeetings-core -pl openmeetings-install -pl openmeetings-service -pl openmeetings-web -pl openmeetings-server -pl openmeetings-webservice -Dwicket.mode=DEVELOPMENT
+mvn install -P allModules,quick,mysql -pl openmeetings-util -pl openmeetings-db -pl openmeetings-core -pl openmeetings-install -pl openmeetings-service -pl openmeetings-web -pl openmeetings-server -pl openmeetings-webservice -Dwicket.configuration=DEVELOPMENT
 ]]>
 			</source>
 			<div>
diff --git a/openmeetings-util/pom.xml b/openmeetings-util/pom.xml
index 8ce63dd..e8d7a96 100644
--- a/openmeetings-util/pom.xml
+++ b/openmeetings-util/pom.xml
@@ -120,6 +120,18 @@
 			<artifactId>wicket-extensions</artifactId>
 		</dependency>
 		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>log4j-over-slf4j</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>ch.qos.logback</groupId>
+			<artifactId>logback-classic</artifactId>
+		</dependency>
+		<dependency>
 			<groupId>org.apache.tika</groupId>
 			<artifactId>tika-parsers</artifactId>
 			<version>1.17</version>
diff --git a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OMContextListener.java b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OMContextListener.java
index d6bd72e..9f4c1a3 100644
--- a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OMContextListener.java
+++ b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OMContextListener.java
@@ -21,13 +21,29 @@ package org.apache.openmeetings.util;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
 
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.joran.JoranConfigurator;
+import ch.qos.logback.core.joran.spi.JoranException;
+
 public class OMContextListener implements ServletContextListener {
 
 	@Override
 	public void contextInitialized(ServletContextEvent event) {
-		System.setProperty("current_openmeetings_context_name", pathToName(event));
-		System.setProperty("webapp.contextPath", String.format("/%s"));
-		System.setProperty("logback.configurationFile", "logback-config.xml");
+		String ctx = pathToName(event);
+		System.setProperty("current_openmeetings_context_name", ctx);
+		System.setProperty("webapp.contextPath", String.format("/%s", ctx));
+		try {
+			LoggerContext context = (LoggerContext)LoggerFactory.getILoggerFactory();
+			JoranConfigurator configurator = new JoranConfigurator();
+			configurator.setContext(context);
+			context.reset();
+			configurator.doConfigure("logback-config.xml");
+		} catch (JoranException je) {
+			// StatusPrinter will handle this
+		}
+		//System.setProperty("logback.configurationFile", "logback-config.xml");
 	}
 
 	private static String pathToName(ServletContextEvent event) {
@@ -37,4 +53,8 @@ public class OMContextListener implements ServletContextListener {
 		}
 		return contextName;
 	}
+
+	@Override
+	public void contextDestroyed(ServletContextEvent arg0) {
+	}
 }
diff --git a/openmeetings-web/pom.xml b/openmeetings-web/pom.xml
index 0a77370..59fccab 100644
--- a/openmeetings-web/pom.xml
+++ b/openmeetings-web/pom.xml
@@ -251,10 +251,36 @@
 					<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
 					<webResources>
 						<webResource>
+							<directory>${project.basedir}/src/main/java</directory>
+							<targetPath>WEB-INF/classes</targetPath>
+							<includes>
+								<include>**/*.html</include>
+								<include>**/*.css</include>
+								<include>**/*.js</include>
+								<include>**/*.xml</include>
+								<include>**/*.properties</include>
+							</includes>
+						</webResource>
+						<webResource>
+							<directory>${project.parent.basedir}/openmeetings-service/src/main/java</directory>
+							<targetPath>WEB-INF/classes</targetPath>
+							<includes>
+								<include>**/*.html</include>
+								<include>**/*.css</include>
+								<include>**/*.js</include>
+								<include>**/*.xml</include>
+								<include>**/*.properties</include>
+							</includes>
+						</webResource>
+						<webResource>
 							<directory>${project.build.directory}/generated-res</directory>
 							<targetPath>WEB-INF/classes/META-INF</targetPath>
 							<filtering>true</filtering>
 						</webResource>
+						<webResource>
+							<directory>${project.build.directory}/generated-sources/main/java/</directory>
+							<targetPath>WEB-INF/classes</targetPath>
+						</webResource>
 					</webResources>
 				</configuration>
 				<executions>
@@ -436,13 +462,34 @@
 						<languages.home>${project.build.directory}/test-root/languages</languages.home>
 						<red5.root>red5.root</red5.root>
 						<backups.dir>${old-backups.dir}</backups.dir>
-						<logback.ContextSelector>org.red5.logging.LoggingContextSelector</logback.ContextSelector>
 						<catalina.useNaming>true</catalina.useNaming>
 					</systemPropertyVariables>
 					<skip>${maven.test.skip}</skip>
 				</configuration>
 			</plugin>
 		</plugins>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.eclipse.jetty</groupId>
+					<artifactId>jetty-maven-plugin</artifactId>
+					<version>${jetty9.version}</version>
+					<configuration>
+						<!--systemProperties>
+							<systemProperty>
+								<name>logback.configurationFile</name>
+								<value>${project.build.directory}/${project.build.finalName}/WEB-INF/classes/logback-config.xml</value>
+							</systemProperty>
+						</systemProperties-->
+						<webApp>
+							<contextPath>/openmeetings</contextPath>
+						</webApp>
+						<!-- jettyXml>${project.basedir}/src/test/jetty/jetty.xml,${project.basedir}/src/test/jetty/jetty-ssl.xml,${project.basedir}/src/test/jetty/jetty-http.xml,${project.basedir}/src/test/jetty/jetty-https.xml</jettyXml-->
+						<jettyXml>${project.basedir}/src/test/jetty/jetty.xml,${project.basedir}/src/test/jetty/jetty-http.xml</jettyXml>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
 	</build>
 	<dependencies>
 		<dependency>
@@ -498,6 +545,11 @@
 			<version>${wicket.version}</version>
 		</dependency>
 		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-spring</artifactId>
+			<version>${wicket.version}</version>
+		</dependency>
+		<dependency>
 			<groupId>com.googlecode.wicket-jquery-ui</groupId>
 			<artifactId>wicket-jquery-ui-core</artifactId>
 			<version>${wicketju.version}</version>
@@ -548,44 +600,6 @@
 			<version>${wickets.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.tomcat.embed</groupId>
-			<artifactId>tomcat-embed-websocket</artifactId>
-			<version>${tomcat.version}</version>
-			<!--exclusions> commented for Red5 lib substitution
-				<exclusion>
-					<groupId>org.apache.tomcat.embed</groupId>
-					<artifactId>tomcat-embed-core</artifactId>
-				</exclusion>
-			</exclusions-->
-		</dependency>
-		<dependency>
-			<groupId>org.apache.tomcat</groupId>
-			<artifactId>tomcat-catalina-ha</artifactId>
-			<version>${tomcat.version}</version>
-			<exclusions>
-				<exclusion>
-					<groupId>org.apache.tomcat</groupId>
-					<artifactId>tomcat-coyote</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>org.apache.tomcat</groupId>
-					<artifactId>tomcat-juli</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>org.apache.tomcat</groupId>
-					<artifactId>tomcat-catalina</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>org.apache.tomcat</groupId>
-					<artifactId>tomcat-util</artifactId>
-				</exclusion>
-				<exclusion>
-					<groupId>org.apache.tomcat</groupId>
-					<artifactId>tomcat-util-scan</artifactId>
-				</exclusion>
-			</exclusions>
-		</dependency>
-		<dependency>
 			<groupId>org.apache.commons</groupId>
 			<artifactId>commons-lang3</artifactId>
 		</dependency>
@@ -614,12 +628,6 @@
 			<version>${cxf.version}</version>
 			<scope>test</scope>
 		</dependency>
-		<!--dependency> commented for Red5 lib substitution
-			<groupId>org.apache.tomcat.embed</groupId>
-			<artifactId>tomcat-embed-core</artifactId>
-			<version>${tomcat.version}</version>
-			<scope>test</scope>
-		</dependency-->
 		<dependency>
 			<groupId>org.apache.derby</groupId>
 			<artifactId>derbynet</artifactId>
@@ -637,21 +645,18 @@
 				</exclusion>
 			</exclusions>
 		</dependency>
-		 <!-- added for Red5 lib substitution -->
-		<dependency>
-			<groupId>org.springframework</groupId>
-			<artifactId>spring-context-support</artifactId>
-			<version>${spring.version}</version>
-		</dependency>
+		<!-- JETTY DEPENDENCIES FOR TESTING -->
 		<dependency>
-			<groupId>org.apache.tomcat.embed</groupId>
-			<artifactId>tomcat-embed-core</artifactId>
-			<version>${tomcat.version}</version>
+			<groupId>org.eclipse.jetty</groupId>
+			<artifactId>jetty-webapp</artifactId>
+			<scope>test</scope>
+			<version>${jetty9.version}</version>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.tomcat.embed</groupId>
-			<artifactId>tomcat-embed-jasper</artifactId>
-			<version>${tomcat.version}</version>
+			<groupId>org.eclipse.jetty</groupId>
+			<artifactId>jetty-jmx</artifactId>
+			<version>${jetty9.version}</version>
+			<scope>test</scope>
 		</dependency>
 	</dependencies>
 </project>
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index 495b04f..8881f12 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -18,11 +18,18 @@
  */
 package org.apache.openmeetings.web.app;
 
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_EXT_PROCESS_TTL;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_HEADER_CSP;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_HEADER_XFRAME;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.HEADER_CSP_SELF;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.HEADER_XFRAME_SAMEORIGIN;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getApplicationName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.getExtProcessTtl;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.getWicketApplicationName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.isInitComplete;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.setExtProcessTtl;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.setInitComplete;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.setWicketApplicationName;
 import static org.apache.openmeetings.web.pages.HashPage.INVITATION_HASH;
 import static org.apache.openmeetings.web.user.rooms.RoomEnterBehavior.getRoomUrlFragment;
@@ -30,6 +37,7 @@ import static org.apache.openmeetings.web.util.OmUrlFragment.PROFILE_MESSAGES;
 import static org.apache.wicket.resource.JQueryResourceReference.getV3;
 import static org.springframework.web.context.support.WebApplicationContextUtils.getWebApplicationContext;
 
+import java.io.File;
 import java.net.UnknownHostException;
 import java.text.MessageFormat;
 import java.util.ArrayList;
@@ -46,6 +54,7 @@ import org.apache.openmeetings.core.service.MainService;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
+import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.record.Recording;
@@ -55,7 +64,9 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
+import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
+import org.apache.openmeetings.util.Version;
 import org.apache.openmeetings.util.ws.IClusterWsMessage;
 import org.apache.openmeetings.web.pages.AccessDeniedPage;
 import org.apache.openmeetings.web.pages.ActivatePage;
@@ -105,9 +116,12 @@ import org.apache.wicket.request.http.WebResponse;
 import org.apache.wicket.request.mapper.info.PageComponentInfo;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.request.mapper.parameter.PageParametersEncoder;
+import org.apache.wicket.spring.injection.annot.SpringComponentInjector;
 import org.apache.wicket.validation.validator.UrlValidator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 import org.springframework.web.context.WebApplicationContext;
 import org.wicketstuff.dashboard.WidgetRegistry;
 import org.wicketstuff.dashboard.web.DashboardContext;
@@ -124,6 +138,7 @@ import com.hazelcast.core.MemberAttributeEvent;
 import com.hazelcast.core.MembershipEvent;
 import com.hazelcast.core.MembershipListener;
 
+@Component
 public class Application extends AuthenticatedWebApplication implements IApplication {
 	private static final Logger log = LoggerFactory.getLogger(Application.class);
 	private static boolean isInstalled;
@@ -145,6 +160,11 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 	private String contentSecurityPolicy = OpenmeetingsVariables.HEADER_CSP_SELF;
 	private ITopic<IClusterWsMessage> hazelWsTopic;
 
+	@Autowired
+	private ConfigurationDao cfgDao;
+	@Autowired
+	private RecordingDao recordingDao;
+
 	@Override
 	protected void init() {
 		setWicketApplicationName(super.getName());
@@ -252,6 +272,29 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 		mountResource("/room/preview/${id}", new RoomPreviewResourceReference());
 		mountResource("/profile/${id}", new ProfileImageResourceReference());
 		mountResource("/group/${id}", new GroupLogoResourceReference());
+		getComponentInstantiationListeners().add(new SpringComponentInjector(this));
+
+		log.debug("InitComponent::PostConstruct");
+		try {
+			OmFileHelper.setOmHome(new File(getServletContext().getRealPath("/"))); //FIXME TODO move to OMContextListener
+			LabelDao.initLanguageMap();  //FIXME TODO move to OMContextListener
+
+			log.debug("webAppPath : {}", OmFileHelper.getOmHome()); //FIXME TODO move to OMContextListener
+
+			// Init all global config properties
+			cfgDao.reinit();
+
+			setInitComplete(true);
+			// Init properties
+			setXFrameOptions(cfgDao.getString(CONFIG_HEADER_XFRAME, HEADER_XFRAME_SAMEORIGIN));
+			setContentSecurityPolicy(cfgDao.getString(CONFIG_HEADER_CSP, HEADER_CSP_SELF));
+			updateJpaAddresses(cfgDao);
+			setExtProcessTtl(cfgDao.getInt(CONFIG_EXT_PROCESS_TTL, getExtProcessTtl()));
+			Version.logOMStarted();
+			recordingDao.resetProcessingStatus(); //we are starting so all processing recordings are now errors
+		} catch (Exception err) {
+			log.error("[appStart]", err);
+		}
 	}
 
 	private static class NoVersionMapper extends MountedMapper {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
index cf77652..f64d813 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
@@ -29,7 +29,6 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.function.Predicate;
 
-import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.db.dao.log.ConferenceLogDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.IClient;
@@ -53,18 +52,20 @@ public class ClientManager implements IClientManager {
 
 	@Autowired
 	private ConferenceLogDao confLogDao;
+	/*
 	@Autowired
 	private ScopeApplicationAdapter scopeAdapter;
+	*/
 
-	private Map<String, Client> map() {
+	private static Map<String, Client> map() {
 		return getHazelcast().getMap(ONLINE_USERS_KEY);
 	}
 
-	private Map<String, String> mapUidBySid() {
+	private static Map<String, String> mapUidBySid() {
 		return getHazelcast().getMap(UID_BY_SID_KEY);
 	}
 
-	private IMap<Long, Set<String>> getRooms() {
+	private static IMap<Long, Set<String>> getRooms() {
 		return getHazelcast().getMap(ROOMS_KEY);
 	}
 
@@ -252,7 +253,7 @@ public class ClientManager implements IClientManager {
 		return false;
 	}
 
-	private Client getByKeys(Long userId, String sessionId) {
+	private static Client getByKeys(Long userId, String sessionId) {
 		Client client = null;
 		for (Map.Entry<String, Client> e : map().entrySet()) {
 			Client c = e.getValue();
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/QuickPollManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/QuickPollManager.java
index f5e01e1..e2f8a33 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/QuickPollManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/QuickPollManager.java
@@ -41,7 +41,7 @@ public class QuickPollManager {
 	private static final Logger log = LoggerFactory.getLogger(QuickPollManager.class);
 	private static final String QPOLLS_KEY = "QPOLLS_KEY";
 
-	private IMap<Long, Map<Long, Boolean>> map() {
+	private static IMap<Long, Map<Long, Boolean>> map() {
 		return getHazelcast().getMap(QPOLLS_KEY);
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
index 9a8c4f4..52b9994 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
@@ -42,16 +42,16 @@ import com.hazelcast.core.IMap;
 public class WhiteboardManager implements IWhiteboardManager {
 	private static final String WBS_KEY = "WBS_KEY";
 
-	private IMap<Long, Whiteboards> getCache() {
+	private static IMap<Long, Whiteboards> map() {
 		return getHazelcast().getMap(WBS_KEY);
 	}
 
 	public boolean tryLock(Long roomId) {
-		return getCache().tryLock(roomId);
+		return map().tryLock(roomId);
 	}
 
 	public void unlock(Long roomId) {
-		getCache().unlock(roomId);
+		map().unlock(roomId);
 	}
 
 	private static String getDefaultName(Long langId, int num) {
@@ -63,7 +63,7 @@ public class WhiteboardManager implements IWhiteboardManager {
 	}
 
 	public boolean contains(Long roomId) {
-		return getCache().containsKey(roomId);
+		return map().containsKey(roomId);
 	}
 
 	@Override
@@ -75,7 +75,7 @@ public class WhiteboardManager implements IWhiteboardManager {
 		if (roomId == null) {
 			return null;
 		}
-		Whiteboards wbs = getCache().get(roomId);
+		Whiteboards wbs = map().get(roomId);
 		if (wbs == null) {
 			wbs = new Whiteboards(roomId);
 			Whiteboard wb = add(wbs, langId);
@@ -132,7 +132,7 @@ public class WhiteboardManager implements IWhiteboardManager {
 		update(wbs);
 	}
 
-	private void update(Whiteboards wbs) {
-		getCache().put(wbs.getRoomId(), wbs);
+	private static void update(Whiteboards wbs) {
+		map().put(wbs.getRoomId(), wbs);
 	}
 }
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
index 027546a..9b0e267 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/pages/auth/SignInDialog.java
@@ -65,6 +65,7 @@ import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.PropertyModel;
 import org.apache.wicket.request.mapper.parameter.PageParameters;
+import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -90,6 +91,9 @@ public class SignInDialog extends NonClosableDialog<String> {
 	private LdapConfig domain;
 	private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
 
+	@SpringBean
+	private ConfigurationDao cfgDao;
+
 	public SignInDialog(String id) {
 		super(id, "");
 		add(form = new SignInForm("signin"));
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml b/openmeetings-web/src/main/webapp/WEB-INF/applicationContext.xml
similarity index 100%
rename from openmeetings-web/src/main/webapp/WEB-INF/classes/applicationContext.xml
rename to openmeetings-web/src/main/webapp/WEB-INF/applicationContext.xml
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/red5-web.properties b/openmeetings-web/src/main/webapp/WEB-INF/red5-web.properties
deleted file mode 100644
index 518301d..0000000
--- a/openmeetings-web/src/main/webapp/WEB-INF/red5-web.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you 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.
-webapp.virtualHosts=*,localhost, 127.0.0.1
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/red5-web.xml b/openmeetings-web/src/main/webapp/WEB-INF/red5-web.xml
deleted file mode 100644
index 4723baf..0000000
--- a/openmeetings-web/src/main/webapp/WEB-INF/red5-web.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you 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.
-
--->
-<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"
-	>
-	<bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
-		<property name="location" value="/WEB-INF/red5-web.properties" />
-	</bean>
-
-	<bean id="web.context" class="org.red5.server.Context" autowire="byType" />
-
-	<bean id="web.scope" class="org.red5.server.scope.WebScope">
-		<property name="server" ref="red5.server" />
-		<property name="parent" ref="global.scope" />
-		<property name="context" ref="web.context" />
-		<property name="handler" ref="web.handler" />
-		<property name="contextPath" value="${webapp.contextPath}" />
-		<property name="virtualHosts" value="${webapp.virtualHosts}" />
-	</bean>
-
-	<import resource="classes/applicationContext.xml" />
-</beans>
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/web.xml b/openmeetings-web/src/main/webapp/WEB-INF/web.xml
index 209395a..634ffee 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/web.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/web.xml
@@ -21,38 +21,11 @@
 <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 		xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
-	<context-param>
-		<param-name>globalScope</param-name>
-		<param-value>default</param-value>
-	</context-param>
-	<context-param>
-		<param-name>contextConfigLocation</param-name>
-		<param-value>/WEB-INF/red5-*.xml</param-value>
-	</context-param>
-	<context-param>
-		<param-name>locatorFactorySelector</param-name>
-		<param-value>red5.xml</param-value>
-	</context-param>
-	<context-param>
-		<param-name>parentContextKey</param-name>
-		<param-value>default.context</param-value>
-	</context-param>
-
 	<listener>
 		<listener-class>org.apache.openmeetings.util.OMContextListener</listener-class>
 	</listener>
 
 	<filter>
-		<filter-name>LoggerContextFilter</filter-name>
-		<filter-class>org.red5.logging.LoggerContextFilter</filter-class>
-		<async-supported>true</async-supported>
-	</filter>
-	<filter-mapping>
-		<filter-name>LoggerContextFilter</filter-name>
-		<url-pattern>/*</url-pattern>
-	</filter-mapping>
-
-	<filter>
 		<filter-name>OpenmeetingsApplication</filter-name>
 		<filter-class>org.apache.wicket.protocol.ws.javax.JavaxWebSocketFilter</filter-class>
 		<async-supported>true</async-supported>
@@ -61,8 +34,12 @@
 			<param-value>org.apache.openmeetings.web.app.Application</param-value>
 		</init-param>
 		<init-param>
+			<param-name>applicationFactoryClassName</param-name>
+			<param-value>org.apache.wicket.spring.SpringWebApplicationFactory</param-value>
+		</init-param>
+		<init-param>
 			<param-name>configuration</param-name>
-			<param-value>${wicket.mode}</param-value>
+			<param-value>${wicket.configuration}</param-value>
 		</init-param>
 		<init-param>
 			<param-name>ignorePaths</param-name>
@@ -73,6 +50,11 @@
 		<filter-name>OpenmeetingsApplication</filter-name>
 		<url-pattern>/*</url-pattern>
 	</filter-mapping>
+
+	<listener>
+		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+	</listener>
+
 	<servlet>
 		<servlet-name>CXFServlet</servlet-name>
 		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
@@ -88,12 +70,6 @@
 		<url-pattern>/services/*</url-pattern>
 	</servlet-mapping>
 
-	<!-- remove the following servlet tags if you want to disable remoting for this application -->
-	<servlet>
-		<servlet-name>gateway</servlet-name>
-		<servlet-class>org.red5.server.net.servlet.AMFGatewayServlet</servlet-class>
-	</servlet>
-
 	<mime-mapping>
 		<extension>inc</extension>
 		<mime-type>text/plain</mime-type>
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractSpringTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractSpringTest.java
index f5b83b1..4985bc2 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractSpringTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/AbstractSpringTest.java
@@ -22,7 +22,6 @@ import static org.junit.Assert.fail;
 
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.util.OmFileHelper;
-import org.apache.tomcat.util.scan.Constants;
 import org.junit.BeforeClass;
 import org.junit.runner.RunWith;
 import org.springframework.test.context.ContextConfiguration;
@@ -38,7 +37,7 @@ public abstract class AbstractSpringTest extends AbstractJUnit4SpringContextTest
 	@BeforeClass
 	public static void init() {
 		setOmHome();
-		System.setProperty(Constants.SKIP_JARS_PROPERTY, "*");
+		//FIXME TODO System.setProperty(Constants.SKIP_JARS_PROPERTY, "*");
 		LabelDao.initLanguageMap();
 		if (LabelDao.getLanguages().isEmpty()) {
 			fail("Failed to set languages");
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
index 94dcac3..80039d7 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/AbstractWebServiceTest.java
@@ -20,7 +20,6 @@ package org.apache.openmeetings.webservice;
 
 import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
 import static org.apache.openmeetings.AbstractWicketTester.getWicketTester;
-import static org.apache.openmeetings.util.OmFileHelper.getOmHome;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
@@ -28,19 +27,16 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.InetAddress;
-import java.nio.file.Files;
+import java.lang.management.ManagementFactory;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
 
+import javax.management.MBeanServer;
 import javax.ws.rs.core.Form;
 import javax.ws.rs.core.MediaType;
 
-import org.apache.catalina.LifecycleState;
-import org.apache.catalina.connector.Connector;
-import org.apache.catalina.startup.Tomcat;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
@@ -54,13 +50,20 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.web.app.WebSession;
 import org.apache.openmeetings.webservice.util.AppointmentMessageBodyReader;
 import org.apache.wicket.util.tester.WicketTester;
+import org.eclipse.jetty.jmx.MBeanContainer;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.util.component.AbstractLifeCycle;
+import org.eclipse.jetty.webapp.WebAppContext;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 
 public class AbstractWebServiceTest extends AbstractJUnitDefaults {
-	private static Tomcat tomcat;
+	private static Server server;
 	private static final String HOST = "localhost";
 	private static final String CONTEXT = "/openmeetings";
 	private static int port = 8080;
@@ -97,21 +100,27 @@ public class AbstractWebServiceTest extends AbstractJUnitDefaults {
 
 	@BeforeClass
 	public static void initialize() throws Exception {
-		tomcat = new Tomcat();
-		Connector connector = new Connector("HTTP/1.1");
-		connector.setAttribute("address", InetAddress.getByName(HOST).getHostAddress());
-		connector.setPort(0);
-		tomcat.getService().addConnector(connector);
-		tomcat.setConnector(connector);
-		File wd = Files.createTempDirectory("om" + UUID.randomUUID().toString()).toFile();
-		tomcat.setBaseDir(wd.getCanonicalPath());
-		tomcat.getHost().setAppBase(wd.getCanonicalPath());
-		tomcat.getHost().setAutoDeploy(false);
-		tomcat.getHost().setDeployOnStartup(false);
-		tomcat.addWebapp(CONTEXT, getOmHome().getAbsolutePath());
-		tomcat.getConnector(); // to init the connector
-		tomcat.start();
-		port = tomcat.getConnector().getLocalPort();
+		server = new Server();
+		HttpConfiguration config = new HttpConfiguration();
+		ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(config));
+		http.setPort(0);
+		http.setIdleTimeout(1000 * 60 * 60);
+		server.addConnector(http);
+
+		WebAppContext bb = new WebAppContext();
+		bb.setServer(server);
+		bb.setContextPath("/");
+		bb.setWar("src/main/webapp");
+
+		server.setHandler(bb);
+
+		MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
+		MBeanContainer mBeanContainer = new MBeanContainer(mBeanServer);
+		server.addEventListener(mBeanContainer);
+		server.addBean(mBeanContainer);
+		server.start();
+		server.join();
+		port = ((ServerConnector)server.getConnectors()[0]).getLocalPort();
 	}
 
 	@Override
@@ -131,11 +140,8 @@ public class AbstractWebServiceTest extends AbstractJUnitDefaults {
 
 	@AfterClass
 	public static void destroy() throws Exception {
-		if (tomcat.getServer() != null && tomcat.getServer().getState() != LifecycleState.DESTROYED) {
-			if (tomcat.getServer().getState() != LifecycleState.STOPPED) {
-				tomcat.stop();
-			}
-			tomcat.destroy();
+		if (server != null && (AbstractLifeCycle.STARTING.equals(server.getState()) || AbstractLifeCycle.STARTED.equals(server.getState()))) {
+			server.stop();
 		}
 	}
 
diff --git a/openmeetings-web/src/test/jetty/jetty-http.xml b/openmeetings-web/src/test/jetty/jetty-http.xml
new file mode 100644
index 0000000..92ad3d1
--- /dev/null
+++ b/openmeetings-web/src/test/jetty/jetty-http.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!-- ============================================================= -->
+<!-- Configure the Jetty Server instance with an ID "Server"       -->
+<!-- by adding a HTTP connector.                                   -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- ============================================================= -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+  <!-- =========================================================== -->
+  <!-- Add a HTTP Connector.                                       -->
+  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
+  <!-- HttpConnectionFactory instance using the common httpConfig  -->
+  <!-- instance defined in jetty.xml                               -->
+  <!--                                                             -->
+  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
+  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
+  <!-- that may be set here.                                       -->
+  <!-- =========================================================== -->
+  <Call name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+        <Arg name="factories">
+          <Array type="org.eclipse.jetty.server.ConnectionFactory">
+            <Item>
+              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+                <Arg name="config"><Ref refid="httpConfig" /></Arg>
+              </New>
+            </Item>
+          </Array>
+        </Arg>
+        <Set name="host"><Property name="jetty.host" /></Set>
+        <Set name="port"><Property name="jetty.port" default="5080" /></Set>
+        <Set name="idleTimeout"><Property name="http.timeout" default="30000"/></Set>
+      </New>
+    </Arg>
+  </Call>
+</Configure>
diff --git a/openmeetings-web/src/test/jetty/jetty-https.xml b/openmeetings-web/src/test/jetty/jetty-https.xml
new file mode 100644
index 0000000..8718ac3
--- /dev/null
+++ b/openmeetings-web/src/test/jetty/jetty-https.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<!-- ============================================================= -->
+<!-- Configure a HTTPS connector.                                  -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- and jetty-ssl.xml.                                            -->
+<!-- ============================================================= -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+  <!-- =========================================================== -->
+  <!-- Add a HTTPS Connector.                                      -->
+  <!-- Configure an o.e.j.server.ServerConnector with connection   -->
+  <!-- factories for TLS (aka SSL) and HTTP to provide HTTPS.      -->
+  <!-- All accepted TLS connections are wired to a HTTP connection.-->
+  <!--                                                             -->
+  <!-- Consult the javadoc of o.e.j.server.ServerConnector,        -->
+  <!-- o.e.j.server.SslConnectionFactory and                       -->
+  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
+  <!-- that may be set here.                                       -->
+  <!-- =========================================================== -->
+  <Call id="httpsConnector" name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+          <Arg name="factories">
+            <Array type="org.eclipse.jetty.server.ConnectionFactory">
+              <Item>
+                <New class="org.eclipse.jetty.server.SslConnectionFactory">
+                  <Arg name="next">http/1.1</Arg>
+                  <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
+                </New>
+              </Item>
+              <Item>
+                <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+                  <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
+                </New>
+              </Item>
+            </Array>
+          </Arg>
+          <Set name="host"><Property name="jetty.host" /></Set>
+          <Set name="port"><Property name="jetty.https.port" default="5443" /></Set>
+          <Set name="idleTimeout">30000</Set>
+        </New>
+    </Arg>
+  </Call>
+</Configure>
diff --git a/openmeetings-web/src/test/jetty/jetty-ssl.xml b/openmeetings-web/src/test/jetty/jetty-ssl.xml
new file mode 100644
index 0000000..dad4b38
--- /dev/null
+++ b/openmeetings-web/src/test/jetty/jetty-ssl.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<!-- ============================================================= -->
+<!-- Configure a TLS (SSL) Context Factory                         -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- and either jetty-https.xml or jetty-spdy.xml (but not both)   -->
+<!-- ============================================================= -->
+<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
+  <Set name="KeyStorePath"><Property name="maven.project.build.directory.test-classes" default="." />/<Property name="jetty.keystore" default="keystore"/></Set>
+  <Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="wicket"/></Set>
+  <Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="wicket"/></Set>
+  <Set name="EndpointIdentificationAlgorithm"></Set>
+  <Set name="ExcludeCipherSuites">
+    <Array type="String">
+      <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
+      <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
+      <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
+      <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
+      <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+      <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+      <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
+    </Array>
+  </Set>
+  <!-- =========================================================== -->
+  <!-- Create a TLS specific HttpConfiguration based on the        -->
+  <!-- common HttpConfiguration defined in jetty.xml               -->
+  <!-- Add a SecureRequestCustomizer to extract certificate and    -->
+  <!-- session information                                         -->
+  <!-- =========================================================== -->
+  <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+    <Arg><Ref refid="httpConfig"/></Arg>
+    <Call name="addCustomizer">
+      <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
+    </Call>
+  </New>
+</Configure>
diff --git a/openmeetings-web/src/test/jetty/jetty.xml b/openmeetings-web/src/test/jetty/jetty.xml
new file mode 100644
index 0000000..edaeb72
--- /dev/null
+++ b/openmeetings-web/src/test/jetty/jetty.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<!-- ============================================================= -->
+<!-- Configure a HTTP connector.                                  -->
+<!-- ============================================================= -->
+<Configure>
+	<New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+		<Set name="secureScheme">https</Set>
+		<Set name="securePort">
+			<Property name="jetty.secure.port" default="8443" />
+		</Set>
+		<Set name="outputBufferSize">32768</Set>
+		<Set name="requestHeaderSize">8192</Set>
+		<Set name="responseHeaderSize">8192</Set>
+		<Set name="sendServerVersion">true</Set>
+		<Set name="sendDateHeader">false</Set>
+		<Set name="headerCacheSize">512</Set>
+
+		<!-- Uncomment to enable handling of X-Forwarded- style headers <Call name="addCustomizer"> -->
+		<!-- <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg> -->
+		<!-- </Call> -->
+	</New>
+</Configure>
diff --git a/pom.xml b/pom.xml
index a03b2c6..bbc69c9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,7 +33,7 @@
 	<properties>
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<maven.build.timestamp.format>yyyy/MM/dd HH:mm</maven.build.timestamp.format>
-		<wicket.mode>DEPLOYMENT</wicket.mode>
+		<wicket.configuration>DEPLOYMENT</wicket.configuration>
 		<om.quick.build>false</om.quick.build>
 		<db>derby</db>
 		<jdk.version>1.8</jdk.version>
@@ -74,6 +74,9 @@
 		<src.pack.skip>false</src.pack.skip>
 		<derby.version>10.14.1.0</derby.version>
 		<commons-lang3.version>3.7</commons-lang3.version>
+		<slf4j.version>1.7.25</slf4j.version>
+		<logback.version>1.2.3</logback.version>
+		<jetty9.version>9.4.8.v20171121</jetty9.version>
 		<license.excludedScopes>test</license.excludedScopes>
 		<!--  URL of the ASF SonarQube server  -->
 		<sonar.host.url>https://builds.apache.org/analysis</sonar.host.url>
@@ -109,7 +112,7 @@
 			<properties>
 				<maven.test.skip>true</maven.test.skip>
 				<om.quick.build>true</om.quick.build>
-				<wicket.mode>DEVELOPMENT</wicket.mode>
+				<wicket.configuration>DEVELOPMENT</wicket.configuration>
 				<src.pack.skip>true</src.pack.skip>
 			</properties>
 		</profile>
@@ -776,9 +779,9 @@
 				</exclusions>
 			</dependency>
 			<dependency>
-				<groupId>org.apache.tomcat</groupId>
-				<artifactId>tomcat-servlet-api</artifactId>
-				<version>${tomcat.version}</version>
+				<groupId>javax.servlet</groupId>
+				<artifactId>javax.servlet-api</artifactId>
+				<version>3.1.0</version>
 				<scope>provided</scope>
 			</dependency>
 			<dependency>
@@ -791,6 +794,21 @@
 				<artifactId>commons-text</artifactId>
 				<version>1.2</version>
 			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>slf4j-api</artifactId>
+				<version>${slf4j.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.slf4j</groupId>
+				<artifactId>log4j-over-slf4j</artifactId>
+				<version>${slf4j.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>ch.qos.logback</groupId>
+				<artifactId>logback-classic</artifactId>
+				<version>${logback.version}</version>
+			</dependency>
 		</dependencies>
 	</dependencyManagement>
 	<dependencies>
@@ -802,18 +820,13 @@
 		</dependency>
 		<dependency>
 			<groupId>org.springframework</groupId>
-			<artifactId>spring-core</artifactId>
-			<scope>test</scope>
-		</dependency>
-		<dependency>
-			<groupId>org.springframework</groupId>
 			<artifactId>spring-test</artifactId>
 			<version>${spring.version}</version>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
-			<groupId>org.apache.tomcat</groupId>
-			<artifactId>tomcat-servlet-api</artifactId>
+			<groupId>javax.servlet</groupId>
+			<artifactId>javax.servlet-api</artifactId>
 		</dependency>
 	</dependencies>
 	<build>

-- 
To stop receiving notification emails like this one, please contact
solomax@apache.org.