diff --git a/src/starsphere/Starsphere.cpp b/src/starsphere/Starsphere.cpp
index 20cdf587c7a21288872230f1e85dcb6ab8a5a06a..e7a6f176afaba39d8f38df1a5645c3a37872ddd3 100644
--- a/src/starsphere/Starsphere.cpp
+++ b/src/starsphere/Starsphere.cpp
@@ -258,8 +258,12 @@ GLfloat Starsphere::RAofZenith(double T, GLfloat LONdeg)
 /**
  * Draw the observatories at their zenith positions
  */
-void Starsphere::make_obs()
+void Starsphere::generateObservatories(float dimFactor)
 {
+	// sanity check
+	if(dimFactor < 0.0) dimFactor = 0.0;
+	if(dimFactor > 1.0) dimFactor = 1.0;
+
 	GLfloat Lat, Lon; // Latitute/Longitude of IFO is
 	GLfloat RAdeg, DEdeg; // converted to RA/DEC of sky sphere position
 	GLfloat radius; // radius of sphere for obs
@@ -293,7 +297,7 @@ void Starsphere::make_obs()
 	LLOmarker = glGenLists(1);
 	glNewList(LLOmarker, GL_COMPILE);
 
-		glColor3f(0.0, 1.0, 0.0);
+		glColor3f(dimFactor * 0.0, dimFactor * 1.0, dimFactor * 0.0);
 		glLineWidth(lineSize);
 
 		glBegin(GL_LINE_STRIP);
@@ -327,7 +331,7 @@ void Starsphere::make_obs()
 	LHOmarker = glGenLists(1);
 	glNewList(LHOmarker, GL_COMPILE);
 
-		glColor3f(0.0, 0.0, 1.0);
+		glColor3f(dimFactor * 0.0, dimFactor * 0.0, dimFactor * 1.0);
 		glLineWidth(lineSize);
 
 		glBegin(GL_LINE_STRIP);
@@ -376,7 +380,7 @@ void Starsphere::make_obs()
 	GEOmarker = glGenLists(1);
 	glNewList(GEOmarker, GL_COMPILE);
 
-		glColor3f(1.0, 0.0, 0.0);
+		glColor3f(dimFactor * 1.0, dimFactor * 0.0, dimFactor * 0.0);
 		glLineWidth(lineSize);
 
 		glBegin(GL_LINE_STRIP);
@@ -411,7 +415,7 @@ void Starsphere::make_obs()
 	VIRGOmarker = glGenLists(1);
 	glNewList(VIRGOmarker, GL_COMPILE);
 
-		glColor3f(1.0, 1.0, 1.0);
+		glColor3f(dimFactor * 1.0, dimFactor * 1.0, dimFactor * 1.0);
 		glLineWidth(lineSize);
 
 		glBegin(GL_LINE_STRIP);
@@ -764,7 +768,6 @@ void Starsphere::initialize(const int width, const int height, const Resource *f
 	make_snrs();
 	make_axes();
 	make_globe();
-	make_obs();
 
 	glDisable(GL_CLIP_PLANE0);
 	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
@@ -850,6 +853,7 @@ void Starsphere::render(const double timeOfDay)
 		glCallList(LHOmarker);
 		glCallList(GEOmarker);
 		glCallList(VIRGOmarker);
+		renderAdditionalObservatories();
 		glPopMatrix();
 	}
 
@@ -909,6 +913,10 @@ void Starsphere::render(const double timeOfDay)
 	SDL_GL_SwapBuffers();
 }
 
+void Starsphere::renderAdditionalObservatories() {
+	// default implementation doesn't do anything
+}
+
 void Starsphere::mouseButtonEvent(const int positionX, const int positionY,
 								  const AbstractGraphicsEngine::MouseButton buttonPressed)
 {
diff --git a/src/starsphere/Starsphere.h b/src/starsphere/Starsphere.h
index bd3ea4cc053ab354cb2142ab557d0d9049b5dfcb..a3434362b8ca10378c7236232128e78afe8a199a 100644
--- a/src/starsphere/Starsphere.h
+++ b/src/starsphere/Starsphere.h
@@ -108,6 +108,12 @@ public:
 	 * \param height The new height of the display surface
 	 */
 	virtual void resize(const int width, const int height);
+
+	/**
+	 * \brief This method renders one frame of the animation
+	 *
+	 * \param timeOfDay The current time (e.g. BOINC's dtime(), used for time-based rendering evolution)
+	 */
 	void render(const double timeOfDay);
 
 	// event handling
@@ -143,6 +149,20 @@ protected:
 	 */
 	virtual void renderSearchInformation() = 0;
 
+	/**
+	 * \brief Render additional observatories
+	 *
+	 * This method doesn't do anything in its local implementation. It's provided
+	 * for potential specializing classes to add additional observatories by
+	 * overriding the empty default implementation.
+	 *
+	 * Important: overriding classes should just provide additional display lists
+	 * by via calls to glCallList().
+	 *
+	 * \see StarsphereRadio::renderAdditionalObservatories()
+	 */
+	virtual void renderAdditionalObservatories();
+
 	/**
 	 * \brief This method has to be called in order to update the BOINC client information
 	 *
@@ -154,6 +174,42 @@ protected:
 	 */
 	virtual void refreshLocalBOINCInformation();
 
+	/**
+	 * \brief Generates the OpenGL call lists for the displayed observatories
+	 *
+	 * \param dimFactor A dim factor (range: 0 <= x <= 1) that will, well, dim the color
+	 * of the observatories.
+	 */
+	virtual void generateObservatories(const float dimFactor);
+
+	// feature control
+	enum Features {
+		STARS = 1,
+		CONSTELLATIONS = 2,
+		OBSERVATORIES = 4,
+		XRAYS = 8,
+		PULSARS = 16,
+		SNRS = 32,
+		GLOBE = 64,
+		AXES = 128,
+		SEARCHINFO = 256,
+		LOGO = 512,
+		MARKER = 1024
+	};
+
+	void setFeature(const Features features, const bool enable);
+	bool isFeature(const Features features);
+
+	GLfloat RAofZenith(double T, GLfloat LONdeg);
+	void sphVertex3D(GLfloat RAdeg, GLfloat DEdeg, GLfloat radius);
+	void sphVertex(GLfloat RAdeg, GLfloat DEdeg);
+
+	GLfloat sphRadius;
+
+	// observatory movement
+	// (in seconds since 1970 with usec precision)
+	double m_ObservatoryDrawTimeLocal;
+
 	// resource handling
 	const Resource *m_FontResource;
 	OGLFT::TranslucentTexture *m_FontLogo1;
@@ -187,14 +243,10 @@ private:
 	void make_pulsars();
 	void make_snrs();
 	void make_constellations();
-	void make_obs();
 	void make_axes();
 	void make_globe();
 	void make_search_marker(GLfloat RAdeg, GLfloat DEdeg, GLfloat size);
 
-	GLfloat RAofZenith(double T, GLfloat LONdeg);
-	void sphVertex3D(GLfloat RAdeg, GLfloat DEdeg, GLfloat radius);
-	void sphVertex(GLfloat RAdeg, GLfloat DEdeg);
 	void star_marker(float RAdeg, float DEdeg, float size);
 
 	/**
@@ -206,9 +258,8 @@ private:
 	GLuint sphGrid, SNRs, SearchMarker;
 
 	/**
-	 * Parameters and State info:
+	 * State info:
 	 */
-	GLfloat sphRadius;
 	int featureFlags;
 
 	/**
@@ -231,28 +282,6 @@ private:
 	// view control
 	void rotateSphere(const int relativeRotation, const int relativeElevation);
 	void zoomSphere(const int relativeZoom);
-
-	// feature control
-	enum Features {
-		STARS = 1,
-		CONSTELLATIONS = 2,
-		OBSERVATORIES = 4,
-		XRAYS = 8,
-		PULSARS = 16,
-		SNRS = 32,
-		GLOBE = 64,
-		AXES = 128,
-		SEARCHINFO = 256,
-		LOGO = 512,
-		MARKER = 1024
-	};
-
-	void setFeature(const Features features, const bool enable);
-	bool isFeature(const Features features);
-
-	// observatory movement
-	// (in seconds since 1970 with usec precision)
-	double m_ObservatoryDrawTimeLocal;
 };
 
 /* Constellation & star coordinates are in starlist.C */
diff --git a/src/starsphere/StarsphereRadio.cpp b/src/starsphere/StarsphereRadio.cpp
index 62a61243b1c23c6a7b088fab733320a0e5c72e90..ecd5f6d8e49ea6e5ceb9b582d0c29a5d5ab5d2fd 100644
--- a/src/starsphere/StarsphereRadio.cpp
+++ b/src/starsphere/StarsphereRadio.cpp
@@ -74,6 +74,9 @@ void StarsphereRadio::initialize(const int width, const int height, const Resour
 
 	// prepare power spectrum
 	generatePowerSpectrumCoordSystem(m_PowerSpectrumXPos, m_PowerSpectrumYPos);
+
+	// prepare base class observatories (dimmed to 33%)
+	generateObservatories(0.33);
 }
 
 void StarsphereRadio::resize(const int width, const int height)
@@ -94,6 +97,10 @@ void StarsphereRadio::resize(const int width, const int height)
 	generatePowerSpectrumBins(m_PowerSpectrumXPos, m_PowerSpectrumYPos);
 }
 
+void StarsphereRadio::renderAdditionalObservatories() {
+	glCallList(m_areciboObservatory);
+}
+
 void StarsphereRadio::refreshBOINCInformation()
 {
 	// call base class implementation
@@ -300,3 +307,106 @@ void StarsphereRadio::generatePowerSpectrumBins(const int originX, const int ori
 
 	glEndList();
 }
+
+void StarsphereRadio::generateObservatories(float dimFactor)
+{
+	// call base class implementation first
+	Starsphere::generateObservatories(dimFactor);
+
+	GLfloat Lat, Lon; // Latitute/Longitude of IFO is
+	GLfloat RAdeg, DEdeg; // converted to RA/DEC of sky sphere position
+	GLfloat radius; // radius of sphere for obs
+
+	double factorRadDeg = 1.0 / 57.29577957795135; // RAD/DEG conversion factor
+	GLfloat dishRadius = 1; // radius of the Arecibo telescope antenna
+	GLfloat domeRadius = 0.2; // radius of the Arecibo telescope receiver dome
+
+	// get current time and UTC offset (for zenith position)
+	m_ObservatoryDrawTimeLocal = dtime();
+	time_t local = m_ObservatoryDrawTimeLocal;
+	tm *utc = gmtime(&local);
+	double utcOffset = difftime(local, mktime(utc));
+	double observatoryDrawTimeGMT = m_ObservatoryDrawTimeLocal - utcOffset;
+
+	radius = 1.0*sphRadius; // radius of sphere on which they are drawn
+
+	/**
+	 * Arecibo Observatory:
+	 */
+
+	Lat = 18.344167;
+	Lon = 66.752778;
+
+	RAdeg= RAofZenith(observatoryDrawTimeGMT, Lon);
+	DEdeg= Lat;
+
+	// delete existing, create new (required for windoze)
+	if(m_areciboObservatory) glDeleteLists(m_areciboObservatory, 1);
+	m_areciboObservatory = glGenLists(1);
+	glNewList(m_areciboObservatory, GL_COMPILE);
+
+		// we don't dim Arecibo, just IFOs
+		glColor3f(0.75, 0.75, 0.75);
+
+		// lines used to draw triangles
+		glLineWidth(1.0);
+
+		// draw antenna dish
+		float originX = RAdeg;
+		float originY = DEdeg;
+		float vectorY1 = originY;
+		float vectorX1 = originX;
+		float vectorX;
+		float vectorY;
+		float angle;
+
+		// make sure both side are visible
+		glDisable(GL_CULL_FACE);
+
+		glBegin(GL_TRIANGLES);
+			for(int i=0; i <= 360; i++) {
+				angle = ((double)i) * factorRadDeg;
+				vectorX = originX + dishRadius * (float)sin(angle);
+				vectorY = originY + dishRadius * (float)cos(angle);
+				sphVertex(originX, originY);
+				sphVertex(vectorX1, vectorY1);
+				sphVertex(vectorX, vectorY);
+				vectorY1 = vectorY;
+				vectorX1 = vectorX;
+			}
+		glEnd();
+
+		// draw receiver dome
+		glColor3f(0.5, 0.5, 0.5);
+		glBegin(GL_TRIANGLES);
+			for(int i=0; i <= 360; i++) {
+				angle = ((double)i) * factorRadDeg;
+				vectorX = originX + domeRadius * (float)sin(angle);
+				vectorY = originY + domeRadius * (float)cos(angle);
+				sphVertex(originX, originY);
+				sphVertex(vectorX1, vectorY1);
+				sphVertex(vectorX, vectorY);
+				vectorY1 = vectorY;
+				vectorX1 = vectorX;
+			}
+		glEnd();
+
+		// enable culling again
+		glEnable(GL_CULL_FACE);
+
+        // draw receiver struts
+		glColor3f(0.0, 0.0, 0.0);
+		glBegin(GL_LINES);
+			// north guide
+			sphVertex3D(RAdeg, DEdeg, radius);
+			sphVertex3D(RAdeg, DEdeg+1.0, radius);
+		glEnd();
+		glBegin(GL_LINE_STRIP);
+			// south-west & south-east guides:
+			sphVertex3D(RAdeg-0.7, DEdeg-0.7, radius);
+			sphVertex3D(RAdeg, DEdeg, radius);
+			sphVertex3D(RAdeg+0.7, DEdeg-0.7, radius);
+		glEnd();
+
+	glEndList();
+}
diff --git a/src/starsphere/StarsphereRadio.h b/src/starsphere/StarsphereRadio.h
index af09c36e29107a41ab3c4ed0f0664f4bf80584d2..d47632d3e47a8a1ea93a064c89758a09557e238d 100644
--- a/src/starsphere/StarsphereRadio.h
+++ b/src/starsphere/StarsphereRadio.h
@@ -108,6 +108,14 @@ private:
 	 */
 	void renderSearchInformation();
 
+	/**
+	 * \brief Renders the Arecibo observatory
+	 *
+	 * This specific implementation invokes a single display list rendering the
+	 * Arecibo observatory. It overrides the (empty) base class implementation.
+	 */
+	void renderAdditionalObservatories();
+
 	/**
 	 * \brief Creates an OpenGL call list which contains the static power spectrum coordinate system
 	 *
@@ -124,6 +132,16 @@ private:
 	 */
 	void generatePowerSpectrumBins(const int originX, const int originY);
 
+	/**
+	 * \brief Generates the OpenGL call lists for the displayed observatories
+	 *
+	 * \param dimFactor A dim factor (range: 0 <= x <= 1) that will, well, dim the color
+	 * of the observatories. Right now the factor is propagated to the base class
+	 * implementation, hence dims the IFOs. The local Arecibo observatory is currently
+	 * unaffected.
+	 */
+	void generateObservatories(const float dimFactor);
+
 	/// ID of the OpenGL call list which contains the static power spectrum coordinate system
 	GLuint m_PowerSpectrumCoordSystemList;
 
@@ -234,6 +252,9 @@ private:
 
 	/// HUD configuration setting (vertical start position for the bottom part, line 6)
 	GLfloat m_Y6StartPosBottom;
+
+	/// Arecibo Observatory display list
+	GLuint m_areciboObservatory;
 };
 
 /**
diff --git a/src/starsphere/StarsphereS5R3.cpp b/src/starsphere/StarsphereS5R3.cpp
index e3400b9caeaf405acb80ff874e2f9591154201e4..bc8b5d4ddc9aae7066d7df97109947ab9ad1845e 100644
--- a/src/starsphere/StarsphereS5R3.cpp
+++ b/src/starsphere/StarsphereS5R3.cpp
@@ -50,6 +50,9 @@ void StarsphereS5R3::initialize(const int width, const int height, const Resourc
 		m_Y3StartPosBottom = m_Y2StartPosBottom - m_YOffsetMedium;
 		m_Y4StartPosBottom = m_Y3StartPosBottom - m_YOffsetMedium;
 	}
+
+	// prepare base class observatories (not dimmed)
+	generateObservatories(1.0);
 }
 
 void StarsphereS5R3::resize(const int width, const int height)
@@ -140,3 +143,9 @@ void StarsphereS5R3::renderSearchInformation()
 		m_FontText->draw(m_XStartPosRight, m_Y3StartPosBottom, m_WUPercentDone.c_str());
 		m_FontText->draw(m_XStartPosRight, m_Y4StartPosBottom, m_WUCPUTime.c_str());
 }
+
+void StarsphereS5R3::generateObservatories(float dimFactor)
+{
+	// we don't do anything special here, just call base class
+	Starsphere::generateObservatories(dimFactor);
+}
diff --git a/src/starsphere/StarsphereS5R3.h b/src/starsphere/StarsphereS5R3.h
index b02eb52845315fb856e8bb0eeac238d93dcfc067..9ec54110f5da6288e6aa28ce837fc2cc39006a30 100644
--- a/src/starsphere/StarsphereS5R3.h
+++ b/src/starsphere/StarsphereS5R3.h
@@ -101,6 +101,15 @@ private:
 	 */
 	void renderSearchInformation();
 
+	/**
+	 * \brief Generates the OpenGL call lists for the displayed observatories
+	 *
+	 * \param dimFactor A dim factor (range: 0 <= x <= 1) that will, well, dim the color
+	 * of the observatories. Right now the factor is propagated to the base class
+	 * implementation, hence dims the IFOs.
+	 */
+	void generateObservatories(const float dimFactor);
+
 	/// Specialized BOINC client adapter instance for information retrieval
 	EinsteinS5R3Adapter m_EinsteinAdapter;