diff --git a/main/NOTICE b/main/NOTICE
index 52b20ee..075ff93 100644
--- a/main/NOTICE
+++ b/main/NOTICE
@@ -1,5 +1,5 @@
 Apache OpenOffice (http://www.openoffice.org)
-Copyright 2011, 2014 The Apache Software Foundation
+Copyright 2011, 2015 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
diff --git a/main/extensions.lst b/main/extensions.lst
index 736da8f..b7e94a8 100644
--- a/main/extensions.lst
+++ b/main/extensions.lst
@@ -137,7 +137,7 @@
 
 # Portuguese (European).
 [ language=pt || language=pt_PT ]
-    c29cd2b68639b4fe78e98f88f1b4dd8e http://sourceforge.net/projects/aoo-extensions/files/1196/30/oo3x-pt-pt-14.7.8.2.oxt/download "dict-pt.oxt"
+    290d182dfad2c65ae2103228a8ed355f http://sourceforge.net/projects/aoo-extensions/files/1196/36/oo3x-pt-pt-15.10.3.1.oxt/download "dict-pt.oxt"
 
 # Catalan.
 [ language=ca ]
diff --git a/main/i18npool/source/search/textsearch.cxx b/main/i18npool/source/search/textsearch.cxx
index ec16d4f..6b646d1 100644
--- a/main/i18npool/source/search/textsearch.cxx
+++ b/main/i18npool/source/search/textsearch.cxx
@@ -241,10 +241,18 @@
 
         sres = (this->*fnForward)( in_str, newStartPos, newEndPos );
 
+        sal_Int32 nOffsetLength = offset.getLength();
+        sal_Int32 nStartOffset = 0;
         for ( int k = 0; k < sres.startOffset.getLength(); k++ )
         {
-            if (sres.startOffset[k])
-	      sres.startOffset[k] = offset[sres.startOffset[k]];
+            nStartOffset = sres.startOffset[k];
+            if ( nStartOffset )
+            {
+                if ( nStartOffset < nOffsetLength )
+                    sres.startOffset[k] = offset[nStartOffset];
+                else
+                    sres.startOffset[k] = offset[offset.getLength()-1] +1;
+            }
             // JP 20.6.2001: end is ever exclusive and then don't return
             //               the position of the next character - return the
             //               next position behind the last found character!
@@ -330,6 +338,8 @@
 
         sres = (this->*fnBackward)( in_str, newStartPos, newEndPos );
 
+        sal_Int32 nOffsetLength = offset.getLength();
+        sal_Int32 nEndOffset = 0;
         for ( int k = 0; k < sres.startOffset.getLength(); k++ )
         {
             if (sres.startOffset[k])
@@ -338,8 +348,14 @@
             //               the position of the next character - return the
             //               next position behind the last found character!
             //               "a b c" find "b" must return 2,3 and not 2,4!!!
-            if (sres.endOffset[k])
-	      sres.endOffset[k] = offset[sres.endOffset[k]];
+            nEndOffset = sres.endOffset[k];
+            if ( nEndOffset )
+            {
+                if ( nEndOffset < nOffsetLength )
+                    sres.endOffset[k] = offset[nEndOffset];
+                else
+                    sres.endOffset[k] = offset[offset.getLength()-1] +1;
+            }
         }
     }
     else
diff --git a/main/sal/osl/unx/socket.c b/main/sal/osl/unx/socket.c
index 8ebe30c..1f8aaab 100644
--- a/main/sal/osl/unx/socket.c
+++ b/main/sal/osl/unx/socket.c
@@ -490,7 +490,7 @@
     pSocket->m_CallbackArg = 0;
 	pSocket->m_nRefCount = 1;
 
-#if defined(LINUX)
+#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
     pSocket->m_bIsAccepting = sal_False;
 #endif
 
@@ -1824,13 +1824,13 @@
 {
 	if( pSocket && 0 == osl_decrementInterlockedCount( &(pSocket->m_nRefCount) ) )
 	{
-#if defined(LINUX)
+#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
     if ( pSocket->m_bIsAccepting == sal_True )
     {
         OSL_ENSURE(0, "osl_destroySocket : attempt to destroy socket while accepting\n");
         return;
     }
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
 		osl_closeSocket( pSocket );
 		__osl_destroySocketImpl( pSocket );
 	}
@@ -1858,7 +1858,7 @@
 
     pSocket->m_Socket = OSL_INVALID_SOCKET;
 
-#if defined(LINUX)
+#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
     pSocket->m_bIsInShutdown = sal_True;
 
     if ( pSocket->m_bIsAccepting == sal_True )
@@ -1904,7 +1904,7 @@
         }
         pSocket->m_bIsAccepting = sal_False;
     }
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
 
 	/* registrierten Callback ausfuehren */
 	if (pSocket->m_CloseCallback != NULL)
@@ -2185,9 +2185,9 @@
 	}
 
     pSocket->m_nLastError=0;
-#if defined(LINUX)
+#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
     pSocket->m_bIsAccepting = sal_True;
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
 
 	if( ppAddr && *ppAddr )
 	{
@@ -2208,23 +2208,23 @@
         pSocket->m_nLastError=errno;
 		OSL_TRACE("osl_acceptConnectionOnSocket : accept error '%s'\n",strerror(errno));
 
-#if defined(LINUX)
+#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
         pSocket->m_bIsAccepting = sal_False;
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
         return 0;
     }
 
     OSL_ASSERT(AddrLen == sizeof(struct sockaddr));
 
 
-#if defined(LINUX)
+#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
     if ( pSocket->m_bIsInShutdown == sal_True )
     {
         close(Connection);
 		OSL_TRACE("osl_acceptConnectionOnSocket : close while accept\n");
         return 0;
     }
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
 
 
 	if(ppAddr)
@@ -2253,11 +2253,11 @@
 	pConnectionSockImpl->m_nLastError		= 0;
 	pConnectionSockImpl->m_CloseCallback	= NULL;
 	pConnectionSockImpl->m_CallbackArg		= NULL;
-#if defined(LINUX)
+#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
 	pConnectionSockImpl->m_bIsAccepting		= sal_False;
 
     pSocket->m_bIsAccepting = sal_False;
-#endif /* LINUX */
+#endif /* CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT */
 	return pConnectionSockImpl;
 }
 
diff --git a/main/sal/osl/unx/sockimpl.h b/main/sal/osl/unx/sockimpl.h
index 8c12e1a..2cec813 100644
--- a/main/sal/osl/unx/sockimpl.h
+++ b/main/sal/osl/unx/sockimpl.h
@@ -33,6 +33,12 @@
 #endif
 
 typedef void* (*oslCloseCallback) (void*);
+
+#if defined(LINUX) || defined(FREEBSD) || defined(NETBSD)
+#define CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT 1
+#else
+#define CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT 0
+#endif
 	
 struct oslSocketImpl {
     int					m_Socket;
@@ -40,7 +46,7 @@
 	oslCloseCallback	m_CloseCallback;
 	void*				m_CallbackArg;
 	oslInterlockedCount m_nRefCount;
-#if defined(LINUX)
+#if CLOSESOCKET_DOESNT_WAKE_UP_ACCEPT
     sal_Bool            m_bIsAccepting;
     sal_Bool            m_bIsInShutdown;
 #endif
diff --git a/main/sal/osl/w32/file_error.c b/main/sal/osl/w32/file_error.c
index 322c7f7..44222f5 100644
--- a/main/sal/osl/w32/file_error.c
+++ b/main/sal/osl/w32/file_error.c
@@ -87,8 +87,9 @@
   {  ERROR_NESTING_NOT_ALLOWED,    osl_File_E_AGAIN    },  /* 215 */
   {  ERROR_DIRECTORY,              osl_File_E_NOENT    },  /* 267 */
   {  ERROR_NOT_ENOUGH_QUOTA,       osl_File_E_NOMEM    },  /* 1816 */
+  {  ERROR_CANT_ACCESS_FILE,       osl_File_E_ACCES    },  /* 1920 */
   {  ERROR_UNEXP_NET_ERR,          osl_File_E_NETWORK  },   /* 59 */
-  {  ERROR_FILE_CHECKED_OUT,       osl_File_E_LOCKED   },   /* 220 The file is locked or checked out by another user. */
+  {  ERROR_FILE_CHECKED_OUT,       osl_File_E_ACCES    },   /* 220 The file is locked or checked out by another user. */
   {  ERROR_INVALID_NAME,           osl_File_E_NOENT    }   /*  123 One or more of the names composing the file path has a wrong syntax. */
 };
     
diff --git a/main/solenv/inc/minor.mk b/main/solenv/inc/minor.mk
index 02c12ec..6ce1147 100644
--- a/main/solenv/inc/minor.mk
+++ b/main/solenv/inc/minor.mk
@@ -19,7 +19,7 @@
 #
 # *************************************************************
 RSCVERSION=412
-RSCREVISION=412m2(Build:9781)
-BUILD=9781
-LAST_MINOR=m2
+RSCREVISION=412m3(Build:9782)
+BUILD=9782
+LAST_MINOR=m3
 SOURCEVERSION=AOO412
