You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@celix.apache.org by pn...@apache.org on 2017/11/20 20:33:04 UTC

[07/46] celix git commit: CELIX-417: Initial refactoring for CMake usage

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp b/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
deleted file mode 100644
index 19cf103..0000000
--- a/remote_services/remote_service_admin_http/private/test/rsa_client_server_tests.cpp
+++ /dev/null
@@ -1,495 +0,0 @@
-/**
- *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.
- */
-#include <CppUTest/TestHarness.h>
-#include <remote_constants.h>
-#include <constants.h>
-#include "CppUTest/CommandLineTestRunner.h"
-#include "../../../examples/calculator_service/public/include/calculator_service.h"
-
-extern "C" {
-
-	#include <stdio.h>
-	#include <stdint.h>
-	#include <stdlib.h>
-	#include <string.h>
-	#include <ctype.h>
-	#include <unistd.h>
-
-	#include "celix_launcher.h"
-	#include "framework.h"
-	#include "remote_service_admin.h"
-	#include "calculator_service.h"
-	#include "bundle.h"
-
-	#define DISCOVERY_CFG_NAME      "apache_celix_rsa_discovery_configured"
-	#define RSA_HTTP_NAME           "apache_celix_remote_service_admin_http"
-	#define TOPOLOGY_MANAGER_NAME   "apache_celix_rs_topology_manager"
-	#define CALCULATOR_PROXY   		"apache_celix_remoting_calculator_proxy"
-	#define CALCULATOR_ENDPOINT   	"apache_celix_remoting_calculator_endpoint"
-
-
-	static framework_pt	serverFramework = NULL;
-	static bundle_context_pt serverContext = NULL;
-
-	static framework_pt clientFramework = NULL;
-	static bundle_context_pt clientContext = NULL;
-
-	static void setupFm(void) {
-		int rc = 0;
-		bundle_pt bundle = NULL;
-
-		//server
-		rc = celixLauncher_launch("server.properties", &serverFramework);
-		CHECK_EQUAL(CELIX_SUCCESS, rc);
-
-		bundle = NULL;
-		rc = framework_getFrameworkBundle(serverFramework, &bundle);
-		CHECK_EQUAL(CELIX_SUCCESS, rc);
-
-		rc = bundle_getContext(bundle, &serverContext);
-		CHECK_EQUAL(CELIX_SUCCESS, rc);
-
-		//client
-		rc = celixLauncher_launch("client.properties", &clientFramework);
-		CHECK_EQUAL(CELIX_SUCCESS, rc);
-
-		bundle = NULL;
-		rc = framework_getFrameworkBundle(clientFramework, &bundle);
-		CHECK_EQUAL(CELIX_SUCCESS, rc);
-
-		rc = bundle_getContext(bundle, &clientContext);
-		CHECK_EQUAL(CELIX_SUCCESS, rc);
-	}
-
-	static void teardownFm(void) {
-		celixLauncher_stop(serverFramework);
-		celixLauncher_waitForShutdown(serverFramework);
-		celixLauncher_destroy(serverFramework);
-
-		celixLauncher_stop(clientFramework);
-		celixLauncher_waitForShutdown(clientFramework);
-		celixLauncher_destroy(clientFramework);
-
-		serverContext = NULL;
-		serverFramework = NULL;
-		clientContext = NULL;
-		clientFramework = NULL;
-	}
-
-	static void test1(void) {
-		celix_status_t status;
-		service_reference_pt ref = NULL;
-		calculator_service_pt calcService = NULL;
-        int retries = 4;
-
-        while (ref == NULL && retries > 0) {
-            printf("Waiting for service .. %d\n", retries);
-            status = bundleContext_getServiceReference(clientContext, (char *) CALCULATOR_SERVICE, &ref);
-            usleep(1000000);
-            --retries;
-        }
-
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-		CHECK(ref != NULL);
-
-		status = bundleContext_getService(clientContext, ref, (void **) &calcService);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-		CHECK(calcService != NULL);
-
-		double result = 0;
-		status = calcService->add(calcService->calculator, 2.0, 5.0, &result);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-		CHECK_EQUAL(7.0, result);
-
-		bundleContext_ungetService(clientContext, ref, NULL);
-		bundleContext_ungetServiceReference(clientContext, ref);
-	}
-
-
-	static celix_status_t getPermutations(array_list_pt bundleIds, int from, int to, array_list_pt permutations) {
-		celix_status_t status = CELIX_SUCCESS;
-		int i = 0;
-
-		if (from == to) {
-			long* permutation = (long*) calloc(to + 1, sizeof(*permutation));
-
-			if (!permutation) {
-				status = CELIX_ENOMEM;
-			} else {
-				for (; i <= to; i++) {
-					permutation[i] = (long) arrayList_get(bundleIds, i);
-				}
-
-				arrayList_add(permutations, permutation);
-			}
-		} else {
-			for (i = from; i <= to; i++) {
-				long fromOrg = (long) arrayList_get(bundleIds, from);
-				long iOrg = (long) arrayList_get(bundleIds, i);
-
-				arrayList_set(bundleIds, from, (void*) iOrg);
-				arrayList_set(bundleIds, i, (void*) fromOrg);
-
-				status = getPermutations(bundleIds, from + 1, to, permutations);
-
-				arrayList_set(bundleIds, from, (void*) fromOrg);
-				arrayList_set(bundleIds, i, (void*) iOrg);
-			}
-		}
-
-		return status;
-	}
-
-	static celix_status_t getSpecifiedBundles(bundle_context_pt context, array_list_pt bundleNames, array_list_pt retrievedBundles) {
-		celix_status_t status;
-		array_list_pt bundles = NULL;
-
-		status = bundleContext_getBundles(context, &bundles);
-
-		if (status == CELIX_SUCCESS) {
-			unsigned int size = arrayList_size(bundles);
-			unsigned int i;
-
-			for (i = 0; i < size; i++) {
-				module_pt module = NULL;
-				const char *name = NULL;
-
-				bundle_pt bundle = (bundle_pt) arrayList_get(bundles, i);
-
-				status = bundle_getCurrentModule(bundle, &module);
-
-				if (status == CELIX_SUCCESS) {
-					status = module_getSymbolicName(module, &name);
-				}
-
-				if (status == CELIX_SUCCESS) {
-
-					printf("FOUND %s\n", name);
-
-					array_list_iterator_pt iter = arrayListIterator_create(bundleNames);
-
-					while(arrayListIterator_hasNext(iter)) {
-						char* bundleName = (char*) arrayListIterator_next(iter);
-
-						if ((strcmp(name, bundleName) == 0)) {
-
-							bundle_archive_pt bundleArchive = NULL;
-							long bundleId = -1;
-
-							status = bundle_getArchive(bundle, &bundleArchive);
-
-							if (status == CELIX_SUCCESS) {
-								status = bundleArchive_getId(bundleArchive, &bundleId);
-							}
-
-							if (status == CELIX_SUCCESS) {
-								arrayList_add(retrievedBundles, (void*) bundleId);
-								break;
-							}
-						}
-					}
-
-					arrayListIterator_destroy(iter);
-
-				}
-			}
-
-			arrayList_destroy(bundles);
-		}
-
-		return status;
-	}
-
-	static celix_status_t stopStartPermutation(bundle_context_pt context, long* permutation, int size) {
-		celix_status_t status = CELIX_SUCCESS;
-		int y = 0;
-
-		printf("Test stop/start permutation: ");
-
-		for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
-			bundle_pt bundle = NULL;
-
-			status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
-			if (status == CELIX_SUCCESS) {
-				module_pt module = NULL;
-				const char *name = NULL;
-
-				status = bundle_getCurrentModule(bundle, &module);
-
-				if (status == CELIX_SUCCESS) {
-					status = module_getSymbolicName(module, &name);
-					printf("%s (%ld) ", name, permutation[y]);
-				}
-			}
-		}
-		printf("\n");
-
-		// stop all bundles
-		if (status == CELIX_SUCCESS) {
-			for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
-				bundle_pt bundle = NULL;
-
-				status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
-				if (status == CELIX_SUCCESS) {
-					printf("stop bundle: %ld\n", permutation[y]);
-					status = bundle_stop(bundle);
-				}
-			}
-		}
-
-		// verify stop state
-		if (status == CELIX_SUCCESS) {
-			for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
-				bundle_pt bundle = NULL;
-
-				status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
-				if (status == CELIX_SUCCESS) {
-					bundle_state_e state;
-					status = bundle_getState(bundle, &state);
-
-					if (state != OSGI_FRAMEWORK_BUNDLE_RESOLVED) {
-						printf("bundle %ld has state %d (should be %d) \n", permutation[y], state, OSGI_FRAMEWORK_BUNDLE_RESOLVED);
-						status = CELIX_ILLEGAL_STATE;
-					}
-				}
-			}
-		}
-
-		// start all bundles
-		if (status == CELIX_SUCCESS) {
-
-			for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
-				bundle_pt bundle = NULL;
-
-				status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
-				if (status == CELIX_SUCCESS) {
-					printf("start bundle: %ld\n", permutation[y]);
-					status = bundle_start(bundle);
-				}
-			}
-		}
-
-		// verify started state
-		if (status == CELIX_SUCCESS) {
-			for (y = 0; (y < size) && (status == CELIX_SUCCESS); y++) {
-				bundle_pt bundle = NULL;
-
-				status = bundleContext_getBundleById(context, permutation[y], &bundle);
-
-				if (status == CELIX_SUCCESS) {
-					bundle_state_e state;
-					status = bundle_getState(bundle, &state);
-
-					if (state != OSGI_FRAMEWORK_BUNDLE_ACTIVE) {
-						printf("bundle %ld has state %d (should be %d) \n", permutation[y], state, OSGI_FRAMEWORK_BUNDLE_ACTIVE);
-						status = CELIX_ILLEGAL_STATE;
-					}
-				}
-			}
-		}
-
-		return status;
-	}
-
-	static void testImport(void) {
-		celix_status_t status;
-		array_list_pt bundleNames = NULL;
-		array_list_pt bundlePermutations = NULL;
-		array_list_pt rsaBundles = NULL;
-		unsigned int i, size;
-
-		arrayList_create(&bundleNames);
-		arrayList_create(&bundlePermutations);
-		arrayList_create(&rsaBundles);
-
-		arrayList_add(bundleNames, (void*) DISCOVERY_CFG_NAME);
-		arrayList_add(bundleNames, (void*) RSA_HTTP_NAME);
-		arrayList_add(bundleNames, (void*) TOPOLOGY_MANAGER_NAME);
-
-		status = getSpecifiedBundles(clientContext, bundleNames, rsaBundles);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-		CHECK_EQUAL(arrayList_size(rsaBundles), arrayList_size(bundleNames));
-
-		status = getPermutations(rsaBundles, 0, arrayList_size(rsaBundles) - 1, bundlePermutations);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-
-		size = arrayList_size(bundlePermutations);
-
-		for (i = 0; i < size; ++i) {
-			long* singlePermutation = (long*) arrayList_get(bundlePermutations, i);
-
-			status = stopStartPermutation(clientContext, singlePermutation, arrayList_size(rsaBundles));
-			CHECK_EQUAL(CELIX_SUCCESS, status);
-
-			// check whether calc service is available
-			test1();
-
-			free(singlePermutation);
-		}
-
-		arrayList_destroy(bundlePermutations);
-		arrayList_destroy(bundleNames);
-		arrayList_destroy(rsaBundles);
-	}
-
-	static void testExport(void) {
-		celix_status_t status;
-		array_list_pt bundleNames = NULL;
-		array_list_pt bundlePermutations = NULL;
-		array_list_pt rsaBundles = NULL;
-
-		unsigned int i, size;
-
-		arrayList_create(&bundleNames);
-		arrayList_create(&bundlePermutations);
-		arrayList_create(&rsaBundles);
-
-		arrayList_add(bundleNames, (void*) DISCOVERY_CFG_NAME);
-		arrayList_add(bundleNames, (void*) RSA_HTTP_NAME);
-		arrayList_add(bundleNames, (void*) TOPOLOGY_MANAGER_NAME);
-
-		status = getSpecifiedBundles(serverContext, bundleNames, rsaBundles);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-		CHECK_EQUAL(arrayList_size(rsaBundles), arrayList_size(bundleNames));
-
-		status = getPermutations(rsaBundles, 0, arrayList_size(rsaBundles) - 1, bundlePermutations);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-
-		size = arrayList_size(bundlePermutations);
-
-		for (i = 0; i < size; ++i) {
-			long* singlePermutation = (long*) arrayList_get(bundlePermutations, i);
-
-			status = stopStartPermutation(serverContext, singlePermutation, arrayList_size(rsaBundles));
-			CHECK_EQUAL(CELIX_SUCCESS, status);
-
-			/* we need to sleep here for a bit to ensure
-			 * that the client has flushed the old discovery
-			 * values
-			 */
-			sleep(2);
-
-			// check whether calc service is available
-			test1();
-
-			free(singlePermutation);
-		}
-
-		arrayList_destroy(bundlePermutations);
-		arrayList_destroy(bundleNames);
-		arrayList_destroy(rsaBundles);
-	}
-
-	static void testProxyRemoval(void) {
-		celix_status_t status;
-		bundle_pt bundle = NULL;
-		array_list_pt bundleNames = NULL;
-		array_list_pt proxyBundle = NULL;
-		service_reference_pt ref = NULL;
-
-		arrayList_create(&bundleNames);
-		arrayList_create(&proxyBundle);
-
-		arrayList_add(bundleNames, (void*) CALCULATOR_PROXY);
-		status = getSpecifiedBundles(clientContext, bundleNames, proxyBundle);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-		CHECK_EQUAL(arrayList_size(proxyBundle), arrayList_size(bundleNames));
-
-		status = bundleContext_getBundleById(clientContext, (long) arrayList_get(proxyBundle, 0), &bundle);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-
-		status = bundle_stop(bundle);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-
-		status = bundleContext_getServiceReference(clientContext, (char *) CALCULATOR_SERVICE, &ref);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-		CHECK(ref == NULL);
-
-		arrayList_destroy(bundleNames);
-		arrayList_destroy(proxyBundle);
-	}
-
-	/*
-	static void testEndpointRemoval(void) {
-		celix_status_t status;
-		bundle_pt bundle = NULL;
-		array_list_pt bundleNames = NULL;
-		array_list_pt endpointBundle = NULL;
-		service_reference_pt ref = NULL;
-
-		arrayList_create(&bundleNames);
-		arrayList_create(&endpointBundle);
-
-		arrayList_add(bundleNames, (void*) CALCULATOR_ENDPOINT);
-		status = getSpecifiedBundles(serverContext, bundleNames, endpointBundle);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-		CHECK_EQUAL(arrayList_size(endpointBundle), arrayList_size(bundleNames));
-
-		status = bundleContext_getBundleById(serverContext, (long) arrayList_get(endpointBundle, 0), &bundle);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-
-		status = bundle_stop(bundle);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-
-		status = bundleContext_getServiceReference(serverContext, (char *) CALCULATOR_SERVICE, &ref);
-		CHECK_EQUAL(CELIX_SUCCESS, status);
-		CHECK(ref == NULL);
-
-		arrayList_destroy(bundleNames);
-		arrayList_destroy(endpointBundle);
-	}
-	*/
-}
-
-TEST_GROUP(RsaHttpClientServerTests) {
-	void setup() {
-		setupFm();
-	}
-
-	void teardown() {
-		teardownFm();
-	}
-};
-
-TEST(RsaHttpClientServerTests, Test1) {
-	test1();
-}
-
-TEST(RsaHttpClientServerTests, TestImport) {
-	testImport();
-}
-
-TEST(RsaHttpClientServerTests, TestExport) {
-	testExport();
-}
-
-TEST(RsaHttpClientServerTests, TestProxyRemoval) {
-	testProxyRemoval();
-}
-/*
-TEST(RsaHttpClientServerTests, TestEndpointRemoval) {
-	// test is currenlty failing
-	testEndpointRemoval();
-}
-*/
-

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/remote_service_admin_http/private/test/run_tests.cpp
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/test/run_tests.cpp b/remote_services/remote_service_admin_http/private/test/run_tests.cpp
deleted file mode 100644
index fb6ca3a..0000000
--- a/remote_services/remote_service_admin_http/private/test/run_tests.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- *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.
- */
-#include <CppUTest/TestHarness.h>
-#include "CppUTest/CommandLineTestRunner.h"
-
-int main(int argc, char** argv) {
-    return RUN_ALL_TESTS(argc, argv);
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/remote_service_admin_http/private/test/server.properties.in
----------------------------------------------------------------------
diff --git a/remote_services/remote_service_admin_http/private/test/server.properties.in b/remote_services/remote_service_admin_http/private/test/server.properties.in
deleted file mode 100644
index e7d48ab..0000000
--- a/remote_services/remote_service_admin_http/private/test/server.properties.in
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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.
-
-cosgi.auto.start.1=@rsa_bundle_file@ @calc_bundle_file@ @discovery_configured_bundle_file@ @topology_manager_bundle_file@
-LOGHELPER_ENABLE_STDOUT_FALLBACK=true
-ENDPOINTS=@server_endpoints@
-RSA_PORT=50882
-DISCOVERY_CFG_SERVER_PORT=50992
-org.osgi.framework.storage.clean=onFirstInit
-org.osgi.framework.storage=.cacheServer
-DISCOVERY_CFG_POLL_INTERVAL=1
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/topology_manager/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/CMakeLists.txt b/remote_services/topology_manager/CMakeLists.txt
index 46a3bac..4bac4fd 100644
--- a/remote_services/topology_manager/CMakeLists.txt
+++ b/remote_services/topology_manager/CMakeLists.txt
@@ -29,8 +29,6 @@ if (RSA_TOPOLOGY_MANAGER)
         private/src/scope
         private/src/activator
 
-        ${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c
-
         private/include/topology_manager.h
         public/include/tm_scope.h
         VERSION 0.9.0
@@ -38,6 +36,7 @@ if (RSA_TOPOLOGY_MANAGER)
         NAME
             "Apache Celix RS Topology Manager"
     )
+    target_link_libraries(topology_manager PRIVATE Celix::log_helper)
 
     install_bundle(topology_manager)
 
@@ -50,6 +49,4 @@ if (RSA_TOPOLOGY_MANAGER)
         include_directories(${CPPUTEST_EXT_INCLUDE_DIR})
         add_subdirectory(tms_tst)
    endif (ENABLE_TESTING)
-
-   target_link_libraries(topology_manager celix_framework celix_utils)
 endif (RSA_TOPOLOGY_MANAGER)

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/topology_manager/tms_tst/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/tms_tst/CMakeLists.txt b/remote_services/topology_manager/tms_tst/CMakeLists.txt
index 16ad011..dc671e4 100644
--- a/remote_services/topology_manager/tms_tst/CMakeLists.txt
+++ b/remote_services/topology_manager/tms_tst/CMakeLists.txt
@@ -39,7 +39,7 @@ add_executable(test_tm_scoped
     
    ${PROJECT_SOURCE_DIR}/remote_services/remote_service_admin/private/src/endpoint_description.c
 )
-target_link_libraries(test_tm_scoped celix_framework celix_utils ${CPPUTEST_LIBRARY} ${JANSSON_LIBRARY})
+target_link_libraries(test_tm_scoped Celix::framework ${CPPUTEST_LIBRARY} ${JANSSON_LIBRARY} Celix::log_helper)
 
 add_dependencies(test_tm_scoped remote_service_admin_dfi topology_manager calculator)
 

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt b/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt
index 6e269f5..9e36e4c 100644
--- a/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt
+++ b/remote_services/topology_manager/tms_tst/bundle/CMakeLists.txt
@@ -32,4 +32,4 @@ bundle_files(topology_manager_test_bundle
     DESTINATION .
 )
 
-target_link_libraries(topology_manager_test_bundle ${CPPUTEST_LIBRARY} celix_framework celix_utils)
+target_link_libraries(topology_manager_test_bundle PRIVATE ${CPPUTEST_LIBRARY})

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt b/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt
index a19efc7..b961de7 100644
--- a/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt
+++ b/remote_services/topology_manager/tms_tst/disc_mock/CMakeLists.txt
@@ -30,4 +30,4 @@ add_bundle(topology_manager_disc_mock_bundle
         disc_mock_service.c
 
 )
-target_link_libraries(topology_manager_disc_mock_bundle ${CPPUTEST_LIBRARY} celix_framework celix_utils)
+target_link_libraries(topology_manager_disc_mock_bundle PRIVATE ${CPPUTEST_LIBRARY} Celix::framework)

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/remote_shell/CMakeLists.txt b/remote_shell/CMakeLists.txt
index 7c37d13..a7f5d36 100644
--- a/remote_shell/CMakeLists.txt
+++ b/remote_shell/CMakeLists.txt
@@ -22,25 +22,23 @@ if (REMOTE_SHELL)
      	VERSION "0.0.2"
      	NAME: "Apache Celix Remote Shell"
 		SOURCES
-			private/src/activator
-			private/src/connection_listener
-			private/src/shell_mediator
-			private/src/remote_shell
-
-			${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c
-
-			private/include/remote_shell.h
-			private/include/connection_listener.h
+			src/activator
+			src/connection_listener
+			src/shell_mediator
+			src/remote_shell
 	)
-	
+
+	target_include_directories(remote_shell PRIVATE src)
+	target_link_libraries(remote_shell PRIVATE log_helper)
 	install_bundle(remote_shell)
- 
-    include_directories("private/include")
+
     include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
-    include_directories("${PROJECT_SOURCE_DIR}/shell/public/include")
     include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
     
-    target_link_libraries(remote_shell celix_framework)
+    target_link_libraries(remote_shell PRIVATE Celix::shell_api)
+
+	#Alias setup to match external usage
+	add_library(Celix::remote_shell ALIAS remote_shell)
 
-    add_deploy("remote_shell_deploy" NAME "remote_shell"  BUNDLES shell remote_shell shell_tui log_service)
+    add_deploy("remote_shell_deploy" NAME "remote_shell"  BUNDLES Celix::shell Celix::remote_shell Celix::shell_tui log_service)
 endif (REMOTE_SHELL)

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/include/connection_listener.h
----------------------------------------------------------------------
diff --git a/remote_shell/private/include/connection_listener.h b/remote_shell/private/include/connection_listener.h
deleted file mode 100644
index 392d6ec..0000000
--- a/remote_shell/private/include/connection_listener.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- *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.
- */
-/*
- * connection_listener.h
- *
- *  \date       Nov 4, 2012
- *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- *  \copyright	Apache License, Version 2.0
- */
-
-#ifndef connectionListener_H_
-#define connectionListener_H_
-
-#include <bundle_context.h>
-#include <celix_errno.h>
-
-#include "remote_shell.h"
-
-typedef struct connection_listener *connection_listener_pt;
-
-celix_status_t connectionListener_create(remote_shell_pt remoteShell, int port, connection_listener_pt *instance);
-celix_status_t connectionListener_destroy(connection_listener_pt instance);
-celix_status_t connectionListener_start(connection_listener_pt instance);
-celix_status_t connectionListener_stop(connection_listener_pt instance);
-
-#endif /* connectionListener_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/include/remote_shell.h
----------------------------------------------------------------------
diff --git a/remote_shell/private/include/remote_shell.h b/remote_shell/private/include/remote_shell.h
deleted file mode 100644
index 55249a8..0000000
--- a/remote_shell/private/include/remote_shell.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- *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.
- */
-/*
- * remote_shell.h
- *
- *  \date       Nov 4, 2012
- *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- *  \copyright	Apache License, Version 2.0
- */
-
-#ifndef REMOTE_SHELL_H_
-#define REMOTE_SHELL_H_
-
-#include <bundle_context.h>
-#include <celix_errno.h>
-
-#include "shell_mediator.h"
-
-struct remote_shell {
-	log_helper_pt* loghelper;
-	shell_mediator_pt mediator;
-	celix_thread_mutex_t mutex;
-	int maximumConnections;
-
-	array_list_pt connections;
-};
-typedef struct remote_shell *remote_shell_pt;
-
-celix_status_t remoteShell_create(shell_mediator_pt mediator, int maximumConnections, remote_shell_pt *instance);
-celix_status_t remoteShell_destroy(remote_shell_pt instance);
-celix_status_t remoteShell_addConnection(remote_shell_pt instance, int socket);
-celix_status_t remoteShell_stopConnections(remote_shell_pt instance);
-
-#endif /* REMOTE_SHELL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/include/shell_mediator.h
----------------------------------------------------------------------
diff --git a/remote_shell/private/include/shell_mediator.h b/remote_shell/private/include/shell_mediator.h
deleted file mode 100644
index 24e8250..0000000
--- a/remote_shell/private/include/shell_mediator.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- *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.
- */
-/*
- * shell_mediator.h
- *
- *  \date       Nov 4, 2012
- *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- *  \copyright	Apache License, Version 2.0
- */
-
-
-#ifndef shellMediator_H_
-#define shellMediator_H_
-
-#include <bundle_context.h>
-#include <service_tracker.h>
-#include <celix_errno.h>
-
-#include <shell.h>
-
-struct shell_mediator {
-
-	log_helper_pt loghelper;
-	bundle_context_pt context;
-	service_tracker_pt tracker;
-	celix_thread_mutex_t mutex;
-
-	//protected by mutex
-	shell_service_pt shellService;
-};
-typedef struct shell_mediator *shell_mediator_pt;
-
-celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance);
-celix_status_t shellMediator_stop(shell_mediator_pt instance);
-celix_status_t shellMediator_destroy(shell_mediator_pt instance);
-celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *command, FILE *out, FILE *err);
-
-#endif /* shellMediator_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/src/activator.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/activator.c b/remote_shell/private/src/activator.c
deleted file mode 100644
index 541eda6..0000000
--- a/remote_shell/private/src/activator.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- *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.
- */
-/*
- * activator.c
- *
- *  \date       Nov 4, 2012
- *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- *  \copyright	Apache License, Version 2.0
- */
-
-#include <celix_errno.h>
-
-#include <stdlib.h>
-
-#include "bundle_activator.h"
-#include "bundle_context.h"
-
-#include "log_helper.h"
-#include "connection_listener.h"
-#include "shell_mediator.h"
-#include "remote_shell.h"
-
-#define REMOTE_SHELL_TELNET_PORT_PROPERTY_NAME 	"remote.shell.telnet.port"
-#define DEFAULT_REMOTE_SHELL_TELNET_PORT 		6666
-
-#define REMOTE_SHELL_TELNET_MAXCONN_PROPERTY_NAME 	"remote.shell.telnet.maxconn"
-#define DEFAULT_REMOTE_SHELL_TELNET_MAXCONN 		2
-
-struct bundle_instance {
-	log_helper_pt loghelper;
-	shell_mediator_pt shellMediator;
-	remote_shell_pt remoteShell;
-	connection_listener_pt connectionListener;
-};
-
-typedef struct bundle_instance *bundle_instance_pt;
-
-static int bundleActivator_getPort(bundle_instance_pt bi, bundle_context_pt context);
-static int bundleActivator_getMaximumConnections(bundle_instance_pt bi, bundle_context_pt context);
-static int bundleActivator_getProperty(bundle_instance_pt bi, bundle_context_pt context, char * propertyName, int defaultValue);
-
-celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
-	celix_status_t status = CELIX_SUCCESS;
-
-	bundle_instance_pt bi = (bundle_instance_pt) calloc(1, sizeof(struct bundle_instance));
-
-	if (!bi)
-	{
-		status = CELIX_ENOMEM;
-	}
-	else if (userData != NULL) {
-		bi->shellMediator = NULL;
-		bi->remoteShell = NULL;
-		bi->connectionListener = NULL;
-
-		status = logHelper_create(context, &bi->loghelper);
-
-		(*userData) = bi;
-	} else {
-		status = CELIX_ILLEGAL_ARGUMENT;
-		free(bi);
-	}
-
-	return status;
-}
-
-celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
-	celix_status_t status = CELIX_SUCCESS;
-	bundle_instance_pt bi = (bundle_instance_pt) userData;
-
-	int port = bundleActivator_getPort(bi, context);
-	int maxConn = bundleActivator_getMaximumConnections(bi, context);
-
-	status = logHelper_start(bi->loghelper);
-
-	status = CELIX_DO_IF(status, shellMediator_create(context, &bi->shellMediator));
-	status = CELIX_DO_IF(status, remoteShell_create(bi->shellMediator, maxConn, &bi->remoteShell));
-	status = CELIX_DO_IF(status, connectionListener_create(bi->remoteShell, port, &bi->connectionListener));
-	status = CELIX_DO_IF(status, connectionListener_start(bi->connectionListener));
-
-	return status;
-}
-
-celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) {
-	celix_status_t status = CELIX_SUCCESS;
-	bundle_instance_pt bi = (bundle_instance_pt) userData;
-
-	connectionListener_stop(bi->connectionListener);
-	shellMediator_stop(bi->shellMediator);
-	shellMediator_destroy(bi->shellMediator);
-
-	remoteShell_stopConnections(bi->remoteShell);
-
-	status = logHelper_stop(bi->loghelper);
-
-	return status;
-}
-
-celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
-	celix_status_t status = CELIX_SUCCESS;
-	bundle_instance_pt bi = (bundle_instance_pt) userData;
-
-	connectionListener_destroy(bi->connectionListener);
-	status = logHelper_destroy(&bi->loghelper);
-
-	return status;
-}
-
-static int bundleActivator_getPort(bundle_instance_pt bi, bundle_context_pt context) {
-	return bundleActivator_getProperty(bi, context, REMOTE_SHELL_TELNET_PORT_PROPERTY_NAME, DEFAULT_REMOTE_SHELL_TELNET_PORT);
-}
-
-static int bundleActivator_getMaximumConnections(bundle_instance_pt bi, bundle_context_pt context) {
-	return bundleActivator_getProperty(bi, context, REMOTE_SHELL_TELNET_MAXCONN_PROPERTY_NAME, DEFAULT_REMOTE_SHELL_TELNET_MAXCONN);
-}
-
-static int bundleActivator_getProperty(bundle_instance_pt bi, bundle_context_pt context, char* propertyName, int defaultValue) {
-	const char *strValue = NULL;
-	int value;
-
-	bundleContext_getProperty(context, propertyName, &strValue);
-	if (strValue != NULL) {
-		char* endptr = (char*)strValue;
-
-		errno = 0;
-		value = strtol(strValue, &endptr, 10);
-		if (*endptr || errno != 0) {
-			logHelper_log(bi->loghelper, OSGI_LOGSERVICE_WARNING, "incorrect format for %s", propertyName);
-			value = defaultValue;
-		}
-	}
-	else {
-		value = defaultValue;
-	}
-
-	return value;
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/src/connection_listener.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/connection_listener.c b/remote_shell/private/src/connection_listener.c
deleted file mode 100644
index 3bef9e5..0000000
--- a/remote_shell/private/src/connection_listener.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/**
- *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.
- */
-/*
- * connection_listener.c
- *
- *  \date       Nov 4, 2012
- *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- *  \copyright	Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <celix_errno.h>
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <fcntl.h>
-
-#include "log_service.h"
-#include "log_helper.h"
-
-#include "connection_listener.h"
-
-#include "shell_mediator.h"
-#include "remote_shell.h"
-
-#define CONNECTION_LISTENER_TIMEOUT_SEC		5
-
-struct connection_listener {
-	//constant
-	int port;
-	log_helper_pt* loghelper;
-	remote_shell_pt remoteShell;
-	celix_thread_mutex_t mutex;
-
-	//protected by mutex
-	bool running;
-	celix_thread_t thread;
-	fd_set pollset;
-};
-
-static void* connection_listener_thread(void *data);
-
-celix_status_t connectionListener_create(remote_shell_pt remoteShell, int port, connection_listener_pt *instance) {
-	celix_status_t status = CELIX_SUCCESS;
-	(*instance) = calloc(1, sizeof(**instance));
-
-	if ((*instance) != NULL) {
-		(*instance)->port = port;
-		(*instance)->remoteShell = remoteShell;
-		(*instance)->running = false;
-		(*instance)->loghelper = remoteShell->loghelper;
-
-		FD_ZERO(&(*instance)-> pollset);
-
-		status = celixThreadMutex_create(&(*instance)->mutex, NULL);
-	} else {
-		status = CELIX_ENOMEM;
-	}
-	return status;
-}
-
-celix_status_t connectionListener_start(connection_listener_pt instance) {
-	celix_status_t status = CELIX_SUCCESS;
-	celixThreadMutex_lock(&instance->mutex);
-	celixThread_create(&instance->thread, NULL, connection_listener_thread, instance);
-	celixThreadMutex_unlock(&instance->mutex);
-	return status;
-}
-
-celix_status_t connectionListener_stop(connection_listener_pt instance) {
-	celix_status_t status = CELIX_SUCCESS;
-	celix_thread_t thread;
-	fd_set pollset;
-
-	instance->running = false;
-	FD_ZERO(&pollset);
-
-	logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "CONNECTION_LISTENER: Stopping thread\n");
-
-	celixThreadMutex_lock(&instance->mutex);
-	thread = instance->thread;
-
-	pollset = instance->pollset;
-	celixThreadMutex_unlock(&instance->mutex);
-
-	celixThread_join(thread, NULL);
-	return status;
-}
-
-celix_status_t connectionListener_destroy(connection_listener_pt instance) {
-	free(instance);
-
-	return CELIX_SUCCESS;
-}
-
-static void* connection_listener_thread(void *data) {
-	celix_status_t status = CELIX_BUNDLE_EXCEPTION;
-	connection_listener_pt instance = data;
-	struct timeval timeout; /* Timeout for select */
-	fd_set active_fd_set;
-	FD_ZERO(&active_fd_set);
-	int listenSocket = 0;
-	int on = 1;
-
-	struct addrinfo *result, *rp;
-	struct addrinfo hints;
-
-	memset(&hints, 0, sizeof(struct addrinfo));
-	hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
-	hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
-	hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */
-	hints.ai_protocol = 0; /* Any protocol */
-	hints.ai_canonname = NULL;
-	hints.ai_addr = NULL;
-	hints.ai_next = NULL;
-
-	char portStr[10];
-	snprintf(&portStr[0], 10, "%d", instance->port);
-
-	getaddrinfo(NULL, portStr, &hints, &result);
-
-	for (rp = result; rp != NULL && status == CELIX_BUNDLE_EXCEPTION; rp = rp->ai_next) {
-
-		status = CELIX_BUNDLE_EXCEPTION;
-
-		/* Create socket */
-		listenSocket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
-		if (listenSocket < 0) {
-			logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "Error creating socket: %s", strerror(errno));
-		}
-		else if (setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)) < 0) {
-			logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "cannot set socket option: %s", strerror(errno));
-		}
-		else if (bind(listenSocket, rp->ai_addr, rp->ai_addrlen) < 0) {
-			logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "cannot bind: %s", strerror(errno));
-		}
-		else if (listen(listenSocket, 5) < 0) {
-			logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "listen failed: %s", strerror(errno));
-		}
-		else {
-			status = CELIX_SUCCESS;
-		}
-	}
-
-	if (status == CELIX_SUCCESS) {
-
-		logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "Remote Shell accepting connections on port %d", instance->port);
-
-		celixThreadMutex_lock(&instance->mutex);
-		instance->pollset = active_fd_set;
-		celixThreadMutex_unlock(&instance->mutex);
-
-		instance->running = true;
-
-		while (status == CELIX_SUCCESS && instance->running) {
-			int selectRet = -1;
-			do {
-				timeout.tv_sec = CONNECTION_LISTENER_TIMEOUT_SEC;
-				timeout.tv_usec = 0;
-
-				FD_ZERO(&active_fd_set);
-				FD_SET(listenSocket, &active_fd_set);
-
-				selectRet = select(listenSocket + 1, &active_fd_set, NULL, NULL, &timeout);
-			} while (selectRet == -1 && errno == EINTR && instance->running == true);
-			if (selectRet < 0) {
-				logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "select on listenSocket failed: %s", strerror(errno));
-				status = CELIX_BUNDLE_EXCEPTION;
-			}
-			else if (selectRet == 0) {
-				/* do nothing here */
-			}
-			else if (FD_ISSET(listenSocket, &active_fd_set)) {
-				int acceptedSocket = accept(listenSocket, NULL, NULL);
-
-				if (acceptedSocket < 0) {
-					logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "REMOTE_SHELL: accept failed: %s.", strerror(errno));
-					status = CELIX_BUNDLE_EXCEPTION;
-				}
-				else {
-					logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "REMOTE_SHELL: connection established.");
-					remoteShell_addConnection(instance->remoteShell, acceptedSocket);
-				}
-			}
-			else {
-				logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_DEBUG, "REMOTE_SHELL: received data on a not-expected file-descriptor?");
-			}
-		}
-	}
-
-	if (listenSocket >= 0) {
-		close(listenSocket);
-	}
-
-	freeaddrinfo(result);
-
-	return NULL;
-}
-

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/src/remote_shell.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/remote_shell.c b/remote_shell/private/src/remote_shell.c
deleted file mode 100644
index 8f42778..0000000
--- a/remote_shell/private/src/remote_shell.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/**
- *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.
- */
-/*
- * remote_shell.c
- *
- *  \date       Nov 4, 2012
- *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- *  \copyright	Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <utils.h>
-#include <array_list.h>
-#include <sys/socket.h>
-
-#include "log_helper.h"
-
-#include "log_service.h"
-#include "remote_shell.h"
-
-#define COMMAND_BUFF_SIZE (256)
-
-#define RS_PROMPT ("-> ")
-#define RS_WELCOME ("\n---- Apache Celix Remote Shell ----\n---- Type exit to disconnect   ----\n\n-> ")
-#define RS_GOODBYE ("Goobye!\n")
-#define RS_ERROR ("Error executing command!\n")
-#define RS_MAXIMUM_CONNECTIONS_REACHED ("Maximum number of connections  reached. Disconnecting ...\n")
-
-#define CONNECTION_LISTENER_TIMEOUT_SEC		5
-
-
-
-struct connection {
-	remote_shell_pt parent;
-	FILE *socketStream;
-	fd_set pollset;
-	bool threadRunning;
-};
-
-typedef struct connection *connection_pt;
-
-static celix_status_t remoteShell_connection_print(connection_pt connection, char * text);
-static celix_status_t remoteShell_connection_execute(connection_pt connection, char *command);
-static void* remoteShell_connection_run(void *data);
-
-celix_status_t remoteShell_create(shell_mediator_pt mediator, int maximumConnections, remote_shell_pt *instance) {
-	celix_status_t status = CELIX_SUCCESS;
-	(*instance) = calloc(1, sizeof(**instance));
-	if ((*instance) != NULL) {
-		(*instance)->mediator = mediator;
-		(*instance)->maximumConnections = maximumConnections;
-		(*instance)->connections = NULL;
-		(*instance)->loghelper = &mediator->loghelper;
-
-		status = celixThreadMutex_create(&(*instance)->mutex, NULL);
-
-		if (status == CELIX_SUCCESS) {
-			status = arrayList_create(&(*instance)->connections);
-		}
-	} else {
-		status = CELIX_ENOMEM;
-	}
-	return status;
-}
-
-celix_status_t remoteShell_destroy(remote_shell_pt instance) {
-	celix_status_t status = CELIX_SUCCESS;
-
-	remoteShell_stopConnections(instance);
-
-	celixThreadMutex_lock(&instance->mutex);
-	arrayList_destroy(instance->connections);
-	celixThreadMutex_unlock(&instance->mutex);
-
-	return status;
-}
-
-celix_status_t remoteShell_addConnection(remote_shell_pt instance, int socket) {
-	celix_status_t status = CELIX_SUCCESS;
-	connection_pt connection = calloc(1, sizeof(struct connection));
-
-	if (connection != NULL) {
-		connection->parent = instance;
-		connection->threadRunning = false;
-		connection->socketStream = fdopen(socket, "w");
-
-		if (connection->socketStream != NULL) {
-
-			celixThreadMutex_lock(&instance->mutex);
-
-			if (arrayList_size(instance->connections) < instance->maximumConnections) {
-				celix_thread_t connectionRunThread = celix_thread_default;
-				arrayList_add(instance->connections, connection);
-				status = celixThread_create(&connectionRunThread, NULL, &remoteShell_connection_run, connection);
-			} else {
-				status = CELIX_BUNDLE_EXCEPTION;
-				remoteShell_connection_print(connection, RS_MAXIMUM_CONNECTIONS_REACHED);
-			}
-			celixThreadMutex_unlock(&instance->mutex);
-
-		} else {
-			status = CELIX_BUNDLE_EXCEPTION;
-		}
-	} else {
-		status = CELIX_ENOMEM;
-	}
-
-	if (status != CELIX_SUCCESS && connection != NULL) {
-		if (connection->socketStream != NULL) {
-			fclose(connection->socketStream);
-		}
-		free(connection);
-	}
-
-	return status;
-}
-
-celix_status_t remoteShell_stopConnections(remote_shell_pt instance) {
-	celix_status_t status = CELIX_SUCCESS;
-	int length = 0;
-	int i = 0;
-
-	celixThreadMutex_lock(&instance->mutex);
-	length = arrayList_size(instance->connections);
-
-	for (i = 0; i < length; i += 1) {
-		connection_pt connection = arrayList_get(instance->connections, i);
-		connection->threadRunning = false;
-	}
-
-	celixThreadMutex_unlock(&instance->mutex);
-
-	return status;
-}
-
-void *remoteShell_connection_run(void *data) {
-	celix_status_t status = CELIX_SUCCESS;
-	connection_pt connection = data;
-	size_t len;
-	int result;
-	struct timeval timeout; /* Timeout for select */
-
-	int fd = fileno(connection->socketStream);
-
-	connection->threadRunning = true;
-	status = remoteShell_connection_print(connection, RS_WELCOME);
-
-	while (status == CELIX_SUCCESS && connection->threadRunning == true) {
-		do {
-			timeout.tv_sec = CONNECTION_LISTENER_TIMEOUT_SEC;
-			timeout.tv_usec = 0;
-
-			FD_ZERO(&connection->pollset);
-			FD_SET(fd, &connection->pollset);
-			result = select(fd + 1, &connection->pollset, NULL, NULL, &timeout);
-		} while (result == -1 && errno == EINTR && connection->threadRunning == true);
-
-		/* The socket_fd has data available to be read */
-		if (result > 0 && FD_ISSET(fd, &connection->pollset)) {
-			char buff[COMMAND_BUFF_SIZE];
-
-			len = recv(fd, buff, COMMAND_BUFF_SIZE - 1, 0);
-			if (len < COMMAND_BUFF_SIZE) {
-				celix_status_t commandStatus = CELIX_SUCCESS;
-				buff[len] = '\0';
-
-				commandStatus = remoteShell_connection_execute(connection, buff);
-
-				if (commandStatus == CELIX_SUCCESS) {
-					remoteShell_connection_print(connection, RS_PROMPT);
-				} else if (commandStatus == CELIX_FILE_IO_EXCEPTION) {
-					//exit command
-					break;
-				} else { //error
-					remoteShell_connection_print(connection, RS_ERROR);
-					remoteShell_connection_print(connection, RS_PROMPT);
-				}
-
-			} else {
-				logHelper_log(*connection->parent->loghelper, OSGI_LOGSERVICE_ERROR, "REMOTE_SHELL: Error while retrieving data");
-			}
-		}
-	}
-
-	remoteShell_connection_print(connection, RS_GOODBYE);
-
-	logHelper_log(*connection->parent->loghelper, OSGI_LOGSERVICE_INFO, "REMOTE_SHELL: Closing socket");
-	celixThreadMutex_lock(&connection->parent->mutex);
-	arrayList_removeElement(connection->parent->connections, connection);
-	celixThreadMutex_unlock(&connection->parent->mutex);
-
-	fclose(connection->socketStream);
-
-	return NULL;
-}
-
-static celix_status_t remoteShell_connection_execute(connection_pt connection, char *command) {
-	celix_status_t status = CELIX_SUCCESS;
-
-	if (status == CELIX_SUCCESS) {
-		char *dline = strdup(command);
-		char *line = utils_stringTrim(dline);
-		int len = strlen(line);
-
-		if (len == 0) {
-			//ignore
-		} else if (len == 4 && strncmp("exit", line, 4) == 0) {
-			status = CELIX_FILE_IO_EXCEPTION;
-		} else {
-			status = shellMediator_executeCommand(connection->parent->mediator, line, connection->socketStream, connection->socketStream);
-            fflush(connection->socketStream);
-		}
-
-		free(dline);
-	}
-
-	return status;
-}
-
-celix_status_t remoteShell_connection_print(connection_pt connection, char *text) {
-	size_t len = strlen(text);
-    int fd = fileno(connection->socketStream);
-	return (send(fd, text, len, 0) > 0) ? CELIX_SUCCESS : CELIX_FILE_IO_EXCEPTION;
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/private/src/shell_mediator.c
----------------------------------------------------------------------
diff --git a/remote_shell/private/src/shell_mediator.c b/remote_shell/private/src/shell_mediator.c
deleted file mode 100644
index d9722a9..0000000
--- a/remote_shell/private/src/shell_mediator.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/**
- *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.
- */
-/*
- * shell_mediator.c
- *
- *  \date       Nov 4, 2012
- *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
- *  \copyright	Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <utils.h>
-#include <shell.h>
-#include <service_tracker.h>
-#include <command.h>
-#include <sys/socket.h>
-
-#include "log_helper.h"
-#include "log_service.h"
-#include "shell_mediator.h"
-
-static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service);
-static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service);
-
-celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance) {
-	celix_status_t status = CELIX_SUCCESS;
-	service_tracker_customizer_pt customizer = NULL;
-
-	(*instance) = (shell_mediator_pt) calloc(1, sizeof(**instance));
-	if ((*instance) != NULL) {
-
-		(*instance)->context = context;
-		(*instance)->tracker = NULL;
-		(*instance)->shellService = NULL;
-
-		status = logHelper_create(context, &(*instance)->loghelper);
-
-		status = CELIX_DO_IF(status, celixThreadMutex_create(&(*instance)->mutex, NULL));
-
-		status = CELIX_DO_IF(status, serviceTrackerCustomizer_create((*instance), NULL, shellMediator_addedService,
-				NULL, shellMediator_removedService, &customizer));
-		status = CELIX_DO_IF(status, serviceTracker_create(context, (char * )OSGI_SHELL_SERVICE_NAME, customizer, &(*instance)->tracker));
-
-		if (status == CELIX_SUCCESS) {
-			logHelper_start((*instance)->loghelper);
-			serviceTracker_open((*instance)->tracker);
-		}
-	} else {
-		status = CELIX_ENOMEM;
-	}
-
-	if ((status != CELIX_SUCCESS) && ((*instance) != NULL)){
-		logHelper_log((*instance)->loghelper, OSGI_LOGSERVICE_ERROR, "Error creating shell_mediator, error code is %i\n", status);
-	}
-	return status;
-}
-
-celix_status_t shellMediator_stop(shell_mediator_pt instance) {
-	service_tracker_pt tracker;
-	celixThreadMutex_lock(&instance->mutex);
-	tracker = instance->tracker;
-	celixThreadMutex_unlock(&instance->mutex);
-
-	if (tracker != NULL) {
-		serviceTracker_close(tracker);
-	}
-
-    return CELIX_SUCCESS;
-}
-
-celix_status_t shellMediator_destroy(shell_mediator_pt instance) {
-	celix_status_t status = CELIX_SUCCESS;
-
-	celixThreadMutex_lock(&instance->mutex);
-
-	instance->shellService = NULL;
-	serviceTracker_destroy(instance->tracker);
-	logHelper_stop(instance->loghelper);
-	status = logHelper_destroy(&instance->loghelper);
-	celixThreadMutex_destroy(&instance->mutex);
-
-
-	free(instance);
-
-
-	return status;
-}
-
-celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *command, FILE *out, FILE *err) {
-	celix_status_t status = CELIX_SUCCESS;
-
-	celixThreadMutex_lock(&instance->mutex);
-
-
-	if (instance->shellService != NULL) {
-		instance->shellService->executeCommand(instance->shellService->shell, command, out, err);
-	}
-
-	celixThreadMutex_unlock(&instance->mutex);
-
-	return status;
-}
-
-static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service) {
-	celix_status_t status = CELIX_SUCCESS;
-	shell_mediator_pt instance = (shell_mediator_pt) handler;
-	celixThreadMutex_lock(&instance->mutex);
-	instance->shellService = (shell_service_pt) service;
-	celixThreadMutex_unlock(&instance->mutex);
-	return status;
-}
-
-
-static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service) {
-	celix_status_t status = CELIX_SUCCESS;
-	shell_mediator_pt instance = (shell_mediator_pt) handler;
-	celixThreadMutex_lock(&instance->mutex);
-	instance->shellService = NULL;
-	celixThreadMutex_unlock(&instance->mutex);
-	return status;
-}
-

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/activator.c
----------------------------------------------------------------------
diff --git a/remote_shell/src/activator.c b/remote_shell/src/activator.c
new file mode 100644
index 0000000..541eda6
--- /dev/null
+++ b/remote_shell/src/activator.c
@@ -0,0 +1,153 @@
+/**
+ *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.
+ */
+/*
+ * activator.c
+ *
+ *  \date       Nov 4, 2012
+ *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ *  \copyright	Apache License, Version 2.0
+ */
+
+#include <celix_errno.h>
+
+#include <stdlib.h>
+
+#include "bundle_activator.h"
+#include "bundle_context.h"
+
+#include "log_helper.h"
+#include "connection_listener.h"
+#include "shell_mediator.h"
+#include "remote_shell.h"
+
+#define REMOTE_SHELL_TELNET_PORT_PROPERTY_NAME 	"remote.shell.telnet.port"
+#define DEFAULT_REMOTE_SHELL_TELNET_PORT 		6666
+
+#define REMOTE_SHELL_TELNET_MAXCONN_PROPERTY_NAME 	"remote.shell.telnet.maxconn"
+#define DEFAULT_REMOTE_SHELL_TELNET_MAXCONN 		2
+
+struct bundle_instance {
+	log_helper_pt loghelper;
+	shell_mediator_pt shellMediator;
+	remote_shell_pt remoteShell;
+	connection_listener_pt connectionListener;
+};
+
+typedef struct bundle_instance *bundle_instance_pt;
+
+static int bundleActivator_getPort(bundle_instance_pt bi, bundle_context_pt context);
+static int bundleActivator_getMaximumConnections(bundle_instance_pt bi, bundle_context_pt context);
+static int bundleActivator_getProperty(bundle_instance_pt bi, bundle_context_pt context, char * propertyName, int defaultValue);
+
+celix_status_t bundleActivator_create(bundle_context_pt context, void **userData) {
+	celix_status_t status = CELIX_SUCCESS;
+
+	bundle_instance_pt bi = (bundle_instance_pt) calloc(1, sizeof(struct bundle_instance));
+
+	if (!bi)
+	{
+		status = CELIX_ENOMEM;
+	}
+	else if (userData != NULL) {
+		bi->shellMediator = NULL;
+		bi->remoteShell = NULL;
+		bi->connectionListener = NULL;
+
+		status = logHelper_create(context, &bi->loghelper);
+
+		(*userData) = bi;
+	} else {
+		status = CELIX_ILLEGAL_ARGUMENT;
+		free(bi);
+	}
+
+	return status;
+}
+
+celix_status_t bundleActivator_start(void * userData, bundle_context_pt context) {
+	celix_status_t status = CELIX_SUCCESS;
+	bundle_instance_pt bi = (bundle_instance_pt) userData;
+
+	int port = bundleActivator_getPort(bi, context);
+	int maxConn = bundleActivator_getMaximumConnections(bi, context);
+
+	status = logHelper_start(bi->loghelper);
+
+	status = CELIX_DO_IF(status, shellMediator_create(context, &bi->shellMediator));
+	status = CELIX_DO_IF(status, remoteShell_create(bi->shellMediator, maxConn, &bi->remoteShell));
+	status = CELIX_DO_IF(status, connectionListener_create(bi->remoteShell, port, &bi->connectionListener));
+	status = CELIX_DO_IF(status, connectionListener_start(bi->connectionListener));
+
+	return status;
+}
+
+celix_status_t bundleActivator_stop(void * userData, bundle_context_pt context) {
+	celix_status_t status = CELIX_SUCCESS;
+	bundle_instance_pt bi = (bundle_instance_pt) userData;
+
+	connectionListener_stop(bi->connectionListener);
+	shellMediator_stop(bi->shellMediator);
+	shellMediator_destroy(bi->shellMediator);
+
+	remoteShell_stopConnections(bi->remoteShell);
+
+	status = logHelper_stop(bi->loghelper);
+
+	return status;
+}
+
+celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt context) {
+	celix_status_t status = CELIX_SUCCESS;
+	bundle_instance_pt bi = (bundle_instance_pt) userData;
+
+	connectionListener_destroy(bi->connectionListener);
+	status = logHelper_destroy(&bi->loghelper);
+
+	return status;
+}
+
+static int bundleActivator_getPort(bundle_instance_pt bi, bundle_context_pt context) {
+	return bundleActivator_getProperty(bi, context, REMOTE_SHELL_TELNET_PORT_PROPERTY_NAME, DEFAULT_REMOTE_SHELL_TELNET_PORT);
+}
+
+static int bundleActivator_getMaximumConnections(bundle_instance_pt bi, bundle_context_pt context) {
+	return bundleActivator_getProperty(bi, context, REMOTE_SHELL_TELNET_MAXCONN_PROPERTY_NAME, DEFAULT_REMOTE_SHELL_TELNET_MAXCONN);
+}
+
+static int bundleActivator_getProperty(bundle_instance_pt bi, bundle_context_pt context, char* propertyName, int defaultValue) {
+	const char *strValue = NULL;
+	int value;
+
+	bundleContext_getProperty(context, propertyName, &strValue);
+	if (strValue != NULL) {
+		char* endptr = (char*)strValue;
+
+		errno = 0;
+		value = strtol(strValue, &endptr, 10);
+		if (*endptr || errno != 0) {
+			logHelper_log(bi->loghelper, OSGI_LOGSERVICE_WARNING, "incorrect format for %s", propertyName);
+			value = defaultValue;
+		}
+	}
+	else {
+		value = defaultValue;
+	}
+
+	return value;
+}

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/connection_listener.c
----------------------------------------------------------------------
diff --git a/remote_shell/src/connection_listener.c b/remote_shell/src/connection_listener.c
new file mode 100644
index 0000000..3bef9e5
--- /dev/null
+++ b/remote_shell/src/connection_listener.c
@@ -0,0 +1,221 @@
+/**
+ *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.
+ */
+/*
+ * connection_listener.c
+ *
+ *  \date       Nov 4, 2012
+ *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ *  \copyright	Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <celix_errno.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <fcntl.h>
+
+#include "log_service.h"
+#include "log_helper.h"
+
+#include "connection_listener.h"
+
+#include "shell_mediator.h"
+#include "remote_shell.h"
+
+#define CONNECTION_LISTENER_TIMEOUT_SEC		5
+
+struct connection_listener {
+	//constant
+	int port;
+	log_helper_pt* loghelper;
+	remote_shell_pt remoteShell;
+	celix_thread_mutex_t mutex;
+
+	//protected by mutex
+	bool running;
+	celix_thread_t thread;
+	fd_set pollset;
+};
+
+static void* connection_listener_thread(void *data);
+
+celix_status_t connectionListener_create(remote_shell_pt remoteShell, int port, connection_listener_pt *instance) {
+	celix_status_t status = CELIX_SUCCESS;
+	(*instance) = calloc(1, sizeof(**instance));
+
+	if ((*instance) != NULL) {
+		(*instance)->port = port;
+		(*instance)->remoteShell = remoteShell;
+		(*instance)->running = false;
+		(*instance)->loghelper = remoteShell->loghelper;
+
+		FD_ZERO(&(*instance)-> pollset);
+
+		status = celixThreadMutex_create(&(*instance)->mutex, NULL);
+	} else {
+		status = CELIX_ENOMEM;
+	}
+	return status;
+}
+
+celix_status_t connectionListener_start(connection_listener_pt instance) {
+	celix_status_t status = CELIX_SUCCESS;
+	celixThreadMutex_lock(&instance->mutex);
+	celixThread_create(&instance->thread, NULL, connection_listener_thread, instance);
+	celixThreadMutex_unlock(&instance->mutex);
+	return status;
+}
+
+celix_status_t connectionListener_stop(connection_listener_pt instance) {
+	celix_status_t status = CELIX_SUCCESS;
+	celix_thread_t thread;
+	fd_set pollset;
+
+	instance->running = false;
+	FD_ZERO(&pollset);
+
+	logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "CONNECTION_LISTENER: Stopping thread\n");
+
+	celixThreadMutex_lock(&instance->mutex);
+	thread = instance->thread;
+
+	pollset = instance->pollset;
+	celixThreadMutex_unlock(&instance->mutex);
+
+	celixThread_join(thread, NULL);
+	return status;
+}
+
+celix_status_t connectionListener_destroy(connection_listener_pt instance) {
+	free(instance);
+
+	return CELIX_SUCCESS;
+}
+
+static void* connection_listener_thread(void *data) {
+	celix_status_t status = CELIX_BUNDLE_EXCEPTION;
+	connection_listener_pt instance = data;
+	struct timeval timeout; /* Timeout for select */
+	fd_set active_fd_set;
+	FD_ZERO(&active_fd_set);
+	int listenSocket = 0;
+	int on = 1;
+
+	struct addrinfo *result, *rp;
+	struct addrinfo hints;
+
+	memset(&hints, 0, sizeof(struct addrinfo));
+	hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
+	hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
+	hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */
+	hints.ai_protocol = 0; /* Any protocol */
+	hints.ai_canonname = NULL;
+	hints.ai_addr = NULL;
+	hints.ai_next = NULL;
+
+	char portStr[10];
+	snprintf(&portStr[0], 10, "%d", instance->port);
+
+	getaddrinfo(NULL, portStr, &hints, &result);
+
+	for (rp = result; rp != NULL && status == CELIX_BUNDLE_EXCEPTION; rp = rp->ai_next) {
+
+		status = CELIX_BUNDLE_EXCEPTION;
+
+		/* Create socket */
+		listenSocket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
+		if (listenSocket < 0) {
+			logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "Error creating socket: %s", strerror(errno));
+		}
+		else if (setsockopt(listenSocket, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on)) < 0) {
+			logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "cannot set socket option: %s", strerror(errno));
+		}
+		else if (bind(listenSocket, rp->ai_addr, rp->ai_addrlen) < 0) {
+			logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "cannot bind: %s", strerror(errno));
+		}
+		else if (listen(listenSocket, 5) < 0) {
+			logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "listen failed: %s", strerror(errno));
+		}
+		else {
+			status = CELIX_SUCCESS;
+		}
+	}
+
+	if (status == CELIX_SUCCESS) {
+
+		logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "Remote Shell accepting connections on port %d", instance->port);
+
+		celixThreadMutex_lock(&instance->mutex);
+		instance->pollset = active_fd_set;
+		celixThreadMutex_unlock(&instance->mutex);
+
+		instance->running = true;
+
+		while (status == CELIX_SUCCESS && instance->running) {
+			int selectRet = -1;
+			do {
+				timeout.tv_sec = CONNECTION_LISTENER_TIMEOUT_SEC;
+				timeout.tv_usec = 0;
+
+				FD_ZERO(&active_fd_set);
+				FD_SET(listenSocket, &active_fd_set);
+
+				selectRet = select(listenSocket + 1, &active_fd_set, NULL, NULL, &timeout);
+			} while (selectRet == -1 && errno == EINTR && instance->running == true);
+			if (selectRet < 0) {
+				logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "select on listenSocket failed: %s", strerror(errno));
+				status = CELIX_BUNDLE_EXCEPTION;
+			}
+			else if (selectRet == 0) {
+				/* do nothing here */
+			}
+			else if (FD_ISSET(listenSocket, &active_fd_set)) {
+				int acceptedSocket = accept(listenSocket, NULL, NULL);
+
+				if (acceptedSocket < 0) {
+					logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_ERROR, "REMOTE_SHELL: accept failed: %s.", strerror(errno));
+					status = CELIX_BUNDLE_EXCEPTION;
+				}
+				else {
+					logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_INFO, "REMOTE_SHELL: connection established.");
+					remoteShell_addConnection(instance->remoteShell, acceptedSocket);
+				}
+			}
+			else {
+				logHelper_log(*instance->loghelper, OSGI_LOGSERVICE_DEBUG, "REMOTE_SHELL: received data on a not-expected file-descriptor?");
+			}
+		}
+	}
+
+	if (listenSocket >= 0) {
+		close(listenSocket);
+	}
+
+	freeaddrinfo(result);
+
+	return NULL;
+}
+

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/connection_listener.h
----------------------------------------------------------------------
diff --git a/remote_shell/src/connection_listener.h b/remote_shell/src/connection_listener.h
new file mode 100644
index 0000000..392d6ec
--- /dev/null
+++ b/remote_shell/src/connection_listener.h
@@ -0,0 +1,42 @@
+/**
+ *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.
+ */
+/*
+ * connection_listener.h
+ *
+ *  \date       Nov 4, 2012
+ *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ *  \copyright	Apache License, Version 2.0
+ */
+
+#ifndef connectionListener_H_
+#define connectionListener_H_
+
+#include <bundle_context.h>
+#include <celix_errno.h>
+
+#include "remote_shell.h"
+
+typedef struct connection_listener *connection_listener_pt;
+
+celix_status_t connectionListener_create(remote_shell_pt remoteShell, int port, connection_listener_pt *instance);
+celix_status_t connectionListener_destroy(connection_listener_pt instance);
+celix_status_t connectionListener_start(connection_listener_pt instance);
+celix_status_t connectionListener_stop(connection_listener_pt instance);
+
+#endif /* connectionListener_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/remote_shell.c
----------------------------------------------------------------------
diff --git a/remote_shell/src/remote_shell.c b/remote_shell/src/remote_shell.c
new file mode 100644
index 0000000..8f42778
--- /dev/null
+++ b/remote_shell/src/remote_shell.c
@@ -0,0 +1,242 @@
+/**
+ *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.
+ */
+/*
+ * remote_shell.c
+ *
+ *  \date       Nov 4, 2012
+ *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ *  \copyright	Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <utils.h>
+#include <array_list.h>
+#include <sys/socket.h>
+
+#include "log_helper.h"
+
+#include "log_service.h"
+#include "remote_shell.h"
+
+#define COMMAND_BUFF_SIZE (256)
+
+#define RS_PROMPT ("-> ")
+#define RS_WELCOME ("\n---- Apache Celix Remote Shell ----\n---- Type exit to disconnect   ----\n\n-> ")
+#define RS_GOODBYE ("Goobye!\n")
+#define RS_ERROR ("Error executing command!\n")
+#define RS_MAXIMUM_CONNECTIONS_REACHED ("Maximum number of connections  reached. Disconnecting ...\n")
+
+#define CONNECTION_LISTENER_TIMEOUT_SEC		5
+
+
+
+struct connection {
+	remote_shell_pt parent;
+	FILE *socketStream;
+	fd_set pollset;
+	bool threadRunning;
+};
+
+typedef struct connection *connection_pt;
+
+static celix_status_t remoteShell_connection_print(connection_pt connection, char * text);
+static celix_status_t remoteShell_connection_execute(connection_pt connection, char *command);
+static void* remoteShell_connection_run(void *data);
+
+celix_status_t remoteShell_create(shell_mediator_pt mediator, int maximumConnections, remote_shell_pt *instance) {
+	celix_status_t status = CELIX_SUCCESS;
+	(*instance) = calloc(1, sizeof(**instance));
+	if ((*instance) != NULL) {
+		(*instance)->mediator = mediator;
+		(*instance)->maximumConnections = maximumConnections;
+		(*instance)->connections = NULL;
+		(*instance)->loghelper = &mediator->loghelper;
+
+		status = celixThreadMutex_create(&(*instance)->mutex, NULL);
+
+		if (status == CELIX_SUCCESS) {
+			status = arrayList_create(&(*instance)->connections);
+		}
+	} else {
+		status = CELIX_ENOMEM;
+	}
+	return status;
+}
+
+celix_status_t remoteShell_destroy(remote_shell_pt instance) {
+	celix_status_t status = CELIX_SUCCESS;
+
+	remoteShell_stopConnections(instance);
+
+	celixThreadMutex_lock(&instance->mutex);
+	arrayList_destroy(instance->connections);
+	celixThreadMutex_unlock(&instance->mutex);
+
+	return status;
+}
+
+celix_status_t remoteShell_addConnection(remote_shell_pt instance, int socket) {
+	celix_status_t status = CELIX_SUCCESS;
+	connection_pt connection = calloc(1, sizeof(struct connection));
+
+	if (connection != NULL) {
+		connection->parent = instance;
+		connection->threadRunning = false;
+		connection->socketStream = fdopen(socket, "w");
+
+		if (connection->socketStream != NULL) {
+
+			celixThreadMutex_lock(&instance->mutex);
+
+			if (arrayList_size(instance->connections) < instance->maximumConnections) {
+				celix_thread_t connectionRunThread = celix_thread_default;
+				arrayList_add(instance->connections, connection);
+				status = celixThread_create(&connectionRunThread, NULL, &remoteShell_connection_run, connection);
+			} else {
+				status = CELIX_BUNDLE_EXCEPTION;
+				remoteShell_connection_print(connection, RS_MAXIMUM_CONNECTIONS_REACHED);
+			}
+			celixThreadMutex_unlock(&instance->mutex);
+
+		} else {
+			status = CELIX_BUNDLE_EXCEPTION;
+		}
+	} else {
+		status = CELIX_ENOMEM;
+	}
+
+	if (status != CELIX_SUCCESS && connection != NULL) {
+		if (connection->socketStream != NULL) {
+			fclose(connection->socketStream);
+		}
+		free(connection);
+	}
+
+	return status;
+}
+
+celix_status_t remoteShell_stopConnections(remote_shell_pt instance) {
+	celix_status_t status = CELIX_SUCCESS;
+	int length = 0;
+	int i = 0;
+
+	celixThreadMutex_lock(&instance->mutex);
+	length = arrayList_size(instance->connections);
+
+	for (i = 0; i < length; i += 1) {
+		connection_pt connection = arrayList_get(instance->connections, i);
+		connection->threadRunning = false;
+	}
+
+	celixThreadMutex_unlock(&instance->mutex);
+
+	return status;
+}
+
+void *remoteShell_connection_run(void *data) {
+	celix_status_t status = CELIX_SUCCESS;
+	connection_pt connection = data;
+	size_t len;
+	int result;
+	struct timeval timeout; /* Timeout for select */
+
+	int fd = fileno(connection->socketStream);
+
+	connection->threadRunning = true;
+	status = remoteShell_connection_print(connection, RS_WELCOME);
+
+	while (status == CELIX_SUCCESS && connection->threadRunning == true) {
+		do {
+			timeout.tv_sec = CONNECTION_LISTENER_TIMEOUT_SEC;
+			timeout.tv_usec = 0;
+
+			FD_ZERO(&connection->pollset);
+			FD_SET(fd, &connection->pollset);
+			result = select(fd + 1, &connection->pollset, NULL, NULL, &timeout);
+		} while (result == -1 && errno == EINTR && connection->threadRunning == true);
+
+		/* The socket_fd has data available to be read */
+		if (result > 0 && FD_ISSET(fd, &connection->pollset)) {
+			char buff[COMMAND_BUFF_SIZE];
+
+			len = recv(fd, buff, COMMAND_BUFF_SIZE - 1, 0);
+			if (len < COMMAND_BUFF_SIZE) {
+				celix_status_t commandStatus = CELIX_SUCCESS;
+				buff[len] = '\0';
+
+				commandStatus = remoteShell_connection_execute(connection, buff);
+
+				if (commandStatus == CELIX_SUCCESS) {
+					remoteShell_connection_print(connection, RS_PROMPT);
+				} else if (commandStatus == CELIX_FILE_IO_EXCEPTION) {
+					//exit command
+					break;
+				} else { //error
+					remoteShell_connection_print(connection, RS_ERROR);
+					remoteShell_connection_print(connection, RS_PROMPT);
+				}
+
+			} else {
+				logHelper_log(*connection->parent->loghelper, OSGI_LOGSERVICE_ERROR, "REMOTE_SHELL: Error while retrieving data");
+			}
+		}
+	}
+
+	remoteShell_connection_print(connection, RS_GOODBYE);
+
+	logHelper_log(*connection->parent->loghelper, OSGI_LOGSERVICE_INFO, "REMOTE_SHELL: Closing socket");
+	celixThreadMutex_lock(&connection->parent->mutex);
+	arrayList_removeElement(connection->parent->connections, connection);
+	celixThreadMutex_unlock(&connection->parent->mutex);
+
+	fclose(connection->socketStream);
+
+	return NULL;
+}
+
+static celix_status_t remoteShell_connection_execute(connection_pt connection, char *command) {
+	celix_status_t status = CELIX_SUCCESS;
+
+	if (status == CELIX_SUCCESS) {
+		char *dline = strdup(command);
+		char *line = utils_stringTrim(dline);
+		int len = strlen(line);
+
+		if (len == 0) {
+			//ignore
+		} else if (len == 4 && strncmp("exit", line, 4) == 0) {
+			status = CELIX_FILE_IO_EXCEPTION;
+		} else {
+			status = shellMediator_executeCommand(connection->parent->mediator, line, connection->socketStream, connection->socketStream);
+            fflush(connection->socketStream);
+		}
+
+		free(dline);
+	}
+
+	return status;
+}
+
+celix_status_t remoteShell_connection_print(connection_pt connection, char *text) {
+	size_t len = strlen(text);
+    int fd = fileno(connection->socketStream);
+	return (send(fd, text, len, 0) > 0) ? CELIX_SUCCESS : CELIX_FILE_IO_EXCEPTION;
+}

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/remote_shell.h
----------------------------------------------------------------------
diff --git a/remote_shell/src/remote_shell.h b/remote_shell/src/remote_shell.h
new file mode 100644
index 0000000..55249a8
--- /dev/null
+++ b/remote_shell/src/remote_shell.h
@@ -0,0 +1,50 @@
+/**
+ *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.
+ */
+/*
+ * remote_shell.h
+ *
+ *  \date       Nov 4, 2012
+ *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ *  \copyright	Apache License, Version 2.0
+ */
+
+#ifndef REMOTE_SHELL_H_
+#define REMOTE_SHELL_H_
+
+#include <bundle_context.h>
+#include <celix_errno.h>
+
+#include "shell_mediator.h"
+
+struct remote_shell {
+	log_helper_pt* loghelper;
+	shell_mediator_pt mediator;
+	celix_thread_mutex_t mutex;
+	int maximumConnections;
+
+	array_list_pt connections;
+};
+typedef struct remote_shell *remote_shell_pt;
+
+celix_status_t remoteShell_create(shell_mediator_pt mediator, int maximumConnections, remote_shell_pt *instance);
+celix_status_t remoteShell_destroy(remote_shell_pt instance);
+celix_status_t remoteShell_addConnection(remote_shell_pt instance, int socket);
+celix_status_t remoteShell_stopConnections(remote_shell_pt instance);
+
+#endif /* REMOTE_SHELL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/shell_mediator.c
----------------------------------------------------------------------
diff --git a/remote_shell/src/shell_mediator.c b/remote_shell/src/shell_mediator.c
new file mode 100644
index 0000000..d9722a9
--- /dev/null
+++ b/remote_shell/src/shell_mediator.c
@@ -0,0 +1,139 @@
+/**
+ *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.
+ */
+/*
+ * shell_mediator.c
+ *
+ *  \date       Nov 4, 2012
+ *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ *  \copyright	Apache License, Version 2.0
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <utils.h>
+#include <shell.h>
+#include <service_tracker.h>
+#include <command.h>
+#include <sys/socket.h>
+
+#include "log_helper.h"
+#include "log_service.h"
+#include "shell_mediator.h"
+
+static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service);
+static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service);
+
+celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance) {
+	celix_status_t status = CELIX_SUCCESS;
+	service_tracker_customizer_pt customizer = NULL;
+
+	(*instance) = (shell_mediator_pt) calloc(1, sizeof(**instance));
+	if ((*instance) != NULL) {
+
+		(*instance)->context = context;
+		(*instance)->tracker = NULL;
+		(*instance)->shellService = NULL;
+
+		status = logHelper_create(context, &(*instance)->loghelper);
+
+		status = CELIX_DO_IF(status, celixThreadMutex_create(&(*instance)->mutex, NULL));
+
+		status = CELIX_DO_IF(status, serviceTrackerCustomizer_create((*instance), NULL, shellMediator_addedService,
+				NULL, shellMediator_removedService, &customizer));
+		status = CELIX_DO_IF(status, serviceTracker_create(context, (char * )OSGI_SHELL_SERVICE_NAME, customizer, &(*instance)->tracker));
+
+		if (status == CELIX_SUCCESS) {
+			logHelper_start((*instance)->loghelper);
+			serviceTracker_open((*instance)->tracker);
+		}
+	} else {
+		status = CELIX_ENOMEM;
+	}
+
+	if ((status != CELIX_SUCCESS) && ((*instance) != NULL)){
+		logHelper_log((*instance)->loghelper, OSGI_LOGSERVICE_ERROR, "Error creating shell_mediator, error code is %i\n", status);
+	}
+	return status;
+}
+
+celix_status_t shellMediator_stop(shell_mediator_pt instance) {
+	service_tracker_pt tracker;
+	celixThreadMutex_lock(&instance->mutex);
+	tracker = instance->tracker;
+	celixThreadMutex_unlock(&instance->mutex);
+
+	if (tracker != NULL) {
+		serviceTracker_close(tracker);
+	}
+
+    return CELIX_SUCCESS;
+}
+
+celix_status_t shellMediator_destroy(shell_mediator_pt instance) {
+	celix_status_t status = CELIX_SUCCESS;
+
+	celixThreadMutex_lock(&instance->mutex);
+
+	instance->shellService = NULL;
+	serviceTracker_destroy(instance->tracker);
+	logHelper_stop(instance->loghelper);
+	status = logHelper_destroy(&instance->loghelper);
+	celixThreadMutex_destroy(&instance->mutex);
+
+
+	free(instance);
+
+
+	return status;
+}
+
+celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *command, FILE *out, FILE *err) {
+	celix_status_t status = CELIX_SUCCESS;
+
+	celixThreadMutex_lock(&instance->mutex);
+
+
+	if (instance->shellService != NULL) {
+		instance->shellService->executeCommand(instance->shellService->shell, command, out, err);
+	}
+
+	celixThreadMutex_unlock(&instance->mutex);
+
+	return status;
+}
+
+static celix_status_t shellMediator_addedService(void *handler, service_reference_pt reference, void * service) {
+	celix_status_t status = CELIX_SUCCESS;
+	shell_mediator_pt instance = (shell_mediator_pt) handler;
+	celixThreadMutex_lock(&instance->mutex);
+	instance->shellService = (shell_service_pt) service;
+	celixThreadMutex_unlock(&instance->mutex);
+	return status;
+}
+
+
+static celix_status_t shellMediator_removedService(void *handler, service_reference_pt reference, void * service) {
+	celix_status_t status = CELIX_SUCCESS;
+	shell_mediator_pt instance = (shell_mediator_pt) handler;
+	celixThreadMutex_lock(&instance->mutex);
+	instance->shellService = NULL;
+	celixThreadMutex_unlock(&instance->mutex);
+	return status;
+}
+

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/remote_shell/src/shell_mediator.h
----------------------------------------------------------------------
diff --git a/remote_shell/src/shell_mediator.h b/remote_shell/src/shell_mediator.h
new file mode 100644
index 0000000..24e8250
--- /dev/null
+++ b/remote_shell/src/shell_mediator.h
@@ -0,0 +1,54 @@
+/**
+ *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.
+ */
+/*
+ * shell_mediator.h
+ *
+ *  \date       Nov 4, 2012
+ *  \author    	<a href="mailto:dev@celix.apache.org">Apache Celix Project Team</a>
+ *  \copyright	Apache License, Version 2.0
+ */
+
+
+#ifndef shellMediator_H_
+#define shellMediator_H_
+
+#include <bundle_context.h>
+#include <service_tracker.h>
+#include <celix_errno.h>
+
+#include <shell.h>
+
+struct shell_mediator {
+
+	log_helper_pt loghelper;
+	bundle_context_pt context;
+	service_tracker_pt tracker;
+	celix_thread_mutex_t mutex;
+
+	//protected by mutex
+	shell_service_pt shellService;
+};
+typedef struct shell_mediator *shell_mediator_pt;
+
+celix_status_t shellMediator_create(bundle_context_pt context, shell_mediator_pt *instance);
+celix_status_t shellMediator_stop(shell_mediator_pt instance);
+celix_status_t shellMediator_destroy(shell_mediator_pt instance);
+celix_status_t shellMediator_executeCommand(shell_mediator_pt instance, char *command, FILE *out, FILE *err);
+
+#endif /* shellMediator_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/a1c30887/shell/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/shell/CMakeLists.txt b/shell/CMakeLists.txt
index 974d2ff..31822c4 100644
--- a/shell/CMakeLists.txt
+++ b/shell/CMakeLists.txt
@@ -18,38 +18,35 @@ celix_subproject(SHELL "Option to enable building the Shell bundles" ON DEPS LAU
 if (SHELL)
 	find_package(CURL REQUIRED)
 
+	add_library(shell_api INTERFACE)
+	target_include_directories(shell_api INTERFACE include)
+
     add_bundle(shell
         SYMBOLIC_NAME "apache_celix_shell"
         VERSION "2.0.0"
         NAME "Apache Celix Shell"
-
         SOURCES
+          src/activator
+          src/shell
+          src/lb_command
+          src/start_command
+          src/stop_command
+          src/install_command
+          src/update_command
+          src/uninstall_command
+          src/log_command
+          src/inspect_command
+          src/help_command
+	)
+	target_include_directories(shell PRIVATE src ${CURL_INCLUDE_DIRS})
+	target_link_libraries(shell PRIVATE Celix::shell_api ${CURL_LIBRARIES} Celix::log_service_api log_helper)
 
-          private/src/activator
-          private/src/shell
-          private/src/lb_command
-          private/src/start_command
-          private/src/stop_command
-          private/src/install_command
-          private/src/update_command
-          private/src/uninstall_command
-          private/src/log_command
-          private/src/inspect_command
-          private/src/help_command
-
-          ${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c
-
-    )
-    
-    install_bundle(shell
+	install_bundle(shell
     	HEADERS
-    		public/include/shell.h public/include/command.h public/include/shell_constants.h
-	)
+    		include/shell.h include/command.h include/shell_constants.h
+    )
 
-	include_directories("public/include")
-	include_directories("private/include")
-    include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
-    include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
-	include_directories(${CURL_INCLUDE_DIRS})
-    target_link_libraries(shell celix_framework ${CURL_LIBRARIES})
+	#Setup target aliases to match external usage
+	add_library(Celix::shell_api ALIAS shell_api)
+	add_library(Celix::shell ALIAS shell)
 endif (SHELL)