diff --git a/httplite/minimum/src/main/java/org/apache/felix/httplite/servlet/HttpServletRequestImpl.java b/httplite/minimum/src/main/java/org/apache/felix/httplite/servlet/HttpServletRequestImpl.java
index e4ca6e2..190e1e7 100644
--- a/httplite/minimum/src/main/java/org/apache/felix/httplite/servlet/HttpServletRequestImpl.java
+++ b/httplite/minimum/src/main/java/org/apache/felix/httplite/servlet/HttpServletRequestImpl.java
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.httplite.servlet;
 
+
 import java.io.BufferedInputStream;
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
@@ -52,6 +53,7 @@
 import org.apache.felix.httplite.osgi.ServiceRegistration;
 import org.apache.felix.httplite.osgi.ServiceRegistrationResolver;
 
+
 /**
  * This class represents an HTTP request, which is parses from a given input
  * stream, and implements HttpServletRequest for servlet processing.
@@ -80,7 +82,7 @@
     private final Map m_headers = new HashMap();
     private final Socket m_socket;
     private Cookie[] m_cookies;
-    private final Locale m_locale = new Locale(System.getProperty("user.language"));
+    private final Locale m_locale = new Locale( System.getProperty( "user.language" ) );
     private Map m_attributes;
     private final ServiceRegistrationResolver m_resolver;
     private String m_servletPath;
@@ -107,18 +109,21 @@
      */
     private boolean m_getReaderCalled = false;
 
+
     /**
      * @param socket Socket assocated with request
      * @param serviceRegistrationResolver 
      * @param logger
      */
-    public HttpServletRequestImpl(final Socket socket, final ServiceRegistrationResolver serviceRegistrationResolver, final Logger logger)
+    public HttpServletRequestImpl( final Socket socket, final ServiceRegistrationResolver serviceRegistrationResolver,
+        final Logger logger )
     {
         this.m_socket = socket;
         this.m_resolver = serviceRegistrationResolver;
         this.m_logger = logger;
     }
 
+
     /**
      * @return The socket this request is associated with.
      */
@@ -127,6 +132,7 @@
         return m_socket;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -135,21 +141,22 @@
     public ServletInputStream getInputStream() throws IOException
     {
 
-        if (m_getReaderCalled)
+        if ( m_getReaderCalled )
         {
-            throw new IllegalStateException("getReader() has already been called.");
+            throw new IllegalStateException( "getReader() has already been called." );
         }
 
-        if (m_requestBody == null)
+        if ( m_requestBody == null )
         {
-            parseBody(new BufferedInputStream(m_socket.getInputStream()));
+            parseBody( new BufferedInputStream( m_socket.getInputStream() ) );
         }
 
         m_getInputStreamCalled = true;
 
-        return new ConcreteServletInputStream(new ByteArrayInputStream(m_requestBody));
+        return new ConcreteServletInputStream( new ByteArrayInputStream( m_requestBody ) );
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -157,21 +164,21 @@
      */
     public BufferedReader getReader() throws IOException
     {
-        if (m_getInputStreamCalled)
+        if ( m_getInputStreamCalled )
         {
-            throw new IllegalStateException("getInputStream() has already been called.");
+            throw new IllegalStateException( "getInputStream() has already been called." );
         }
-        if (m_requestBody == null)
+        if ( m_requestBody == null )
         {
-            parseBody(new BufferedInputStream(m_socket.getInputStream()));
+            parseBody( new BufferedInputStream( m_socket.getInputStream() ) );
         }
 
         m_getReaderCalled = true;
 
-        return new BufferedReader(new InputStreamReader(new ByteArrayInputStream(
-            m_requestBody)));
+        return new BufferedReader( new InputStreamReader( new ByteArrayInputStream( m_requestBody ) ) );
     }
 
+
     /**
      * This method parses the HTTP request line from the specified input stream
      * and stores the result.
@@ -181,39 +188,40 @@
      * @throws java.io.IOException
      *             If any I/O error occurs.
      **/
-    public void parseRequestLine(final ConcreteServletInputStream is) throws IOException
+    public void parseRequestLine( final ConcreteServletInputStream is ) throws IOException
     {
         String requestLine = is.readLine();
-        if (requestLine == null)
+        if ( requestLine == null )
         {
-            throw new IOException("Unexpected end of file when reading request line.");
+            throw new IOException( "Unexpected end of file when reading request line." );
         }
-        StringTokenizer st = new StringTokenizer(requestLine, " ");
-        if (st.countTokens() != 3)
+        StringTokenizer st = new StringTokenizer( requestLine, " " );
+        if ( st.countTokens() != 3 )
         {
-            throw new IOException("Malformed HTTP request: " + requestLine);
+            throw new IOException( "Malformed HTTP request: " + requestLine );
         }
         m_method = st.nextToken();
         m_uri = st.nextToken();
         m_version = st.nextToken();
 
         // If the URI has query string, parse it.
-        int qsIdx = m_uri.indexOf("?");
-        if (qsIdx > 0)
+        int qsIdx = m_uri.indexOf( "?" );
+        if ( qsIdx > 0 )
         {
-            m_queryString = m_uri.substring(qsIdx + 1);
-            m_uri = m_uri.substring(0, qsIdx);
+            m_queryString = m_uri.substring( qsIdx + 1 );
+            m_uri = m_uri.substring( 0, qsIdx );
         }
-        
+
         // If path contains multiple successive path separators (a//b/c a/b////c, etc.), strip them.
-        if (m_uri.indexOf( "//" ) > -1)
+        if ( m_uri.indexOf( "//" ) > -1 )
         {
             // separator
-            
-            m_uri = stripRedundantSeparators(m_uri);         
+
+            m_uri = stripRedundantSeparators( m_uri );
         }
     }
 
+
     /**
      * Remove successive '/' characters.
      * 
@@ -225,28 +233,31 @@
         StringBuffer sb = new StringBuffer();
         boolean lastIsSeparator = false;
 
-        for (int i = 0; i < in.length(); ++i) 
+        for ( int i = 0; i < in.length(); ++i )
         {
             char c = in.charAt( i );
-            
-            if (lastIsSeparator && c == '/')
+
+            if ( lastIsSeparator && c == '/' )
             {
                 continue;
             }
-            
+
             sb.append( c );
-            
-            if (c == '/')
+
+            if ( c == '/' )
             {
                 lastIsSeparator = true;
-            } else {
+            }
+            else
+            {
                 lastIsSeparator = false;
             }
         }
-        
+
         return sb.toString();
     }
 
+
     /**
      * This method parses the HTTP header lines from the specified input stream
      * and stores the results.
@@ -260,52 +271,53 @@
      * @throws java.io.IOException
      *             If any I/O error occurs.
      **/
-    public void parseHeader(final ConcreteServletInputStream is) throws IOException
-    {              
-        for (String s = is.readLine(); (s != null) && (s.length() != 0); s = is.readLine())
+    public void parseHeader( final ConcreteServletInputStream is ) throws IOException
+    {
+        for ( String s = is.readLine(); ( s != null ) && ( s.length() != 0 ); s = is.readLine() )
         {
-            int idx = s.indexOf(":");
-            if (idx > 0)
+            int idx = s.indexOf( ":" );
+            if ( idx > 0 )
             {
-                String header = s.substring(0, idx).trim();
-                String value = s.substring(idx + 1).trim();
+                String header = s.substring( 0, idx ).trim();
+                String value = s.substring( idx + 1 ).trim();
 
                 String key = header.toLowerCase();
 
-                if (!m_headers.containsKey(key))
+                if ( !m_headers.containsKey( key ) )
                 {
-                    m_headers.put(key, value);
+                    m_headers.put( key, value );
                 }
                 else
                 {
-                    Object originalValue = m_headers.get(key);
+                    Object originalValue = m_headers.get( key );
 
-                    if (originalValue instanceof String)
+                    if ( originalValue instanceof String )
                     {
                         List headerList = new ArrayList();
-                        headerList.add(originalValue);
-                        headerList.add(value);
-                        m_headers.put(key, headerList);
+                        headerList.add( originalValue );
+                        headerList.add( value );
+                        m_headers.put( key, headerList );
                     }
-                    else if (originalValue instanceof List)
+                    else if ( originalValue instanceof List )
                     {
-                        ((List) originalValue).add(value);
+                        ( ( List ) originalValue ).add( value );
                     }
                     else
                     {
-                        throw new RuntimeException("Unexpected type in m_headers: "
-                            + originalValue.getClass().getName());
+                        throw new RuntimeException( "Unexpected type in m_headers: "
+                            + originalValue.getClass().getName() );
                     }
                 }
             }
         }
-        
-        if (m_headers.containsKey( "Host" )) 
-        {          
-            m_uriHost = m_headers.get( "Host" ).toString();         
+
+        if ( m_headers.containsKey( "Host" ) )
+        {
+            m_uriHost = m_headers.get( "Host" ).toString();
         }
     }
 
+
     /**
      * This method parses the HTTP body from the specified input stream and
      * ignores the result.
@@ -315,11 +327,11 @@
      * @throws java.io.IOException
      *             If any I/O error occurs.
      **/
-    public void parseBody(final InputStream is) throws IOException
+    public void parseBody( final InputStream is ) throws IOException
     {
         int length = getContentLength();
 
-        if (length > 0)
+        if ( length > 0 )
         {
             ByteArrayOutputStream baos = null;
 
@@ -328,19 +340,19 @@
 
             do
             {
-                left = left - is.read(buf);
-                if (left > 0)
+                left = left - is.read( buf );
+                if ( left > 0 )
                 {
-                    if (baos == null)
+                    if ( baos == null )
                     {
-                        baos = new ByteArrayOutputStream(length);
+                        baos = new ByteArrayOutputStream( length );
                     }
-                    baos.write(buf);
+                    baos.write( buf );
                 }
             }
-            while (left > 0);
+            while ( left > 0 );
 
-            if (baos != null)
+            if ( baos != null )
             {
                 m_requestBody = baos.toByteArray();
             }
@@ -357,6 +369,7 @@
         }
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -368,6 +381,7 @@
         return m_method;
     }
 
+
     /**
      * Returns the value of the specified header, if present.
      * 
@@ -376,11 +390,11 @@
      * @return The value of the specified header or <tt>null</tt>.
      **/
 
-    public String getHeader(final String header)
+    public String getHeader( final String header )
     {
-        Object value = m_headers.get(header.toLowerCase());
+        Object value = m_headers.get( header.toLowerCase() );
 
-        if (value == null)
+        if ( value == null )
         {
             return null;
         }
@@ -388,54 +402,58 @@
         return value.toString();
     }
 
-    public Enumeration getHeaders(final String name)
-    {
-        Object v = m_headers.get(name);
 
-        if (v == null)
+    public Enumeration getHeaders( final String name )
+    {
+        Object v = m_headers.get( name );
+
+        if ( v == null )
         {
             return HttpConstants.EMPTY_ENUMERATION;
         }
 
-        if (v instanceof String)
+        if ( v instanceof String )
         {
-            return Collections.enumeration(Arrays.asList(new String[] { (String) v }));
+            return Collections.enumeration( Arrays.asList( new String[]
+                { ( String ) v } ) );
         }
 
-        if (v instanceof List)
+        if ( v instanceof List )
         {
-            return Collections.enumeration((List) v);
+            return Collections.enumeration( ( List ) v );
         }
 
-        throw new RuntimeException("Unexpected type in m_headers: "
-            + v.getClass().getName());
+        throw new RuntimeException( "Unexpected type in m_headers: " + v.getClass().getName() );
     }
 
+
     public Enumeration getHeaderNames()
     {
-        if (m_headers.isEmpty())
+        if ( m_headers.isEmpty() )
         {
             return HttpConstants.EMPTY_ENUMERATION;
         }
 
-        return Collections.enumeration(m_headers.keySet());
+        return Collections.enumeration( m_headers.keySet() );
     }
 
+
     /*
      * (non-Javadoc)
      * 
      * @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
      */
-    public Object getAttribute(final String arg0)
+    public Object getAttribute( final String arg0 )
     {
-        if (m_attributes != null)
+        if ( m_attributes != null )
         {
-            return m_attributes.get(arg0);
+            return m_attributes.get( arg0 );
         }
 
         return null;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -444,14 +462,15 @@
 
     public Enumeration getAttributeNames()
     {
-        if (m_attributes != null)
+        if ( m_attributes != null )
         {
-            return Collections.enumeration(m_attributes.keySet());
+            return Collections.enumeration( m_attributes.keySet() );
         }
 
         return HttpConstants.EMPTY_ENUMERATION;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -459,18 +478,19 @@
      */
     public String getCharacterEncoding()
     {
-        return getHeader("Accept-Encoding");
+        return getHeader( "Accept-Encoding" );
     }
 
+
     public int getContentLength()
     {
         int len = 0;
 
         try
         {
-            len = Integer.parseInt(getHeader("Content-Length"));
+            len = Integer.parseInt( getHeader( "Content-Length" ) );
         }
-        catch (NumberFormatException e)
+        catch ( NumberFormatException e )
         {
             // Ignore this exception intentionally.
         }
@@ -478,6 +498,7 @@
         return len;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -485,9 +506,10 @@
      */
     public String getContentType()
     {
-        return getHeader("Content-Type");
+        return getHeader( "Content-Type" );
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -498,6 +520,7 @@
         return m_locale;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -505,32 +528,35 @@
      */
     public Enumeration getLocales()
     {
-        return Collections.enumeration(Arrays.asList(new Object[] { m_locale }));
+        return Collections.enumeration( Arrays.asList( new Object[]
+            { m_locale } ) );
     }
 
+
     /*
      * (non-Javadoc)
      * 
      * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
      */
-    public String getParameter(final String arg0)
+    public String getParameter( final String arg0 )
     {
-        if (m_parameters == null)
+        if ( m_parameters == null )
         {
             try
             {
                 m_parameters = parseParameters();
             }
-            catch (UnsupportedEncodingException e)
+            catch ( UnsupportedEncodingException e )
             {
-                m_logger.log(Logger.LOG_ERROR, "Failed to parse request parameters.", e);
+                m_logger.log( Logger.LOG_ERROR, "Failed to parse request parameters.", e );
                 return null;
             }
         }
 
-        return (String) m_parameters.get(arg0);
+        return ( String ) m_parameters.get( arg0 );
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -538,22 +564,23 @@
      */
     public Map getParameterMap()
     {
-        if (m_parameters == null)
+        if ( m_parameters == null )
         {
             try
             {
                 m_parameters = parseParameters();
             }
-            catch (UnsupportedEncodingException e)
+            catch ( UnsupportedEncodingException e )
             {
-                m_logger.log(Logger.LOG_ERROR, "Failed to parse request parameters.", e);
+                m_logger.log( Logger.LOG_ERROR, "Failed to parse request parameters.", e );
                 return null;
             }
         }
-        
+
         return m_parameters;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -561,45 +588,47 @@
      */
     public Enumeration getParameterNames()
     {
-        if (m_parameters == null)
+        if ( m_parameters == null )
         {
             try
             {
                 m_parameters = parseParameters();
             }
-            catch (UnsupportedEncodingException e)
+            catch ( UnsupportedEncodingException e )
             {
-                m_logger.log(Logger.LOG_ERROR, "Failed to parse request parameters.", e);
+                m_logger.log( Logger.LOG_ERROR, "Failed to parse request parameters.", e );
                 return null;
             }
         }
-        
-        return Collections.enumeration(m_parameters.keySet());
+
+        return Collections.enumeration( m_parameters.keySet() );
     }
 
+
     /*
      * (non-Javadoc)
      * 
      * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String)
      */
-    public String[] getParameterValues(String arg0)
+    public String[] getParameterValues( String arg0 )
     {
-        if (m_parameters == null)
+        if ( m_parameters == null )
         {
             try
             {
                 m_parameters = parseParameters();
             }
-            catch (UnsupportedEncodingException e)
+            catch ( UnsupportedEncodingException e )
             {
-                m_logger.log(Logger.LOG_ERROR, "Failed to parse request parameters.", e);
+                m_logger.log( Logger.LOG_ERROR, "Failed to parse request parameters.", e );
                 return null;
             }
         }
-        
-        return (String[]) m_parameters.values().toArray(new String[m_parameters.size()]);
+
+        return ( String[] ) m_parameters.values().toArray( new String[m_parameters.size()] );
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -610,16 +639,18 @@
         return m_version;
     }
 
+
     /*
      * (non-Javadoc)
      * 
      * @see javax.servlet.ServletRequest#getRealPath(java.lang.String)
      */
-    public String getRealPath(final String arg0)
+    public String getRealPath( final String arg0 )
     {
         throw new UnimplementedAPIException();
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -630,6 +661,7 @@
         return getSocket().getRemoteSocketAddress().toString();
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getRemoteHost()
      */
@@ -639,14 +671,16 @@
         return getSocket().getRemoteSocketAddress().toString();
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String)
      */
-    public RequestDispatcher getRequestDispatcher(String arg0)
+    public RequestDispatcher getRequestDispatcher( String arg0 )
     {
         return null;
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getScheme()
      */
@@ -655,6 +689,7 @@
         return HttpConstants.HTTP_SCHEME;
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getServerName()
      */
@@ -663,6 +698,7 @@
         return HttpConstants.SERVER_INFO;
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getServerPort()
      */
@@ -671,6 +707,7 @@
         return getSocket().getLocalPort();
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#isSecure()
      */
@@ -679,39 +716,43 @@
         return false;
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String)
      */
-    public void removeAttribute(String arg0)
+    public void removeAttribute( String arg0 )
     {
-        if (m_attributes != null)
+        if ( m_attributes != null )
         {
-            m_attributes.remove(arg0);
+            m_attributes.remove( arg0 );
         }
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#setAttribute(java.lang.String, java.lang.Object)
      */
-    public void setAttribute(String arg0, Object arg1)
+    public void setAttribute( String arg0, Object arg1 )
     {
-        if (m_attributes == null)
+        if ( m_attributes == null )
         {
             m_attributes = new HashMap();
         }
 
-        m_attributes.put(arg0, arg1);
+        m_attributes.put( arg0, arg1 );
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String)
      */
 
-    public void setCharacterEncoding(String arg0) throws UnsupportedEncodingException
+    public void setCharacterEncoding( String arg0 ) throws UnsupportedEncodingException
     {
         throw new UnimplementedAPIException();
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -722,6 +763,7 @@
         return null;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -729,47 +771,48 @@
      */
     public Cookie[] getCookies()
     {
-        if (m_cookies == null)
+        if ( m_cookies == null )
         {
 
-            String cookieHeader = getHeader("Cookie");
+            String cookieHeader = getHeader( "Cookie" );
 
-            if (cookieHeader == null)
+            if ( cookieHeader == null )
             {
                 return null;
             }
 
             List cookieList = new ArrayList();
 
-            for (Iterator i = Arrays.asList(cookieHeader.split(";")).iterator(); i.hasNext();)
+            for ( Iterator i = Arrays.asList( splitString( cookieHeader, ';' ) ).iterator(); i.hasNext(); )
             {
-                String[] nvp = i.next().toString().split("=");
+                String[] nvp = splitString( i.next().toString(), '=' );
 
-                if (nvp.length != 2)
+                if ( nvp.length != 2 )
                 {
                     //Ignore invalid cookie and and continue.
                     continue;
                 }
 
-                cookieList.add(new Cookie(nvp[0].trim(), nvp[1].trim()));
+                cookieList.add( new Cookie( nvp[0].trim(), nvp[1].trim() ) );
             }
-            m_cookies = (Cookie[]) cookieList.toArray(new Cookie[cookieList.size()]);
+            m_cookies = ( Cookie[] ) cookieList.toArray( new Cookie[cookieList.size()] );
         }
 
         return m_cookies;
     }
 
+
     /*
      * (non-Javadoc)
      * 
      * @see
      * javax.servlet.http.HttpServletRequest#getDateHeader(java.lang.String)
      */
-    public long getDateHeader(final String name)
+    public long getDateHeader( final String name )
     {
-        String headerValue = getHeader(name);
+        String headerValue = getHeader( name );
 
-        if (headerValue == null)
+        if ( headerValue == null )
         {
             return -1;
         }
@@ -778,32 +821,33 @@
         {
             SimpleDateFormat sdf = new SimpleDateFormat();
 
-            return sdf.parse(headerValue).getTime();
+            return sdf.parse( headerValue ).getTime();
         }
-        catch (ParseException e)
+        catch ( ParseException e )
         {
-            throw new IllegalArgumentException("Unable to convert to date: "
-                + headerValue);
+            throw new IllegalArgumentException( "Unable to convert to date: " + headerValue );
         }
     }
 
+
     /*
      * (non-Javadoc)
      * 
      * @see javax.servlet.http.HttpServletRequest#getIntHeader(java.lang.String)
      */
-    public int getIntHeader(final String name)
+    public int getIntHeader( final String name )
     {
-        String value = getHeader(name);
+        String value = getHeader( name );
 
-        if (value == null)
+        if ( value == null )
         {
             return -1;
         }
 
-        return Integer.parseInt(value);
+        return Integer.parseInt( value );
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -813,30 +857,33 @@
     {
         String alias = getAlias();
 
-        if (m_uri != null && alias.length() > 0)
+        if ( m_uri != null && alias.length() > 0 )
         {
-            if (m_uri.length() == alias.length())
+            if ( m_uri.length() == alias.length() )
             {
                 return null;
             }
 
-            return m_uri.substring(alias.length());
+            return m_uri.substring( alias.length() );
         }
 
         return null;
     }
 
+
     public String getPathTranslated()
     {
         // TODO: Always returning null may be incorrect.
         return null;
     }
 
+
     public String getContextPath()
     {
         return "";
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -847,26 +894,31 @@
         return m_queryString;
     }
 
+
     public String getRemoteUser()
     {
         return null;
     }
 
-    public boolean isUserInRole(String role)
+
+    public boolean isUserInRole( String role )
     {
         return false;
     }
 
+
     public Principal getUserPrincipal()
     {
         return null;
     }
 
+
     public String getRequestedSessionId()
     {
         return null;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -877,6 +929,7 @@
         return m_uri;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -885,15 +938,16 @@
     public StringBuffer getRequestURL()
     {
         StringBuffer sb = new StringBuffer();
-        if (m_uriHost != null)
+        if ( m_uriHost != null )
         {
-            sb.append(m_uriHost);
+            sb.append( m_uriHost );
         }
-        sb.append(m_uri);
+        sb.append( m_uri );
 
         return sb;
     }
 
+
     /*
      * (non-Javadoc)
      * 
@@ -901,14 +955,13 @@
      */
     public String getServletPath()
     {
-        if (m_servletPath == null)
+        if ( m_servletPath == null )
         {
-            ServiceRegistration element = m_resolver.getServiceRegistration(m_uri);
+            ServiceRegistration element = m_resolver.getServiceRegistration( m_uri );
 
-            if (element == null)
+            if ( element == null )
             {
-                throw new IllegalStateException(
-                    "Unable to get ServletElement for HttpRequest.");
+                throw new IllegalStateException( "Unable to get ServletElement for HttpRequest." );
             }
 
             m_servletPath = element.getAlias();
@@ -917,52 +970,59 @@
         return m_servletPath;
     }
 
+
     /**
      * @return Alias associated with this request
      */
     private String getAlias()
     {
-        ServiceRegistration element = m_resolver.getServiceRegistration(m_uri);
+        ServiceRegistration element = m_resolver.getServiceRegistration( m_uri );
 
-        if (element == null)
+        if ( element == null )
         {
-            throw new IllegalStateException(
-                "Unable to get ServletElement for HttpRequest.");
+            throw new IllegalStateException( "Unable to get ServletElement for HttpRequest." );
         }
 
         return element.getAlias();
     }
 
-    public HttpSession getSession(boolean create)
+
+    public HttpSession getSession( boolean create )
     {
         throw new UnimplementedAPIException();
     }
 
+
     public HttpSession getSession()
     {
         throw new UnimplementedAPIException();
     }
 
+
     public boolean isRequestedSessionIdValid()
     {
         throw new UnimplementedAPIException();
     }
 
+
     public boolean isRequestedSessionIdFromCookie()
     {
         throw new UnimplementedAPIException();
     }
 
+
     public boolean isRequestedSessionIdFromURL()
     {
         throw new UnimplementedAPIException();
     }
 
+
     public boolean isRequestedSessionIdFromUrl()
     {
         throw new UnimplementedAPIException();
     }
 
+
     /**
      * Parse the parameters in the request and return as a Map of <String,
      * String>.
@@ -976,19 +1036,20 @@
 
         String queryString = getQueryString();
 
-        if (queryString != null && queryString.length() > 0)
+        if ( queryString != null && queryString.length() > 0 )
         {
-            parseParameterString(queryString, params);
+            parseParameterString( queryString, params );
         }
 
-        if (m_requestBody != null && m_requestBody.length > 0)
+        if ( m_requestBody != null && m_requestBody.length > 0 )
         {
-            parseParameterString(new String(m_requestBody), params);
+            parseParameterString( new String( m_requestBody ), params );
         }
 
         return Collections.unmodifiableMap( params );
     }
 
+
     /**
      * 
      * @param queryString
@@ -999,28 +1060,29 @@
      * @throws UnsupportedEncodingException
      *             if encoding type is unsupported
      */
-    private void parseParameterString(final String queryString, final Map params)
-        throws UnsupportedEncodingException
+    private void parseParameterString( final String queryString, final Map params ) throws UnsupportedEncodingException
     {
-        for (Iterator i = Arrays.asList(queryString.split("&")).iterator(); i.hasNext();)
+        String[] parameters = splitString( queryString, '&' );
+        for ( Iterator i = Arrays.asList( parameters ).iterator(); i.hasNext(); )
         {
-            String[] nva = i.next().toString().split("=");
+            String[] nva = splitString( i.next().toString(), '=' );
 
-            if (nva.length == 2)
+            if ( nva.length == 2 )
             {
-                params.put(URLDecoder.decode(nva[0].trim(), m_encoding), nva[1].trim());
+                params.put( URLDecoder.decode( nva[0].trim(), m_encoding ), nva[1].trim() );
             }
         }
     }
 
+
     /**
      * @param method
      *            HTTP method
      * @return true if the psased HTTP method is supported by this server.
      */
-    public static boolean isSupportedMethod(final String method)
+    public static boolean isSupportedMethod( final String method )
     {
-        if (method.equals(HttpConstants.OPTIONS_REQUEST))
+        if ( method.equals( HttpConstants.OPTIONS_REQUEST ) )
         {
             return false;
         }
@@ -1028,12 +1090,13 @@
         return true;
     }
 
+
     /* (non-Javadoc)
      * @see java.lang.Object#toString()
      */
     public String toString()
     {
-        if (m_method != null && m_uri != null)
+        if ( m_method != null && m_uri != null )
         {
             return m_method + " " + m_uri;
         }
@@ -1041,6 +1104,7 @@
         return super.toString();
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getLocalAddr()
      */
@@ -1049,6 +1113,7 @@
         return m_socket.getLocalAddress().getHostAddress();
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getLocalName()
      */
@@ -1057,6 +1122,7 @@
         return m_socket.getLocalAddress().getHostName();
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getLocalPort()
      */
@@ -1065,6 +1131,7 @@
         return m_socket.getLocalPort();
     }
 
+
     /* (non-Javadoc)
      * @see javax.servlet.ServletRequest#getRemotePort()
      */
@@ -1072,4 +1139,60 @@
     {
         return m_socket.getPort();
     }
+
+
+    /**
+     * Split a string into substrings based on delimiter character.
+     * 
+     * @param instr input string
+     * @param separator separator char
+     * @return array of substrings
+     * @throws IllegalArgumentException if instr parameter is null.
+     */
+    private static String[] splitString( String instr, char separator )
+    {
+        if ( instr == null )
+        {
+            throw new IllegalArgumentException( "Input string must not be null." );
+        }
+
+        if ( instr.length() == 0 )
+        {
+            return ( new String[0] );
+        }
+
+        List tokens = new ArrayList();
+        String token;
+        int index_a = 0;
+        int index_b = 0;
+
+        while ( true )
+        {
+            index_b = instr.indexOf( separator, index_a );
+            if ( index_b == -1 )
+            {
+                token = instr.substring( index_a );
+
+                if ( token.length() > 0 )
+                {
+                    tokens.add( token );
+                }
+
+                break;
+            }
+            token = instr.substring( index_a, index_b );
+
+            if ( token.length() >= 0 )
+            {
+                tokens.add( token );
+            }
+            index_a = index_b + 1;
+        }
+        String[] str_array = new String[tokens.size()];
+        for ( int i = 0; i < str_array.length; i++ )
+        {
+            str_array[i] = ( String ) ( tokens.get( i ) );
+        }
+        return str_array;
+    }
 }
\ No newline at end of file
