diff --git a/src/java/org/apache/http/client/HttpClient.java b/src/java/org/apache/http/client/HttpClient.java
new file mode 100644
index 000000000..2bbd01400
--- /dev/null
+++ b/src/java/org/apache/http/client/HttpClient.java
@@ -0,0 +1,135 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ *
+ */
+
+package org.apache.http.client;
+
+import java.io.IOException;
+
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpException;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.conn.ClientConnectionManager;
+
+
+
+/**
+ * Interface for an HTTP client.
+ * HTTP clients encapsulate a collection of objects required to
+ * execute HTTP requests while handling cookies, authentication,
+ * connection management, and other features.
+ *
+ * @author Roland Weber
+ *
+ *
+ *
+ * @version $Revision$
+ *
+ * @since 4.0
+ */
+public interface HttpClient {
+
+
+ /**
+ * Obtains the default context for this client.
+ * This context will be used by default when executing requests
+ * with this client.
+ *
+ * @return the default context
+ */
+ HttpContext getContext()
+ ;
+
+
+ /**
+ * Obtains the parameters for this client.
+ * These parameters will become defaults for all requests being
+ * executed with this client, and for the parameters of all
+ * dependent objects in this client.
+ *
+ * @return the default parameters
+ */
+ HttpParams getParams()
+ ;
+
+
+ /**
+ * Obtains the connection manager used by this client.
+ *
+ * @return the connection manager
+ */
+ ClientConnectionManager getConnectionManager()
+ ;
+
+ /**
+ * Executes a request using the {@link #getContext default context}.
+ * Same as {@link #execute(HttpRequest,HttpContext)
+ * client.execute(request, client.getContext())},
+ * see there for details.
+ *
+ * @param request the request to execute
+ *
+ * @return the response to the request
+ *
+ * @throws HttpException in case of a protocol problem
+ * @throws IOException in case of an IO problem
+ *
timeout exceptions?
+ */
+ HttpResponse execute(HttpRequest request)
+ throws HttpException, IOException
+ ;
+
+
+ /**
+ * Executes a request using the given context.
+ *
+ * @param request the request to execute
+ * @param context the context to use for the execution, or
+ * null
to use the
+ * {@link #getContext default context}
+ *
+ * @return the response to the request. This is always a final response,
+ * never an intermediate response with an 1xx status code.
+ * Whether redirects or authentication requests will be returned
+ * or handled automatically depends on the implementation and
+ * configuration of this client.
+ *
+ * @throws HttpException in case of a protocol problem
+ * @throws IOException in case of an IO problem
+ *
timeout exceptions?
+ */
+ HttpResponse execute(HttpRequest request, HttpContext context)
+ throws HttpException, IOException
+ ;
+
+
+} // interface HttpClient
diff --git a/src/java/org/apache/http/client/impl/AbstractHttpClient.java b/src/java/org/apache/http/client/impl/AbstractHttpClient.java
new file mode 100644
index 000000000..b6c1fa375
--- /dev/null
+++ b/src/java/org/apache/http/client/impl/AbstractHttpClient.java
@@ -0,0 +1,154 @@
+/*
+ * $HeadURL$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ * 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.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ *
+ */
+
+package org.apache.http.client.impl;
+
+import java.io.IOException;
+
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpException;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.SyncHttpExecutionContext;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.client.HttpClient;
+
+
+
+/**
+ * Convenience base class for HTTP client implementations.
+ *
+ * @author Roland Weber
+ *
+ *
+ *
+ * @version $Revision$
+ *
+ * @since 4.0
+ */
+public abstract class AbstractHttpClient
+ implements HttpClient {
+
+
+ /** The default context. */
+ protected HttpContext defaultContext;
+
+ /** The parameters. */
+ protected HttpParams defaultParams;
+
+ /** The connection manager. */
+ protected ClientConnectionManager connManager;
+
+
+ /**
+ * Creates a new HTTP client.
+ *
+ * @param context the context, or null
to use an instance of
+ * {@link SyncHttpExecutionContext SyncHttpExecutionContext}
+ * @param params the parameters
+ * @param conman the connection manager
+ */
+ protected AbstractHttpClient(HttpContext context, HttpParams params,
+ ClientConnectionManager conman) {
+ if (params == null)
+ throw new IllegalArgumentException
+ ("Parameters must not be null.");
+ if (conman == null)
+ throw new IllegalArgumentException
+ ("Connection manager must not be null.");
+
+ defaultParams = params;
+ connManager = conman;
+ defaultContext = (context != null) ?
+ context : new SyncHttpExecutionContext(null);
+
+ } // constructor
+
+
+ // non-javadoc, see interface HttpClient
+ public final HttpContext getContext() {
+ return defaultContext;
+ }
+
+
+ /**
+ * Replaces the default context.
+ *
+ * @param context the new default context
+ */
+ public void setContext(HttpContext context) {
+ if (context == null)
+ throw new IllegalArgumentException
+ ("Context must not be null.");
+ defaultContext = context;
+ }
+
+
+ // non-javadoc, see interface HttpClient
+ public final HttpParams getParams() {
+ return defaultParams;
+ }
+
+
+ /**
+ * Replaces the parameters.
+ * The implementation here does not update parameters of dependent objects.
+ *
+ * @param params the new default parameters
+ */
+ public void setParams(HttpParams params) {
+ if (params == null)
+ throw new IllegalArgumentException
+ ("Parameters must not be null.");
+ defaultParams = params;
+ }
+
+
+ // non-javadoc, see interface HttpClient
+ public final ClientConnectionManager getConnectionManager() {
+ return connManager;
+ }
+
+
+ // no setConnectionManager(), too dangerous to replace while in use
+ // derived classes may offer that method at their own risk
+
+
+ // non-javadoc, see interface HttpClient
+ public final HttpResponse execute(HttpRequest request)
+ throws HttpException, IOException {
+
+ return execute(request, defaultContext);
+ }
+
+
+} // class AbstractHttpClient