http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/dfi/test/json_serializer_tests.cpp
----------------------------------------------------------------------
diff --git a/dfi/test/json_serializer_tests.cpp 
b/dfi/test/json_serializer_tests.cpp
deleted file mode 100644
index a52e4cc..0000000
--- a/dfi/test/json_serializer_tests.cpp
+++ /dev/null
@@ -1,558 +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"                                    
                                                                                
                                                    
-
-extern "C" {
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-
-#include <ffi.h>
-
-#include "dyn_common.h"
-#include "dyn_type.h"
-#include "json_serializer.h"
-
-static void stdLog(void*, int level, const char *file, int line, const char 
*msg, ...) {
-       va_list ap;
-       const char *levels[5] = {"NIL", "ERROR", "WARNING", "INFO", "DEBUG"};
-       fprintf(stderr, "%s: FILE:%s, LINE:%i, MSG:",levels[level], file, line);
-       va_start(ap, msg);
-       vfprintf(stderr, msg, ap);
-       fprintf(stderr, "\n");
-       va_end(ap);
-}
-
-/*********** example 1 ************************/
-/** struct type ******************************/
-const char *example1_descriptor = "{DJISF a b c d e}";
-
-const char *example1_input = "{ \
-    \"a\" : 1.0, \
-    \"b\" : 22, \
-    \"c\" : 32, \
-    \"d\" : 42, \
-    \"e\" : 4.4 \
-}";
-
-struct example1 {
-       double a;   //0
-       int64_t b;  //1
-       int32_t c;  //2
-       int16_t d;  //3
-       float e;    //4
-};
-
-static void check_example1(void *data) {
-       struct example1 *ex = (struct example1 *)data;
-       CHECK_EQUAL(1.0, ex->a);
-       LONGS_EQUAL(22, ex->b);
-       LONGS_EQUAL(32, ex->c);
-       LONGS_EQUAL(42, ex->d);
-       CHECK_EQUAL(4.4f, ex->e);
-}
-
-/*********** example 2 ************************/
-const char *example2_descriptor = "{BJJDFD byte long1 long2 double1 float1 
double2}";
-
-const char *example2_input = "{ \
-    \"byte\" : 42, \
-    \"long1\" : 232, \
-    \"long2\" : 242, \
-    \"double1\" : 4.2, \
-    \"float1\" : 3.2, \
-    \"double2\" : 4.4 \
-}";
-
-struct example2 {
-       char byte;      //0
-       int64_t long1;     //1
-       int64_t long2;     //2
-       double double1; //3
-       float float1;   //4
-       double double2; //5
-};
-
-static void check_example2(void *data) {
-       struct example2 *ex = (struct example2 *)data;
-       CHECK_EQUAL(42, ex->byte);
-       LONGS_EQUAL(232, ex->long1);
-       LONGS_EQUAL(242, ex->long2);
-       CHECK_EQUAL(4.2, ex->double1);
-       CHECK_EQUAL(3.2f, ex->float1);
-       CHECK_EQUAL(4.4, ex->double2);
-}
-
-
-/*********** example 3 ************************/
-/** sequence with a simple type **************/
-const char *example3_descriptor = "{[I numbers}";
-
-const char *example3_input = "{ \
-    \"numbers\" : [22,32,42] \
-}";
-
-struct example3 {
-       struct {
-               uint32_t cap;
-               uint32_t len;
-               int32_t *buf;
-       } numbers;
-};
-
-static void check_example3(void *data) {
-       struct example3 *ex = (struct example3 *)data;
-       CHECK_EQUAL(3, ex->numbers.len);
-       CHECK_EQUAL(22, ex->numbers.buf[0]);
-       CHECK_EQUAL(32, ex->numbers.buf[1]);
-       CHECK_EQUAL(42, ex->numbers.buf[2]);
-}
-
-/*********** example 4 ************************/
-/** structs within a struct (by reference)*******/
-const char *example4_descriptor = "{{IDD index val1 val2}{IDD index val1 val2} 
left right}";
-
-static const char *example4_input =  "{ \
-    \"left\" : {\"index\":1, \"val1\":1.0, \"val2\":2.0 }, \
-    \"right\" : {\"index\":2, \"val1\":5.0, \"val2\":4.0 } \
-}";
-
-struct ex4_leaf {
-       int32_t index;
-       double val1;
-       double val2;
-};
-
-struct example4 {
-       struct ex4_leaf left;
-       struct ex4_leaf right;
-};
-
-static void check_example4(void *data) {
-       struct example4 *ex = (struct example4 *)data;
-       CHECK_EQUAL(1, ex->left.index);
-       CHECK_EQUAL(1.0, ex->left.val1);
-       CHECK_EQUAL(2.0, ex->left.val2);
-       CHECK_EQUAL(2, ex->right.index);
-       CHECK_EQUAL(5.0, ex->right.val1);
-       CHECK_EQUAL(4.0, ex->right.val2);
-}
-
-
-/*********** example 5 ************************/
-/** structs within a struct (by reference)*******/
-const char *example5_descriptor = "Tleaf={ts name 
age};Tnode={Lnode;Lnode;Lleaf; left right value};{Lnode; head}";
-
-static const char *example5_input =  "{ \
-    \"head\" : {\
-        \"left\" : {\
-            \"value\" : {\
-                \"name\" : \"John\",\
-                \"age\" : 44 \
-            }\
-        },\
-        \"right\" : {\
-            \"value\" : {\
-                \"name\" : \"Peter\", \
-                \"age\" : 55 \
-            }\
-        }\
-    }\
-}";
-
-struct leaf {
-       const char *name;
-       uint16_t age;
-};
-
-struct node {
-       struct node *left;
-       struct node *right;
-       struct leaf *value;
-};
-
-struct example5 {
-       struct node *head;
-};
-
-static void check_example5(void *data) {
-       struct example5 *ex = (struct example5 *)data;
-       CHECK_TRUE(ex->head != NULL);
-
-       CHECK(ex->head->left != NULL);
-       CHECK(ex->head->left->value != NULL);
-       STRCMP_EQUAL("John", ex->head->left->value->name);
-       CHECK_EQUAL(44, ex->head->left->value->age);
-       CHECK(ex->head->left->left == NULL);
-       CHECK(ex->head->left->right == NULL);
-
-       CHECK(ex->head->right != NULL);
-       CHECK(ex->head->right->value != NULL);
-       STRCMP_EQUAL("Peter", ex->head->right->value->name);
-       CHECK_EQUAL(55, ex->head->right->value->age);
-       CHECK(ex->head->right->left == NULL);
-       CHECK(ex->head->right->right == NULL);
-}
-
-static const char *example6_descriptor = "Tsample={DD v1 v2};[lsample;";
-
-static const char *example6_input = 
"[{\"v1\":0.1,\"v2\":0.2},{\"v1\":1.1,\"v2\":1.2},{\"v1\":2.1,\"v2\":2.2}]";
-
-struct ex6_sample {
-       double v1;
-       double v2;
-};
-
-struct ex6_sequence {
-       uint32_t cap;
-       uint32_t len;
-       struct ex6_sample *buf;
-};
-
-static void check_example6(struct ex6_sequence seq) {
-       CHECK_EQUAL(3, seq.cap);
-       CHECK_EQUAL(3, seq.len);
-       CHECK_EQUAL(0.1, seq.buf[0].v1);
-       CHECK_EQUAL(0.2, seq.buf[0].v2);
-       CHECK_EQUAL(1.1, seq.buf[1].v1);
-       CHECK_EQUAL(1.2, seq.buf[1].v2);
-       CHECK_EQUAL(2.1, seq.buf[2].v1);
-       CHECK_EQUAL(2.2, seq.buf[2].v2);
-}
-
-
-/*********** example 7 ************************/
-const char *example7_descriptor = "{t a}";
-
-const char *example7_input = "{ \
-    \"a\" : \"apache celix\" \
-}";
-
-struct example7 {
-       char* a;   //0
-};
-
-static void check_example7(void *data) {
-       struct example7 *ex = (struct example7 *)data;
-       STRCMP_EQUAL("apache celix", ex->a);
-}
-
-
-/*********** example 8 ************************/
-
-const char *example8_descriptor = "{ZbijNP a b c d e f}";
-
-const char *example8_input = "{ \
-    \"a\" : true, \
-    \"b\" : 4, \
-    \"c\" : 8, \
-    \"d\" : 16, \
-    \"e\" : 32 \
-}";
-
-struct example8 {
-       bool a;
-       unsigned char b;
-       uint32_t c;
-       uint64_t d;
-       int e;
-       void* f;
-};
-
-static void check_example8(void *data) {
-       struct example8 *ex = (struct example8 *)data;
-       CHECK_EQUAL(true,ex->a);
-       CHECK_EQUAL(4,ex->b);
-       CHECK_EQUAL(8,ex->c);
-       //error on mac CHECK_EQUAL(16,ex->d);
-    CHECK(16 == ex->d)
-       CHECK_EQUAL(32,ex->e);
-}
-
-
-static void parseTests(void) {
-       dyn_type *type;
-       void *inst;
-       int rc;
-
-       type = NULL;
-       inst = NULL;
-       rc = dynType_parseWithStr(example1_descriptor, NULL, NULL, &type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_deserialize(type, example1_input, &inst);
-       CHECK_EQUAL(0, rc);
-       check_example1(inst);
-       dynType_free(type, inst);
-       dynType_destroy(type);
-
-       type = NULL;
-       inst = NULL;
-       rc = dynType_parseWithStr(example2_descriptor, NULL, NULL, &type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_deserialize(type, example2_input, &inst);
-       CHECK_EQUAL(0, rc);
-       check_example2(inst);
-       dynType_free(type, inst);
-       dynType_destroy(type);
-
-       type = NULL;
-       inst = NULL;
-       rc = dynType_parseWithStr(example3_descriptor, NULL, NULL, &type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_deserialize(type, example3_input, &inst);
-       CHECK_EQUAL(0, rc);
-       check_example3(inst);
-       dynType_free(type, inst);
-       dynType_destroy(type);
-
-       type = NULL;
-       inst = NULL;
-       rc = dynType_parseWithStr(example4_descriptor, NULL, NULL, &type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_deserialize(type, example4_input, &inst);
-       CHECK_EQUAL(0, rc);
-       check_example4(inst);
-       dynType_free(type, inst);
-       dynType_destroy(type);
-
-       type = NULL;
-       inst = NULL;
-       rc = dynType_parseWithStr(example5_descriptor, NULL, NULL, &type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_deserialize(type, example5_input, &inst);
-       CHECK_EQUAL(0, rc);
-       check_example5(inst);
-       dynType_free(type, inst);
-       dynType_destroy(type);
-
-       type = NULL;
-       struct ex6_sequence *seq;
-       rc = dynType_parseWithStr(example6_descriptor, NULL, NULL, &type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_deserialize(type, example6_input, (void **)&seq);
-       CHECK_EQUAL(0, rc);
-       check_example6((*seq));
-       dynType_free(type, seq);
-       dynType_destroy(type);
-
-
-       type = NULL;
-       inst = NULL;
-       rc = dynType_parseWithStr(example7_descriptor, NULL, NULL, &type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_deserialize(type, example7_input, &inst);
-       CHECK_EQUAL(0, rc);
-       check_example7(inst);
-       dynType_free(type, inst);
-       dynType_destroy(type);
-
-       type = NULL;
-       inst = NULL;
-       rc = dynType_parseWithStr(example8_descriptor, NULL, NULL, &type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_deserialize(type, example8_input, &inst);
-       CHECK_EQUAL(0, rc);
-       check_example8(inst);
-       dynType_free(type, inst);
-       dynType_destroy(type);
-}
-
-const char *write_example1_descriptor = "{BSIJsijFDNZb a b c d e f g h i j k 
l}";
-
-struct write_example1 {
-       char a;
-       int16_t b;
-       int32_t c;
-       int64_t d;
-       uint16_t e;
-       uint32_t f;
-       uint64_t g;
-       float h;
-       double i;
-       int j;
-       bool k;
-       unsigned char l;
-};
-
-void writeTest1(void) {
-       struct write_example1 ex1;
-       ex1.a=1;
-       ex1.b=2;
-       ex1.c=3;
-       ex1.d=4;
-       ex1.e=5;
-       ex1.f=6;
-       ex1.g=7;
-       ex1.h=8.8f;
-       ex1.i=9.9;
-       ex1.j=10;
-       ex1.k=true;
-       ex1.l=12;
-
-       dyn_type *type = NULL;
-       char *result = NULL;
-       int rc = dynType_parseWithStr(write_example1_descriptor, "ex1", NULL, 
&type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_serialize(type, &ex1, &result);
-       CHECK_EQUAL(0, rc);
-       STRCMP_CONTAINS("\"a\":1", result);
-       STRCMP_CONTAINS("\"b\":2", result);
-       STRCMP_CONTAINS("\"c\":3", result);
-       STRCMP_CONTAINS("\"d\":4", result);
-       STRCMP_CONTAINS("\"e\":5", result);
-       STRCMP_CONTAINS("\"f\":6", result);
-       STRCMP_CONTAINS("\"g\":7", result);
-       STRCMP_CONTAINS("\"h\":8.8", result);
-       STRCMP_CONTAINS("\"i\":9.9", result);
-       STRCMP_CONTAINS("\"j\":10", result);
-       STRCMP_CONTAINS("\"k\":true", result);
-       STRCMP_CONTAINS("\"l\":12", result);
-       //printf("example 1 result: '%s'\n", result);
-       dynType_destroy(type);
-       free(result);
-}
-
-const char *write_example2_descriptor = "{*{JJ a b}{SS c d} sub1 sub2}";
-
-struct write_example2_sub {
-       int64_t a;
-       int64_t b;
-};
-
-struct write_example2 {
-       struct write_example2_sub *sub1;
-       struct {
-               int16_t c;
-               int16_t d;
-       } sub2;
-};
-
-void writeTest2(void) {
-       struct write_example2_sub sub1;
-       sub1.a = 1;
-       sub1.b = 2;
-
-       struct write_example2 ex;
-       ex.sub1=&sub1;
-       ex.sub2.c = 3;
-       ex.sub2.d = 4;
-
-       dyn_type *type = NULL;
-       char *result = NULL;
-       int rc = dynType_parseWithStr(write_example2_descriptor, "ex2", NULL, 
&type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_serialize(type, &ex, &result);
-       CHECK_EQUAL(0, rc);
-       STRCMP_CONTAINS("\"a\":1", result);
-       STRCMP_CONTAINS("\"b\":2", result);
-       STRCMP_CONTAINS("\"c\":3", result);
-       STRCMP_CONTAINS("\"d\":4", result);
-       //printf("example 2 result: '%s'\n", result);
-       dynType_destroy(type);
-       free(result);
-}
-
-const char *write_example3_descriptor = "Tperson={ti name age};[Lperson;";
-
-struct write_example3_person {
-       const char *name;
-       uint32_t age;
-};
-
-struct write_example3 {
-       uint32_t cap;
-       uint32_t len;
-       struct write_example3_person **buf;
-};
-
-void writeTest3(void) {
-       struct write_example3_person p1;
-       p1.name = "John";
-       p1.age = 33;
-
-       struct write_example3_person p2;
-       p2.name = "Peter";
-       p2.age = 44;
-
-       struct write_example3_person p3;
-       p3.name = "Carol";
-       p3.age = 55;
-
-       struct write_example3_person p4;
-       p4.name = "Elton";
-       p4.age = 66;
-
-       struct write_example3 seq;
-       seq.buf = (struct write_example3_person **) calloc(4, sizeof(void *));
-       seq.len = seq.cap = 4;
-       seq.buf[0] = &p1;
-       seq.buf[1] = &p2;
-       seq.buf[2] = &p3;
-       seq.buf[3] = &p4;
-
-       dyn_type *type = NULL;
-       char *result = NULL;
-       int rc = dynType_parseWithStr(write_example3_descriptor, "ex3", NULL, 
&type);
-       CHECK_EQUAL(0, rc);
-       rc = jsonSerializer_serialize(type, &seq, &result);
-       CHECK_EQUAL(0, rc);
-       STRCMP_CONTAINS("\"age\":33", result);
-       STRCMP_CONTAINS("\"age\":44", result);
-       STRCMP_CONTAINS("\"age\":55", result);
-       STRCMP_CONTAINS("\"age\":66", result);
-       //printf("example 3 result: '%s'\n", result);
-       free(seq.buf);
-       dynType_destroy(type);
-       free(result);
-}
-
-
-
-}
-
-TEST_GROUP(JsonSerializerTests) {
-       void setup() {
-               int lvl = 1;
-               dynCommon_logSetup(stdLog, NULL, lvl);
-               dynType_logSetup(stdLog, NULL,lvl);
-               jsonSerializer_logSetup(stdLog, NULL, lvl);
-       }
-};
-
-TEST(JsonSerializerTests, ParseTests) {
-       //TODO split up
-       parseTests();
-}
-
-TEST(JsonSerializerTests, WriteTest1) {
-       writeTest1();
-}
-
-TEST(JsonSerializerTests, WriteTest2) {
-       writeTest2();
-}
-
-TEST(JsonSerializerTests, WriteTest3) {
-       writeTest3();
-}
-
-

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/dfi/test/run_tests.cpp
----------------------------------------------------------------------
diff --git a/dfi/test/run_tests.cpp b/dfi/test/run_tests.cpp
deleted file mode 100644
index 786f4bf..0000000
--- a/dfi/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);
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/dfi/test/schemas/complex.avdl
----------------------------------------------------------------------
diff --git a/dfi/test/schemas/complex.avdl b/dfi/test/schemas/complex.avdl
deleted file mode 100644
index eff1fd8..0000000
--- a/dfi/test/schemas/complex.avdl
+++ /dev/null
@@ -1,30 +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.
- */
-
-protocol Complex {
-
-  record StatResult {
-    double sum;
-    double min;
-    double max;
-    array<double> input;
-  }
-
-  StatResult stats(array<double> input);
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/dfi/test/schemas/complex.avpr
----------------------------------------------------------------------
diff --git a/dfi/test/schemas/complex.avpr b/dfi/test/schemas/complex.avpr
deleted file mode 100644
index ca39b56..0000000
--- a/dfi/test/schemas/complex.avpr
+++ /dev/null
@@ -1,55 +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.
- */
-
-{
-  "protocol" : "Complex",
-  "namespace" : null,
-  "types" : [ {
-    "type" : "record",
-    "name" : "StatResult",
-    "fields" : [ {
-      "name" : "sum",
-      "type" : "double"
-    }, {
-      "name" : "min",
-      "type" : "double"
-    }, {
-      "name" : "max",
-      "type" : "double"
-    }, {
-      "name" : "input",
-      "type" : {
-        "type" : "array",
-        "items" : "double"
-      }
-    } ]
-  } ],
-  "messages" : {
-    "stats" : {
-      "request" : [ {
-        "name" : "input",
-        "type" : {
-          "type" : "array",
-          "items" : "double"
-        }
-      } ],
-      "response" : "StatResult"
-    }
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/dfi/test/schemas/invalid1.avpr
----------------------------------------------------------------------
diff --git a/dfi/test/schemas/invalid1.avpr b/dfi/test/schemas/invalid1.avpr
deleted file mode 100644
index bbf77ee..0000000
--- a/dfi/test/schemas/invalid1.avpr
+++ /dev/null
@@ -1,47 +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.
- */
-{
-  "protocol" : "Complex",
-  "namespace" : null,
-  "types" : [ {
-    "type" : "record",
-    "name" : "StatResult",
-    "fields" : [ {
-      "name" : "sum",
-      "type" : "double"
-    }, {
-      "name" : "min",
-      "type" : "double"
-    }, {
-      "name" : "max",
-      "type" : "double"
-    }, {
-      "name" : "input",
-      "type" : {
-        "type" : "array",
-        "items" : "double"
-      }
-    } ]
-  } ],
-  "messages" : {
-    "stats" : {
-      "response" : "StatResult"
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/dfi/test/schemas/invalid2.avpr
----------------------------------------------------------------------
diff --git a/dfi/test/schemas/invalid2.avpr b/dfi/test/schemas/invalid2.avpr
deleted file mode 100644
index 9eb9209..0000000
--- a/dfi/test/schemas/invalid2.avpr
+++ /dev/null
@@ -1,49 +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.
- */
- {
-  "protocol" : "Simple",
-  "types" : [ ],
-  "messages" : {
-    "sum" : {
-      "request" : [ {
-        "name" : "a"
-      }, {
-        "name" : "b",
-        "type" : "double"
-      } ],
-      "response" : "double"
-    },
-    "sub" : {
-      "request" : [ {
-        "name" : "a",
-        "type" : "double"
-      }, {
-        "name" : "b",
-        "type" : "double"
-      } ],
-      "response" : "double"
-    },
-    "sqrt" : {
-      "request" : [ {
-        "name" : "a"
-      } ],
-      "response" : "double"
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/dfi/test/schemas/simple.avdl
----------------------------------------------------------------------
diff --git a/dfi/test/schemas/simple.avdl b/dfi/test/schemas/simple.avdl
deleted file mode 100644
index a03e352..0000000
--- a/dfi/test/schemas/simple.avdl
+++ /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.
- */
- @namespace("org.apache.avro.test")
-protocol Simple {
-  double sum(double a, double b);
-  double sub(double a, double b);
-  double sqrt(double a);
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/dfi/test/schemas/simple.avpr
----------------------------------------------------------------------
diff --git a/dfi/test/schemas/simple.avpr b/dfi/test/schemas/simple.avpr
deleted file mode 100644
index 4910346..0000000
--- a/dfi/test/schemas/simple.avpr
+++ /dev/null
@@ -1,51 +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.
- */
- {
-  "protocol" : "Simple",
-  "types" : [ ],
-  "messages" : {
-    "sum" : {
-      "request" : [ {
-        "name" : "a",
-        "type" : "double"
-      }, {
-        "name" : "b",
-        "type" : "double"
-      } ],
-      "response" : "double"
-    },
-    "sub" : {
-      "request" : [ {
-        "name" : "a",
-        "type" : "double"
-      }, {
-        "name" : "b",
-        "type" : "double"
-      } ],
-      "response" : "double"
-    },
-    "sqrt" : {
-      "request" : [ {
-        "name" : "a",
-        "type" : "double"
-      } ],
-      "response" : "double"
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/dfi/test/schemas/simple_min.avpr
----------------------------------------------------------------------
diff --git a/dfi/test/schemas/simple_min.avpr b/dfi/test/schemas/simple_min.avpr
deleted file mode 100644
index f5c6673..0000000
--- a/dfi/test/schemas/simple_min.avpr
+++ /dev/null
@@ -1,19 +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.
- */
- 
{"protocol":"Simple","types":[],"messages":{"sum":{"request":[{"name":"a","type":"double"},{"name":"b","type":"double"}],"response":"double"},"sub":{"request":[{"name":"a","type":"double"},{"name":"b","type":"double"}],"response":"double"},"sqrt":{"request":[{"name":"a","type":"double"}],"response":"double"}}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/documents/getting_started/using_services_with_c.md
----------------------------------------------------------------------
diff --git a/documents/getting_started/using_services_with_c.md 
b/documents/getting_started/using_services_with_c.md
index 6622cba..75692f9 100644
--- a/documents/getting_started/using_services_with_c.md
+++ b/documents/getting_started/using_services_with_c.md
@@ -607,4 +607,4 @@ The suspend strategy has the advantage of reducing locks' 
usage: of course, susp
 
 ## See also
 
-See the [C Dependeny Manager](../../dependency_manager/readme.md) and [C 
Dependency Manager example](../../examples/dm_example) for more information and 
a more complex working example.
+See the [C Dependeny Manager](../../libs/dependency_manager/readme.md) and [C 
Dependency Manager example](../../examples/celix-examples/dm_example) for more 
information and a more complex working example.

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/documents/getting_started/using_services_with_cxx.md
----------------------------------------------------------------------
diff --git a/documents/getting_started/using_services_with_cxx.md 
b/documents/getting_started/using_services_with_cxx.md
index d8ad2ca..b8f359e 100644
--- a/documents/getting_started/using_services_with_cxx.md
+++ b/documents/getting_started/using_services_with_cxx.md
@@ -141,7 +141,7 @@ Component are concrete classes in C++. This do not have to 
implement specific in
 ## Code Examples
 
 The next code blocks contains some code examples of components to indicate how 
to handle service dependencies, how to specify providing services and how to 
cope with locking/synchronizing.
-The complete example can be found [here](../../examples/services_example_cxx).
+The complete example can be found 
[here](../../examples/celix-examples/services_example_cxx).
 
 ### Bar Example
 
@@ -568,4 +568,4 @@ The suspend strategy has the advantage of reducing locks' 
usage: of course, susp
 
 ## See also
 
-See the [C++ Dependeny Manager](../../dependency_manager_cxx/readme.md) and 
[C++ Dependency Manager example](../../examples/dm_example_cxx) for more 
information and a more complex working example.
+See the [C++ Dependeny Manager](../../libs/dependency_manager_cxx/readme.md) 
and [C++ Dependency Manager 
example](../../examples/celix-examples/dm_example_cxx) for more information and 
a more complex working example.

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/documents/intro/readme.md
----------------------------------------------------------------------
diff --git a/documents/intro/readme.md b/documents/intro/readme.md
index b91a0e0..c98883e 100644
--- a/documents/intro/readme.md
+++ b/documents/intro/readme.md
@@ -134,17 +134,17 @@ Taking into account that C has no garbage collection 
handling the dynamic behavi
  
 Apache Celix offers different solutions how to cope with this dynamic 
behaviour:
 
-* Bundle Context & Service References  - This (low level) 
[API](../../framework/public/include/bundle_context.h) exists to be compatible 
with the OSGi standard. This should not be used in production code, because no 
locking/syncing mechanisms are available.   
-* Service Listener - This (log level) 
[API](../../framework/public/include/service_listener.h) can be used to 
retrieve event when services are being removed or are added. Combined with 
locking this can be used to safely monitor and use services. 
-* Service Tracker - This 
[API](../../framework/public/include/service_tracker.h) can be used to register 
callbacks function when services are being removed or are added. Combined with 
locking this can be used to safely use services.
-* [Dependency Manager](../../dependency_manager/readme.md) - This library can 
be used to add service dependency is a declarative way.  A locking or syncing 
mechanism can be selected to safely use services. Note that this is not part of 
the OSGi standard.
+* Bundle Context & Service References  - This (low level) 
[API](../../libs/framework/public/include/bundle_context.h) exists to be 
compatible with the OSGi standard. This should not be used in production code, 
because no locking/syncing mechanisms are available.
+* Service Listener - This (log level) 
[API](../../libs/framework/public/include/service_listener.h) can be used to 
retrieve event when services are being removed or are added. Combined with 
locking this can be used to safely monitor and use services.
+* Service Tracker - This 
[API](../../libs/framework/public/include/service_tracker.h) can be used to 
register callbacks function when services are being removed or are added. 
Combined with locking this can be used to safely use services.
+* [Dependency Manager](../../libs/dependency_manager/readme.md) - This library 
can be used to add service dependency is a declarative way.  A locking or 
syncing mechanism can be selected to safely use services. Note that this is not 
part of the OSGi standard.
 
 Even though the dependency manager is not part of the OSGi specification, this 
is the preferred way because it uses a higher abstraction and removes a lot 
boilerplate code. 
 
 ## C++ Support
 
 One of the reasons why C was chosen as implementation language is that C can 
act as a common denominator for (service oriented) interoperability between a 
range of languages.
-C++ support is added with the use of a [C++ Dependency 
Manager](../../dependency_manager_cxx/readme.md).
+C++ support is added with the use of a [C++ Dependency 
Manager](../../libs/dependency_manager_cxx/readme.md).
 The Dependency Manager is arguably the most convenient way to interact with 
services, confers most uses cases and eliminates the necessity to port the rest 
of the (large) API to C++.
 
 ## Documentation

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/documents/subprojects/readme.md
----------------------------------------------------------------------
diff --git a/documents/subprojects/readme.md b/documents/subprojects/readme.md
index 49da63e..2853912 100644
--- a/documents/subprojects/readme.md
+++ b/documents/subprojects/readme.md
@@ -19,25 +19,25 @@ limitations under the License.
 
 Apache Celix is organized into several subprojects. The following subproject 
are currently available:
 
-* [Framework](../../framework) - The Apache Celix framework, an implementation 
of OSGi adapted to C.
-* [C Dependency Manager](../../dependency_manager) - A C component/dependency 
model for use through an API provided as library.
-* [C++ Dependency Manager](../../dependency_manager_cxx) - A C++ 
component/dependency model for use through an API provided as library.
-* [Device Access](../../device_access) - An implementation of the OSGi Device 
Access specification adapted to C.
-* [Etcd library](../../etcdlib) - A C library that interfaces with ETCD. 
+* [Framework](../../libs/framework) - The Apache Celix framework, an 
implementation of OSGi adapted to C.
+* [C Dependency Manager](../../libs/dependency_manager) - A C 
component/dependency model for use through an API provided as library.
+* [C++ Dependency Manager](../../libs/dependency_manager_cxx) - A C++ 
component/dependency model for use through an API provided as library.
+* [Device Access](../../bundles/device_access) - An implementation of the OSGi 
Device Access specification adapted to C.
+* [Etcd library](../../libs/etcdlib) - A C library that interfaces with ETCD.
 * [Examples](../../examples) - A Selection of examples showing how the 
framework can be used.
-* [Log Service](../../log_service) - An implementation of the OSGi Log Service 
adapated to C.
-* [Log Writer](../../log_writer) - A simple log writer for use in combination 
with the Log Service.
-* [Remote Service Admin](../../remote_services) - An implementation of the 
OSGi Remote Service Admin Service - for several protocols - adapted to C.
-    * [Remote Service Admin 
HTTP](../../remote_services/remote_service_admin_http) - A HTTP implementation 
of the RSA.
-    * [Remote Service Admin 
DFI](../../remote_services/remote_service_admin_dfi) - A Dynamic Function 
Interface (DFI) implementation of the RSA.
-    * [Remote Service Admin 
SHM](../../remote_services/remote_service_admin_shm) - A shared memory 
implementation of the RSA.
-    * [Topology Manager](../../remote_services/topology_manager) - A (scoped) 
RSA Topology Manager implementation. 
-    * [Discovery Configured](../../remote_services/discovery_configured) - A 
RSA Discovery implementation using static configuration (xml).
-    * [Discovery Etcd](../../remote_services/dicovery_etcd) - A RSA Discovery 
implementation using etcd.
-    * [Discovery SHM](../../remote_services/dicovery_shm) - A RSA Discovery 
implementation using shared memory.
-* [Shell](../../shell) - A OSGi shell implementation.
-* [Shell TUI](../../shell_tui) - A textual UI for the Celix Shell.
-* [Remote Shell](../../remote_shell) - A remote (telnet) frontend for the 
Celix shell.
-* [Bonjour Shell](../../shell_bonjour) - A remote (Bonjour / mDNS) frontend 
for the Celix shell.
-* [Deployment Admin](../../deployment_admin) - A deployment admin 
implementation.
+* [Log Service](../../bundles/log_service) - An implementation of the OSGi Log 
Service adapated to C.
+* [Log Writer](../../bundles/log_writer) - A simple log writer for use in 
combination with the Log Service.
+* [Remote Service Admin](../../bundles/remote_services) - An implementation of 
the OSGi Remote Service Admin Service - for several protocols - adapted to C.
+    * [Remote Service Admin 
HTTP](../../bundles/remote_services/remote_service_admin_http) - A HTTP 
implementation of the RSA.
+    * [Remote Service Admin 
DFI](../../bundles/remote_services/remote_service_admin_dfi) - A Dynamic 
Function Interface (DFI) implementation of the RSA.
+    * [Remote Service Admin 
SHM](../../bundles/remote_services/remote_service_admin_shm) - A shared memory 
implementation of the RSA.
+    * [Topology Manager](../../bundles/remote_services/topology_manager) - A 
(scoped) RSA Topology Manager implementation.
+    * [Discovery 
Configured](../../bundles/remote_services/discovery_configured) - A RSA 
Discovery implementation using static configuration (xml).
+    * [Discovery Etcd](../../bundles/remote_services/dicovery_etcd) - A RSA 
Discovery implementation using etcd.
+    * [Discovery SHM](../../bundles/remote_services/dicovery_shm) - A RSA 
Discovery implementation using shared memory.
+* [Shell](../../bundles/shell/shell) - A OSGi shell implementation.
+* [Shell TUI](../../bundles/shell/shell_tui) - A textual UI for the Celix 
Shell.
+* [Remote Shell](../../bundles/shell/remote_shell) - A remote (telnet) 
frontend for the Celix shell.
+* [Bonjour Shell](../../bundles/shell/shell_bonjour) - A remote (Bonjour / 
mDNS) frontend for the Celix shell.
+* [Deployment Admin](../../bundles/deployment_admin) - A deployment admin 
implementation.
 

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/etcdlib/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/etcdlib/CMakeLists.txt b/etcdlib/CMakeLists.txt
deleted file mode 100644
index eae7d0f..0000000
--- a/etcdlib/CMakeLists.txt
+++ /dev/null
@@ -1,88 +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.
-
-
-if (NOT COMMAND celix_subproject) 
-    #If COMMAND celix_subproject is not defined, this CMakeLists will
-    #act as a top level project. Making the etcdlib useable 
-    #stand-alone
-
-    cmake_minimum_required (VERSION 3.2)
-    project(ETCDLIB 
-        VERSION 1.0.0
-        LANGUAGES C CXX
-    )
-
-    include(GNUInstallDirs)
-
-    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
-    set(CMAKE_C_FLAGS "-D_GNU_SOURCE -std=gnu99 ${CMAKE_C_FLAGS}")
-    set(CMAKE_C_FLAGS_DEBUG "-g -DDEBUG")
-
-    set(ETCDLIB_CMP ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME})
-else()
-    set(ETCDLIB_CMP framework)
-endif ()
-
-find_package(CURL REQUIRED)
-find_package(Jansson REQUIRED)
-
-add_library(etcdlib SHARED
-    src/etcd.c
-)
-target_include_directories(etcdlib PUBLIC 
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-    $<INSTALL_INTERFACE:include/etcdlib>
-)
-target_include_directories(etcdlib PRIVATE src)
-target_include_directories(etcdlib SYSTEM PRIVATE 
-    ${CURL_INCLUDE_DIRS}
-    ${JANSSON_INCLUDE_DIRS}
-)
-
-set_target_properties(etcdlib PROPERTIES SOVERSION 1)
-set_target_properties(etcdlib PROPERTIES VERSION 1.0.0)
-target_link_libraries(etcdlib PRIVATE ${CURL_LIBRARIES} ${JANSSON_LIBRARIES})
-
-add_library(etcdlib_static STATIC
-    src/etcd.c
-)
-target_include_directories(etcdlib_static PUBLIC 
-    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/api>
-    $<INSTALL_INTERFACE:include/etcdlib>
-)
-target_include_directories(etcdlib_static PRIVATE src)
-target_include_directories(etcdlib_static SYSTEM PRIVATE 
-    ${CURL_INCLUDE_DIRS}
-    ${JANSSON_INCLUDE_DIRS}
-)
-set_target_properties(etcdlib_static PROPERTIES "SOVERSION" 1)
-target_link_libraries(etcdlib_static PRIVATE ${CURL_LIBRARIES} 
${JANSSON_LIBRARY})
-
-add_executable(etcdlib_test ${CMAKE_CURRENT_SOURCE_DIR}/test/etcdlib_test.c)
-target_link_libraries(etcdlib_test PRIVATE etcdlib_static)
-
-#TODO install etcdlib_static. For now left out, because the imported target 
leaks library paths
-install(DIRECTORY api/ DESTINATION include/etcdlib COMPONENT ${ETCDLIB_CMP})
-if (NOT COMMAND celix_subproject) 
-    install(TARGETS etcdlib DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT 
${ETCDLIB_CMP})
-else ()
-    install(TARGETS etcdlib EXPORT celix DESTINATION ${CMAKE_INSTALL_LIBDIR} 
COMPONENT ${ETCDLIB_CMP})
-    #Setup target aliases to match external usage
-    add_library(Celix::etcdlib ALIAS etcdlib)
-    add_library(Celix::etcdlib_static ALIAS etcdlib_static)
-endif ()

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/etcdlib/README.md
----------------------------------------------------------------------
diff --git a/etcdlib/README.md b/etcdlib/README.md
deleted file mode 100644
index 28cc442..0000000
--- a/etcdlib/README.md
+++ /dev/null
@@ -1,88 +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.
--->
-
-# Etcdlib
-etcd is a distributed, consistent key-value store for shared configuration and 
service discovery, part of the CoreOS project.
-
-This repository provides a library for etcd for C applications.
-
-Etcdlib can be used as part of Celix but is also useable stand-alone.
-
-## Preparing
-The following packages (libraries + headers) should be installed on your 
system:
-
-*      Development Environment
-       *       build-essentials (gcc/g++ or clang/clang++)
-       *       cmake (3.2 or higher)
-
-*      Etcdlib Dependencies
-       *       curl
-       *       jansson
-
-## Download the Apache Celix sources
-To get started you first have to download the Apache Celix sources. This can 
be done by cloning the Apache Celix git repository:
-
-```bash
-# Create a new workspace to work in, e.g:
-mkdir -p ${HOME}/workspace
-export WS=${HOME}/workspace
-cd ${WS}
-
-# clone the repro
-git clone --single-branch --branch develop https://github.com/apache/celix.git
-```
-
-## Building
-Etcdlib uses [CMake](https://cmake.org) as build system. CMake can generate 
(among others) makefiles or ninja build files. Using ninja build files will 
result in a faster build.
-
-### Building using CMake and makefiles:
-```bash
-cd ${WS}/celix/etcdlib
-mkdir build
-cd build
-cmake .. 
-make 
-```
-
-### Building using CMake and Ninja
-```bash
-cd ${WS}/celix/etcdlib
-mkdir build
-cd build
-cmake -G Ninja ..
-ninja
-```
-
-## Editing Build options
-With use of CMake, Etcdlib makes it possible to edit build options. This 
enabled users, among other options, to configure a install location.
-To edit the options use ccmake or cmake-gui. For cmake-gui an additional 
package install can be necessary (Fedora: `dnf install cmake-gui`). 
-
-```bash
-cd ${WS}/celix/etcdlib/build
-ccmake .
-# Edit the CMAKE_INSTALL_PREFIX config to set the install location
-```
-
-For this guide we assume the CMAKE_INSTALL_PREFIX is `/usr/local`.
-
-## Installing Etcdlib
-
-```bash
-cd ${WS}/celix/etcdlib/build
-make
-sudo make install
-```

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/etcdlib/api/etcd.h
----------------------------------------------------------------------
diff --git a/etcdlib/api/etcd.h b/etcdlib/api/etcd.h
deleted file mode 100644
index 7980700..0000000
--- a/etcdlib/api/etcd.h
+++ /dev/null
@@ -1,110 +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.
- */
-
-#ifndef ETCDLIB_H_
-#define ETCDLIB_H_
-
-#include <stdbool.h>
-
-/*
- * If set etcdlib will _not_ initialize curl
- * using curl_global_init. Note that 
- * curl_global_init can be called multiple
- * times, but is _not_ thread-safe.
- */
-#define ETCDLIB_NO_CURL_INITIALIZATION (1)
-
-#define ETCDLIB_ACTION_CREATE   "create"
-#define ETCDLIB_ACTION_GET      "get"
-#define ETCDLIB_ACTION_SET      "set"
-#define ETCDLIB_ACTION_UPDATE   "update"
-#define ETCDLIB_ACTION_DELETE   "delete"
-#define ETCDLIB_ACTION_EXPIRE   "expire"
-
-typedef void (*etcd_key_value_callback) (const char *key, const char *value, 
void* arg);
-
-/**
- * @desc Initialize the ETCD-LIB  with the server/port where Etcd can be 
reached.
- * @param const char* server. String containing the IP-number of the server.
- * @param int port. Port number of the server.
- * @param int flags. bitwise flags to control etcdlib initialization. 
- * @return 0 on success, non zero otherwise.
- */
-int etcd_init(const char* server, int port, int flags);
-
-/**
- * @desc Retrieve a single value from Etcd.
- * @param const char* key. The Etcd-key (Note: a leading '/' should be avoided)
- * @param char** value. The allocated memory contains the Etcd-value. The 
caller is responsible for freeing this memory.
- * @param int* modifiedIndex. If not NULL the Etcd-index of the last modified 
value.
- * @return 0 on success, non zero otherwise
- */
-int etcd_get(const char* key, char** value, int* modifiedIndex);
-
-/**
- * @desc Retrieve the contents of a directory. For every found key/value pair 
the given callback function is called.
- * @param const char* directory. The Etcd-directory which has to be searched 
for keys
- * @param etcd_key_value_callback callback. Callback function which is called 
for every found key
- * @param void *arg. Argument is passed to the callback function
- * @param int* modifiedIndex. If not NULL the Etcd-index of the last modified 
value.
- * @return 0 on success, non zero otherwise
- */
-int etcd_get_directory(const char* directory, etcd_key_value_callback 
callback, void *arg, long long* modifiedIndex);
-
-/**
- * @desc Setting an Etcd-key/value
- * @param const char* key. The Etcd-key (Note: a leading '/' should be avoided)
- * @param const char* value. The Etcd-value 
- * @param int ttl. If non-zero this is used as the TTL value
- * @param bool prevExist. If true the value is only set when the key already 
exists, if false it is always set
- * @return 0 on success, non zero otherwise
- */
-int etcd_set(const char* key, const char* value, int ttl, bool prevExist);
-
-/**
- * @desc Setting an Etcd-key/value and checks if there is a different previuos 
value
- * @param const char* key. The Etcd-key (Note: a leading '/' should be avoided)
- * @param const char* value. The Etcd-value 
- * @param int ttl. If non-zero this is used as the TTL value
- * @param bool always_write. If true the value is written, if false only when 
the given value is equal to the value in etcd.
- * @return 0 on success, non zero otherwise
- */
-int etcd_set_with_check(const char* key, const char* value, int ttl, bool 
always_write);
-
-/**
- * @desc Deleting an Etcd-key
- * @param const char* key. The Etcd-key (Note: a leading '/' should be avoided)
- * @return 0 on success, non zero otherwise
- */
-int etcd_del(const char* key);
-
-/**
- * @desc Watching an etcd directory for changes
- * @param const char* key. The Etcd-key (Note: a leading '/' should be avoided)
- * @param long long index. The Etcd-index which the watch has to be started on.
- * @param char** action. If not NULL, memory is allocated and contains the 
action-string. The caller is responsible of freeing the memory.
- * @param char** prevValue. If not NULL, memory is allocated and contains the 
previous value. The caller is responsible of freeing the memory.
- * @param char** value. If not NULL, memory is allocated and contains the new 
value. The caller is responsible of freeing the memory.
- * @param char** rkey. If not NULL, memory is allocated and contains the 
updated key. The caller is responsible of freeing the memory.
- * @param long long* modifiedIndex. If not NULL, the index of the modification 
is written.
- * @return 0 on success, non zero otherwise
- */
-int etcd_watch(const char* key, long long index, char** action, char** 
prevValue, char** value, char** rkey, long long* modifiedIndex);
-
-#endif /*ETCDLIB_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/etcdlib/cmake/FindJansson.cmake
----------------------------------------------------------------------
diff --git a/etcdlib/cmake/FindJansson.cmake b/etcdlib/cmake/FindJansson.cmake
deleted file mode 100644
index bedf8be..0000000
--- a/etcdlib/cmake/FindJansson.cmake
+++ /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.
-
-
-# - Try to find Jansson
-# Once done this will define
-#  JANSSON_FOUND - System has Jansson
-#  JANSSON_INCLUDE_DIRS - The Jansson include directories
-#  JANSSON_LIBRARIES - The libraries needed to use Jansson
-#  JANSSON_DEFINITIONS - Compiler switches required for using Jansson
-
-find_path(JANSSON_INCLUDE_DIR jansson.h
-          /usr/include
-          /usr/local/include )
-
-find_library(JANSSON_LIBRARY NAMES jansson
-             PATHS /usr/lib /usr/local/lib )
-
-set(JANSSON_LIBRARIES ${JANSSON_LIBRARY} )
-set(JANSSON_INCLUDE_DIRS ${JANSSON_INCLUDE_DIR} )
-
-include(FindPackageHandleStandardArgs)
-# handle the QUIETLY and REQUIRED arguments and set JANSSON_FOUND to TRUE
-# if all listed variables are TRUE
-find_package_handle_standard_args(Jansson  DEFAULT_MSG
-                                  JANSSON_LIBRARY JANSSON_INCLUDE_DIR)
-
-mark_as_advanced(JANSSON_INCLUDE_DIR JANSSON_LIBRARY )
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/etcdlib/src/etcd.c
----------------------------------------------------------------------
diff --git a/etcdlib/src/etcd.c b/etcdlib/src/etcd.c
deleted file mode 100644
index 0c9d615..0000000
--- a/etcdlib/src/etcd.c
+++ /dev/null
@@ -1,546 +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 <stdio.h>
-#include <stdbool.h>
-#include <string.h>
-#include <curl/curl.h>
-#include <jansson.h>
-
-#include "etcd.h"
-
-#define ETCD_JSON_NODE                  "node"
-#define ETCD_JSON_PREVNODE              "prevNode"
-#define ETCD_JSON_NODES                 "nodes"
-#define ETCD_JSON_ACTION                "action"
-#define ETCD_JSON_KEY                   "key"
-#define ETCD_JSON_VALUE                 "value"
-#define ETCD_JSON_DIR                   "dir"
-#define ETCD_JSON_MODIFIEDINDEX         "modifiedIndex"
-#define ETCD_JSON_INDEX                 "index"
-
-#define ETCD_HEADER_INDEX               "X-Etcd-Index: "
-
-#define MAX_OVERHEAD_LENGTH           64
-#define DEFAULT_CURL_TIMEOUT          10
-#define DEFAULT_CURL_CONECTTIMEOUT    10
-
-typedef enum {
-       GET, PUT, DELETE
-} request_t;
-
-static const char* etcd_server;
-static int etcd_port = 0;
-
-struct MemoryStruct {
-       char *memory;
-       char *header;
-       size_t memorySize;
-    size_t headerSize;
-};
-
-
-/**
- * Static function declarations
- */
-static int performRequest(char* url, request_t request, void* reqData, void* 
repData);
-static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, 
void *userp);
-/**
- * External function definition
- */
-
-
-/**
- * etcd_init
- */
-int etcd_init(const char* server, int port, int flags) {
-       int status = 0;
-       etcd_server = server;
-       etcd_port = port;
-
-       if ((flags & ETCDLIB_NO_CURL_INITIALIZATION) == 0) {
-               //NO_CURL_INITIALIZATION flag not set
-               status = curl_global_init(CURL_GLOBAL_ALL);
-       }
-
-       return status;
-}
-
-
-/**
- * etcd_get
- */
-int etcd_get(const char* key, char** value, int* modifiedIndex) {
-       json_t* js_root = NULL;
-       json_t* js_node = NULL;
-       json_t* js_value = NULL;
-       json_t* js_modifiedIndex = NULL;
-       json_error_t error;
-       int res = -1;
-       struct MemoryStruct reply;
-
-       reply.memory = malloc(1); /* will be grown as needed by the realloc 
above */
-       reply.memorySize = 0; /* no data at this point */
-    reply.header = NULL; /* will be grown as needed by the realloc above */
-    reply.headerSize = 0; /* no data at this point */
-
-       int retVal = -1;
-       char *url;
-       asprintf(&url, "http://%s:%d/v2/keys/%s";, etcd_server, etcd_port, key);
-       res = performRequest(url, GET, NULL, (void*) &reply);
-       free(url);
-
-       if (res == CURLE_OK) {
-               js_root = json_loads(reply.memory, 0, &error);
-
-               if (js_root != NULL) {
-                       js_node = json_object_get(js_root, ETCD_JSON_NODE);
-               }
-               if (js_node != NULL) {
-                       js_value = json_object_get(js_node, ETCD_JSON_VALUE);
-                       js_modifiedIndex = json_object_get(js_node,
-                                       ETCD_JSON_MODIFIEDINDEX);
-
-                       if (js_modifiedIndex != NULL && js_value != NULL) {
-                               if (modifiedIndex) {
-                                       *modifiedIndex = 
json_integer_value(js_modifiedIndex);
-                               }
-                               *value = strdup(json_string_value(js_value));
-                               retVal = 0;
-                       }
-               }
-               if (js_root != NULL) {
-                       json_decref(js_root);
-               }
-       }
-
-       if (reply.memory) {
-               free(reply.memory);
-       }
-       if(retVal != 0) {
-               *value = NULL;
-       }
-       return retVal;
-}
-
-
-static int etcd_get_recursive_values(json_t* js_root, etcd_key_value_callback 
callback, void *arg, json_int_t *mod_index) {
-       json_t *js_nodes;
-       if ((js_nodes = json_object_get(js_root, ETCD_JSON_NODES)) != NULL) {
-               // subarray
-               if (json_is_array(js_nodes)) {
-                       int len = json_array_size(js_nodes);
-                       for (int i = 0; i < len; i++) {
-                               json_t *js_object = json_array_get(js_nodes, i);
-                               json_t *js_mod_index = 
json_object_get(js_object, ETCD_JSON_MODIFIEDINDEX);
-
-                               if(js_mod_index != NULL) {
-                                       json_int_t index = 
json_integer_value(js_mod_index);
-                                       if(*mod_index < index) {
-                                               *mod_index = index;
-                                       }
-                               } else {
-                                       printf("[ETCDLIB] Error: No INDEX found 
for key!\n");
-                               }
-
-                               if (json_object_get(js_object, 
ETCD_JSON_NODES)) {
-                                       // node contains nodes
-                                       etcd_get_recursive_values(js_object, 
callback, arg, mod_index);
-                               } else {
-                                       json_t* js_key = 
json_object_get(js_object, ETCD_JSON_KEY);
-                                       json_t* js_value = 
json_object_get(js_object, ETCD_JSON_VALUE);
-
-                                       if (js_key && js_value) {
-                                               if (!json_object_get(js_object, 
ETCD_JSON_DIR)) {
-                                                       
callback(json_string_value(js_key), json_string_value(js_value), arg);
-                                               }
-                                       } //else empty etcd directory, not an 
error.
-
-                               }
-                       }
-               } else {
-                       fprintf(stderr, "[ETCDLIB] Error: misformatted JSON: 
nodes element is not an array !!\n");
-               }
-       } else {
-               fprintf(stderr, "[ETCDLIB] Error: nodes element not found!!\n");
-       }
-
-       return (*mod_index > 0 ? 0 : 1);
-}
-
-static long long etcd_get_current_index(const char* headerData) {
-    long long index = -1;
-    char * indexStr = strstr(headerData, ETCD_HEADER_INDEX);
-    indexStr += strlen(ETCD_HEADER_INDEX);
-
-    if (sscanf(indexStr, "%lld\n",&index) == 1) {
-    } else {
-        index = -1;
-    }
-    return index;
-}
-/**
- * etcd_get_directory
- */
-int etcd_get_directory(const char* directory, etcd_key_value_callback 
callback, void* arg, long long* modifiedIndex) {
-       json_t* js_root = NULL;
-       json_t* js_rootnode = NULL;
-
-       json_error_t error;
-       int res;
-       struct MemoryStruct reply;
-
-       reply.memory = malloc(1); /* will be grown as needed by the realloc 
above */
-       reply.memorySize = 0; /* no data at this point */
-    reply.header = malloc(1); /* will be grown as needed by the realloc above 
*/
-    reply.headerSize = 0; /* no data at this point */
-
-       int retVal = 0;
-       char *url;
-
-       asprintf(&url, "http://%s:%d/v2/keys/%s?recursive=true";, etcd_server, 
etcd_port, directory);
-
-       res = performRequest(url, GET, NULL, (void*) &reply);
-       free(url);
-       if (res == CURLE_OK) {
-               js_root = json_loads(reply.memory, 0, &error);
-               if (js_root != NULL) {
-                       js_rootnode = json_object_get(js_root, ETCD_JSON_NODE);
-               } else {
-                       retVal = -1;
-                       fprintf(stderr, "[ETCDLIB] Error: %s in js_root not 
found", ETCD_JSON_NODE);
-               }
-               if (js_rootnode != NULL) {
-                       *modifiedIndex = 0;
-                       retVal = etcd_get_recursive_values(js_rootnode, 
callback, arg, (json_int_t*)modifiedIndex);
-            long long indexFromHeader = etcd_get_current_index(reply.header);
-            if (indexFromHeader > *modifiedIndex) {
-              *modifiedIndex = indexFromHeader;
-            }
-               } else {
-                       // Error occured, retrieve the index of ETCD from the 
error code
-                       js_rootnode = json_object_get(js_root, ETCD_JSON_INDEX);
-                       if(js_rootnode) {
-                               json_int_t index = 
json_integer_value(js_rootnode);
-                               *modifiedIndex = index;
-
-                       } else {
-                               fprintf(stderr, "[ETCDLIB] Error: index not 
found in error %s\n", reply.memory);
-
-                       }
-
-               }
-               if (js_root != NULL) {
-                       json_decref(js_root);
-               }
-       }
-
-    free(reply.memory);
-    free(reply.header);
-
-       return retVal;
-}
-
-/**
- * etcd_set
- */
-int etcd_set(const char* key, const char* value, int ttl, bool prevExist) {
-       json_error_t error;
-       json_t* js_root = NULL;
-       json_t* js_node = NULL;
-       json_t* js_value = NULL;
-       int retVal = -1;
-       char *url;
-       size_t req_len = strlen(value) + MAX_OVERHEAD_LENGTH;
-       char request[req_len];
-       char* requestPtr = request;
-       int res;
-       struct MemoryStruct reply;
-
-       /* Skip leading '/', etcd cannot handle this. */
-       while(*key == '/') {
-               key++;
-       }
-
-       reply.memory = calloc(1, 1); /* will be grown as needed by the realloc 
above */
-       reply.memorySize = 0; /* no data at this point */
-    reply.header = NULL; /* will be grown as needed by the realloc above */
-    reply.headerSize = 0; /* no data at this point */
-
-       asprintf(&url, "http://%s:%d/v2/keys/%s";, etcd_server, etcd_port, key);
-
-       requestPtr += snprintf(requestPtr, req_len, "value=%s", value);
-       if (ttl > 0) {
-               requestPtr += snprintf(requestPtr, 
req_len-(requestPtr-request), ";ttl=%d", ttl);
-       }
-
-       if (prevExist) {
-               requestPtr += snprintf(requestPtr, 
req_len-(requestPtr-request), ";prevExist=true");
-       }
-
-       res = performRequest(url, PUT, request, (void*) &reply);
-       if(url) {
-               free(url);
-       }
-
-       if (res == CURLE_OK) {
-               js_root = json_loads(reply.memory, 0, &error);
-
-               if (js_root != NULL) {
-                       js_node = json_object_get(js_root, ETCD_JSON_NODE);
-               }
-               if (js_node != NULL) {
-                       js_value = json_object_get(js_node, ETCD_JSON_VALUE);
-               }
-               if (js_value != NULL && json_is_string(js_value)) {
-                       if(strcmp(json_string_value(js_value), value) == 0) {
-                               retVal = 0;
-                       }
-               }
-               if (js_root != NULL) {
-                       json_decref(js_root);
-               }
-       }
-
-       if (reply.memory) {
-               free(reply.memory);
-       }
-
-       return retVal;
-}
-
-
-/**
- * etcd_set_with_check
- */
-int etcd_set_with_check(const char* key, const char* value, int ttl, bool 
always_write) {
-       char *etcd_value;
-       int result = 0;
-       if (etcd_get(key, &etcd_value, NULL) == 0) {
-               if(etcd_value!=NULL){
-                       if (strcmp(etcd_value, value) != 0) {
-                               fprintf(stderr, "[ETCDLIB] WARNING: value 
already exists and is different\n");
-                               fprintf(stderr, "   key       = %s\n", key);
-                               fprintf(stderr, "   old value = %s\n", 
etcd_value);
-                               fprintf(stderr, "   new value = %s\n", value);
-                               result = -1;
-                       }
-                       free(etcd_value);
-               }
-       }
-       if(always_write || !result) {
-               result = etcd_set(key, value, ttl, false);
-       }
-       return result;
-}
-
-
-/**
- * etcd_watch
- */
-int etcd_watch(const char* key, long long index, char** action, char** 
prevValue, char** value, char** rkey, long long* modifiedIndex) {
-       json_error_t error;
-       json_t* js_root = NULL;
-       json_t* js_node = NULL;
-       json_t* js_prevNode = NULL;
-       json_t* js_action = NULL;
-       json_t* js_value = NULL;
-       json_t* js_rkey = NULL;
-       json_t* js_prevValue = NULL;
-       json_t* js_modIndex = NULL;
-       int retVal = -1;
-       char *url = NULL;
-       int res;
-       struct MemoryStruct reply;
-
-       reply.memory = malloc(1); /* will be grown as needed by the realloc 
above */
-       reply.memorySize = 0; /* no data at this point */
-    reply.header = NULL; /* will be grown as needed by the realloc above */
-    reply.headerSize = 0; /* no data at this point */
-
-       if (index != 0)
-               asprintf(&url, 
"http://%s:%d/v2/keys/%s?wait=true&recursive=true&waitIndex=%lld";, etcd_server, 
etcd_port, key, index);
-       else
-               asprintf(&url, 
"http://%s:%d/v2/keys/%s?wait=true&recursive=true";, etcd_server, etcd_port, 
key);
-       res = performRequest(url, GET, NULL, (void*) &reply);
-       if(url)
-               free(url);
-       if (res == CURLE_OK) {
-               js_root = json_loads(reply.memory, 0, &error);
-
-               if (js_root != NULL) {
-                       js_action = json_object_get(js_root, ETCD_JSON_ACTION);
-                       js_node = json_object_get(js_root, ETCD_JSON_NODE);
-                       js_prevNode = json_object_get(js_root, 
ETCD_JSON_PREVNODE);
-                       retVal = 0;
-               }
-               if (js_prevNode != NULL) {
-                       js_prevValue = json_object_get(js_prevNode, 
ETCD_JSON_VALUE);
-               }
-               if (js_node != NULL) {
-                       js_rkey = json_object_get(js_node, ETCD_JSON_KEY);
-                       js_value = json_object_get(js_node, ETCD_JSON_VALUE);
-                       js_modIndex = json_object_get(js_node, 
ETCD_JSON_MODIFIEDINDEX);
-               }
-               if (js_prevNode != NULL) {
-                       js_prevValue = json_object_get(js_prevNode, 
ETCD_JSON_VALUE);
-               }
-               if ((prevValue != NULL) && (js_prevValue != NULL) && 
(json_is_string(js_prevValue))) {
-
-                       *prevValue = strdup(json_string_value(js_prevValue));
-               }
-               if(modifiedIndex != NULL) {
-                       if ((js_modIndex != NULL) && 
(json_is_integer(js_modIndex))) {
-                               *modifiedIndex = 
json_integer_value(js_modIndex);
-                       } else {
-                               *modifiedIndex = index;
-                       }
-               }
-               if ((rkey != NULL) && (js_rkey != NULL) && 
(json_is_string(js_rkey))) {
-                       *rkey = strdup(json_string_value(js_rkey));
-
-               }
-               if ((action != NULL)  && (js_action != NULL)  && 
(json_is_string(js_action))) {
-                       *action = strdup(json_string_value(js_action));
-               }
-               if ((value != NULL) && (js_value != NULL) && 
(json_is_string(js_value))) {
-                       *value = strdup(json_string_value(js_value));
-               }
-               if (js_root != NULL) {
-                       json_decref(js_root);
-               }
-
-       }
-
-       free(reply.memory);
-
-       return retVal;
-}
-
-/**
- * etcd_del
- */
-int etcd_del(const char* key) {
-       json_error_t error;
-       json_t* js_root = NULL;
-       json_t* js_node = NULL;
-       int retVal = -1;
-       char *url;
-       int res;
-       struct MemoryStruct reply;
-
-       reply.memory = malloc(1); /* will be grown as needed by the realloc 
above */
-       reply.memorySize = 0; /* no data at this point */
-    reply.header = NULL; /* will be grown as needed by the realloc above */
-    reply.headerSize = 0; /* no data at this point */
-
-       asprintf(&url, "http://%s:%d/v2/keys/%s?recursive=true";, etcd_server, 
etcd_port, key);
-       res = performRequest(url, DELETE, NULL, (void*) &reply);
-       free(url);
-
-       if (res == CURLE_OK) {
-               js_root = json_loads(reply.memory, 0, &error);
-               if (js_root != NULL) {
-                       js_node = json_object_get(js_root, ETCD_JSON_NODE);
-               }
-
-               if (js_node != NULL) {
-                       retVal = 0;
-               }
-
-               if (js_root != NULL) {
-                       json_decref(js_root);
-               }
-       }
-
-       free(reply.memory);
-
-       return retVal;
-}
-
-
-static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, 
void *userp) {
-       size_t realsize = size * nmemb;
-       struct MemoryStruct *mem = (struct MemoryStruct *) userp;
-
-    mem->memory = realloc(mem->memory, mem->memorySize + realsize + 1);
-       if (mem->memory == NULL) {
-               /* out of memory! */
-               fprintf(stderr, "[ETCDLIB] Error: not enough memory (realloc 
returned NULL)\n");
-               return 0;
-       }
-
-       memcpy(&(mem->memory[mem->memorySize]), contents, realsize);
-       mem->memorySize += realsize;
-       mem->memory[mem->memorySize] = 0;
-
-       return realsize;
-}
-
-static size_t WriteHeaderCallback(void *contents, size_t size, size_t nmemb, 
void *userp) {
-    size_t realsize = size * nmemb;
-    struct MemoryStruct *mem = (struct MemoryStruct *) userp;
-
-    mem->header = realloc(mem->header, mem->headerSize + realsize + 1);
-    if (mem->header == NULL) {
-        /* out of memory! */
-        fprintf(stderr, "[ETCDLIB] Error: not enough header-memory (realloc 
returned NULL)\n");
-        return 0;
-    }
-
-    memcpy(&(mem->header[mem->headerSize]), contents, realsize);
-    mem->headerSize += realsize;
-    mem->header[mem->headerSize] = 0;
-
-    return realsize;
-}
-
-
-
-static int performRequest(char* url, request_t request, void* reqData, void* 
repData) {
-       CURL *curl = NULL;
-       CURLcode res = 0;
-       curl = curl_easy_init();
-       curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
-       curl_easy_setopt(curl, CURLOPT_TIMEOUT, DEFAULT_CURL_TIMEOUT);
-       curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 
DEFAULT_CURL_CONECTTIMEOUT);
-       curl_easy_setopt(curl, CURLOPT_URL, url);
-       curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
-       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
-       curl_easy_setopt(curl, CURLOPT_WRITEDATA, repData);
-    if (((struct MemoryStruct*)repData)->header) {
-        curl_easy_setopt(curl, CURLOPT_HEADERDATA, repData);
-        curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, WriteHeaderCallback);
-    }
-
-       if (request == PUT) {
-               curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
-               curl_easy_setopt(curl, CURLOPT_POST, 1L);
-               curl_easy_setopt(curl, CURLOPT_POSTFIELDS, reqData);
-       } else if (request == DELETE) {
-               curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "DELETE");
-       } else if (request == GET) {
-               curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
-       }
-
-       res = curl_easy_perform(curl);
-       curl_easy_cleanup(curl);
-
-       return res;
-}

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/etcdlib/test/etcdlib_test.c
----------------------------------------------------------------------
diff --git a/etcdlib/test/etcdlib_test.c b/etcdlib/test/etcdlib_test.c
deleted file mode 100644
index d4b34b9..0000000
--- a/etcdlib/test/etcdlib_test.c
+++ /dev/null
@@ -1,116 +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.
- */
-
-/**
- * Test program for testing the etcdlib.
- * Prerequisite is that etcdlib is started on localhost on default port (2379)
- * tested with etcd 2.3.7
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include "etcd.h"
-
-#include <pthread.h>
-
-int simplewritetest() {
-       int res = 0;
-       char*value = NULL;
-       etcd_set("simplekey", "testvalue", 5, false);
-       etcd_get("simplekey", &value, NULL);
-       if (value && strcmp(value, "testvalue")) {
-               printf("etcdlib test error: expected testvalue got %s\n", 
value);
-               res = -1;
-       }
-       free(value);
-       return res;
-}
-
-void* waitForChange(void*arg) {
-       int *idx = (int*)arg;
-       char *action = NULL;
-       char *prevValue = NULL;
-       char *value = NULL;
-       char *rkey = NULL;
-       long long modifiedIndex;
-
-       printf("Watching for index %d\n", *idx);
-
-       if(etcd_watch("hier/ar", *idx, &action, &prevValue, &value, &rkey, 
&modifiedIndex) == 0){
-               printf(" New value from watch : [%s]%s => %s\n", rkey, 
prevValue, value);
-               if(action != NULL) free(action);
-               if(prevValue != NULL) free(prevValue);
-               if(rkey != NULL) free(rkey);
-               if(value != NULL) free(value);
-       }
-
-       *idx = modifiedIndex+1;
-
-       action = NULL;
-       prevValue = NULL;
-       value = NULL;
-       rkey = NULL;
-
-       if(etcd_watch("hier/ar", *idx, &action, &prevValue, &value, &rkey, 
&modifiedIndex) == 0){
-               printf(" New value from watch : [%s]%s => %s\n", rkey, 
prevValue, value);
-               if(action != NULL) free(action);
-               if(prevValue != NULL) free(prevValue);
-               if(rkey != NULL) free(rkey);
-       }
-
-       return value;
-}
-
-int waitforchangetest() {
-       int res = 0;
-       char*value = NULL;
-
-       etcd_set("hier/ar/chi/cal", "testvalue1", 5, false);
-
-       int index;
-       etcd_get("hier/ar/chi/cal", &value, &index);
-       free(value);
-       pthread_t waitThread;
-       index++;
-       pthread_create(&waitThread, NULL, waitForChange, &index);
-       sleep(1);
-       etcd_set("hier/ar/chi/cal", "testvalue2", 5, false);
-       sleep(1);
-       etcd_set("hier/ar/chi/cal", "testvalue3", 5, false);
-       void *resVal;
-       pthread_join(waitThread, &resVal);
-       if(strcmp((char*)resVal,"testvalue3" )) {
-               printf("etcdtest::waitforchange1 expected testvalue3, got 
%s\n", (char*)resVal);
-               res = -1;
-       }
-       free(resVal);
-       return res;
-}
-
-int main (void) {
-       etcd_init("localhost", 2379, 0);
-
-       int res = simplewritetest(); if(res) return res; else 
printf("simplewrite test success\n");
-       res = waitforchangetest(); if(res) return res;else 
printf("waitforchange1 test success\n");
-
-       return 0;
-}
-

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/event_admin/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/event_admin/CMakeLists.txt b/event_admin/CMakeLists.txt
deleted file mode 100644
index 2882069..0000000
--- a/event_admin/CMakeLists.txt
+++ /dev/null
@@ -1,43 +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.
-
-celix_subproject(EVENT_ADMIN "Option to enable building the Event Admin 
Service bundles" OFF DEPS LAUNCHER LOG_SERVICE SHELL shell_tui)
-if(EVENT_ADMIN)
-
-       #add_subdirectory(utils)
-       add_subdirectory(event_admin)
-       add_subdirectory(event_handler)
-       add_subdirectory(event_publisher)
-
-       #deploy("event_admin_bundle" BUNDLES event_admin shell shell_tui 
log_service log_writer)
-  #  deploy("event_publisher_example" BUNDLES event_admin event_publisher 
shell shell_tui log_service log_writer)
-#      deploy("event_handler_example" BUNDLES event_admin event_handler shell 
shell_tui log_service log_writer)
-#      deploy("event_admin_example" BUNDLES event_admin event_publisher 
event_handler shell shell_tui log_service log_writer)
-       add_celix_container(event_admin_service
-                       NAME "event_admin_service"
-                       GROUP "event_admin/event_admin"
-                       BUNDLES event_admin shell shell_tui log_service 
log_writer
-                       )
-       add_celix_container(event_handler_consumer
-                       NAME "event_handler_consumer"
-                       GROUP "event_handler"
-                       BUNDLES event_handler event_admin shell shell_tui 
log_service log_writer)
-       add_celix_container(event_publisher_consumer
-                       NAME "event_publisher_consumer"
-                       GROUP "event_publisher"
-                       BUNDLES event_publisher event_handler event_admin shell 
shell_tui log_service log_writer)
-endif(EVENT_ADMIN)

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/event_admin/event_admin/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/event_admin/event_admin/CMakeLists.txt 
b/event_admin/event_admin/CMakeLists.txt
deleted file mode 100644
index 87b6e62..0000000
--- a/event_admin/event_admin/CMakeLists.txt
+++ /dev/null
@@ -1,39 +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_directories(public/include)
-include_directories(private/include)
-include_directories("${PROJECT_SOURCE_DIR}/utils/public/include")
-include_directories("${PROJECT_SOURCE_DIR}/log_service/public/include")
-
-add_celix_bundle(event_admin
-    VERSION 0.0.0
-       SOURCES 
-               private/src/event_admin_activator.c
-               private/src/event_admin_impl.c
-               private/src/event_impl.c
-               public/include/event_admin.h
-               public/include/event_handler.h
-               private/include/event_admin_impl.h
-               ${PROJECT_SOURCE_DIR}/log_service/public/src/log_helper.c
-)
-
-install_celix_bundle(event_admin)
-
-target_link_libraries(event_admin Celix::framework)

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/event_admin/event_admin/private/include/event_admin_impl.h
----------------------------------------------------------------------
diff --git a/event_admin/event_admin/private/include/event_admin_impl.h 
b/event_admin/event_admin/private/include/event_admin_impl.h
deleted file mode 100644
index 20b0f1b..0000000
--- a/event_admin/event_admin/private/include/event_admin_impl.h
+++ /dev/null
@@ -1,169 +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.
- */
-/*
- * event_admin_impl.h
- *
- *  \Created on: Jul 16, 2013
- *  \author            <a href="mailto:d...@celix.apache.org";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#ifndef EVENT_ADMIN_IMPL_H_
-#define EVENT_ADMIN_IMPL_H_
-#include <string.h>
-#include "celix_errno.h"
-#include "bundle_context.h"
-#include "constants.h"
-#include "event_constants.h"
-#include "event_admin.h"
-#include "event_handler.h"
-#include "bundle_activator.h"
-#include "bundle_context.h"
-#include "service_tracker.h"
-#include "service_listener.h"
-#include "service_registration.h"
-#include "listener_hook_service.h"
-#include "event_admin.h"
-#include "log_helper.h"
-
-struct event_admin {
-        hash_map_pt channels;
-        array_list_pt event_handlers;
-        bundle_context_pt context;
-        log_helper_pt *loghelper;
-};
-typedef struct channel *channel_t;
-struct channel {
-        char *topic;
-        hash_map_pt eventHandlers;///array list containing all listeners 
subscribed to the channel
-       // hash_map_pt channels;
-       // apr_thread_mutex_t *channelLock;
-
-};
-/**
- * @desc Create event an event admin and put it in the event_admin parameter.
- * @param apr_pool_t *pool. Pointer to the apr pool
- * @param bundle_context_pt context. Pointer to the bundle context.
- * @param event_admin_pt *event_admin. The event admin result.
- */
-celix_status_t eventAdmin_create( bundle_context_pt context, event_admin_pt 
*event_admin);
-
-
-celix_status_t eventAdmin_destroy(event_admin_pt *event_admin);
-
-/**
- * @desc Post event. sends the event to the handlers in async.
- * @param event_admin_pt event_admin. the event admin instance
- * @param event_pt event. the event to be send.
- *
- */
-celix_status_t eventAdmin_postEvent(event_admin_pt event_admin, event_pt 
event);// async event sending
-/**
- * @desc send event. sends the event to the handlers in sync.
- * @param event_admin_pt event_admin. the event admin instance
- * @param event_pt event. the event to be send.
- *
- */
-celix_status_t eventAdmin_sendEvent(event_admin_pt event_admin, event_pt 
event);// sync event sending
-/**
- * @desc functions for the service tracker
- * @param void * handle.  Pointer to the event admin.
- * @param service_reference_pt ref. Pointer to the service reference. Needed 
to get the service
- * @param void **service Pointer to the service. Needed to use the service.
- */
-celix_status_t eventAdmin_addingService(void * handle, service_reference_pt 
ref, void **service);
-celix_status_t eventAdmin_addedService(void * handle, service_reference_pt 
ref, void * service);
-celix_status_t eventAdmin_modifiedService(void * handle, service_reference_pt 
ref, void * service);
-celix_status_t eventAdmin_removedService(void * handle, service_reference_pt 
ref, void * service) ;
-/*
- * end functions for service tracker
- */
-
-/**
- * @desc finds the handlers interested in the topic.
- * @param hash_map_pt channels. hashmap contains the channels, key string based
- * @param char *topic, the topic string.
- * @param array_list_pt event_handlers. The array list to contain the 
interested handlers.
- */
-celix_status_t eventAdmin_findHandlersByTopic(event_admin_pt event_admin, 
const char *topic,
-                                              array_list_pt event_handlers);
-/**
- * @desc create the needed event channels for an event handler.
- * @desc apr_pool_t *pool. a memory pool pointer.
- * @desc event_handler_service_pt event_handler_service. The handler
- * @desc char *topic the topic
- * @desc channel_t *channel. the top level channel.
- */
-celix_status_t 
eventAdmin_createEventChannelsByEventHandler(event_handler_service_pt 
event_handler_service,
-                                                            const char *topic, 
channel_t *channel);
-/**
- * @desc mutex functions for the channels
- * @param event_admin_pt event_admin. the event admin instance.
- * @param char *topic. the topic for which the channels need to be locked or 
unlocked
- */
-celix_status_t eventAdmin_lockHandlersList(event_admin_pt event_admin, const 
char *topic);
-
-celix_status_t eventAdmin_releaseHandersList(event_admin_pt event_admin, const 
char *topic);
-
-/**
- * @desc create an event
- * @param char *topic. String containing the topic
- * @param properties_pt properties.
- */
-celix_status_t eventAdmin_createEvent(event_admin_pt event_admin, const char 
*topic, properties_pt properties,
-                                      event_pt *event);
-/**
- * @desc checks if an event contains the property
- * @param event_pt *event. the event to check
- * @param char *property. the key for the property to check
- * @param bool *result. the result.
- */
-celix_status_t eventAdmin_containsProperty( event_pt *event, char *property, 
bool *result);
-/**
- * @desc checks if an event is equal to the second event.
- * @param event_pt *event, event to compare to
- * @param event_pt *event, the event to be compared
- * @param bool *result. the result true if equal.
- */
-celix_status_t eventAdmin_event_equals( event_pt *event, event_pt *compare, 
bool *result);
-/**
- * @desc gets a property from the event.
- * @param event_pt *event. the event to get the property from
- * @param char *propertyKey the key of the property to get
- * @param char **propertyValue. the result param will contain the property if 
it exists in the event.
- */
-celix_status_t eventAdmin_getProperty(event_pt *event, char *propertyKey, 
const char **propertyValue);
-/**
- * @desc gets all property names from the event
- * @param event_pt *event. the event to get the property names from
- * @param array_list_pt *names. will contain the keys
- */
-celix_status_t eventAdmin_getPropertyNames( event_pt *event, array_list_pt 
*names);
-/**
- * @desc gets the topic from an event
- * @param event_pt *event. the event to get the topic from
- * @param char **topic, result pointer will contain the topic.
- */
-celix_status_t eventAdmin_getTopic(event_pt *event, const char **topic);
-celix_status_t eventAdmin_hashCode(event_pt *event, int *hashCode);
-celix_status_t eventAdmin_matches( event_pt *event);
-celix_status_t eventAdmin_toString( event_pt *event, char *eventString);
-
-
-#endif /* EVENT_ADMIN_IMPL_H_ */

http://git-wip-us.apache.org/repos/asf/celix/blob/3bce889b/event_admin/event_admin/private/src/event_admin_activator.c
----------------------------------------------------------------------
diff --git a/event_admin/event_admin/private/src/event_admin_activator.c 
b/event_admin/event_admin/private/src/event_admin_activator.c
deleted file mode 100644
index a5f8cb2..0000000
--- a/event_admin/event_admin/private/src/event_admin_activator.c
+++ /dev/null
@@ -1,136 +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
- *
- *  Created on: Jul 9, 2013
- *  \author            <a href="mailto:d...@celix.apache.org";>Apache Celix 
Project Team</a>
- *  \copyright Apache License, Version 2.0
- */
-
-#include <stdlib.h>
-
-#include "event_admin_impl.h"
-#include "log_helper.h"
-#include "log_service.h"
-
-struct activator {
-
-       event_admin_service_pt event_admin_service;
-       event_admin_pt event_admin;
-       service_registration_pt registration;
-       service_tracker_pt tracker;
-       bundle_context_pt context;
-       log_helper_pt loghelper;
-};
-
-celix_status_t bundleActivator_create(bundle_context_pt context, void 
**userData) {
-       celix_status_t status = CELIX_SUCCESS;
-
-       struct activator *activator;
-       activator = calloc(1, sizeof(*activator));
-
-       if(!activator) {
-               status = CELIX_BUNDLE_EXCEPTION;
-       }else {
-               activator->registration = NULL;
-               logHelper_create(context, &activator->loghelper);
-
-               *userData = activator;
-               event_admin_pt event_admin = NULL;
-               event_admin_service_pt event_admin_service = NULL;
-               status = eventAdmin_create(context, &event_admin);
-               if(status == CELIX_SUCCESS){
-                       activator->event_admin = event_admin;
-                       event_admin_service = calloc(1, 
sizeof(event_admin_service));
-                       if(!event_admin_service){
-                               status = CELIX_ENOMEM;
-                       } else {
-                               event_admin->context = context;
-                               event_admin->loghelper = &activator->loghelper;
-                               event_admin_service->eventAdmin = event_admin;
-                               event_admin_service->postEvent = 
eventAdmin_postEvent;
-                               event_admin_service->sendEvent = 
eventAdmin_sendEvent;
-                               event_admin_service->createEvent = 
eventAdmin_createEvent;
-                               event_admin_service->containsProperty = 
eventAdmin_containsProperty;
-                               event_admin_service->event_equals = 
eventAdmin_event_equals;
-                               event_admin_service->getProperty = 
eventAdmin_getProperty;
-                               event_admin_service->getPropertyNames = 
eventAdmin_getPropertyNames;
-                               event_admin_service->getTopic = 
eventAdmin_getTopic;
-                               event_admin_service->hashCode = 
eventAdmin_hashCode;
-                               event_admin_service->matches = 
eventAdmin_matches;
-                               event_admin_service->toString = 
eventAdmin_toString;
-
-                       }
-               }
-               activator->event_admin_service = event_admin_service;
-       }
-
-
-       return status;
-}
-
-celix_status_t bundleActivator_start(void * userData, bundle_context_pt 
context) {
-       celix_status_t status = CELIX_SUCCESS;
-       struct activator *activator = userData;
-       event_admin_service_pt event_admin_service = NULL;
-
-       if(status == CELIX_SUCCESS) {
-               struct activator * data = (struct activator *) userData;
-               service_tracker_customizer_pt cust = NULL;
-               service_tracker_pt tracker = NULL;
-               data->context = context;
-
-               
serviceTrackerCustomizer_create(data->event_admin_service->eventAdmin, 
eventAdmin_addingService, eventAdmin_addedService, eventAdmin_modifiedService, 
eventAdmin_removedService, &cust);
-               serviceTracker_create(context, (char *) EVENT_HANDLER_SERVICE, 
cust, &tracker);
-
-               data->tracker = tracker;
-
-               serviceTracker_open(tracker);
-               properties_pt properties = NULL;
-               properties = properties_create();
-               event_admin_service = activator->event_admin_service;
-               bundleContext_registerService(context, (char *) 
EVENT_ADMIN_NAME, event_admin_service, properties, &activator->registration);
-               logHelper_start(activator->loghelper);
-       }
-       return status;
-}
-
-celix_status_t bundleActivator_stop(void * userData, bundle_context_pt 
context) {
-       celix_status_t status = CELIX_SUCCESS;
-       struct activator * data =  userData;
-    serviceRegistration_unregister(data->registration);
-       serviceTracker_close(data->tracker);
-       status = logHelper_stop(data->loghelper);
-    logHelper_destroy(&data->loghelper);
-
-       return status;
-}
-
-
-celix_status_t bundleActivator_destroy(void * userData, bundle_context_pt 
context) {
-       celix_status_t status = CELIX_SUCCESS;
-    //stop  struct activator *activator = userData;
-
-    // free(activator);
-
-       return status;
-}
-
-

Reply via email to