diff --git a/include/stateMachineFwk/controlBlock.h b/include/stateMachineFwk/controlBlock.h
new file mode 100644
index 0000000..7591a1a
--- /dev/null
+++ b/include/stateMachineFwk/controlBlock.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 2019, Infosys Ltd.
+ *
+ * Licensed 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 CONTROLBLOCK_H_
+#define CONTROLBLOCK_H_
+
+#include <mutex>
+#include <queue>
+#include <deque>
+#include <stdint.h>
+#include <time.h>
+#include "permDataBlock.h"
+#include <smTypes.h>
+#include "tempDataBlock.h"
+
+class Event;
+class State;
+
+using namespace std;
+
+namespace SM
+{
+	typedef struct debugEventInfo
+	{
+        	Event_e event;
+	        State_e state;
+        	time_t evt_time;
+
+        	debugEventInfo(Event_e evt, State_e st, time_t t)
+        	{
+        		event = evt;
+        		state = st;
+        		evt_time = t;
+        	}
+
+	}debugEventInfo;
+
+	class Event;
+	class State;
+	class ControlBlock
+	{
+   	public:
+			static const unsigned short MAX_FAST_BLOCK_IDX = 5;
+			static uint32_t controlBlockArrayIdx;
+
+      		ControlBlock();
+      		virtual ~ControlBlock();
+
+      		void reset();
+
+      		uint32_t getCBIndex();
+
+      		void addEventToProcQ(Event &event);
+	      	bool getCurrentEvent(Event &evt);
+
+	      	State* getCurrentState();
+      		void setNextState(State* state);
+
+      		PermDataBlock* getFastAccessBlock(unsigned short idx) const;
+      		void setFastAccessBlock(PermDataBlock* pdb_p, unsigned short idx);
+
+      		PermDataBlock* getPermDataBlock() const;
+      		void setPermDataBlock(PermDataBlock* pdb_p);
+
+      		TempDataBlock* getTempDataBlock() const;
+      		void setTempDataBlock(TempDataBlock* tdb_p); 
+      		void setCurrentTempDataBlock(TempDataBlock* tdb_p);
+
+      		void addDebugInfo(debugEventInfo& eventInfo);
+      		inline deque<debugEventInfo> getDebugInfoQueue()const
+			{
+      			return debugEventInfoQ;
+			}
+
+      		void* getMsgData()
+      		{
+      			return data_p;
+      		}
+
+      		void setMsgData(void* ptr)
+      		{
+      			data_p = ptr;
+      		}
+
+      		void setControlBlockState(ControlBlockState state);
+      		ControlBlockState getControlBlockState();
+
+            bool isInProcQueue();
+            void setProcQueueFlag(bool flag);
+
+      		virtual void display();
+
+   	private:
+		std::mutex mutex_m;
+		const uint32_t cbIndex_m;
+		ControlBlockState cbState_m;
+
+		// deallocated once the event is processed
+		void* data_p;
+
+      		PermDataBlock* pdb_mp;
+      		PermDataBlock* fadb_mpa[MAX_FAST_BLOCK_IDX];
+      		TempDataBlock* tdb_mp;
+
+      		queue<Event> eventQ;
+		
+	    	deque<debugEventInfo> debugEventInfoQ;
+		bool inProcQueue_m;
+	};
+}
+#endif /* CONTROLBLOCK_H_ */
