diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp
index 67aed8becb2a62b51b7a14a9a31f8c7575babdc7..93437984cc0dbaa5af08114d7641a1ad3969c307 100644
--- a/src/pulsaranimationwidget.cpp
+++ b/src/pulsaranimationwidget.cpp
@@ -20,26 +20,164 @@
 
 #include "pulsaranimationwidget.h"
 
-PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) : QGLWidget(parent)
+PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) :
+	QGLWidget(parent),
+	m_frameTimer(),
+	m_pulsarSpinTimer()
 {
+    connect(&m_frameTimer, SIGNAL(timeout()), this, SLOT(updateFrame()));
+    connect(&m_pulsarSpinTimer, SIGNAL(timeout()), this, SLOT(updatePulsarSpin()));
 
+	GLUquadricObj *m_quadricPulsar;
+	GLUquadricObj *m_quadricPulsarCone1;
+	GLUquadricObj *m_quadricPulsarCone2;
+
+	m_framesPerSecond = 25;
+	setPulsarSpinFrequency(0.5f);
+	m_pulsarRotationAngle = 0.0;
 }
 
 PulsarAnimationWidget::~PulsarAnimationWidget()
 {
-
+	if(m_quadricPulsar) gluDeleteQuadric(m_quadricPulsar);
+	if(m_quadricPulsarCone1) gluDeleteQuadric(m_quadricPulsarCone1);
+	if(m_quadricPulsarCone2) gluDeleteQuadric(m_quadricPulsarCone2);
 }
 
 void PulsarAnimationWidget::initializeGL()
 {
+	glShadeModel(GL_SMOOTH);
+	glClearColor(0.0, 0.0, 0.0, 0.0);
+	glClearDepth(1.0f);
+	glEnable(GL_DEPTH_TEST);
+	glDepthFunc(GL_LEQUAL);
+	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+
+	GLfloat LightAmbient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
+	GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+	GLfloat LightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
+	GLfloat LightPosition[] = { 0.0f, 0.0f, 3.0f, 1.0f };
+	GLfloat spot_direction[] = { 0.0, 0.0, -1.0 };
+
+	glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
+	glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
+	glLightfv(GL_LIGHT0, GL_SPECULAR, LightSpecular);
+	glLightfv(GL_LIGHT0, GL_POSITION, LightPosition);
+	glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 20.0);
+	glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);
+	glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 5.0);
+
+	glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
+	glEnable(GL_LIGHT0);
+	glEnable(GL_LIGHTING);
 
+	m_quadricPulsar = gluNewQuadric();
+    m_quadricPulsarCone1 = gluNewQuadric();
+    m_quadricPulsarCone2 = gluNewQuadric();
+    gluQuadricNormals(m_quadricPulsar, GLU_SMOOTH);
+    gluQuadricNormals(m_quadricPulsarCone1, GLU_SMOOTH);
+    gluQuadricNormals(m_quadricPulsarCone2, GLU_SMOOTH);
 }
 
 void PulsarAnimationWidget::resizeGL(int w, int h)
 {
+	glViewport(0, 0, w, h);
+
+	glMatrixMode(GL_PROJECTION);
+	glLoadIdentity();
+
+	gluPerspective(45.0f, (GLfloat)w / (GLfloat)h, 0.1f, 100.0f);
+
+	glMatrixMode(GL_MODELVIEW);
+	glLoadIdentity();
+}
+
+void PulsarAnimationWidget::paintGL()
+{
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+	glMatrixMode(GL_MODELVIEW);
+	glLoadIdentity();
+
+	gluLookAt(0.0, 6.0, 10.0, 0.0, 0.0, 0.0, 0.0, 2.0, -5.0);
+
+	// TODO: should be located elsewhere
+	static GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };
+	static GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };
+	static GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };
+	static GLfloat mat_diffuse[] = { 0.5, 0.5, 0.5, 1.0 };
+	static GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+	static GLfloat no_shininess[] = { 0.0 };
+	static GLfloat low_shininess[] = { 5.0 };
+	static GLfloat high_shininess[] = { 100.0 };
+	static GLfloat mat_emission[] = { 0.3, 0.2, 0.2, 0.0 };
+	glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
+	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
+	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+	glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);
+	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
 
+	glPushMatrix();
+	glRotatef(m_pulsarRotationAngle, 0.0f, 1.0f, 0.0f);
+	gluSphere(m_quadricPulsar, 1.0f, 32, 32);
+	glPopMatrix();
+
+	glPushMatrix();
+	glRotatef(m_pulsarRotationAngle-90, 0.0f, 1.0f, 0.0f);
+	glTranslatef(0.0f, 0.0f, -4.0f);
+	gluCylinder(m_quadricPulsarCone1, 0.5f, 0.0f, 3.0f, 32, 32);
+	glPopMatrix();
+
+	glPushMatrix();
+	glRotatef(m_pulsarRotationAngle+90, 0.0f, 1.0f, 0.0f);
+	glTranslatef(0.0f, 0.0f, -4.0f);
+	gluCylinder(m_quadricPulsarCone2, 0.5f, 0.0f, 3.0f, 32, 32);
+	glPopMatrix();
 }
 
-void PulsarAnimationWidget::paintGL() {
+void PulsarAnimationWidget::runAnimation()
+{
+	m_frameTimer.start(1000.0 / m_framesPerSecond);
+	m_pulsarSpinTimer.start(m_pulsarSpinFrequency);
+}
 
+void PulsarAnimationWidget::pauseAnimation()
+{
+	m_frameTimer.stop();
+	m_pulsarSpinTimer.stop();
+}
+
+void PulsarAnimationWidget::stopAnimation()
+{
+	m_frameTimer.stop();
+	m_pulsarSpinTimer.stop();
+
+	m_pulsarRotationAngle = 0.0;
+	updateGL();
+}
+
+void PulsarAnimationWidget::updateFrame()
+{
+	updateGL();
+}
+
+void PulsarAnimationWidget::updatePulsarSpin()
+{
+	if(m_pulsarRotationAngle <= 360.0) {
+		m_pulsarRotationAngle++;
+	}
+	else {
+		m_pulsarRotationAngle = 0.0;
+	}
+}
+
+void PulsarAnimationWidget::setFramePerSecond(const unsigned int fps)
+{
+	m_framesPerSecond = fps;
+}
+
+void PulsarAnimationWidget::setPulsarSpinFrequency(const float frequency)
+{
+	m_pulsarSpinFrequency = (unsigned int) (1000 / (frequency * 360.0f));
+	m_pulsarSpinTimer.setInterval(m_pulsarSpinFrequency);
 }
diff --git a/src/pulsaranimationwidget.h b/src/pulsaranimationwidget.h
index 5be88b7876c780790aa5097a51b0d26c61466ad6..8106bc9b839592c5d52084ff83a63dcadaa2da2f 100644
--- a/src/pulsaranimationwidget.h
+++ b/src/pulsaranimationwidget.h
@@ -22,6 +22,7 @@
 #define PULSARANIMATIONWIDGET_H_
 
 #include <QGLWidget>
+#include <QTimer>
 
 class PulsarAnimationWidget : public QGLWidget
 {
@@ -31,6 +32,17 @@ public:
 	PulsarAnimationWidget(QWidget *parent);
 	virtual ~PulsarAnimationWidget();
 
+	void setFramePerSecond(const unsigned int fps);
+	void setPulsarSpinFrequency(const float frequency);
+
+public slots:
+	void runAnimation();
+	void pauseAnimation();
+	void stopAnimation();
+
+	void updateFrame();
+	void updatePulsarSpin();
+
 protected:
 
     void initializeGL();
@@ -38,6 +50,18 @@ protected:
     void resizeGL(int w, int h);
 
     void paintGL();
+
+private:
+    QTimer m_frameTimer;
+    QTimer m_pulsarSpinTimer;
+
+	GLUquadricObj *m_quadricPulsar;
+	GLUquadricObj *m_quadricPulsarCone1;
+	GLUquadricObj *m_quadricPulsarCone2;
+
+	int m_framesPerSecond;
+	float m_pulsarSpinFrequency;
+	float m_pulsarRotationAngle;
 };
 
 #endif /* PULSARANIMATIONWIDGET_H_ */