diff --git a/cxf/pom.xml b/cxf/pom.xml
new file mode 100644
index 0000000..e0f8974
--- /dev/null
+++ b/cxf/pom.xml
@@ -0,0 +1,77 @@
+<?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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.karaf</groupId>
+        <artifactId>webconsole</artifactId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.apache.karaf.webconsole</groupId>
+    <artifactId>org.apache.karaf.webconsole.cxf</artifactId>
+    <packaging>bundle</packaging>
+    <name>Apache Karaf :: Karaf Webconsole Prototype :: CXF extension</name>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.karaf.webconsole</groupId>
+            <artifactId>org.apache.karaf.webconsole.core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-core</artifactId>
+            <version>${cxf.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.5</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
+                        <Import-Package>
+                            !org.apache.karaf.webconsole.cxf*,
+                            *,
+                            <!-- transient dependencies -->
+                            org.ops4j.pax.wicket.api,
+                            org.ops4j.pax.wicket.util,
+                            org.ops4j.pax.wicket.util.proxy,
+                            <!-- camel dependencies -->
+                            org.apache.cxf;version="[2.3,3)",
+                            <!-- cglib (transient) -->
+                            net.sf.cglib.proxy;version="[2,3)",
+                            net.sf.cglib.core;version="[2,3)",
+                            net.sf.cglib.reflect;version="[2,3)",
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/BusFinder.java b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/BusFinder.java
new file mode 100644
index 0000000..20c38e8
--- /dev/null
+++ b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/BusFinder.java
@@ -0,0 +1,11 @@
+package org.apache.karaf.webconsole.cxf.internal;
+
+import java.util.List;
+
+import org.apache.cxf.Bus;
+
+public interface BusFinder {
+
+    List<Bus> getBuses();
+
+}
diff --git a/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/DefaultBusFinder.java b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/DefaultBusFinder.java
new file mode 100644
index 0000000..ee22525
--- /dev/null
+++ b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/DefaultBusFinder.java
@@ -0,0 +1,70 @@
+package org.apache.karaf.webconsole.cxf.internal;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cxf.Bus;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.springframework.context.ApplicationContext;
+
+public class DefaultBusFinder implements BusFinder, ServiceListener {
+
+    private BundleContext context;
+    private List<Bus> buses = Collections.synchronizedList(new LinkedList<Bus>());
+
+    public DefaultBusFinder(BundleContext context) throws InvalidSyntaxException {
+        this.context = context;
+
+        ServiceReference[] references = context.getServiceReferences(ApplicationContext.class.getName(), null);
+        for (ServiceReference reference : references) {
+            String[] classes = (String[]) reference.getProperty(Constants.OBJECTCLASS);
+            for (String clazz : classes) {
+                if (ApplicationContext.class.getName().equals(clazz)) {
+                    buses.addAll(findSpringBus(reference));
+                }
+            }
+        }
+    }
+
+    public List<Bus> getBuses() {
+        return buses;
+    }
+
+    public void serviceChanged(ServiceEvent event) {
+        ServiceReference reference = event.getServiceReference();
+        String[] classes = (String[]) reference.getProperty(Constants.OBJECTCLASS);
+
+        if (event.getType() == ServiceEvent.REGISTERED) {
+            for (String clazz : classes) {
+                if (ApplicationContext.class.getName().equals(clazz)) {
+                    buses.addAll(findSpringBus(reference));
+                }
+            }
+        } else if (event.getType() == ServiceEvent.UNREGISTERING) {
+            for (String clazz : classes) {
+                if (ApplicationContext.class.getName().equals(clazz)) {
+                    buses.removeAll(findSpringBus(reference));
+                }
+            }
+            
+        }
+    }
+
+    private Collection<Bus> findSpringBus(ServiceReference reference) {
+        ApplicationContext appContext = (ApplicationContext) context.getService(reference);
+
+        Map<String, Bus> contextBuses = appContext.getBeansOfType(Bus.class);
+
+        context.ungetService(reference);
+        return contextBuses.values();
+    }
+
+}
diff --git a/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/navigation/CxfConsoleTabProvider.java b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/navigation/CxfConsoleTabProvider.java
new file mode 100644
index 0000000..5bf3540
--- /dev/null
+++ b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/navigation/CxfConsoleTabProvider.java
@@ -0,0 +1,23 @@
+package org.apache.karaf.webconsole.cxf.internal.navigation;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.karaf.webconsole.core.navigation.ConsoleTabProvider;
+import org.apache.karaf.webconsole.core.util.LinkUtils;
+import org.apache.karaf.webconsole.cxf.internal.services.CxfServicesPage;
+import org.apache.wicket.Page;
+import org.apache.wicket.markup.html.link.Link;
+
+public class CxfConsoleTabProvider implements ConsoleTabProvider {
+
+    public List<Link<Page>> getItems(String componentId, String labelId) {
+        return Collections.emptyList();
+    }
+
+    public Link<Page> getModuleLink(String componentId, String labelId) {
+        return LinkUtils.createPageLink(componentId, labelId, "CXF", CxfServicesPage.class);
+    }
+
+
+}
diff --git a/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/BusModel.java b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/BusModel.java
new file mode 100644
index 0000000..4f08888
--- /dev/null
+++ b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/BusModel.java
@@ -0,0 +1,35 @@
+package org.apache.karaf.webconsole.cxf.internal.services;
+
+import java.util.List;
+
+import org.apache.cxf.Bus;
+import org.apache.wicket.model.LoadableDetachableModel;
+
+public class BusModel extends LoadableDetachableModel<Bus> {
+
+    private List<Bus> buses;
+    private String id;
+
+    public BusModel(List<Bus> buses, Bus object) {
+        super(object);
+        this.buses = buses;
+        this.id = object.getId();
+    }
+
+    public BusModel(List<Bus> buses, String id) {
+        this.buses = buses;
+        this.id = id;
+    }
+
+    @Override
+    protected Bus load() {
+        for (Bus bus : buses) {
+            if (id.equals(bus.getId())) {
+                return bus;
+            }
+        }
+
+        throw new IllegalArgumentException("Bus " + id + " not found");
+    }
+
+}
diff --git a/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/CxfBusesActionPanel.java b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/CxfBusesActionPanel.java
new file mode 100644
index 0000000..c77c7f3
--- /dev/null
+++ b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/CxfBusesActionPanel.java
@@ -0,0 +1,33 @@
+package org.apache.karaf.webconsole.cxf.internal.services;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cxf.Bus;
+import org.apache.karaf.webconsole.core.table.ActionsPanel;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.BookmarkablePageLink;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.model.IModel;
+
+public class CxfBusesActionPanel extends ActionsPanel<Bus> {
+
+    public CxfBusesActionPanel(String componentId, IModel<Bus> model) {
+        super(componentId, model);
+    }
+
+    @Override
+    protected List<Link> getLinks(Bus object, String id) {
+        List<Link> links = new ArrayList<Link>();
+
+        PageParameters params = new PageParameters();
+        params.put("busId", object.getId());
+
+        Link link = new BookmarkablePageLink<DetailsPage>(id, DetailsPage.class, params);
+        link.add(new Label("label", "Details"));
+        links.add(link);
+
+        return links;
+    }
+}
diff --git a/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/CxfServicesPage.java b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/CxfServicesPage.java
new file mode 100644
index 0000000..5e489d2
--- /dev/null
+++ b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/CxfServicesPage.java
@@ -0,0 +1,56 @@
+package org.apache.karaf.webconsole.cxf.internal.services;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.cxf.Bus;
+import org.apache.karaf.webconsole.core.page.SinglePage;
+import org.apache.karaf.webconsole.core.table.OrdinalColumn;
+import org.apache.karaf.webconsole.core.table.PropertyColumnExt;
+import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
+import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.ops4j.pax.wicket.api.PaxWicketBean;
+
+public class CxfServicesPage extends SinglePage {
+
+    @PaxWicketBean(name = "busList")
+    private List<Bus> buses;
+
+    public CxfServicesPage() {
+        @SuppressWarnings("unchecked")
+        IColumn<Bus>[] columns = new IColumn[] {
+            new OrdinalColumn<Bus>(),
+            new PropertyColumnExt<Bus>("Bus id", "id"),
+            new AbstractColumn<Bus>(Model.of("Actions")) {
+                public void populateItem(Item<ICellPopulator<Bus>> cellItem, String componentId, IModel<Bus> rowModel) {
+                    cellItem.add(new CxfBusesActionPanel(componentId, rowModel));
+                }
+            }
+        };
+
+        ISortableDataProvider<Bus> provider = new SortableDataProvider<Bus>() {
+            public Iterator<? extends Bus> iterator(int first, int count) {
+                return new ArrayList<Bus>(buses).subList(first, first + count).iterator();
+            }
+
+            public int size() {
+                return buses.size();
+            }
+
+            public IModel<Bus> model(Bus object) {
+                return new BusModel(buses, object);
+            }
+        };
+
+        add(new DefaultDataTable<Bus>("buses", columns, provider, 20));
+    }
+
+}
diff --git a/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/DetailsPage.java b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/DetailsPage.java
new file mode 100644
index 0000000..bca3956
--- /dev/null
+++ b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/DetailsPage.java
@@ -0,0 +1,127 @@
+package org.apache.karaf.webconsole.cxf.internal.services;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.endpoint.ServerRegistry;
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.service.model.OperationInfo;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.karaf.webconsole.core.page.SinglePage;
+import org.apache.karaf.webconsole.cxf.internal.trace.TraceInterceptor;
+import org.apache.wicket.PageParameters;
+import org.apache.wicket.Session;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.link.Link;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.ops4j.pax.wicket.api.PaxWicketBean;
+
+public class DetailsPage extends SinglePage {
+
+    @PaxWicketBean(name = "busList")
+    private List<Bus> buses;
+
+    private TraceInterceptor traceIn = new TraceInterceptor(Phase.RECEIVE, "in");
+    private TraceInterceptor traceOut = new TraceInterceptor(Phase.PRE_STREAM, "out");
+
+    public DetailsPage(PageParameters params) {
+        String busId = params.getString("busId");
+
+        final BusModel model = new BusModel(buses, busId);
+
+        Bus object = model.getObject();
+
+        add(new Link("traceOn") {
+            @Override
+            public void onClick() {
+                Bus bus = model.getObject();
+
+                Session.get().info("Trace enabled");
+                bus.getInInterceptors().add(traceIn);
+                bus.getOutInterceptors().add(traceOut);
+            }
+        });
+
+        add(new Link("traceOff") {
+            @Override
+            public void onClick() {
+                Bus bus = model.getObject();
+
+                Session.get().info("Trace disabled");
+                bus.getInInterceptors().remove(traceIn);
+                bus.getOutInterceptors().remove(traceOut);
+            }
+        });
+
+        ServerRegistry extension = object.getExtension(ServerRegistry.class);
+        LoadableDetachableModel<List<Server>> serverModel = new LoadableDetachableModel<List<Server>>(extension.getServers()) {
+            @Override
+            protected List<Server> load() {
+                return model.getObject().getExtension(ServerRegistry.class).getServers();
+            }
+        };
+
+        add(new ListView<Server>("servers", serverModel) {
+            @Override
+            protected void populateItem(ListItem<Server> item) {
+                Server server = item.getModelObject();
+
+                item.add(new Label("class", server.getClass().getName()));
+
+                item.add(new Link("stop") {
+                    @Override
+                    public void onClick() {
+                        //server.stop();
+                    }
+                });
+                item.add(new Link("start") {
+                    @Override
+                    public void onClick() {
+                        //server.start();
+                    }
+                });
+
+                ServiceInfo service = server.getEndpoint().getEndpointInfo().getService();
+                item.add(new ListView<EndpointInfo>("endpoints", new ArrayList<EndpointInfo>(service.getEndpoints())) {
+                    @Override
+                    protected void populateItem(ListItem<EndpointInfo> item) {
+                        EndpointInfo endpointInfo = item.getModelObject();
+
+                        item.add(new Label("namespace", endpointInfo.getName().getNamespaceURI()));
+                        item.add(new Label("element", endpointInfo.getName().getLocalPart()));
+                        item.add(new Label("transport", endpointInfo.getTransportId()));
+
+                        item.add(new ListView<OperationInfo>("operations", new ArrayList<OperationInfo>(endpointInfo.getInterface().getOperations())) {
+
+                            @Override
+                            protected void populateItem(ListItem<OperationInfo> item) {
+                                OperationInfo operation = item.getModelObject();
+
+                                item.add(new Label("input", "" + operation.getInput().getName()));
+                                item.add(new Label("output", "" + operation.getOutput().getName()));
+                                item.add(new Label("faults", "" + operation.getFaults()));
+                            }
+                            
+                        });
+                    }
+                });
+
+                Endpoint endpoint = server.getEndpoint();
+                List<Interceptor> inInterceptors = (List) endpoint.getInInterceptors();
+                List<Interceptor> outInterceptors = (List) endpoint.getOutInterceptors();
+                List<Interceptor> faultInterceptors = (List) endpoint.getInFaultInterceptors();
+
+                item.add(new InterceptorView("in-interceptors", inInterceptors));
+                item.add(new InterceptorView("out-interceptors", outInterceptors));
+                item.add(new InterceptorView("fault-interceptors", faultInterceptors));
+            }
+        });
+    }
+}
diff --git a/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/InterceptorView.java b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/InterceptorView.java
new file mode 100644
index 0000000..b530b84
--- /dev/null
+++ b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/services/InterceptorView.java
@@ -0,0 +1,34 @@
+package org.apache.karaf.webconsole.cxf.internal.services;
+
+import java.util.List;
+
+import org.apache.cxf.interceptor.Interceptor;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.PhaseInterceptor;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+
+public class InterceptorView extends ListView<Interceptor> {
+
+    public InterceptorView(String id, List<Interceptor> interceptors) {
+        super(id, interceptors);
+    }
+
+    @Override
+    protected void populateItem(ListItem<Interceptor> item) {
+        Interceptor<? extends Message> interceptor = item.getModelObject();
+
+        item.add(new Label("class", interceptor.getClass().getName()));
+
+        if (interceptor instanceof PhaseInterceptor) {
+            PhaseInterceptor phaseInterceptor = (PhaseInterceptor) interceptor;
+            item.add(new Label("phase", phaseInterceptor.getPhase()));
+            item.add(new Label("id", phaseInterceptor.getId()));
+        } else {
+            item.add(new Label("phase", "no phase interceptor"));
+            item.add(new Label("id", "unknown"));
+        }
+    }
+
+}
diff --git a/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/trace/TraceInterceptor.java b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/trace/TraceInterceptor.java
new file mode 100644
index 0000000..ae921e5
--- /dev/null
+++ b/cxf/src/main/java/org/apache/karaf/webconsole/cxf/internal/trace/TraceInterceptor.java
@@ -0,0 +1,22 @@
+package org.apache.karaf.webconsole.cxf.internal.trace;
+
+import java.io.Serializable;
+
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+
+public class TraceInterceptor extends AbstractPhaseInterceptor<Message> implements Serializable {
+
+    private String direction;
+
+    public TraceInterceptor(String phase, String direction) {
+        super(phase);
+        this.direction = direction;
+    }
+
+    public void handleMessage(Message message) throws Fault {
+        System.out.println("--> " + direction + " > " + message);
+    }
+
+}
diff --git a/cxf/src/main/resources/OSGI-INF/blueprint/cxf.xml b/cxf/src/main/resources/OSGI-INF/blueprint/cxf.xml
new file mode 100644
index 0000000..fbea428
--- /dev/null
+++ b/cxf/src/main/resources/OSGI-INF/blueprint/cxf.xml
@@ -0,0 +1,32 @@
+<?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.
+-->
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
+
+    <service interface="org.apache.karaf.webconsole.core.navigation.ConsoleTabProvider">
+        <bean class="org.apache.karaf.webconsole.cxf.internal.navigation.CxfConsoleTabProvider" />
+    </service>
+
+    <bean id="busFinder" class="org.apache.karaf.webconsole.cxf.internal.DefaultBusFinder">
+        <argument ref="blueprintBundleContext" />
+    </bean>
+
+    <service ref="busFinder" auto-export="interfaces" />
+
+    <reference-list id="busList" interface="org.apache.cxf.Bus" availability="optional" />
+
+</blueprint>
diff --git a/cxf/src/main/resources/org/apache/karaf/webconsole/cxf/internal/services/CxfServicesPage.html b/cxf/src/main/resources/org/apache/karaf/webconsole/cxf/internal/services/CxfServicesPage.html
new file mode 100644
index 0000000..8ddf724
--- /dev/null
+++ b/cxf/src/main/resources/org/apache/karaf/webconsole/cxf/internal/services/CxfServicesPage.html
@@ -0,0 +1,33 @@
+<?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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <title>Karaf WebConsole</title>
+</head>
+<body>
+
+    <wicket:extend>
+        <h1>Deployed CXF services</h1>
+
+        <table wicket:id="buses" class="dataview" />
+
+    </wicket:extend>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/cxf/src/main/resources/org/apache/karaf/webconsole/cxf/internal/services/DetailsPage.html b/cxf/src/main/resources/org/apache/karaf/webconsole/cxf/internal/services/DetailsPage.html
new file mode 100644
index 0000000..2c4af46
--- /dev/null
+++ b/cxf/src/main/resources/org/apache/karaf/webconsole/cxf/internal/services/DetailsPage.html
@@ -0,0 +1,181 @@
+<?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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    <title>Karaf WebConsole</title>
+</head>
+<body>
+
+    <wicket:extend>
+        <h1>Bus details</h1>
+
+        <a wicket:id="traceOn">Enable tracing</a>
+        <a wicket:id="traceOff">Disable tracing</a>
+
+        <table class="dataview">
+            <tr>
+                <th colspan="2">Server</th>
+                <th>Operations</th>
+            </tr>
+            <wicket:container wicket:id="servers">
+                <tr>
+                    <td colspan="2">
+                        <span wicket:id="class">org.apache.cxf.rt.SomeClass</span>
+                    </td>
+                    <td>
+                        <a wicket:id="stop">stop</a>
+                        <a wicket:id="start">start</a>
+                    </td>
+                </tr>
+                <tr>
+                    <td colspan="3"><hr /></td>
+                </tr>
+
+                <tr>
+                    <th colspan="3">
+                        <h2>Endpoints</h2>
+                    </th>
+                </tr>
+                <tr>
+                    <th>Namespace</th>
+                    <th>Element</th>
+                    <th>Transport Id</th>
+                </tr>
+                <wicket:container wicket:id="endpoints">
+                    <tr>
+                        <td>
+                            <span wicket:id="namespace">http://someuri</span>
+                        </td>
+                        <td>
+                            <span wicket:id="element">someelem</span>
+                        </td>
+                        <td>
+                            <span wicket:id="transport">soap</span>
+                        </td>
+                    </tr>
+                    <tr>
+                        <th colspan="3">Operations</th>
+                    </tr>
+                    <tr>
+                        <th>Name</th>
+                        <th>Input</th>
+                        <th>Output</th>
+                    </tr>
+                    <wicket:container wicket:id="operations">
+                        <tr>
+                            <td>
+                                <span wicket:id="input">aaa</span>
+                            </td>
+                            <td>
+                                <span wicket:id="output">aaa</span>
+                            </td>
+                            <td>
+                                <span wicket:id="faults">aaa</span>
+                            </td>
+                        </tr>
+                    </wicket:container>
+                </wicket:container>
+                <tr>
+                    <td colspan="3"><hr /></td>
+                </tr>
+
+                <tr>
+                    <th colspan="3">
+                        <h3>In interceptors</h3>
+                    </th>
+                </tr>
+                <tr>
+                    <th width="150px">Id</th>
+                    <th>Class</th>
+                    <th>Phase</th>
+                </tr>
+                <wicket:container wicket:id="in-interceptors">
+                    <tr>
+                        <td>
+                            <span wicket:id="id">some-class</span>
+                        </td>
+                        <td>
+                            <span wicket:id="class">some-class</span>
+                        </td>
+                        <td>
+                            <span wicket:id="phase">some-class</span>
+                        </td>
+                    </tr>
+                </wicket:container>
+                <tr>
+                    <td colspan="3"><hr /></td>
+                </tr>
+
+                <tr>
+                    <th colspan="3">
+                        <h3>Out interceptors</h3>
+                    </th>
+                </tr>
+                <tr>
+                    <th width="150px">Id</th>
+                    <th>Class</th>
+                    <th>Phase</th>
+                </tr>
+                <wicket:container wicket:id="out-interceptors">
+                    <tr>
+                        <td>
+                            <span wicket:id="id">some-class</span>
+                        </td>
+                        <td>
+                            <span wicket:id="class">some-class</span>
+                        </td>
+                        <td>
+                            <span wicket:id="phase">some-class</span>
+                        </td>
+                    </tr>
+                </wicket:container>
+                <tr>
+                    <td colspan="3"><hr /></td>
+                </tr>
+
+                <tr>
+                    <th colspan="3">
+                        <h3>Fault interceptors</h3>
+                    </th>
+                </tr>
+                <tr>
+                    <th width="150px">Id</th>
+                    <th>Class</th>
+                    <th>Phase</th>
+                </tr>
+                <wicket:container wicket:id="fault-interceptors">
+                    <tr>
+                        <td>
+                            <span wicket:id="id">some-class</span>
+                        </td>
+                        <td>
+                            <span wicket:id="class">some-class</span>
+                        </td>
+                        <td>
+                            <span wicket:id="phase">some-class</span>
+                        </td>
+                    </tr>
+                </wicket:container>
+            </wicket:container>
+        </table>
+
+    </wicket:extend>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index a03fe43..054b81f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,7 +34,8 @@
         <ops4j.paxwicket.version>0.8.0-SNAPSHOT</ops4j.paxwicket.version>
         <karaf.version>2.2.2</karaf.version>
         <nmr.version>1.4.0</nmr.version>
-        <camel.version>[2.6.0,3)</camel.version>
+        <camel.version>2.6.0</camel.version>
+        <cxf.version>2.5.0-SNAPSHOT</cxf.version>
     </properties>
 
     <modules>
@@ -45,6 +46,7 @@
         <module>features</module>
         <module>servicemix</module>
         <module>camel</module>
+        <module>cxf</module>
 
         <module>examples</module>
         <module>manual</module>
@@ -72,6 +74,17 @@
             <url>http://wiquery.googlecode.com/svn/repo/</url>
         </repository>
         <repository>
+            <id>apache-snapshot</id>
+            <name>Apache Snapshots</name>
+            <url>http://repository.apache.org/content/groups/snapshots-group/</url>
+            <snapshots>
+                <enabled>true</enabled>
+            </snapshots>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+        </repository>
+        <repository>
             <id>sonatype</id>
             <name>sonatype repo</name>
             <url>http://oss.sonatype.org/content/repositories/ops4j-snapshots/</url>
