diff --git a/src/object/object.h b/src/object/object.h
new file mode 100644
index 000000000..b957d97f5
--- /dev/null
+++ b/src/object/object.h
@@ -0,0 +1,60 @@
+/*
+ * object.h
+ * Copyright (C) 2017 Belledonne Communications SARL
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef _OBJECT_H_
+#define _OBJECT_H_
+
+#include "utils/general.h"
+
+// =============================================================================
+
+namespace Linphone {
+ class Object;
+
+ class ObjectPrivate {
+ public:
+ virtual ~ObjectPrivate () = default;
+
+ protected:
+ Object *mPublic = nullptr;
+
+ private:
+ L_DECLARE_PUBLIC(Object);
+ };
+
+ class Object {
+ public:
+ virtual ~Object () {
+ delete mPrivate;
+ }
+
+ protected:
+ explicit Object (ObjectPrivate *objectPrivate) : mPrivate(objectPrivate) {
+ if (mPrivate)
+ mPrivate->mPublic = this;
+ }
+
+ ObjectPrivate *mPrivate = nullptr;
+
+ private:
+ L_DECLARE_PRIVATE(Object);
+ L_DISABLE_COPY(Object);
+ };
+}
+
+#endif // ifndef _OBJECT_H_
diff --git a/src/object/singleton.h b/src/object/singleton.h
new file mode 100644
index 000000000..37506542d
--- /dev/null
+++ b/src/object/singleton.h
@@ -0,0 +1,51 @@
+/*
+ * singleton.h
+ * Copyright (C) 2017 Belledonne Communications SARL
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef _SINGLETON_H_
+#define _SINGLETON_H_
+
+#include "object.h"
+
+// =============================================================================
+
+namespace Linphone {
+ template
+ class Singleton : public Object {
+ public:
+ static Singleton *getInstance () {
+ if (!mInstance)
+ mInstance = new Singleton();
+ return mInstance;
+ }
+
+ virtual ~Singleton () = default;
+
+ protected:
+ explicit Singleton (ObjectPrivate *objectPrivate = nullptr) : Object(objectPrivate) {}
+
+ private:
+ static Singleton *mInstance;
+
+ L_DISABLE_COPY(Singleton);
+ };
+
+ template
+ Singleton *Singleton::mInstance = nullptr;
+}
+
+#endif // ifndef _SINGLETON_H_
diff --git a/src/utils/general.h b/src/utils/general.h
new file mode 100644
index 000000000..0fc5afe6f
--- /dev/null
+++ b/src/utils/general.h
@@ -0,0 +1,49 @@
+/*
+ * general.h
+ * Copyright (C) 2017 Belledonne Communications SARL
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+// =============================================================================
+
+#ifndef _GENERAL_H_
+#define _GENERAL_H_
+
+#define L_DECLARE_PRIVATE(CLASS) \
+ inline CLASS ## Private * getPrivate() { \
+ return reinterpret_cast(mPrivate); \
+ } \
+ inline const CLASS ## Private *getPrivate() const { \
+ return reinterpret_cast(mPrivate); \
+ } \
+ friend class CLASS ## Private;
+
+#define L_DECLARE_PUBLIC(CLASS) \
+ inline CLASS * getPublic() { \
+ return static_cast(mPublic); \
+ } \
+ inline const CLASS *getPublic() const { \
+ return static_cast(mPublic); \
+ } \
+ friend class CLASS;
+
+#define L_DISABLE_COPY(CLASS) \
+ CLASS(const CLASS &) = delete; \
+ CLASS &operator= (const CLASS &) = delete;
+
+#define L_D(CLASS) CLASS ## Private * const d = getPrivate();
+#define L_Q(CLASS) CLASS * const q = getPublic();
+
+#endif // ifndef _GENERAL_H_