diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java
index 3b67f01..d3ba32e 100644
--- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java
+++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyConfig.java
@@ -18,6 +18,9 @@
 
 import org.osgi.framework.BundleContext;
 import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Properties;
 import java.util.Hashtable;
 
@@ -86,6 +89,16 @@
     private boolean useHttpsNio;
     private boolean registerMBeans;
 
+    /**
+     * Properties from the configuration not matching any of the
+     * predefined properties. These properties can be accessed from the
+     * getProperty* methods.
+     * <p>
+     * This map is indexed by String objects (the property names) and
+     * the values are just objects as provided by the configuration.
+     */
+    private Map genericProperties = new HashMap();
+
     public JettyConfig(BundleContext context)
     {
         this.context = context;
@@ -197,11 +210,19 @@
         this.useHttpNio = getBooleanProperty(props, FELIX_HTTP_NIO, true);
         this.useHttpsNio = getBooleanProperty(props, FELIX_HTTPS_NIO, this.useHttpNio);
         this.registerMBeans = getBooleanProperty(props, FELIX_HTTP_MBEANS, false);
+
+        // copy rest of the properties
+        Enumeration keys = props.keys();
+        while (keys.hasMoreElements())
+        {
+            Object key = keys.nextElement();
+            this.genericProperties.put(key, props.get(key));
+        }
     }
 
     private String getProperty(Dictionary props, String name, String defValue)
     {
-        Object value = props.get(name);
+        Object value = props.remove(name);
         if (value == null)
         {
             value = this.context.getProperty(name);
@@ -230,6 +251,51 @@
         }
     }
 
+    /**
+     * Returns the named generic configuration property from the
+     * configuration or the bundle context. If neither property is defined
+     * return the defValue.
+     */
+    public String getProperty(String name, String defValue) {
+        Object value = this.genericProperties.get(name);
+        if (value == null)
+        {
+            value = this.context.getProperty(name);
+        }
+
+        return value != null ? String.valueOf(value) : defValue;
+    }
+
+    /**
+     * Returns the named generic configuration property from the
+     * configuration or the bundle context. If neither property is defined
+     * return the defValue.
+     */
+    public boolean getBooleanProperty(String name, boolean defValue)
+    {
+        String value = getProperty(name, null);
+        if (value != null)
+        {
+            return (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes"));
+        }
+
+        return defValue;
+    }
+
+    /**
+     * Returns the named generic configuration property from the
+     * configuration or the bundle context. If neither property is defined
+     * return the defValue.
+     */
+    public int getIntProperty(String name, int defValue)
+    {
+        try {
+            return Integer.parseInt(getProperty(name, null));
+        } catch (Exception e) {
+            return defValue;
+        }
+    }
+
     public void setServiceProperties(Hashtable<String, Object> props)
     {
         props.put(HTTP_PORT, String.valueOf(this.httpPort));
diff --git a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java
index 1dd1c8a..949af3f 100644
--- a/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java
+++ b/http/jetty/src/main/java/org/apache/felix/http/jetty/internal/JettyService.java
@@ -16,26 +16,28 @@
  */
 package org.apache.felix.http.jetty.internal;
 
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceRegistration;
-import org.mortbay.jetty.security.HashUserRealm;
-import org.mortbay.jetty.security.SslSelectChannelConnector;
-import org.mortbay.jetty.security.SslSocketConnector;
-import org.mortbay.jetty.Server;
-import org.mortbay.jetty.Connector;
-import org.mortbay.jetty.bio.SocketConnector;
-import org.mortbay.jetty.handler.StatisticsHandler;
-import org.mortbay.jetty.nio.SelectChannelConnector;
-import org.mortbay.jetty.servlet.*;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Properties;
+
 import org.apache.felix.http.base.internal.DispatcherServlet;
 import org.apache.felix.http.base.internal.EventDispatcher;
 import org.apache.felix.http.base.internal.HttpServiceController;
 import org.apache.felix.http.base.internal.logger.SystemLogger;
-
-import java.util.Properties;
-import java.util.Dictionary;
-import java.util.Hashtable;
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.SessionManager;
+import org.mortbay.jetty.bio.SocketConnector;
+import org.mortbay.jetty.handler.StatisticsHandler;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.HashUserRealm;
+import org.mortbay.jetty.security.SslSelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.servlet.Context;
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
 
 public final class JettyService
     implements Runnable
@@ -169,10 +171,11 @@
             }
 
             Context context = new Context(this.server, "/", Context.SESSIONS);
+            configureSessionManager(context);
             context.addEventListener(eventDispatcher);
             context.getSessionHandler().addEventListener(eventDispatcher);
             context.addServlet(new ServletHolder(this.dispatcher), "/*");
-            
+
             if (this.config.isRegisterMBeans())
             {
                 this.mbeanServerTracker = new MBeanServerTracker(this.context, this.server);
@@ -300,6 +303,15 @@
         this.server.addConnector(connector);
     }
 
+    private void configureSessionManager(final Context context) {
+        final SessionManager manager = context.getSessionHandler().getSessionManager();
+        manager.setSessionCookie(this.config.getProperty(SessionManager.__SessionCookieProperty, SessionManager.__DefaultSessionCookie));
+        manager.setSessionURL(this.config.getProperty(SessionManager.__SessionURLProperty, SessionManager.__DefaultSessionURL));
+        manager.setSessionDomain(this.config.getProperty(SessionManager.__SessionDomainProperty, SessionManager.__DefaultSessionDomain));
+        manager.setSessionPath(this.config.getProperty(SessionManager.__SessionPathProperty, context.getContextPath()));
+        manager.setMaxCookieAge(this.config.getIntProperty(SessionManager.__MaxAgeProperty, -1));
+    }
+
     public void run()
     {
         this.running = true;
