diff --git a/httplite/src/main/java/org/apache/felix/http/lightweight/servlet/HttpServletRequestImpl.java b/httplite/src/main/java/org/apache/felix/http/lightweight/servlet/HttpServletRequestImpl.java
index b15381a..7ed2511 100644
--- a/httplite/src/main/java/org/apache/felix/http/lightweight/servlet/HttpServletRequestImpl.java
+++ b/httplite/src/main/java/org/apache/felix/http/lightweight/servlet/HttpServletRequestImpl.java
@@ -132,7 +132,6 @@
      * 
      * @see javax.servlet.ServletRequest#getInputStream()
      */
-    @Override
     public ServletInputStream getInputStream() throws IOException
     {
 
@@ -156,7 +155,6 @@
      * 
      * @see javax.servlet.ServletRequest#getReader()
      */
-    @Override
     public BufferedReader getReader() throws IOException
     {
         if (m_getInputStreamCalled)
@@ -328,7 +326,7 @@
      * 
      * @see javax.servlet.http.HttpServletRequest#getMethod()
      */
-    @Override
+
     public String getMethod()
     {
         return m_method;
@@ -342,7 +340,6 @@
      * @return The value of the specified header or <tt>null</tt>.
      **/
 
-    @Override
     public String getHeader(final String header)
     {
         Object value = m_headers.get(header.toLowerCase());
@@ -355,7 +352,6 @@
         return value.toString();
     }
 
-    @Override
     public Enumeration getHeaders(final String name)
     {
         Object v = m_headers.get(name);
@@ -379,7 +375,6 @@
             + v.getClass().getName());
     }
 
-    @Override
     public Enumeration getHeaderNames()
     {
         if (m_headers.isEmpty())
@@ -395,7 +390,6 @@
      * 
      * @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
      */
-    @Override
     public Object getAttribute(final String arg0)
     {
         if (m_attributes != null)
@@ -412,7 +406,6 @@
      * @see javax.servlet.ServletRequest#getAttributeNames()
      */
 
-    @Override
     public Enumeration getAttributeNames()
     {
         if (m_attributes != null)
@@ -428,14 +421,11 @@
      * 
      * @see javax.servlet.ServletRequest#getCharacterEncoding()
      */
-
-    @Override
     public String getCharacterEncoding()
     {
         return getHeader("Accept-Encoding");
     }
 
-    @Override
     public int getContentLength()
     {
         int len = 0;
@@ -457,8 +447,6 @@
      * 
      * @see javax.servlet.ServletRequest#getContentType()
      */
-
-    @Override
     public String getContentType()
     {
         return getHeader("Content-Type");
@@ -469,8 +457,6 @@
      * 
      * @see javax.servlet.ServletRequest#getLocale()
      */
-
-    @Override
     public Locale getLocale()
     {
         return m_locale;
@@ -481,8 +467,6 @@
      * 
      * @see javax.servlet.ServletRequest#getLocales()
      */
-
-    @Override
     public Enumeration getLocales()
     {
         return Collections.enumeration(Arrays.asList(new Object[] { m_locale }));
@@ -493,8 +477,6 @@
      * 
      * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
      */
-
-    @Override
     public String getParameter(final String arg0)
     {
         if (m_parameters == null)
@@ -518,8 +500,6 @@
      * 
      * @see javax.servlet.ServletRequest#getParameterMap()
      */
-
-    @Override
     public Map getParameterMap()
     {
         return m_parameters;
@@ -530,8 +510,6 @@
      * 
      * @see javax.servlet.ServletRequest#getParameterNames()
      */
-
-    @Override
     public Enumeration getParameterNames()
     {
         return Collections.enumeration(m_parameters.keySet());
@@ -542,8 +520,6 @@
      * 
      * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String)
      */
-
-    @Override
     public String[] getParameterValues(String arg0)
     {
         return (String[]) m_parameters.values().toArray(new String[m_parameters.size()]);
@@ -554,7 +530,6 @@
      * 
      * @see javax.servlet.ServletRequest#getProtocol()
      */
-    @Override
     public String getProtocol()
     {
         return m_version;
@@ -565,7 +540,6 @@
      * 
      * @see javax.servlet.ServletRequest#getRealPath(java.lang.String)
      */
-    @Override
     public String getRealPath(final String arg0)
     {
         throw new UnimplementedAPIException();
@@ -576,7 +550,6 @@
      * 
      * @see javax.servlet.ServletRequest#getRemoteAddr()
      */
-    @Override
     public String getRemoteAddr()
     {
         return getSocket().getRemoteSocketAddress().toString();
@@ -585,7 +558,7 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getRemoteHost()
      */
-    @Override
+
     public String getRemoteHost()
     {
         return getSocket().getRemoteSocketAddress().toString();
@@ -594,7 +567,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String)
      */
-    @Override
     public RequestDispatcher getRequestDispatcher(String arg0)
     {
         return null;
@@ -603,7 +575,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getScheme()
      */
-    @Override
     public String getScheme()
     {
         return HttpConstants.HTTP_SCHEME;
@@ -612,7 +583,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getServerName()
      */
-    @Override
     public String getServerName()
     {
         return HttpConstants.SERVER_INFO;
@@ -621,7 +591,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getServerPort()
      */
-    @Override
     public int getServerPort()
     {
         return getSocket().getLocalPort();
@@ -630,7 +599,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#isSecure()
      */
-    @Override
     public boolean isSecure()
     {
         return false;
@@ -639,7 +607,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String)
      */
-    @Override
     public void removeAttribute(String arg0)
     {
         if (m_attributes != null)
@@ -651,7 +618,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#setAttribute(java.lang.String, java.lang.Object)
      */
-    @Override
     public void setAttribute(String arg0, Object arg1)
     {
         if (m_attributes == null)
@@ -665,7 +631,7 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String)
      */
-    @Override
+
     public void setCharacterEncoding(String arg0) throws UnsupportedEncodingException
     {
         throw new UnimplementedAPIException();
@@ -676,8 +642,6 @@
      * 
      * @see javax.servlet.http.HttpServletRequest#getAuthType()
      */
-
-    @Override
     public String getAuthType()
     {
         return null;
@@ -688,8 +652,6 @@
      * 
      * @see javax.servlet.http.HttpServletRequest#getCookies()
      */
-
-    @Override
     public Cookie[] getCookies()
     {
         if (m_cookies == null)
@@ -728,8 +690,6 @@
      * @see
      * javax.servlet.http.HttpServletRequest#getDateHeader(java.lang.String)
      */
-
-    @Override
     public long getDateHeader(final String name)
     {
         String headerValue = getHeader(name);
@@ -757,8 +717,6 @@
      * 
      * @see javax.servlet.http.HttpServletRequest#getIntHeader(java.lang.String)
      */
-
-    @Override
     public int getIntHeader(final String name)
     {
         String value = getHeader(name);
@@ -776,8 +734,6 @@
      * 
      * @see javax.servlet.http.HttpServletRequest#getPathInfo()
      */
-
-    @Override
     public String getPathInfo()
     {
         String alias = getAlias();
@@ -795,14 +751,12 @@
         return null;
     }
 
-    @Override
     public String getPathTranslated()
     {
         // TODO: Always returning null may be incorrect.
         return null;
     }
 
-    @Override
     public String getContextPath()
     {
         return "";
@@ -813,32 +767,26 @@
      * 
      * @see javax.servlet.http.HttpServletRequest#getQueryString()
      */
-
-    @Override
     public String getQueryString()
     {
         return m_queryString;
     }
 
-    @Override
     public String getRemoteUser()
     {
         return null;
     }
 
-    @Override
     public boolean isUserInRole(String role)
     {
         return false;
     }
 
-    @Override
     public Principal getUserPrincipal()
     {
         return null;
     }
 
-    @Override
     public String getRequestedSessionId()
     {
         return null;
@@ -849,7 +797,6 @@
      * 
      * @see javax.servlet.http.HttpServletRequest#getRequestURI()
      */
-    @Override
     public String getRequestURI()
     {
         return m_uri;
@@ -860,7 +807,6 @@
      * 
      * @see javax.servlet.http.HttpServletRequest#getRequestURL()
      */
-    @Override
     public StringBuffer getRequestURL()
     {
         StringBuffer sb = new StringBuffer();
@@ -875,8 +821,6 @@
      * 
      * @see javax.servlet.http.HttpServletRequest#getServletPath()
      */
-
-    @Override
     public String getServletPath()
     {
         if (m_servletPath == null)
@@ -911,37 +855,31 @@
         return element.getAlias();
     }
 
-    @Override
     public HttpSession getSession(boolean create)
     {
         throw new UnimplementedAPIException();
     }
 
-    @Override
     public HttpSession getSession()
     {
         throw new UnimplementedAPIException();
     }
 
-    @Override
     public boolean isRequestedSessionIdValid()
     {
         throw new UnimplementedAPIException();
     }
 
-    @Override
     public boolean isRequestedSessionIdFromCookie()
     {
         throw new UnimplementedAPIException();
     }
 
-    @Override
     public boolean isRequestedSessionIdFromURL()
     {
         throw new UnimplementedAPIException();
     }
 
-    @Override
     public boolean isRequestedSessionIdFromUrl()
     {
         throw new UnimplementedAPIException();
@@ -1015,7 +953,6 @@
     /* (non-Javadoc)
      * @see java.lang.Object#toString()
      */
-    @Override
     public String toString()
     {
         if (m_method != null && m_uri != null)
@@ -1029,7 +966,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getLocalAddr()
      */
-    @Override
     public String getLocalAddr()
     {
         return m_socket.getLocalAddress().getHostAddress();
@@ -1038,7 +974,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getLocalName()
      */
-    @Override
     public String getLocalName()
     {
         return m_socket.getLocalAddress().getHostName();
@@ -1047,18 +982,16 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getLocalPort()
      */
-    @Override
     public int getLocalPort()
-    {        
+    {
         return m_socket.getLocalPort();
     }
 
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getRemotePort()
      */
-    @Override
     public int getRemotePort()
-    {        
+    {
         return m_socket.getPort();
     }
 }
\ No newline at end of file
diff --git a/httplite/src/main/java/org/apache/felix/http/lightweight/servlet/ServletContextImpl.java b/httplite/src/main/java/org/apache/felix/http/lightweight/servlet/ServletContextImpl.java
index f0161e2..dddddb0 100644
--- a/httplite/src/main/java/org/apache/felix/http/lightweight/servlet/ServletContextImpl.java
+++ b/httplite/src/main/java/org/apache/felix/http/lightweight/servlet/ServletContextImpl.java
@@ -67,7 +67,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getContext(java.lang.String)
      */
-    @Override
 	public ServletContext getContext(String uripath)
     {
         return null;
@@ -76,7 +75,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getMajorVersion()
      */
-    @Override
 	public int getMajorVersion()
     {
         return 2;
@@ -85,7 +83,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getMinorVersion()
      */
-    @Override
 	public int getMinorVersion()
     {
         return 4;
@@ -94,7 +91,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getMimeType(java.lang.String)
      */
-    @Override
 	public String getMimeType(String file)
     {
         return m_httpContext.getMimeType(file);
@@ -103,7 +99,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
      */
-    @Override
 	public Set getResourcePaths(String path)
     {
         return null;
@@ -112,7 +107,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getResource(java.lang.String)
      */
-    @Override
 	public URL getResource(String path) throws MalformedURLException
     {
         return m_httpContext.getResource(path);
@@ -121,7 +115,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String)
      */
-    @Override
 	public InputStream getResourceAsStream(String path)
     {
         try
@@ -139,7 +132,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String)
      */
-    @Override
 	public RequestDispatcher getRequestDispatcher(String path)
     {
         return null;
@@ -148,7 +140,7 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
      */
-    @Override
+
 	public RequestDispatcher getNamedDispatcher(String name)
     {
         return null;
@@ -157,37 +149,36 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getServlet(java.lang.String)
      */
-    @Override
 	public Servlet getServlet(String name) throws ServletException
     {
         return null;
     }
 
-    @Override
+
 	public Enumeration getServlets()
     {
         return null;
     }
 
-    @Override
+
 	public Enumeration getServletNames()
     {
         return null;
     }
 
-    @Override
+
 	public void log(String msg)
     {
         m_logger.log(Logger.LOG_INFO, msg);
     }
 
-    @Override
+
 	public void log(Exception exception, String msg)
     {
         m_logger.log(Logger.LOG_ERROR, msg, exception);
     }
 
-    @Override
+
 	public void log(String message, Throwable throwable)
     {
         m_logger.log(Logger.LOG_ERROR, message, throwable);
@@ -196,7 +187,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getRealPath(java.lang.String)
      */
-    @Override
 	public String getRealPath(String path)
     {
         return path;
@@ -205,7 +195,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getServerInfo()
      */
-    @Override
 	public String getServerInfo()
     {
         return HttpConstants.SERVER_INFO;
@@ -214,7 +203,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
      */
-    @Override
 	public String getInitParameter(String name)
     {
         if (m_initparams != null)
@@ -233,7 +221,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getInitParameterNames()
      */
-    @Override
 	public Enumeration getInitParameterNames()
     {
         if (m_initparams != null)
@@ -247,7 +234,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getAttribute(java.lang.String)
      */
-    @Override
 	public Object getAttribute(String name)
     {
         if (m_attributes != null)
@@ -261,7 +247,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getAttributeNames()
      */
-    @Override
 	public Enumeration getAttributeNames()
     {
         if (m_attributes != null)
@@ -275,7 +260,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#setAttribute(java.lang.String, java.lang.Object)
      */
-    @Override
 	public void setAttribute(String name, Object object)
     {
         if (m_attributes == null)
@@ -289,7 +273,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#removeAttribute(java.lang.String)
      */
-    @Override
 	public void removeAttribute(String name)
     {
         if (m_attributes != null)
@@ -301,7 +284,6 @@
     /* (non-Javadoc)
      * @see javax.servlet.ServletContext#getServletContextName()
      */
-    @Override
 	public String getServletContextName()
     {
         return m_name;
@@ -310,7 +292,6 @@
 	/* (non-Javadoc)
 	 * @see javax.servlet.ServletContext#getContextPath()
 	 */
-	@Override
 	public String getContextPath() {	
 		return m_name;
 	}
